Jump to content

All Activity

This stream auto-updates     

  1. Past hour
  2. If you are having a hard time getting cc65 development for the X16 working on Windows, I go through the straightforward process of using Cygwin to provide a GNU environment without having to start up any VMs. Of course, however, I do this all within a Windows 10 VM running on Linux, including running the X16 emulator, thus: RETROCEPTION!
  3. The TRY IT NOW function for this program fails now. I presume that it's not updated for R38?
  4. Today
  5. 010 turboloader 033 frogger 098 commandos 155 cybernoid 2 and then having to mess with this to get rid of the ?LOAD ERRORs:
  6. The way it happened was that I had a global variable holding the shadow copies of the sprite regs. uint8_t spregs[16][8]; The update_bird() routine knew the bird was sprite X and would go through spregs[x][0] = VRAM_ADDR_LO ; spregs[x][1] = VRAM_ADDR_HI ; etc.... While de-globalizing this array, I decided that update_bird needed a pointer to the bird struct and a pointer to the shadow registers. I realized I could pass a pointer to just the specific sprite slot index, and the bird code could just use reg[0]=VRAM_ADDR_LO etc.... and then the function returns a pointer at the next spreg[] index. So for those reading along who aren't quite following what all this means: My original version of update_bird() was essentially written such that calling it was like saying "hey bird, go do your thing" - and now it's like "draw THIS bird HERE" - and it's up to the main program to figure out where that might be. I could have 20 birds if I wanted, and the function wouldn't care, now. Previously, it was hard-wired to just the one bird, and it was hard-wired to a particular sprite slot.
  7. This sounds familiar . I do something similar in Brixx and Invaderz for the laser sprites and explosions. The main player sprite and some others use fixed slots, though. I'm very much looking forward to the end result.
  8. Update Looks like TYPE-A me has won out. I’ve ended up spending most of my time refactoring my code into a project and using better coding habits. I’ve almost gotten rid of all global variables that don’t absolutely need to be globals, and most modules are now moved into separate files such as bird.c/.h etc. The fact that it's been so long since writing the original code has ended up being a good lesson because it’s like I'm reading someone else’s code. There were plenty of What was I THINKING? moments. The plus side is: now that everything is properly contained within its own circle of functionality, it's much quicker and easier to make use of these things in the main program. For example, I was able to quickly re-task the scoreboard as a 2-byte hex debug output tool so I can see values during execution if I need to. I have made progress in the game though. The joystick works. I was able to get the title screen knocked out in very short (for me) time last night, now that my functions don’t use global variables. Most of that time was spent implementing the "banners" - the actual title screen game loop took less than 5 minutes. The cool thing was that I was able to make the banner's position controllable by the joystick, and the scoreboard showed the X/Y coords, so I used that to choose the spot on the screen I wanted, and then just wrote the value into my code. No need to change + build + run, then go - hmm - 2 pixels up? (change build run).. no - two more pixels. (etc.) I also stumbled upon a neat method to make sprite slots dynamic so I no longer have to think about which sprite is the bird or the scoreboard etc. Each object just uses the next available one in the order I render them. Thich let me do something cool - I made the bird leave trails of the last 6 renders by just altering which sprite it rendered to on each frame. That little 'demo' aside, the nice thing is I no longer need to keep track of which objects use which sprite slots, so it's faster and easier to add/remove things as I see fit in my main game code. I can put 8 scoreboards on the screen as debug outputs, showing various things if that's what I need to do, and I don't have to account for the sprite slots in my other objects. Once I get the basic flow through all of the game states running (which also means I need to draw a few more sprites), I’ll upload the alpha .PRG so folks can try it out while I implement sound and other polish I'm planning.
  9. This is more important than I thought. Apparently the jiffies clock is updated very late in the kernal IRQ handler. When I started working on input code on my Flappy Bird game, I noticed tearing at the top of the screen whenever I hit keys on the kbd. This means that waitvsync() isn’t even getting control back until AFTER vblank is done. Not a big deal for me as I already plan to switch over to using the raster IRQ anyway, but I thought it might be useful knowledge to share this.
  10. I thought this might come in handy for people using the Adobe software family when designing graphics for old ChickenLips. It's an Adobe Colour Table (.ACT) file containing the default 256 colour palette. I found it useful when designing tiles in Photoshop. Let me know if there are any errors in it! Have fun. cx16.ACT
  11. I think I finally got it. FETVEC should not contain the MSB of the address you want to look up, but a zero page address that in its turn points to the address you want to read. A working example reading bank 6/address $c000: ;Setup ZP pointer stz $22 lda #$c0 sta $23 ;Call FETCH lda #$22 ;ZP pointer ldx #$06 ;ROM bank ldy #$00 ;Index for the indirect load jsr $ff74 ;Fetch call address ;Store return value sta $6000 rts
  12. I wonder if, back then, we somehow knew that business was the niche where the personal computer could thrive? All I remember thinking was wishful: I hope IBM abandons the PC market for good. That sort of thing. Totally irrational. And then a few short years later I get a 386SX-16 for college. So much for Commodore. Back then and now, I feel that the TRS-80 Model III has the most professional look of perhaps any computer, with the CBM 8032 a close second.
  13. I was watching the 8-Bit guy video about Tandy 1000 and had an interesting thought. The thing that gave them an edge was their gaming-friendly hardware that was compatible with the non-proprietary stuff as well. Once VGA started to take over, they lost the edge and were just another PC clone. But what if they had innovated? What could they have done to stay on top? The 1988-ish analog to modern accelerated video would have been a tile engine. If they’d made something like VERA but with 512k VRAM and a DMA engine to pipe textures / use system RAM for the tile maps of the layers, they could have matched VGA and blown it out of the water. It could default to supporting CGA and even VGA but also provide multi-layer tile scrolling and a crapload of sprites. It was lack of sprites that really dictated a lot of how PC games were designed. Plus, it would’ve taken much less CPU horsepower to drive this than the equivalent in VGA where you have to push a whole screen full of pixels every single frame if you want arcade style games. If Tandy had made such a move, could that have kept them in a strong position? The 1000 had enough install base to cause game developers to support their hardware already so I imagine the games would’ve been made to support this beast.
  14. Yesterday
  15. Most if not all of them are available via archive.org today... https://archive.org/details/compute-gazette That page ostensibly includes a link to D64 disk images as well.
  16. The markdown code in the PRG is mis-formatted; the list of routines should look like this: $FF4A: CLOSE_ALL – close all files on a device $FF8D: LKUPLA – search tables for given LA $FF8A: LKUPSA – search tables for given SA $FF62: DLCHR - activate a text mode font in the video hardware [not yet implemented] $FF65: PFKEY – program a function key [not yet implemented] $FF74: FETCH – LDA (fetvec),Y from any bank $FF77: STASH – STA (stavec),Y to any bank $FF7A: CMPARE – CMP (cmpvec),Y to any bank $FF7D: PRIMM – print string following the caller’s code The current markdown code lacks two spaces at the end of the line, and so the rendering has them all smashed together, making it look like this: $FF4A: CLOSE_ALL – close all files on a device $FF8D: LKUPLA – search tables for given LA $FF8A: LKUPSA – search tables for given SA $FF62: DLCHR - activate a text mode font in the video hardware [not yet implemented] $FF65: PFKEY – program a function key [not yet implemented] $FF74: FETCH – LDA (fetvec),Y from any bank $FF77: STASH – STA (stavec),Y to any bank $FF7A: CMPARE – CMP (cmpvec),Y to any bank $FF7D: PRIMM – print string following the caller’s code
  17. I purchased several copies of Compute, and Compute's Gazette, but I wasn't what one would call diligent about it, and didn't subscribe. I never managed to get one of the issues that had a version of SpeedScript in it.
  18. I watch his channel - his series on the NES Emulator from scratch was very enlightening. He uses that game engine for everything!
  19. Does this help? https://github.com/commanderx16/x16-docs/blob/master/Commander X16 Programmer's Reference Guide.md#commodore-128-api-compatibility There is also the C128 documentation for the FETCH/INDFET api call https://cx16.dk/c128-kernal-routines/indfet.html
  20. I've been trying to use the KERNAL FETCH function for some time. But I can't get it to work. This is my test code: lda #$c0 ldy #$00 ldx #$06 jsr $ff74 sta $6000 rts Reading the KERNAL source code, it seems that the calling address is $ff74, not $ff77 as stated in the PRG. Following the path of execution from ROM bank 0/$ff74, it seems that the value in .A is stored in the FETVEC, and that you need not store it yourself before calling the function as stated in the PRG. When running this, I expect the function to fetch the value in bank 6 (.X) at address $c000 (MSB in .A) + .Y and store it in RAM address $6000. But it doesn't. Neither does it work when I try following exactly what's said in the PRG.
  21. Feature suggestions: When I'm looking at the converted version of a set of tiles, the display defaults to using the 0 offset in the palette. You can click a tile and change this per-tile, which is great, but if you want to change several of them this way, then it is tedious when you could just select several tiles and change the value once for all of them. Also, when doing a sprite sheet, it would be nice if you could re-arrange the order of the individual sprite blocks and/or omit some from the export. (I'm working with an animation that was clearly designed to be multi-sprite, and the sheet ends up having the frames of each "sub-sprite" interlaced with each other when it would be nice to re-arrange them w/o having to edit the source image.
  22. I sold mine off over the years as well. Regret it now, but I also just don't have the space for it all. I didn't like CoCo's when the first came out, it wasn't until many years later that I rediscovered them. I wish I had given them more of a chance, they are indeed really nice systems. Yeah, prices these days are crazy.... was a time not long ago nobody wanted these old computers and they were dirt cheap, now they are in such high demand... Makes me wonder how many made it into trash bins... Kind of sad really. That's why I am excited about the X16, new "old" hardware!
  23. Here is the source code. voxel.zip contains the 65c02 assembly source code with the necessary data files (tables, heightmap). You can assemble it using the cc65 tools. There is a .bat file for Windows users to assemble the thing. simpleVoxel.zip is the tables generator. It computes the tables and displays a test render. You can't move around. This is a VS2017 C++ solution. It relies on the OneLoneCoder Pixel Game Engine to display the render. This game engine fits in a single header file. If you want to easily make games on a modern machine in C++ you should check it out! voxel.zip simpleVoxel.zip
    I consider this script a must-have in Aseprite!
    This reminds me of a "screensaver" I wrote in Turbo Pascal which had many modes based on polar coordinates - drawing spirals, "spyrographs," squiggly snakey lines crawling around, etc. It's neat to watch math make pictures. And I agree with your observation that the community could use some content for newbie-level members who aren't up to talking about bus timing, latches, compiler internals, etc. This program definitely fits the bill.
  24. I can understand this feeling. I had a ton of equipment when I was younger and in college, but then I "grew up" and it all "disappeared". Now I am, little by little, getting things here and there, but missing my old stuff. I acquired a couple of TRS-80 CoCo 2's, one had a bad joystick port. I know lots of people dump on this system, but I always thought it was a blast. Love the old Loadrunner so got it up and playing. Created a joystick using a ATTiny85 and some leftover arcade parts. Trying for a Toshiba T1000 now. Really miss the 8088/8086 processor. I don't think I will get much more that this though. Other than the Commander x16 when it arrives!! About 10-20 years ago you could pretty much get anything you wanted for a decent price, but today I see mangled systems going for 100's. Sign of the times I guess. Have a great day everyone!
  25. I still have old college papers produced on a C64 (actually a 128 in C64 mode) using Word Writer 6 (or 5, I forget) and an MPS1200 -- actually a really nice rebadged letter quality high pin dot matrix. It really worked nice and was half the weight of my old DPS 1101 daisy wheel monster. Of course, I think like everyone I also did plenty in years prior using Speedscript after typing the damn thing in myownself!
  26. Hi Scott, I'm sorry myself if I came across as miffed or something. You had described so precisely the approach I had taken to avoid the pitfall that @ZeroByte correctly pointed out that "That's exactly what I'm doing" jumped into my mind and keyboard. Rereading it, I realize that it has a ring to it that I hadn't intended. Thanks again to both of you, this was very helpful input.
  1. Load more activity
  • Create New...

Important Information

Please review our Terms of Use