Jump to content

Blogs

Our community blogs

  1. During a discussion with @SvOlli about how to optimize calculations required for a low-res, playfield based plasma effect within a 512 byte demo for the 2600, I started coding myself to verify my own ideas. This eventually led to the current code.

    Usually the plasma effect is created by combining sine waves. Since one of the goals was to use only minimal ROM space, I started by using precalculated, small sine tables. This worked OK, but still needed some ROM space and also a lot of checks in the code when wrapping around the table index. This also affected my second goal negatively: display as many scanlines with the highest vertical resolution possible. While looking for improvements, I found this website, which uses easy to calculate parabolas for generating sine tables. A stock 2600 cannot make use of this, due to the limited RAM. But Svolli wanted to use CommaVid bankswitching, which allows up to 2K of RAM. Great! After a little optimizing, I came up with the following code. Since it is placed right after the initial clear loop, A and X are 0 already, so that saves a few bytes too.

     

        ldy     #$3f                ; A = X = 0!
    ; Accumulate the delta (normal 16-bit addition):
    .loopSine
    ; Reflect the value around for a sine wave:
    ;    clc                         ; this makes no difference
        pha                         ; = .delta
        adc     .value				
        sta     .value
        lda     .delta+1
        adc     .value+1
        sta     .value+1
        sta     SinLstW + $c0,x
        sta     SinLstW + $80,y
        eor     #$7f
        sta     SinLstW + $40,x
        sta     SinLstW + $00,y
    ; Increase the delta, which creates the "acceleration" for a parabola:
        pla                         ; = .delta
        adc     #$08                ; this value adds up to the proper amplitude
        bcc     .skipHi
        inc     .delta+1
    .skipHi
    ; Loop:
        inx
        dey
        bpl     .loopSine

    The result is a 256 bytes sine table, ranging from 0 to 127. So now we have a large table which automatically wraps around. Nice.

     

    For creating the plasma effect, several sines with different offset and frequency have to be combined. Svolli's idea was to aggregate two sines per axis. And then aggregate the results per playfield pixel. If that result overflows (carry set), the pixel would be set. Even for a mirrored playfield, the number of calculations required for the final aggregates exceed the available CPU time by far. So the plan was (and still is), to do that on-the-fly during kernel display. Here is an excerpt of the original code:

    LoopKernel
        lda   YSinLst,y  	; from CV RAM, e.g. 50 aggregated sine values
        tay               
        adc   xSinLst+19	; from ZP-RAM, 20 aggregated sine values
        ror   .tmpPF0
        tya
        adc   xSinLst+18
        ror   .tmpPF0
        tya
        adc   xSinLst+17
        ror   .tmpPF0
        ...			; and so on for 20 pixel and 3 PF registers
        lda   .tmpPF0
        sta   PF0  

    This fully unrolled code would need 10 cycles per pixel for the sine list aggregation. So that's 200 cycles already, and with some overhead (e.g. colors), it would barely fit into 3 scanlines, and most likely need 4 scanlines. That's when Svolli contacted me, asking if I have any ideas how to optimize this.

     

    Since I had never coded the effect, initially I barely understood all the details. :) But somewhere in the back of my mind I had the idea that there must be a simpler solution. I first thought about using deltas in xSinLst to avoid the TYA, and this would have saved 2 cycles per calculation. But then I came up with something completely different. Instead of adding the two sine lists, due to their symmetric nature, subtracting them might work as well. And since we only need the carry flag, we could use CMP instead of SBC. Which means we could use A for aggregating the carries. Here is the new, faster code:

        ldy     #KERNEH_H-1
    LoopKernel                      
        ldx     YSinLst,y           
        cpx     xSinLst+19          
        ror                         
        cpx     xSinLst+18          
        ror                         
        cpx     xSinLst+17          
        ror
        ...
        sta	    PF0

    Now each pixel requires only 5 cycles, 50% saved! :) Which makes the code fit into just two scanlines now. But does it really work? Svolli was not convinced, so I started coding myself to test the idea. The initial results where OK, but no exactly what I was expecting. But that was due to a lack of understanding of how to prepare the sine lists. Svolli was kind enough to give me some detailed explanations. Later it turned out, that the new kernel code works almost exactly like the original code. Just that everything is shifted by 180°. Which doesn't matter for the plasma effect at all.

     

    The missing piece was the calculation of the sine lists for X and Y axis. Since we combine two sine tables per axis with varying offsets, we first have to change their offset each frame. To make movement smooth, 16 bit math is used here. So that's four 16 bit additions. Again we can make use of the 256 byte table size to ignore any overflow checks. And then I had the idea, that we could do eight 8 bit additions instead. Which makes the loop a bit smaller and saves some bytes. I only had to rearrange the variables a bit.

    offsetLst       ds NUM_SPEEDS*2
    xOffsetAHi      = offsetLst
    ;xOffsetALo      = offsetLst+1
    xOffsetBHi      = offsetLst+2
    ;xOffsetBLo      = offsetLst+3
    yOffsetAHi      = offsetLst+4
    ;yOffsetALo      = offsetLst+5
    yOffsetBHi      = offsetLst+6
    ;yOffsetBLo      = offsetLst+7 
        ...
        ldx     #8-1
    .loopOffsets
        lda     offsetLst,x        
        adc     SpeedTbl,x         
        sta     offsetLst,x        
        dex                        
        bpl     .loopOffsets

    Pretty simple.

     

    What's left now, are the final calculations of the two sine lists from two sine tables each. This is pretty time consuming, as we have to do 20 calculations for the X-axis and about 100 calculations for the Y-axis.

     

    Since the X-axis goes into ZP-RAM and I need X and Y registers for the offsets, I make heavy use of the stack pointer here. For that I did put the list at the beginning of the ZP-RAM, so that I can now easily check the N-flag in the loop branch. 

    ; setup X-list:
    ; A = xOffsetAHi from previous code          
        ldx     #xSinLst+PF_BITS-1  ; 2
        txs                         ; 2             SP also used as loop counter     
        ldy     xOffsetBHi          ; 3 =  7
    LoopCopyX
        tax                         ; 2
    ;    clc                         ; 2		
        lda     SinLst,x            ; 4
        adc     SinLst,y            ; 4     
        pha                         ; 3     
        tya                         ; 2 = 15
        adc     #13                 ; 2
        tay                         ; 2     
        txa                         ; 2
    ;    clc                         ; 2      
        adc     #-11                ; 2 = 8 
        tsx                         ; 2
        bmi     LoopCopyX           ; 3/2= 5/4

    That's 28 cycles per loop. Nice!

     

    Adding 13/-11 to the offsets for each column simulates using sinus tables of higher frequencies. So we can use our single 256 bytes sinus table here too. The values used for adding are arbitrary chosen, they just have to look nice. The code ignores clearing the carry flags, because I found that the differences are hardly noticeable, only of you look very closely. Since my goal is to minimize the ROM space, this is an acceptable compromise, IMO.

     

    Now to the Y-axis. Here we have to do the same calculation for about 100 values, so this is very time consuming. Especially since I cannot use the stack pointer, so I have to use variables to keep track. Initially I planned to put the previous code into Overscan and the Y-axis calculations into VBlank. But then I would have wasted some remaining CPU time in Overscan. But I wanted to display as many scanlines of plasma as possible. So I had to split the calculation between Overscan and VBlank. Doubling the code was out of question, and a subroutine would have made the code more complex and slower. Then I had the idea, that I could check the timer during the loop, do the VSync when it is due and continue with the loop. The timer check would have cost me extra cycles, but the extra CPU time gained from Overhead made more than up for that. Still the timer check was bugging me, since reading INTIM takes 4 cycles. Eventually I realized that all my code execution timings are constant (or can be made constant), so I don't need the timers are all!

    ; setup Y-list:
    .tmpX       = tmpVars
        lda     yOffsetAHi          ; 3
        sta     .tmpX               ; 3
        ldy     yOffsetBHi          ; 3
        ldx     #KERNEL_H-1         ; 2 =  8
    LoopCopyY
        txs                         ; 2 =  2
        dec     .tmpX               ; 5
        ldx     .tmpX               ; 3
        tya                         ; 2
        adc     #5                  ; 2
        tay                         ; 2 = 14
    ;    clc			 ; 2
        lda     SinLst,x            ; 4
        adc     SinLst,y            ; 4 =  8
        tsx                         ; 2
        sta     YSinLstW,x          ; 5 =  7
    ; Instead of splitting the loop, do the vertical sync in the middle of the loop.
    ; This maximizes the available CPU time for the loop and minimizes the code.
        cpx     #OVERSCAN_X         ; 2
        bne     .skipVSync          ; 3/2= 5/4
        lda     #%1110              ;           each '1' bits generate a VSYNC ON line (bits 1..3)
    .loopVSync
        sta     WSYNC               ;           1st '0' bit resets Vsync, 2nd '0' bit exits loop
        sta     VSYNC
        lsr
        bne     .loopVSync          ;           branch until VSYNC has been reset
    .skipVSync
        dex                         ; 2
        bpl     LoopCopyY           ; 3/2= 5/4

    41 cycles per loop, ~3977 cycles (~53.3 scanlines) in total. That would have never fit into Overscan only, even if we deduct the 5 extra cycles for the VSync check.

     

    Finally I just have to waste the few remaining cycles (~150):

        ldx     #VBLANK_X           ;           waste remaining time
    .waitTim
        dex
        bne     .waitTim
        sta     WSYNC

     

    For now, everything was just black and white, which looked pretty dull, even with animation:

    NoColor_1.thumb.png.e480e68e8516f7d34afecfd95a7fbbcf.png NoColor_2.thumb.png.ec60bcd4a80cbf64c7eaba826d5a9fa6.png

    But the kernel code had ~25 cycles free within its two scanlines. By rearranging the code a bit, I was able to merge the free cycles into one block. And after a bit of experimenting, I came up some code which mixes the values of PF1 and X. Not exactly what plasma usually looks like, but still nice looking. Maybe one could use a precalculated a color table here, but what do I know. :) 

     

    ; A = PF1, X = YSinLst,y
        and     #$60                ; 2         ;  0, 2, 4, 6
        adc     colorOr             ; 3         ; +2, 3, 4, 5, 6 
        sta     .tmpCol             ; 3         ;  2..12
        txa                         ; 2
        lsr                         ; 2
        lsr                         ; 2
        lsr                         ; 2
        lsr                         ; 2
        ora     .tmpCol             ; 3
        sta.w   COLUPF              ; 4 = 25    @17     

    To make the colors move lively, I change colorOr every 256 frames:

        inc     frameCnt            ; 5
    ; update color
        bne     .skipColor          ; 3/2= 8/7
        lda     colorOr             ; 3
        cmp     #$50                ; 2
        bcc     .ok                 ; 2/3
        sbc     #$50+1              ; 2
    .ok
        adc     #$20                ; 2
        sta     colorOr             ; 3                 $28..$68
    .skipColor      

    That looks much more interesting:

    Color_1.thumb.png.75b38ea146937380d6c186b49eb0a436.png Color_2.thumb.png.92e0b553ccdaa0ab3779e0267e24990b.png

     

    One last little trick is, that I use BRK to jump back to the begin of the main loop.

     

    Now, what's the final result? The minimal code (no color) needs exactly 247 bytes, with colors added ~30 bytes more. And in the end I managed to display 97 double scanlines (NTSC, 117 for PAL). So a nice demo with sound and some bells and whistles within 512 bytes seems very double.

     

    I also experimented with a 32 pixel wide, non-mirrored playfield, but that takes at least 385 bytes and halves the vertical resolution:

    image.thumb.png.a24220eda253bf227fe8b0ad9253f062.png

    Anyway, I am no demo coder, so I stopped here. But I learned some new tricks, which I can maybe use in the future.

     

    I have attached some ROMs and source code files. PlasmaCompact.asm shows the cleaned code, with all options and further distracting stuff removed. Then I have the same code, prepared for PAL and NTSC, and with some assembler options. I also added my code for the non-mirrored playfield. And last not least, a version with Svolli's nice full coloring.

    Plasma_FC.thumb.png.538d693734d3ab9d057ef3ea9c15d637.png

     

    The ROMs show the results with all options enabled, which means you can change the settings with the joystick:

    • With left difficulty = B you can change the offset steps within the setup loops. Left and right for X offset steps, up and down for Y offset steps. Since there are two values each, you change be 2nd value by holding the fire button.
    • With left difficulty = A you can change the speed of the initial offset changes. Again, left and right for X offset speeds, up and down for Y offset speeds. And since there are two values each here too, use the fire button for the 2nd one.
    • By using RESET, you can reset all settings to their initial values. 

     

    The effects of the changes are hard to describe. But when you experiment with them, you will get an idea. Here is an example:

    image.thumb.png.87cd2139e7cc7f2ee770f8d467280c83.png

    I hope that made sense or you have at least some fun playing with the plasma effect.

     

    Thanks to @SvOlli for contacting me and helping me out quite a lot. Therefore I respectfully waited with the release of this entry until after the Nordlicht 2023 demo party (September 8. - 10.), where he successfully presented his demo.

     

     

    Plasma.bin Plasma.asm PlasmaCompact.bin PlasmaCompact.asm PlasmaAsym.bin PlasmaAsym.asm Plasma_FC.bin Plasma_FC.asm

  2. Yes, that blog title is hinting at the subject of this post. Care to take a guess? Ok, yes, it was obvious to anyone with half a functioning brain that I'm referring to the Atari VCS, of which I am now a proud and unworthy user. As you can see by my thread in the VCS forum, I purchased this last December when Atari had a big sale going on, but didn't hook it up then because I simply didn't have room to do so. Fast forward about 9 months or so, and the recent news about Atari purchasing this very website has kind of lit a flame under my rear, and one of the consequences of that was me finally getting around to hooking up the box.

     

    Well, you can read my impressions of it in that thread if you want to know what I think. It's both a car crash and a miracle rolled up into one piece of technology, and I'm having quite a good time with it so far, despite its obvious flaws. There's tons of unrealized potential in this box, but at the same time just looking at it fills me with excitement....it's really hard to explain. Should I be enjoying it as much as I am? Probably not, and let's face it, there are plenty of good and valid reasons to find it an utter disappointment. The system has plenty of glitches and bugs that drive me to the point of insanity at times, such as my controller not wanting to sync up for a full minute despite the fact that it actually wakes up the unit (explain that to me, someone, PLEASE), the fact that I sometimes have to double-press the A button on the home screen to open a game, the default settings for MAME in 7800 games being far less than ideal....the list of problems goes on and on and on.

     

    Yet....I can't stop playing with it, going round after round in Amoeba Jump, doing a few rounds of Caverns of Mars Recharged, or getting my butt kicked in Donut Dodo, I've spent far more time the last 3 days playing on this system than I have spent on my Wii in the last month. It's crazy. Maybe it's that glowing fuji that's putting so much joy into me? Maybe it's the promise of what could come of this iteration of Atari in the future? And actually, that last bit I think hits the nail on the head. I'm feeling inspiration from my all-time favorite brand that puts me back to how I felt as a kid when I first played on the Atari 2600, or when I first opened a present on Christmas to find a 130XE, or when I walked into Babbage's first thing after getting home from boot camp to buy my Atari Jaguar, or even the first day I discovered this website. It's the magic of Atari being rekindled in me for some strange reason, giving a person who feels stuck at the moment in life the swift kick in the ass they need to make something good happen. And I think that's best thing that this little black box that somewhat resembles a Vader 2600 could possibly give to me.

     

  3. I wanted to play NSMBW for the first (kinda) time, in anticipation of the upcoming Super Mario Wonder. I did not feel like shaking the Wii remote though, and looked up other control options for actual hardware. (emulator can work around this pretty easy)

    It looked like from some googling, there was an ocarina cheat code to use with wii USB loaders (on your own backed up disc) that would allow one to use a classic controller.
     

    Enable Classic Controller [Thomas83Lin]
    
    C21EB5B8 00000020
    38210050 7C0802A6
    80BA0060 48000041
    809A0000 7CA52378
    90BA0000 80BA0064
    4800002D 809A0004
    7CA52378 90BA0004
    80BA0068 48000019
    809A0008 7CA52378
    90BA0008 7C0803A6
    4E800020 70A40200  --> possible R button line
    2C040000 4182000C
    3CC07FC0 90DA0010
    38C00000 70A40800
    2C040000 41820008
    60C68000 70A40020 --> possible Y button line
    2C040000 41820008
    60C60200 70A40040  --> possible B button line
    2C040000 41820008
    60C60100 70A40001
    2C040000 41820008
    60C60002 70A40002
    2C040000 41820008
    60C60008 70A48000
    2C040000 41820008
    60C60004 70A44000
    2C040000 41820008
    60C60001 70A40400
    2C040000 41820008
    60C60010 70A41000
    2C040000 41820008
    60C61000 7CC53378
    60000000 00000000
    041EAE30 39800000
    041EAE34 91840000
    04019EE0 38000000
    040B3B30 38000000
    2076DBA8 8804A2DC
    0476DBA8 38000000
    2076DBE9 8804A2DC
    0476DBE8 38000000
    E0000000 80008000

     

    You'll notice some comments about "possible" button mappings.

    The controller mapping is Y run, B jump, and R shake. This is fine for the original Classic Controller, but I didn't want to use that controller since the analog shoulder buttons aren't that comfy to use.

    Ideally I would want to use a Classic Controller Pro, and use ZR for shake since nintendo changed that to the "main" shoulder button (a weird change that persists to today on Switch Pro Controller)

     

    There was some information online about remapping the buttons in another game, DKCR, with another Classic Controller Code by Thomas83Lin, that made sense but didn't seem completely applicable, from reddit.

    The responder mentioned "Classic Controller Button Activator = 28200F0A 0000XXXX." , but the first line in the cheat "28200F0A" wasn't in the DKCR nor NSMBW cheat.

    This thread does also link an article about the cheat code however, ( http://www.pixlbit.com/news?action=showNewsArticle&newsArticleId=1037 ) which contains comments showing what button binds go with each line of code.

    Classic Controller Support (v2)
    C24A5F70 00000020
    38210050 7C0802A6
    80B50060 48000041
    80950000 7CA52378
    90B50000 80B50064
    4800002D 80950004
    7CA52378 90B50004
    80B50068 48000019
    80950008 7CA52378
    90B50008 7C0803A6
    4E800020 70A40020 --> button (in this case Y) which triggers the shake
    2C040000 4182000C
    38C0012D B0D50186
    38C00000 70A40800
    2C040000 41820008
    60C68000 70A40200 --> button (in this case R) which simulates a 1 press
    2C040000 41820008
    60C60200 70A40040 --> button (in this case B) which simulates a 2 press
    2C040000 41820008
    60C60100 70A40001
    2C040000 41820008
    60C60002 70A40002
    2C040000 41820008
    60C60008 70A48000
    2C040000 41820008
    60C60004 70A44000
    2C040000 41820008
    60C60001 70A40400
    2C040000 41820008
    60C60010 70A41000
    2C040000 41820008
    60C61000 7CC53378
    60000000 00000000
    04389B90 38A00000
    0438710C 28000009

     

    I searched for similar lines in the NSBMW cheat, which led me to find "70A40200" was the R button bind in the cheat code. I substituted the ZR button activator, giving me "70A40004", and the following code.

    New Super Mario Bros Wii
    Enable Classic Controller ZR Mod [Thomas83Lin + Firestarw]
    C21EB5B8 00000020
    38210050 7C0802A6
    80BA0060 48000041
    809A0000 7CA52378
    90BA0000 80BA0064
    4800002D 809A0004
    7CA52378 90BA0004
    80BA0068 48000019
    809A0008 7CA52378
    90BA0008 7C0803A6
    4E800020 70A40004  --> ZR button = shake
    2C040000 4182000C
    3CC07FC0 90DA0010
    38C00000 70A40800
    2C040000 41820008
    60C68000 70A40020 --> Y button = Run
    2C040000 41820008
    60C60200 70A40040  --> B button = Jump
    2C040000 41820008
    60C60100 70A40001
    2C040000 41820008
    60C60002 70A40002
    2C040000 41820008
    60C60008 70A48000
    2C040000 41820008
    60C60004 70A44000
    2C040000 41820008
    60C60001 70A40400
    2C040000 41820008
    60C60010 70A41000
    2C040000 41820008
    60C61000 7CC53378
    60000000 00000000
    041EAE30 39800000
    041EAE34 91840000
    04019EE0 38000000
    040B3B30 38000000
    2076DBA8 8804A2DC
    0476DBA8 38000000
    2076DBE9 8804A2DC
    0476DBE8 38000000
    E0000000 80008000

    If you want to change any binds yourself, here's the button activator codes from the reddit thread:

    XXXX Values:
    0001: Up DPAD.
    0002: Left DPAD.
    4000: Down DPAD.
    8000: Right DPAD.
    1000: Minus (Select)
    0800: Home.
    0400: Plus (Start)
    0008: X.
    0020: Y.
    0040: B.
    0010: A.
    2000: L.
    0080: ZL.
    0200: R.
    0004: ZR.

     

    Hope this helps anyone wanting to play NSMBW on Wii or WiiU. Alternatively you could play in emulator with a Switch Pro controller or some other 2D controller with motion controls, and a good controller experience while also being able to use the tilt controls for a few levels, since this classic controller code can't implement that.

     

  4. It has been a while since I have written one of my blog entries about the technical challenges of making my RPG "Penult" for the Atari 2600. By far my biggest challenge has been making the game with the extreme memory constraints of the console, so this entry will discuss how I dealt with those issues.

     

    RPGs tend to be very memory-hungry. You need to keep track of a character's name, stats, inventory, experience, location, current state, etc. If there are multiple party members, these need to be tracked for each character. The Atari 2600, on the other hand, only has 128 bytes of RAM. For Penult, I am using a cartridge format that lets me double that, for a total of 256 bytes of RAM, or one quarter of a kilobyte. Over half of this RAM is used to track the tiles currently displayed on the viewport portion of the screen as well as the text characters in the two text lines below the viewport. The visible map is 12 tiles wide by 7 tiles tall, for a total of 84 tiles. The text lines below the viewport are each 24 characters long, or 48 for both. All of these together take up 132 bytes of the 256 bytes available, leaving 124 bytes remaining.

     

    The Stack

    On the Atari 2600, stack space comes from the same limited pool of RAM. Every subroutine call takes two bytes to store the return address of that routine on the stack. Due to the extremely limited RAM available, I was careful to never use more than 4 bytes of stack space, which means never having more than two levels of nested subroutines. Allowing 4 bytes for the stack means that the actual amount of RAM available for the game is only 120 bytes.

     

    Hero Name and Gender

    When you only have 120 bytes of RAM to work with to make an RPG, even allowing the player name their character seems daunting, as that name would have to be stored in RAM. I considered having the hero already be named, or letting the player choose from a variety of pregenerated names, but these options didn't appeal to me for the style of game I was making. In the end, I allowed players to use up to 6 letters for the hero's name, and I have code to compress this along with the choice of gender down to 4 bytes of RAM.

     

    Companions

    With extremely limited RAM, having a party of characters each with their own stats simply isn't feasible. Even a single companion would require at least 16 bytes to keep track of stats, equipment, etc. However, having the hero adventure alone didn't fit the style of game I was trying to make, either.

    My solution was to have the hero have a small fey dragon companion that under the hood shared most of the hero's stats, and didn't need any of its own equipment. The dragon e.g. has the same maximum hit points as the hero, and always starts with maximum hit points at the beginning of combat. The hero's level is used for things like attack roll modifiers in combat. Finally, the power of the dragon's abilities is based on the hero's game stats. E.g. if the hero has a high strength, then the dragon's bite will do more damage, or if the hero has a high intelligence, then the dragon's breath will be more damaging, and its heal ability will heal more hit points with each usage. This also has the side effect of having the dragon companion of different heroes have different strengths and weaknesses, and it also means that dragon's effectiveness will automatically increase as the hero becomes more powerful.

     

    Single-bit Variables

    A byte has 8 bits, and I keep track of as much as I can in the game with bits instead of bytes. I use 7 bytes to effectively make 56 single-byte variables in the game to save RAM (actually more than this since some bits end up getting reused in different parts of the game).

     

    Temp Variables

    Since the Atari 2600 doesn't have screen memory, a character display, etc, 28 bytes of RAM is used to build and display the 96-pixel visible screen kernel that I use for the viewport and text lines. Since these bytes do not have to maintain their values after the screen is drawn, it means they are available in other parts of the code to use as temp variables. Whenever I can, I make heavy use of temp variables in my code to avoid reserving more of the very limited RAM for permanent variables.


    Variable Reuse

    Also to save RAM, there are many variables that get used for multiple purposes. E.g. variables that are used in combat may be used for other purposes out of combat. This can be tricky to do correctly to avoid situations where both variable values would be needed at the same time, but is vital to avoid running out of RAM.


    Combat

    Combat can use up a lot of RAM since you need to track the position and hit points of each opponent in addition to the hero and fey dragon companion. For this reason, there are never more than four opponents on the screen. Even enemies that can spawn more of their kind only do so when there are less than four of them on the screen. I also save seven bytes by encoding the X and Y positions of the combatants and any active missile in a single byte instead of using a byte to track each axis.


    Static Map

    Games like Ultima have cities where people wander around, and outdoor areas where you see monsters roaming the land. Doing this in my game definitely wasn't feasible, since this would require a huge amount of RAM to track all of these NPC and monster positions. Instead, the town maps have NPCs with fixed positions on the map, and the outdoor map doesn't show opponents until you encounter them.

     

    Also for reasons of limited RAM, the game can only track one ship at a time. If one becomes inaccessible and a new one is purchased to replace it, then the old one is lost.


    Simplified Inventory

    The game keeps track of the hero's melee weapon, ranged weapon (if any), armor, and a few miscellaneous items. If e.g. their armor is upgraded from leather to chain, then it is presumed that the old suit gets donated to that city's defense effort. This greatly streamlines inventory management and vendor interactions, but more importantly it saves a ton of RAM by not having to track unused equipment.

     

    Dungeon State

    Dungeons in Penult are 8 levels of 16x16 tiles. I wanted to have treasure chests that could be looted, and the game would keep track of which chests have already been looted and which ones hadn't. As there could be chests in any location on any level, there simply isn't enough RAM to keep track of all of these in a normal fashion. The solution I came up with is in a separate blog entry: The Problem of 2048 Treasure Chests.

     

    While there were sacrifices that needed to be made along the way, all and all I am quite happy with how much of an "Ultima RPG feel" I was able to create with the limited resources I had to work with.

  5. Download or listen to the podcast episode at atarijaguargamebygame.libsyn.com/s03-atari-50-the-anniversary-celebration

    Wait, another Atari game compilation? Is there anything to distinguish Atari 50: The Anniversary Celebration from all those that came before? Is it worth our time and money? Do these people even get why we so love Atari? Tempest 2000 answers these questions for us: "YES! YES! YES!"

    This deep dive into Atari 50 walks through the entire experience, not just Jaguar, but reviewing "re-imagined," analyzing arcade games, perusing the platforms, and tackling the timeline. Some bugs are found, sure, but also a few delightful surprises.

    Also included is feedback from Richard, Nick, and Editorb!

    Show Notes


    General Links


    Forums


    Game Links


    Developer, Distributor, and Development

     


    Gameplay & Graphics Notes


    Cheat Codes

     


    Reviews


    Other Media/Culture References


    Podcast references


    Personal Opinions


    Listener Feedback


    Storytime


    Extra

     


    Next up: JaguarCD and Virtual Light Machine!

     

     

  6. [#053] vacationing in early June, one particular evening my entire family sans me and my youngest daughter went to some dinner that I didn't want to go to and didn't feel like the 5-year-old would be on her best behavior. she's normally good but it's something about restaurants where she can't sit still through a whole meal and wants to walk around or sit on my lap or run her mouth (that last part she does 24/7, even talking in her sleep).

     

    anyway, we went to the local mall and into a bookstore. i picked out a true crime book called "Evil Women" for as a birthday present for my wife. she likes that kind of stuff (so do I; huge fan of Forensic Files on PlutoTV). then there was another book that caught my eye. a hardcover action/thriller story called Final Option. I've been meaning to pick up something like that from either Tom Clancy or Clive Cussler or that other guy who's name I can't remember at the moment. James Patterson, i think.

     

    i don't remember what book or toy i bought my daughter but after the bookstore we hit Chik-Fil-A (her favorite) and then got slices of cookie cake from Great American Cookie Company. on the way out I stopped at a vape shop and bought this thing called Pod King, bubble berry flavor. i've never owned a "douche-flute" but i've been intrigued by all the different flavors and a neighbor let my try his blueberry one last summer. that thing was as big as a small bong. the Pod King is a small device about the size of a box of TicTacs. in hindsight, i should have checked for something vanilla-flavored because back in the early 2000s, Camel used to make Vanilla Turkish Blend cigs. they came in a tin. those things were amazing.

     

    fast-forward to the Cussler book I bought. I didn't notice the text "Oregon Series" on the cover. surely this wasn't the first book of the series so I had to research the list of titles. well i definitely bit off more than i can chew as this series has 17 books in it, with the last two being written by someone else but still carrying Cussler's name in bold on the cover even though he died a few years ago. Final Option is Book 14. i put the hardcover in one of my bags and forgot about it until I got home from vacation.

     

    within a few days i found myself at a second-hand store called 2nd & Charles in my city, and I walked out with six books (1, 3, 4, 6, 7, 11) from the series. some eBay and Thriftbooks later, I have 14 of the 17 titles and no rush to buy the final three because i've got a lot of pages ahead of me... a bit about me and books - i get distracted easily, and if i can't visualize a sentence i have to reread it, sometimes multiple times. sometimes my mind drifts off and i've looked through a whole paragraph without absorbing any of it. with two young girls in the house i have to either wait until at least the younger one (the chatterbox) is asleep, or i'll put on my old soupcan headphones (the ones that completely cover your ears) and play some white noise from the YouTube app to drown out the sounds of the house,

     

    anyway, I spent less than $80 on all these titles, all used, most of them in near-perfect condition. I also have a kindle paperwhite (or whatever it's called) collecting dust. i like actual books, when i do have the time to read them.

     

    I'm currently 1/3 through the second book, called Sacred Stone.

     

     

    Here's my thoughts on book one, Golden Buddha:

     

    There is one page of backstory; the main character is a guy named Juan Cabrillo who along with a very large team of players, work various missions from their technologically-advanced ship called the Oregon. on the outside it looks like a rust bucket. even the main deck is dirty, stinks, and various things inoperable. below deck is where all the magic is and where all the members work, eat, and sleep. It's kind of like taking the team from the Mission: Impossible tv series, adding a ton more people, and putting them in the water. The ship also houses a helicopter and several small boats of varying sizes.

     

    There are two main objectives in this story, the first being removing the Dalai Lama from exile back into Tibet where he belongs. The other is recovering a 600 lb Buddha statue made of solid gold, which changes hands several times, with some worthless decoy statues sprinkled in.

     

    This story was mostly engaging, jumping from scenario A to scenario B, to C, back to A, etcetera, but overall slow-paced. at times I kept thinking to myself "what in the hell is going on?" In 420 pages, only two or three scenes were page-turners, my favorite being the guys stuck in the sewers on inflatable rafts. one raft held the statue and one guy, the other raft holding two guys, one with injured ribs. there was a hard rain and the water level kept rising while the current blasted them into walls while they were pushed to the outlet. the quick-rising water gave them panic as there was less and less space to keep their heads up to prevent drowning while still trying to maneuver the inflatables. meanwhile a rescue team presumed them dead and was going to abandon them at a certain time. then you had the local police pouring paint into the sewer as a means of tracking them down by figuring out which tunnel draining into the ocean would start having paint spew out.

     

    i'm doing that whole substory an injustice with what i just typed in the previous paragraph, but that was a wild ride.

     

    I remember having like 40 pages left and there was still so much that needed to happen for the mission to be completed. the final confrontation was not as epic as one would imagine, in fact it was a lot more realistic. one bridge was blocked, effectively taking out one of two armies; a few fighter jets taken down immediately; the crook who double-crossed another crook was quietly murdered by a hired hand while on his way to salvation from his former identity.

     

    What I hope to see in the next books is more character development for the people who are not Juan Cabrillo. I spent a whole book with close to three dozen people and I can only really imagine five or six in both personality and appearance.

     

    There's another brand new book that caught my interest called The Wager, by a different author. This one is non-fiction, historical accounts of a shipwreck and a crew turning on each other. That sounds amazing. However, it will wait. I'm going to finish this Oregon series. Even if it takes me 5 years.

     

    The best thing that came out of all of this is that my oldest daughter and I have reading time almost every night. truthfully, she peaces out after 20 minutes or so but that's a start. i can go two hours or so before i start zoning out for the night.

     

    Alright, this one's long enough. I hope someone out there enjoyed at least something from it.

     

    Edited (twice now) to correct typos.

  7. As a kid I enjoyed playing games, and would say " Not bad, but it could also use this..." As a teen I loved to use a sector editor to give me 1,000,000 points of energy (originally like 10,000) in the Adventure International Star Trek 3.5 game. I'd change wording in games, error messages into more funny messages, etc.

    In more recent times I've learned about sprite hacking programs (Hack-o-matic), Hex fiend, and other fan based tools that have made some dreams of game changing and altering come true. (Thank you fellow fans!) Lots of great advice from those here in the Atariage community.

    This is a list of games that I have had fun altering to date. I would say I got interesting starting 2014, but then all of this helped me grow in the computer/video game hobby.

    OTHER HACKS AND TINKERING
    1977

    • Dad had the Sol Terminal 20. Cool machine. Lots of Trek80 and Targ played.
    • Also had a 2600 rom reader on the Sol and a Flash cart.


    1978

    • We got a Sears Telegames system, which got us into Atari stuff.


    1980

    • Sold newspaper subscriptions and got my own Atari VCS.

    IMG_20220226_224625.thumb.jpg.7a67cad140ce1a4d910e4b376956f694.jpg
    1981

    • Sold the VCS, got a Atari 400. Was going to get a Colecovision but when I saw Choplifter, Miner2049er, and Archon I decided to get a computer. Also learned about floppy disks and piracy!


    1982

    • Later in this year got on my first computer BBS. Now I could get games over the phone! Whoo hoo!


    1984

    • Attended Atari user meetings at the Dallas Infomart for the Dal-ACE Meetings.


    1986

    • Dad had already upgraded the 400 to 48K, but installed a Atari 1400 keyboard from Radio Shack.

    20221127_100900.jpg.0217e16b522349fb2d8e636cbdbb70c1.jpg
    1989

    • Bear in mind, no Internet yet, really believed Atari was dead.
    • Saw a friend’s Mac SE with Dark Castle and managed to score a Mac 128K. Later would upgrade that to 4 MB.


    1993

    • I got onto the text Internet while in college computer labs.


    1994

    • While in Guam, scored a Mac Plus. Lots of BBSing while on the island.


    1995

    • I saw my first graphical Internet page on Mosiac. (Didn’t think it'd catch on.)
    • Dad gives me my first Newton 110 when I returned from Guam. At first didn’t know what to do with it.
    • First home Internet service through a BBS (Chrysalis BBS in Dallas)


    1996

    • Picked up a Performa 550 (68030) later upgraded to 68040 with math co-processor.


    1997

    • Picked up the amazing Newton 2000. 10x faster than my Newton 110.
    • Played video!
    • Started using graphical web browsers. (I was a slow adopter on that one.)


    1999

    • Out of college, found out Atari user group was still around. Borrowed 520 ST (upgraded to 4 mb) for newsletter.
    • Used Pagestream and had a laser printer!
    • First year to attend the First Saturday SideWalk Sale.


    2000

    • Managed to score an Atari TT030, Lynx, Atari Jaguar.
    • Atari user group folds due to having to move from the Infomart that they had for nearly fifteen years.
    • I learned of Bubsy Bobcat on the Jaguar!
    • Continued using TT030 alongside Performa 550 for Internet.
    • Featured in the Dallas Morning News: Atari Jaguar on front cover.
    • I met this local Dallas Amiga User Group (MCCC) as they were also in the newspaper article.


    2001

    • Got an IT job, used a Athlon 1 Ghz processor with Win98. Later used Linux.
    • Still tinkered with retro computers (Atari XE and ST).
    • Got my first DVD player as the spiritual successor to the Jaguar, the Nuon Samsung 2000.


    blogentry-4709-0-47543000-1550987006_thumb.jpg

    2002

    • Scored two Macintosh G3 Powerbooks for my wife and I. I was back in the Mac world using OS 9.
    • Attended the JagFest in St. Louis (while visiting wife's family). Saw the Korean version of the Nuon there as a contest prize.


    2003

    • Attended JagFest in 2003 in Austin, TX with KevMos3.
    • Joined Amiga User Group. They helped me get an Amiga 3000 working that I picked up at the 2002 JagFest. Even had a Ethernet card!


    2004

         Joined Atariage!!

    • Upgraded to OS X.3 on the Mac.


    2005

    • Won the retro-challenge (like the first or second year of it) using nothing but an Atari 800 for one month.
    • Figured out I didn’t need portable computing right before smart phones. My Newton 2000 and Duo Macs became used less.
    • I was handed a G4 12" 800 mhz Powerbook. Beautiful little computer! Well I was handed it in parts and I managed to reassemble it.
    • Tinkered heavy in the Dreamcast after a friend showed me that system.
    • For the next five years lots of calling BBSs and Internet with beige Atari 800. Many discussions over Atariage and Atari IRC channels.



    2006
    Worked with Warerat on testing XL memory on the Atari 800.

    Lots of chatting at Atarinews.org on Tuesdays.

    Put an archive of the Dal-ACE disks online.
    2008
    Started the Bubsy Bobcat Fan Blog

    Testing of Atari800DC version 0.77 for the Dreamcast with Christian Groessler.

    Gauntlet by Donald R. Lebeau. Thing I like about Atariage are the authors that show up from time to time. Shortly after he showed had a High Score Club contest and Donald offered a signed copy of some game art. I blasted every pixel I could to get that. As of 2022 the score still stands...
    GAUNTLETAK (Graphics:6 Sound:7 Playability:8 HSCR *8*) doctorclu : 1235025 [5-4]
    2110575680_ScreenShot2022-11-27at9_18_49AM.png.551e6f219a88f0d2b8790635e702fe37.png

    2009
    Binary hacking and uncompression of Bubsy rom for the Jaguar.

    Picked up the Lynx Flash Cart.

    2010
    Dial-up/Telnet out set up at the Prison Board BBS

    Was the first to come up with a shell for the Jaguar's Skunkboard. Also created a photoshop prank where I claimed to use the clear case from a Battlesphere Gold cartridge. Only did that joke for a few hours but the outrage was priceless.

    Got a Macbook Pro dual Core processor laptop in parts. Fixed it up. Hated it. Traded for 1.2 Ghz G4 12" laptop. Used that G4 through my time in Kuwait along with a 1.4 Ghz G4 Mac Mini.

    2011
    My first Android device, the Archos 32, and my first experience with Angry Birds! Picked up the device while in Kuwait.

    There was a certain joy of posting "Happy 2011" on a Atari BBS. Seemed surreal to myself and others.

    Did a photoshop of a Jaguar and CD for a more streamline appearance.

    I beat Cybermorph a second time.

    IRC chat more commonly used for Atari chat.
    2012
    Wondered if there was a way to piggy back memory on the ECS?

    Got my first Intel iMac 1.5 Ghz from a sidewalk sale.

    Bought the Incogneto boards from Candle while in Kuwait.

    Had at time the unbeatable 5200 HSC Gyruss score of 279,850.

    2013
    Installed one Incogneto board while snowed out of work for three days.

    The year I achived Star Commander Class 1 in Star Raiders.
    The year I beat Blue Max.


    2014
    BBSing
    Veered away from Atari 800 use after experiencing overheating problems after installing Incogneto board.

    Oh 04 January 2014 connected an Intellivision with ECS and Cuttle Cart 3 to a modem using the terminal program by Joe Zbiciak


    Video shows the end of the first known time for an Intellivision to call a BBS and records the second time such a thing had happened.
    blogentry-4709-0-25594300-1536857049.jpeg

    "1979 Calling the Internet..."
    Later the Intellivision dialed to a BBS and then telneted to a shell account getting on Atariage and posting a message. Good times!

    blogentry-4709-0-04319100-1550994597_thumb.png
    The proto Dual Action Controller

    I was listening to the Intellivisionaries Podcast and they talked about how you cannot move and fire the disc with the same controller. Came up with the idea of put both mylar underlays in the same controller but cancelling out the upper or lower part of the underlays.

    blogentry-4709-0-56113200-1536857980.jpgblogentry-4709-0-87623200-1536858010.jpg

    Originally Intellivision 2 controllers were used which proved the point though a bit stiff. When the Intellivision Flashback came out however, well designed thin controllers worked quite well with this concept as Nurmix of the Intellivisionaries podcast would find out. Nurmix asked a few questions on the tinkering and then later tried the idea on the newer controllers and viola!!

    blogentry-4709-0-63241500-1536858151_thumb.jpg

    The research was later referenced by Nurmix in his dual-action controller thread. Nurmix converted Flashback controllers to the Dual-Action design, and the rest is history. So now many have had more fun at playing Night Stalker, Tron Deadly Discs, and AD&D thanks to my initial tinkering. Another fun addition, and first, I got to add to the Intellivision legacy.

    Battlestar Galactica (Intellivision) [Hack of Space Battle]
    blogentry-4709-0-44230300-1536857150.jpg

    Long before I was sprite hacking, I was hex and text hacking. This was a simple hack that taught me that as long as I stayed within the original character count given, you could hack information in a rom and it not break. Oh, and don't write over crucial instructions while you are doing it.

     

    • Picked up a Amiga 500 from a friend. Fixed it up to 8 MB and SD card slot. Then got a Amiga 1200.

     



    2015
    Hacked an Atari 400 keyboard to an Atari 800.
    Created the sounds for Joust and Moon Patrol which CyranoJ ported from the Atari ST to the Atari Jaguar. Made me extremely happy as those are my favorite arcade titles, and CJ was and is great to work with.

    Picked up a Macbook Air 1.8 Ghz from a friend. (What I'm using to write this.)

    2016


    2017
    Bubsy Kitt'N Kaboodle (Atari 2600) [Hack of Fast Eddie]
    blogentry-4709-0-14682200-1534696145.png
    This was the one that started it all. "Wouldn't it be fun to have Bubsy on my Atari Flashback Portable..." was the original idea. The handy tool of Hack-O-Matic was found, I had some guidance from fellow sprite hacker and friend Kevin, and off I went on adventures. Versions for the Atari 800, 5200, Vic 20, and Commodore 64 have also been hacked. And this has had the fun of being played in alpha versions on Atari 2600 emulators on the Atari Jaguar and Nuon as well.

    This game also turned into an unofficial way to advertise the release of the newest Bubsy game, the Woolies Strike Back. Actually helped get them a few more sales. :P
    blogentry-4709-0-21749500-1534695049_thumb.png
    Moon Patrol (Atari 2600)
    blogentry-4709-0-25983500-1534695050.png
    Hacking an already amazing hack that looked more like the Arcade, detail was given to make more arcade accurate enemies and eventually a buggy with three rolling wheels. :)

    During the summer and fall I helped on the Oregon Trail port to the Intellivision. Actually came up with the name "Oregon Bound" which I understand was later used for the TI port. Helped come up with some of the mini games and sound and music ideas for some segments. Was fun working with everyone on this game. :D
    blogentry-4709-0-11844600-1550968736_thumb.png

    Was also a lot of fun working with a group of people on the game AstroStorm programmed by Sporadic. I loved how the game had a very utility look and feel to the ship. And as I was playing said "wouldn't it be nice if we had ways to store powerups". Sporadic liked the idea and added that to his game.

    • Got the Sega Flashback Portable from Atgames, causing me to get into some tinkering on Sega Genesis.
    • To date, Bubsy Bobcat Fan Blog on Atariage has had 175,398 visitors.
    • Still call computer BBSs and write a blog on that as well.
    • And the MCCC Amiga user group in the Dallas/Fort Worth, TX area is still active with live YouTube broadcasts every month.



    2018
    Virtual VCS (Atari 2600 emulator for the Atari Jaguar)
    blogentry-4709-0-91510400-1534695760_thumb.png
    Pasting in game rom images into a program just thought to be a demo and finding some games that actually worked! :D

    Atari 800 emulator (Nuon)
    blogentry-4709-0-04109400-1534695747.jpg
    Same trick as above, replacing a built in game image in a burnable disc image with another game image. Got Return of Heracles to come up, though it doesn't play very far. Still fun to see that much.

    Battlestar Galactica (Atari 2600) [Hack of Space Attack]
    blogentry-4709-0-76420000-1534695050.png
    The following was Inspired by reading up on Space Battle for the Intellivision and after discovering that Space Attack for the Atari VCS works on the VCS emulator for the Jaguar. From that point on, the game was hacked to look and feel more like the show it was supposed to be based on in the first place: Battlestar Galactica. So this has changes in color to the enemy fire, the background color, the color the screen flashes when you ship explodes, the color of the squadrons, and of course sprites. Took a bit to track all that down. :D

    Miner 2049er (Atari 2600) [Hack of Miner 2049er and Miner 2049er II]
    blogentry-4709-0-41888400-1534695360.png
    Played first on the Retron 77 as part of a collection, I found the initial game had a surprising amount of detail of the Atari 800 version for a Atari 2600 game. But the character sprite didn't even have Bounty Bob's hat. So sprites were altered based on the Atari 800 version of Miner 2049er.

    Buck Rogers in the 25th Century (Atari 2600) [Hack of Buck Rogers: Planet of Zoom]
    blogentry-4709-0-18660200-1535393566_thumb.png
    Recently played Buck Rogers on the Retron 77 and enjoyed it, but said to myself the same thing I've said over the years "If only Buck Rogers had a Thunderfighter like in the 1980s TV show. OH WAIT... I sprite hack now!" :D

    I'll try to make other adjustments, but so far the fonts and the ship are designed to match the show with Gil Gerard.

    Shame Twiki can't make an appearance.

    Alien Visitors Are Our Friends (Atari 2600) [Hack of Cosmic Ark]
    blogentry-4709-0-65781200-1535947777_thumb.pngblogentry-4709-0-97675800-1535947809_thumb.png
    This fun project was started on a Battlestar Galactica (Space Attack hack) thread by Marcallie when he said:

    "This is great! Now go re-theme Cosmic Ark as V: The Final Battle."

    > Interesting. The Visitors collect humans while Earth forces try to stop you from eating their population?

    "Exactly! It would be very cool to play as the bad guys for once, right?"

    Actually sounded like a fun idea so I spent some time giving this more of a "V" the sci-fi series feel.

    Scraper Caper (Atari 2600) [Hack of Fire Fighter]

     


    Originally wanted to hack Towering Inferno but the characters were not much to work with. Fire Fighter had better character but too easy of a game. Anyway, just wanted to make some reality of the Bounty Bob game (Scraper Caper) that was advertised but never finished. But at least now we have Bounty Bob's nemesis, Yukon Yohan, in a game. :)

    Miner 2049er (Atari 800/5200) - Miner animations of TIX
    blogentry-4709-0-93524000-1536866818_thumb.png

     

     


    So Bounty Bob is a Canadian Mountie, but on the game art he is a Miner. Well TIX drew up new miner animations and I looked into making them a reality. I think many liked the end result, though I am partial to Bounty Bob being a Mountie. ;)

    Moon Patrol (Atari 800/5200) - Working back and forth with TIX, EnderDude, Level 42, and a few others. Before it is all done we were able to modify the sprites, and change most of the colors. We had fun creating our own buggy designs. Below was a design I came up with which I thought matched the arcade best.
    blogentry-4709-0-12155900-1550968427_thumb.png

    To wrap up the year I released a version of VirtualVCS that had three version of Space Battle, Sky Diver, AstroBlast, and Space Chase. The most notable was Space Battle and the Battlestar Galactica Hack (fully working) and Sky Diver (also fully working). And with that, I played the first ever two player 2600 game on a Atari Jaguar against KevMos3 when he was in town

     

     

     

     


    2019

    -----------------------------------------------------------
    I was surprised to see my name was still on the 5200 HSC listing for all time high scores. Been a while since I played the 5200 or any High Score Club for that matter. I figure someone will beat my scores so I will post these now to remember them.

    Countermeasure - (Level 1) doctorclu 184,450
    Gremlins -(Night 3) doctorclu 2,503,623
    Gyruss - doctorclu 279,850
    Joust - (Skilled) doctorclu 1,611,000

    Looked in the Atari XL/XE HSC
    ASTEROIDS (HYPERSPACE) (Graphics:6 Sound:6 Playability:6 HSCR *5*) doctorclu : 115370 [5-5]
    EMBARGO (SKILL 1) (Graphics:7 Sound:6 Playability:6 HSCR *6*) doctorclu : 37910 [3-13] [9-12]
    GAUNTLETAK (Graphics:6 Sound:7 Playability:8 HSCR *8*) doctorclu : 1235025 [5-4]
    JOUST (EXPERT) [Graphics:8 Sound:8 Playability:9 HSCR *8*] doctorclu : 1106250 [3-2] [10-18]
    LASER HAWK [Graphics:8 Sound:6 Playability:7 HSCR *7*] doctorclu : 75260 [5-7]
    WIZARD OF WOR (7LIV) [Graphics:7 Sound:8 Playability:9 HSCR *9*] doctorclu : 377400 [5-10] [2-3,7-21, 15-5]

    Lynx HSC. (I was surprised!)
    Battlezone 2000. doctorclu (180,600)

    For the Atari 2600 there is a huge pdf document. there I was for Spy Hunter June 28, 2009 for 193,200
    I didn't have any scores in the 7800 HSC

    And for the Atari Jaguar as of 2010 I had a lot of the high scores, but now one remains, my epic gaming on Pitfall!
    PITFALL: THE MAYAN ADVENTURE [A]. Atardi & Doctor Clu (TIED) - 999,999 (Link). (Crazy that the score flips over.)

    -----------------------------------------------------------------------------------------------------


    More work on 2600 Buck Rogers.

    Created the sound effects for Revenge of Doh which was ported by CyranoJ from the Atari ST to Atari Jaguar.

    February 25, 2019
    Two hacks, the 2600 Moon Patrol (black buggy) with three moving wheels and the 2600 Miner 2049er are nominated for Best Game Hack of 2018. Moon Patrol lands 2nd place with Miner 2049er landing 1st place.

    blogentry-4709-0-38074200-1550967694.png

    Rented a Mountie costume from Norcostco Texas Costume rental for the thank you from Bounty Bob himself. Was fun working with Cimmerian and the ZeroPage HomeBrew crew on this first year of the Atari Awards.

     

     

     

     

     



    blogentry-4709-0-11844600-1550968736_thumb.png
    ---------------------------------------------------------------------------------

     

    March 28, 2019

           People requested a Fast Eddie hack with my own character, so a version with my fursona "Buster the BBSing Bobtail" was created.

     

           All prizes combined contain a message, as I write this in December 2019 no one has figured it out yet. 

     

           Unlike the previous Bubsy version, Buster was designed to run on his hind legs, and jump, more like a cat would.

     

           Starting to think a cat would never smile though.  I think Garfield pegged that one.

     


    post-4709-0-65659100-1553796014_thumb.thumb.png.6be9aa9021d3597042b08803b618e8dc.png
     

    July 2019 -

    My signature was a great way to revisit my hacks.   I decided today to kull it back, but wanted to place this here in remembrance in the fun that was 2018-2019

     

    Atari 2600 Sprite Hacks Battlestar Galactica, Buck Rogers, Moon Patrol, "V"

    Miner 2049er, Scraper Caper, Bubsy: Kitt'N Kaboodle, Buster

    Aided BSG.

    Atari 8-bit/5200 Hacks Miner 2049er (800, 5200), Bubsy (800, 5200). Moon Patrol (800, 5200)

    Jaguar / Nuon Hacks Virtual VCS (Jaguar), Atari800 (Nuon)

    Commodore Vic-20, 64 Bubsy (Vic-20, C=64)

     

    Bubsy Bobcat Fan Blog

    Bubsy Fractured Furry Tales speedrun king 2006-2018

    4th out of 1,000 on the Bubsy Woolies Strike Back (PS4) Leaderboard

     

    Visit Atari BBS's : CLICK HERE FOR THE ATARI BBS LIST

     

    August 24, 2019

    Released Miner 2049er with a few more fixes, and then gave all the sprite versions the upgrade and introduced the newest sprite yet, Bounty Rob!   (probably the closest to the Atari 800 sprite yet).

    885008079_ScreenShot2019-12-30at1_03_50AM.thumb.png.3602d98136bf8489c787a59004c4a2d5.png

    In the future I still hope to combine the levels of Miner 2049er Volumes 1 & 2 to make one solid game with 6 levels!   And maybe hack it further to bring it closer to the 10 levels of the Atari 800 version.

     

    September 19, 2019-

    So ClassicGamer74 reached out to me to help hack the Smurf Rescue game to the Moomin character since his daughter likes the Moomins.   What are the Moomins?   A popular Italian Anime is best I can tell.  Watched a little bit of it, pretty trippy.  Working on the game was fun changing this and that to give it more of a Moomin feel and less of a Smurf feel.  Threw a wrench into the music so while it may not play a Moomin tune, at least it's not the Smurf's.  :D   ClassicGamer74 got a cart printed for his daughter, she loved it, and well, that is all that matters here.  And ClassGamer74 learned some things about sprite hacking.   Good times. 

     

     

    November 9, 2019

    Jamcat Reloaded came up with a great idea for a Battlestar Galactica game using the Star Trek Simulator Game by SEGA.   March 28th I was able to hack the music and I guess my heart hasn't been into other music hacks because I have not been able to hack music since.  :P   Over time I quietly hacked more and more elements of the game to give it the classic Battlestar feel.   Change of radar screen to a green field, hacking the triangle to something that looked more like a Viper, the font of the numbers, etc.   The intent was to wait till February after the Zero Page Awards to give Jamcat a chance to enter his hack, but then hacks where thrown out of the Zero Page awards.   With that, I went ahead and released the added hacks I made to Jamcat's idea.  To date, those have not been overly downloaded, but that's fine, it's one hack I enjoy playing over and over again.  And flying the ship like a Viper has made for some GREAT scores at the Free Play Arcade when I play the Star Trek Arcade game!  

     

    November 21, 2019

    TIX releases the Moon Patrol Redux edition for the 5200 (and Atari Computer I'm sure).   The guy has been all over the place hacking 8-bit games since I helped show him what was possible with Miner 2049er and Moon Patrol last year.   Was really cool to see the background updated to be more like the arcade, along with everything else.   Got a chuckle out of seeing that.

     

    image.png.42025849bd65f28a7d1a81c2dc7a0054.png.57fd7e456fd8dbe59513994b16646514.png

     

    December 30, 2019-

    During this year worked to complete the Dal-Ace Newsletter Archive.   Dal-ACE was a big part of my childhood, though I only attended the meetings a handful of times.   Was something that I wanted to help preserve.  Current status of the archive:

     

    1983 - 1 out of 12 months.   Oct.

    1984 - 6 out of 12 months.    Apr-May-Jun-Jul-Sep-Nov

    1985 - 11 out of 12 months   (All but December)

    1986 - 6 out of 12 months.   Feb-Apr-May-Jun-Aug-Sep

    1987 - 7 out of 12 months.   Jun-Jul-Aug-Sep-Oct-Nov-Dec

     

    2020

     

    July - Bubsy: Fractured Furry Tales mystery room solved.

    August -  Bubsy: Kitt'N Kaboodle for the 2600 gets an update

    November - Helped track down some "bugs" in Biopede.

     

    2021

     

    January -

    Zool Handheld by Systema

    February - During snowmaggedon in Dallas, won the Blue Max round in the 8-bit high score club.

    DoctorClu-BlueMax.thumb.png.310acc33d3fab4f620aedb139295e023.png.13db38ffda0b8743c20031c4862de6db.png

     

            Completed updating my Incogneto 800 and finished adding the 400 keyboard.   A fun unique look.

    20210218_223116.thumb.jpg.d1efb15282ba3907041de8f47fa0b08f.jpg.89f9326d54fae752f6c4d13717aff85e.jpg

     

    March - Receive the Game Drive for the Drive, create thread .e2p Files (Shared Leaderboards)

     

    April -Toys "R" Us VIDPro Display Card .. for Jaguar?

     

    July - Thanks to Allan the Dal-ACE newsletter collection is complete.

             Wins "Another World" for the Jaguar in the Darkforce! BBS raffle.

     

    September - In moving to a new house passed on a lot of stuff.    Attended an Atari meet up in Dallas. As John of the Video Game Museum wrote:

    "- @doctorclu brought a literal truckload of stuff and gave it away for free!! I'm talking Atari disk drives, computers, joysticks, magazines, just boxes and boxes of parts. It was an event unto itself! "

     

    October - Congratulated for the packing job of a Headstart Explorer by bluejay.   (What can I say it's been a slow year but part of the retro hobby experience).  :P

     

    2022

     

    April -

    Playtested Golden Axe for the Atari Jaguar.

     

    June-

    Set the new speed record completing Bubsy: Fractured Furry Tales at Speedrun.com of 33 minutes and 25 seconds, beating the previous record by three minutes!

    722026175_ScreenShot2022-08-06at7_14_03AM.png.31e001c47186a01961d30539bad5e0f6.png

     

    Some comments on it, one from the first record setter...

    537997266_ScreenShot2022-08-06at9_01_41AM.png.ff0ced2d8a8a714f09c1d3fd370b67f1.png

    1389756079_ScreenShot2022-08-06at9_01_32AM.png.f98133090cdbdc40e8c05760cf4c3239.png

    November-

    Released a proper version of the Sci-Fi game pack for the Atari Jaguar's Virtual VCS.  

     

    20221106_213005.thumb.jpg.e1eb7f4080c804fdebdfff51b7de5071.jpg.e8a9b120f7353293ec609a38b2f03a0b.jpg

    Songbird with some help from s0c7 and myself was able to figure out what hex to change to switch the game from hard to normal difficulty.  Made Space Attack and Astroblast more playable.

     

    974883159_ScreenShot2022-11-27at7_41_21AM.thumb.png.1f6773c1e1059bc9629a8d1a280b11a5.png

     

    On of the early members of the new Atari user group, TACO!!  (Texas Atari Computer Owners)

    (Not actually their shirt, but a stand in till they make a shirt.)

    20230205_192908.jpg.fcd40b22c63b6cd230e00b09f022d265.jpg

     

    2023

    Janaury new years day

    Learned how to hack Bubsy Fractured Furry Tales levels and music.

     

    May

    Fan video for "Court of Love" by the "Breakfast Club" is recognized by the Breakfast Club!  One of which was specifically Stephen Bray, drummer of the Breakfast Club, Madonna, The Jets, and quite a few others, who said the video brought him a smile.   While not Atari related, it's retro 80s music related, and more tinkering and creating so still fun to note.  :D

     

    370693884_ScreenShot2023-06-11at1_53_10PM.png.f0997d75fe4b00529f84999f43631b95.png

     

    June

    After hours of playing "Zool RedimeNsioned" on the PS4, a nice tweaking of the the original Zool game by Sumo Academy and Steel Minions, the "Zool RedetermiNed Project" is created from that inspiration to tweak Zool 2 on the Atari Jaguar to a more enjoyable game. First stop was swap out the intro and first level music files to original Zool soundtrack as personal preference to make it more fun.  Second was to address the complaint heard over and over again about UP on the D-Pad causing the game character to jump at times when it was bumped.   Thanks to wonderful help from Seedy1812, up on the D-Pad was cut out, trimming up the controls quite nicely.   We'll see if the third issue about the item collection of 99% of items before exiting a level being lessened also happens.

     

    Current copy released June 9th as of June 11th had 20 downloads.   Not bad considering how niche Atari Jaguar AND Zool are.  :P

     

     

     

  8. Boo

    • 4
      entries
    • 10
      comments
    • 7065
      views

    Recent Entries

    Andrew Davie
    Latest Entry

    People have seen me on @ZeroPage Homebrew not so long ago.  I usually hate hate seeing myself in photo/video. But overall I think that show went OK and I've re-watched myself in that "episode/show".  It went OK; I think I made an interesting interview subject.  Anyway, I just stumbled on this photo of myself, which is actually one of my all-time favourites. Here I am in the middle, with a couple of motorbike riding buddies -- deep in the bush/outback in Tasmania a few years back.  Just don't cross me, is all I can advise ;)

    mean.thumb.jpg.ff11b3a65484220dd1075ebfa0c57a57.jpg
     

  9. 'Clear for Action in the age of Sailing'  is a game of strategy pitting you against the computer in a pitched naval battle in the age of the great sail battleships of the 18th century. Originally ported to the TI-99 by Walid Maalouli from the TRS-80 I have now ported thst 99 version over to the Geneve. This is a really terrific program and I have made some modifications to better run on the Geneve and take advantage of it's features.

    The program is now one large program. Malllouli had to break up the program to get it fit on the 99, on the Geneve there is more than enough memory to fir the whole program at once. Also switched some of the menus to 80 column and added more info in the program.

    there's a run-able version on a single DSK1 that runs from A: and, if you have Geneve MAME package download from my site https://ti99resources.wordpress.com/emulation/,

    a set of HDs you can just replace the SOFTWARE files with the new SOFTWARE files  and execute ABGAMES at the Geneve prompt for the menu to run CFA.

    To change to run from another source change the variable on line 100 to the new default SAVEFILE area.

    Lot's of fun and challenging.

    enjoy

    CFA10a-UPDATED.zip

  10. For February , the AtariAge 5200 OE High Score club is playing Activisions's H.E.R.O., which is a great game I haven't spent enough time playing.  So I got my 5200 HERO cartridge, hooked it up to my 5200, and discovered that the second button on my 1 working controller wasn't working - which is kind of essential for HERO.

     

    I took my working controller apart, gave it a good cleaning, and put it back together.  The second button was now working!  Inspired by this success, I decided to go ahead and try the same cleaning procedure on my second controller, which has never worked for me.  Upon taking it apart, I discovered two things: the left/right pot was horribly rusted, and the traces for the Start button had peeled off the flex circuit.  I cleaned the pot out, and all of the button contacts.  I put the controller back together.  I thought I would try out HERO with this controller to see how it worked.

     

    Surprisingly, the Start button did work.  Any amount of pressure was pushing those broken traces together, shorting them out and registering as a button press.  Unfortunately, using the top side buttons has the same effect!  However, the actual joystick part of the controller was working perfectly.  This got me thinking; this controller would be perfect as a second controller for the twin stick shooter - Space Dungeon!  I'm pretty sure the second controller is only used for the joystick, the controls would be performed on the first controller!

     

    So I plugged in Space Dungeon, both controllers, and used a 3D printed controller group I had purchased for this a while back.  Everything worked perfectly!  I've owned this game for a while, but haven't had the chance to try it out until now.  

     

    Space Dungeon is a 1982 twin stick shooter arcade game by Taito.  (By some accounts, the original twin stick shooter).  The Atari 5200 port was the only home port of this game.  I generally like twin stick shooters, and this game is no exception!  The difficulty is tough, but fair.  In addition to a healthy supply of enemies comming after you, there is an exploration element.  You need to search through an array of rooms to find "treasure".  When you are ready to leave the level, you find your way to the a special "Collect Bonus" zone.  At this point you get bonus points for all the treasure you've collected and move on to the next level.  If you die before you make it to the "Collect Bonus", you drop all your treasure in the room you died.  This room gets marked on the map, so you can go collect it with your next llife.

     

    I love the risk/reward balance.  The more treasure you collect, the higher bonus you will get.  But this takes longer, and more and more enemies get spawned to make it tougher for you.

     

    Overall, a fun game, and a rare 5200 exclusive.  I'm spending way too much time playing this game.

  11. I thought I would post these here:

    A word of warning: These videos are quite slow-paced.

  12. Yes, Virginia, a UAV will fit in a CX-55.  Disabuse yourself of the previously-held notion that it won't.

     

    A/V jacks may be a different matter entirely, so feeding out a cable (round or ribbon) with all of them connected to it may be necessary.  This will involve drilling / cutting the case.

  13. How I flashed CPLD chip on Incognito (with latest tweaked experimental Jed)

     

    I made these notes to myself at the time I did this as it was a fairly involved process. 

     

    Please cross reference with the AA threads before you do anything but these are the steps that worked for me at the time to flash the Jed. 

     

    Note:  for me after flashing the experimental Jed I experienced instability which was known at the time, (it was an experimental Jed after all), so I just flashed the original Jed back and the instability disappeared. Iirc instability included crashing in the loader, erratic menu behaviour and corrupted menu characters, some files crashing on loading

     

    Downloaded the 14.5 version of Xilinx ISE design software  (16GB) (includes iMpact software):

     
    version 14.7 kept crashing so I tried 14.5
     
    Installed the webpackage and ISE design suite
     
    Soldered header pins for the Jtag connector on Incognito board as they were missing
     
    Used flat connector to individual header connectors cable that came with the programmer and the following pinout which is the same as the U1MB:
     
    From Xilinx to UM1B
    2 - 1 VCC
    3 - 2 GND
    4 - 6 TMS
    6 - 3 TCK
    8 - 4 TDO
    10 - 5 TDI
     
     
    (instructions pasted at the end of this blog entry too)
     
     
    .....And this Windows file tweak to stop the Xilinx iMpact software from crashing under Win10:
     
    • Open the following directory: C:\Xilinx\14.7\ISE_DS\ISE\lib\nt64
    • Find and rename libPortability.dll to libPortability.dll.orig
    • Make a copy of libPortabilityNOSH.dll (copy and paste it to the same directory) and rename it libPortability.dll
    • Copy libPortabilityNOSH.dll again, but this time navigate to C:\Xilinx\14.7\ISE_DS\common\lib\nt64 and paste it there
    • In C:\Xilinx\14.7\ISE_DS\common\lib\nt64 Find and rename libPortability.dll to libPortability.dll.orig
    • Rename libPortabilityNOSH.dll to libPortability.dll
    •  
    Flash the new JD to the CPLD chip whilst the Xilinx platform flasher is plugged into the Incognito with the board in the 800 powered up using the Impact verison of the software, (not the prev installed 64bit (which crashes) or 32bit( never loads):
     
    Then to flash the patched Incognito firmware from here:
     
    pages 11 and 12: (where I've elaborated on them with some additional info)
      
    1. Ensure that XL/XE mode is selected, SDX is enabled and RAM size is set to ‘1088K RAMBO’ and the PBI is on and HDD is enabled. (Latter so CF can be read)
    2. Place UFLASH.XEX and the ROM and UFLASH files in the FAT partition of your CF card, and plug the card into your Incognito’s card slot. 
    3. Turn on the Atari while holding down the ‘L’ key to run the SIDE XEX Loader. 
    4. If already using the new SIDE loader, make sure that ‘FAT FMS’ is set to ‘Enabled’ in the Options menu. 
    5. In the FAT directory listing, navigate to ‘UFLASH.XEX’ and press Return to run it. 
    6. If your hardware is not automatically detected by UFLASH, do not proceed. 
    7. Assuming the hardware is detected, navigate to the ‘Main BIOS’ entry and press Return. 
    8. From the resulting file list, select ‘IBIOS.ROM’ and press Return. Ultimate 1MB, Incognito and 1088XEL|U1MB Firmware 
    9. Press Return again to confirm the flash. (it will flash the Rom but report a short file size - ignore the latter, it has flashed)
    10. Repeat the above process for the ‘Loader’ entry (selecting ‘ILOADER.ROM’) and the ‘PBI BIOS’ entry (choosing ‘IPBI.ROM’), in that order. 
    11. Power-cycle the machine when the operation is complete.   (you can just hold down RESET and the FUJIkey to boot into the Incognito bios)

     

  14. I'm referring to physical releases here.

     

    GAMES PORTED ALREADY

    Chaos Engine, The
    Custodian
    Defender of the Crown
    Fantasy World Dizzy
    Gods
    Head Over Heels
    Speedball 2: Brutal Deluxe
    Stormbringer
    Treasure Island Dizzy
    Xenon 2: Megablast


    GAMES THAT WILL PROBABLY BE PORTED SOON (Or Eventually)

    Bubble Dizzy
    Crystal Kingdom Dizzy
    Dizzy Down the Rapids
    Dizzy Panic  aka Panic Dizzy
    Dizzy Prince of the Yolkfolk
    Fast Food  aka Fast Food Dizzy
    Kwik Snax  (a Dizzy game)
    Magicland Dizzy
    Spellbound Dizzy

     

    PORTS I'D LIKE TO SEE

    Buggy Boy  aka Speed Buggy
    Gauntlet
    Gauntlet II
    Leisure Suit Larry
    Leisure Suit Larry 2
    Leisure Suit Larry 3
    Lemmings
    Lemmings 2: The Tribes
    Pinball Wizard
    Revenge of the Mutant Camels
    Robotron: 2084

  15. Got my last three carts from eBay vendors.  Robot Tank, Starmaster and Megamania.  Don't have natural light to take a picture of Megamania, so I'll provide it some other time.

     

    Opening the Robot Tank cartridge, I found a surprise.  It uses a new blob-type ROM chip with all epoxy.  Of all the cartridges I opened in this project, this is the only one.  So most likely this was a latter run of Activision cartridges.  All the other ones had the larger chip. 

     

    image.thumb.jpeg.6af2a2008105e52f2c751e405f7f8280.jpeg

     

     

    Here is the new one on the left, and my original cart on the right.  I ended up deciding that my original cart was going to be relabeled.  The folding looked worse and the end label was ripped.

     

     

    image.thumb.jpeg.7d9d1f8168baf0009217c5f458508c3c.jpeg

     

    Here is Starmaster and Robot Tank with the new labels.

     

    image.thumb.jpeg.d2a279ebebccf8a43f0d680620f7efcc.jpeg

     

    Here is the comparison with the original labels.

    image.thumb.jpeg.951343e495a3f82a67a0c66762e7eab1.jpeg

     

    Starmaster looks "off" with the new label.  The blue is a lot brighter and some of the stars in the screenshot are missing.  I noticed that there are a couple more cartridges were things were a tad off.  I will make a more detailed comparison in the near future.

    image.thumb.jpeg.9cd2f4c4db65434e76a1292a49d14125.jpeg

     

    Finally, here's a screenshot of the carts that I will most likely not relabel (except for Commando which I used my original cart to be relabeled, pictured here is the new one I got last week).  My Double Dragon cartridge is in really poor shape; I'll make it my next task to find a better cartridge considering it's one of my favourite games. I only wish I had my original collection from the early 90s!!!

     

    image.thumb.jpeg.02fd25c2dbc0da32fc1d3fba359ad543.jpeg

     

    A few more lessons learned:

    - Some cartridges are absolutely filthy.  Over the 25 or so cartridges I opened to clean, I found dead bugs, substances I don't want to know about, rusty springs in the plastic prongs, and many times strong tobacco smell.

    - If you place the new labels incorrectly, then there's not way to adjust it.  I put my Megamania one slightly off and tried to re-apply it.  It started to rip.  No do-overs with these labels

    - Many of the cartridges on eBay claimed to be "tested" didn't work without a proper clean or scrub.  Megamania, River Raid, Kaboom, and Dolphin took ages to get working

    - Surprisingly, my 7800 can play Robot Tank and Decathlon with no problems!  

     

  16. Following up on my last post, I did manage to finally fix and build the old Christmas Carol code. As expected, it only took me a couple of hours, maybe less, to get the code to assemble. That's with not fixing any of the old bugs -- I decided that for the sake of stability and expediency, I wouldn't mess with it.

    As explained in the previous post, the issues had to do with the assembler changing behaviour. Normally this would be a bad thing to do for something already in production and in wide use. In practice, however, back then there were very few people using the assembler, and these were actual bugs that were fixed to improve its function.

    There were two major bugs that tripped Christmas Carol:

    • QEQU directive uniqueness was fixed to be global
    • NOT directive behaviour was changed from bitwise to logical


    The first one is silly and it should have never been there. The QEQU directive (Quiet Equals, which assigns a global constant label without adding an entry in the symbol table), was always intended to be global, of course. However, it was given inadvertently the behaviour of the QSET directive (Quiet Set, which assigns a global variable label without adding an entry in the symbol table).

    Consequently, a label defined with QEQU could change its value with multiple assignments throughout the code.

    I had misunderstood this behaviour to be by design (don't ask :dunce:), thinking that the values were localized to modules or procedures. Thus, my entire codebase had a bunch of "constants" with the same label assigned different values in multiple procedures and library modules. Dozens of them. All over the place. Eek!

    So you can imagine that as soon as I tried to assemble, I got dozens of errors, over a hundred of them! Fixing this was tedious, but very easy: just go one by one through all the QEQU directives in use and decide whether they were an actual constant which needed that constraint, or a re-usable label, in which case it should be changed to QSET.

    Actually, it was easier than that. Assuming that the code had correct constants and variables in place, just not assigned with the correct directive -- and this is a safe assumption after all, since the game works and it's already out there -- I just changed all the QEQUs to QSETs. After doing that in a few seconds, I felt a bit dirty by doing it without thinking, so I went over them one by one anyway to review and put back a few QEQUs which were actual unique constant labels.

    The second issue was a bit more subtle. Everything assembled by now, so I could run the game, but it sort of behave weirdly, and had some strange graphical glitches here and there, and occasionally crashed completely into the weeds.

    It took me a few minutes to remember that several years ago, the behaviour of the NOT directive in the assembler was changed from bitwise (in which all bits in a value are flipped from 1s to 0s and vice versa, a one's complement) to logical (in which it would return 1 if the expression evaluates to zero, and 0 if it evaluates to non-zero).

    This threw off all the bitwise masks composed in my code. All of a sudden, something like this:

    BTAB_COLOR_MSK  QEQU    $1007
    .btab_mask      QSET    (NOT BTAB_COLOR_MSK)
     


    which originally treated BTAB_COLOR_MSK as a bit-mask and then complemented its bits to set .btab_mask to 0xEFF8 (the 1s complement of 0x1007); it now treated it as a boolean value and set .btab_mask to 0x0000 (false) because the value of BTAB_COLOR_MSK evaluated to non-zero (true).

    The result is all sorts of masks used to clear or set registers and variables getting corrupted with stupid wrong values. This caused the game to fail or misbehave in mysterious and seemingly random ways.

    Anyway, once I remembered this change in the tool, it was simple and easy to know what was going on and fix it. I just did search-and-replace over everything that had a NOT directive in it, to use a new special "complement" macro I created, ~(). So this:

    .btab_mask      QSET    (NOT BTAB_COLOR_MSK)
     


    became this:

    .btab_mask      QSET    ~(BTAB_COLOR_MSK)
     


    I then just added the special macro to the already existing macro library:

    ;; ======================================================================== ;;
    ;;  ~(val)                                                                  ;;
    ;;  Implements a bitwise NOT operator that applies a One's Complement. This ;;
    ;;  is useful for composing masks by negating bit fields.                   ;;
    ;;                                                                          ;;
    ;;  NOTE:   The AS1600 assembler's behaviour was changed to treat NOT as a  ;;
    ;;          logical operator, so this is now required for One's Complement. ;;
    ;;                                                                          ;;
    ;;  ARGUMENTS                                                               ;;
    ;;      val         A value to complement.                                  ;;
    ;; ======================================================================== ;;
    MACRO   ~(val)
        ((%val%) XOR -1)
    ENDM
     


    I had done this already in all my development branches of the game, in used for the "Special Edition" versions I made for contest winners and the like, but hadn't done it here. It worked like a charm.

    OK, so after that, just a couple of hours later I had a valid source code that I could successfully assemble. Now it was time to actually do the customizations promised to CharonPDX for his charity event.

    I made three simple customizations:

    1. Updated the "ROM-only splash" screen to mention the charity event:
      blogentry-27318-0-82606300-1541336006_thumb.gif
    2. Renamed the game in the "title" screen to "Cascadian Carol vs. The Ghost Of Christmas Presents" to reflect the gamer group to which CharonPDX belongs:
      blogentry-27318-0-50382500-1541336014_thumb.gif
    3. Added a new page to the "credits" sequence to dedicate the game:
      blogentry-27318-0-12330200-1541336023_thumb.gif



    And that's it. I just bundled that up into a ZIP archive and sent it over to CharonPDX. He's going to be playing an assortment of games, mostly Desert Bus, and perhaps a wee-bit of Christmas Carol, for charity during a 25 hour gaming marathon. So, don't forget to go visit his event page and post a donation. I did mine, where's yours? It's all for a good cause!

    As the game says ...

    You're on a mission.

     

    The children of the world are counting on you.

     

     

    Can you save Christmas?

     


    -dZ.

     

     

     

     

     

     

     

     

     

  17. I have an interesting... thing... with a bunch of 2708 chips in it, and I want to read them. But I'm very wary, because I don't want to fry them.

     

    The problem is that the 2708 needs extra supply voltages of -5 and +12 volts just to read a chip, but it also needs +26V for programming. The extra cost of all the extra voltages means almost zero programmers support it without extra hardware.

     

    A few months ago, I tried to do the simple idea, add a socket board with some pins changed so that I could try to read it on a regular EPROM programmer as a 2716, but get the voltages from a couple of wall warts. I've heard that not having the -5 volts is crossing-the-streams-bad, so I put LEDs on both voltages. I had one other 2708 chip, and its contents were already known and it could be replaced with a 2716. It didn't go well. I got a few partial reads, then the chip died.

     

    So on to version two. Start with making a Blue Pill board read a 2716 chip. It was not a fast process, made slower because I'm trying to break away from the mbed web site compiler. I tried to get the old version of mbed working offline, but crappiness related to Python 2 vs 3, and Apple change-protecting chunks of Python 2.7's package storage made it impossible on my laptop. And the current version of mbed is super bloated, it includes all sorts of crap that makes a minimal program be like 30-50K. Eventually I not only got my own code working, I also got gdb working in text screen (ncurses) mode... more or less, but enough to be better than printf debugging through a serial port that you don't have working yet.

     

    (To make things even more fun, a USB serial adapter I got from Amazon seems to have a bug when its internal buffer overflows before opening up the serial port on your computer, then it spews everything forever. Sometimes it even barfs out garbage with debug symbols.)

     

    Tonight I finally got it to dump a 2716 chip. I had been poking at the various pins, and nothing would output data. So I started a new breadboard with a bunch of LEDs and DIP switches. After more poking around, finally the LEDs come on, and I recognized the bytes at 0x000 and 0x0FF. Turns out that the pin 21 (Vpp on 2716) needs to be connected to +5V, not GND. Now I just need to set up the extra voltages and cross my fingers. Maybe tomorrow.

    IMG_20221010_215113439..jpg

  18. Hey all,

     

    I've been away a while. I'll spare the details, but between family and work issues finding the time to work on anything like I did during the years of the pandemic isn't feasible for the foreseeable future. I wouldn't even be surprised if someone else built something along the lines of what I was trying to do in the meantime.

     

    IDK, if anyone is still interested in the VCS modern controller adapter for classic systems, let me know. I might have time to get to it over the holidays. Currently, I'm between houses, and the place that where I'm currently living isn't conducive to having my electronics stuff out to work on.

     

    Aaron

  19. I've been working on a Javascript web app for exploring the Atari 2600 music palette. My goal is to provide musicians a way to visualize and identify in-tune notes and chords producible by the TIA chip. I felt frustrated looking at static diagrams with fixed tuning. I imagined better note relationships could be found if it was possible to tune the piano scale and make various adjustments.

     

    My app overlays Atari notes onto piano notes by matching up their frequencies. The point is to tune the notes up and down for discovering relative tuning relationships. It also has a function for subdividing the piano into microtonal notes. If you have a digital piano that allows for adjusting the tuning, then you could actually play notes on the piano that are similar to the TIA note frequencies.

     

    My app is in very early development so half the functionality isn't working. It's a 3rd version prototype, so the code is still rough. The UI will change as I figure out what the app is going to be. I'm building it in Javascript, because it's easy to build user interfaces in Javascript, and it's highly cross compatible. I'm hosting it on Github for reliable hosting that won't disappear.

     

    I'm blogging about it to let people know what I'm working on and haven't fallen off the face of the Earth. It'd be nice to gather some friendly suggestions. It's tested in Chrome and untested in other browsers. It also requires a modern browser version. FYI: If you press UP/DOWN arrow keys in the A4 frequency field, the updating looks neat.

     

    https://pizzatari.github.io/atari2600music/

     

    Immediate TODO list:

    • Add a circle of 5ths diagram and some geometry diagrams (updating)
    • Finish the remaining options shown in the UI
    • Fix the major chord detection routine
    • Add detection for remaining chords
    • Thoroughly validate my frequency and cent calculations are correct and use best known values
    • Add a sound generator to play notes as a virtual piano
    • Add an option to flip text vertically for printing the piano layout
    • Think of more useful stuff to throw in
    • Speed up the rendering (it's re-building everything on every change)

     

    I got into this because I discovered a new interest in music theory and the piano after thinking about writing some Atari 2600 tunes. I had zero prior music experience, so I am still learning.

     

     

  20. This lesson will discuss more of the details of RAM organization, working with the stack and some minimal Forth programming.

    The 32 KiB expansion RAM on the TI-99/4A is organized as follows in fbForth 2.0: The 8 KiB lower RAM (2000h – 3FFFh) contains four fbForth block buffers, low-level Assembly Language support, system global variables (termed “user variables”) and the return stack. You will notice here that hexadecimal numbers in this discussion (not in actual Forth code!) have a trailing ‘h’. The return stack starts at the top of this space at 3FFEh and grows downward toward the low-level support code, which currently ends at 3A03h. This allows 766 cells for address storage for deeply nested code. Colon ( : ), introduced in the last lesson, makes extensive use of the return stack. Your code can make use of the return stack as well; but, you must be very, very careful when you do, that you do not interfere with the return scheme of fbForth. In a later lesson we will discuss how to safely use the return stack because it certainly can be useful.

    The 24 KiB upper RAM (A000h – FFFFh) is almost entirely free for your Forth programming pleasure. This is due to the fact that the entire resident dictionary of fbForth 2.0 resides in the 32 KiB ROM of the cartridge. The last word of the resident dictionary is TASK and resides at A000h for reasons that will be explained in a later lesson. The next available address is A00Ch. This is the beginning of the user-definable dictionary. Any words defined after this point are still part of the dictionary and, as a result, become part of the language. This is what makes Forth extensible.

    The top of memory in the upper 24 KiB area contains the Terminal Input Buffer (TIB) and the base of the parameter stack at FFA0h. This means that all but 108 bytes of the upper 24 KiB area is available for your programming. This, of course, includes the parameter stack, which grows downward toward the dictionary, which grows upward toward the stack.

    Now is a good time to elaborate on a comment Owen left on the last lesson, viz., verbalizing or pronouncing Forth words. Forth was intended to be a language you could speak. That is pretty much why Forth functions, routines, constants and variables are called “words”. I will try to remember to include the usual pronunciation of standard Forth words as we discuss them. A very good source for such pronunciations is Derick and Becker’s FORTH Encyclopedia: The Complete FORTH Programmer’s Manual, 2nd Edition. The words appear in ASCII order, so they are easy to find. Each of the entries includes the word’s pronunciation. An example from the last lesson is SP! , which is usually pronounced “S-P-store”. The “SP” part happens to refer to the stack pointer, which is why I had said “stack pointer store”. Another example, as Owen mentioned, is “dot-quote” for ." and “quote” for " .

    Most words’ pronunciations are not difficult to figure out; but, there are a couple of heavily used words that are not obvious. One is @ , which is pronounced “fetch” because it pops an address from the stack and fetches its contents to the stack. Another is ! , which is pronounced “store”. It requires two numbers on the stack: the number to store and the address in which to store it. We will discuss these in greater detail ere long.

    We turn our attention, now, to working with the stack. As mentioned last time, it operates in a LIFO mode. To show you how it works, we will use . and a new word, .S (pronounced “dot-S” and means “print stack”). .S will non-destructively print the stack contents from the bottom up (left to right), with ‘|’ representing the bottom of the stack. Recall that . pops the top number off the stack and prints it:

    blogentry-29677-0-85051100-1436976895.png


    You will see that the system response of “ok:5” displayed after .S is executed shows the stack to have the same depth as before it was executed. Notice that the last of the five numbers entered is on top of the stack, that it is the first one popped and printed by . and that the system response shows the depth to be one less after each . . The last line demonstrates what happens when you execute a word requiring a number on the stack but with nothing on the stack. The number 11776 (2E00h) printed is significant because the bottom edge of the stack is the start of the TIB and the last thing entered at the terminal (console) was ‘ . ’, which has an ASCII code of 2Eh.

    A Forth convention when defining or listing words is to show the state of the stack before and after the word executes. The stack effects (also, stack signature) are indicated by showing within parentheses what the word expects on top of the stack before it executes to the left of an em-dash (—) (or two or three dashes [--]) and what it leaves on the stack to the right. Also, the most accessible number is always on the right on either side of ‘--’, which represents execution of the word. For example:

    !   ( n addr -- )

    shows that the stack effects of ! , which requires the storage address addr to be on top of the stack and the number n, which will be stored at addr, below it. The absence of anything to the right of the execution indicator (--) shows that ! leaves nothing on the stack.


    Let's do a little math with the stack. We will start with the basic four: addition, subtraction, multiplication and division. Here are those definitions with their stack effects:

    +   ( n1 n2 -- sum )    pronounced “plus”
    -   ( n1 n2 -- diff )   pronounced “subtract”
    *   ( n1 n2 -- prod )   pronounced “times”
    /   ( n1 n2 -- quot )   pronounced “divide”

    Each of these operators requires two numbers on the stack and leaves the result on the stack when it is done. Below are examples of each operation, showing the result printed with . :

     

    blogentry-29677-0-38047400-1436976896.png

     

    As you type the above at the terminal, you will see that the operator is after the numbers it operates on. This is an example of postfix notation or RPN (Reverse Polish Notation). You are probably more familiar with infix (algebraic) notation:

    1 + 2 = 3
    where the operator is between the two numbers it operates on. The postfix nature of Forth is the highest hurdle you will likely need to get over. Words in Forth can certainly be defined in an infix way; but, postfix is more efficient and easier to implement.


    An interesting bit of history regarding RPN: Reverse Polish Notation implies that there is a Polish Notation, which, of course, there is. Polish logician Jan Łukasiewic (yahn woo-kah-SHEH-vitch) invented prefix notation to simplify a branch of mathematical logic. The operator precedes its two operands in prefix notation. It became known as Polish Notation (PN) due to the nationality of Łukasiewic. Quite naturally, when postfix notation arrived on the scene with the exact opposite form, it became known as Reverse Polish Notation (RPN).

    At the top of this lesson, we discussed memory organization, stating that virtually all of the available programming memory is one chunk between the top of the parameter stack and the most recently defined word in the dictionary. Each of these locations is readily available with resident fbForth 2.0 words:

     

    SP@   ( -- addr )   pronounced “S-P-fetch”; leaves on the stack the address of top of stack
    HERE   ( -- addr )   pronounced “here”; leaves on the stack the address of next available dictionary location

    The available RAM is the difference between these two addresses. Since the stack is at the higher address, we want to subtract HERE from the top-of-stack address:

     

    blogentry-29677-0-88004400-1436976896.png


    We can make a couple of useful definitions from this:

    : SIZE   ( -- n ) 
       SP@ HERE - ;
    
    : .SIZE   ( -- ) 
       SIZE . ." bytes free" ;

     

    blogentry-29677-0-57223500-1436976897.png


    The first one leaves the size in bytes of free RAM between the top of the stack and HERE . The second prints that number followed by “bytes free”. You may have noticed that I slipped in another word in the definitions above, viz., ( . Pronounced “left paren”, it begins a comment, which is terminated by ‘)’. Comments are ignored by the text interpreter. Obviously, the comments above are not necessary for the definitions to work. You can enter the above definitions without them. They help us to remember what the words do. We will make it a habit to include the stack effects in this way when we actually begin storing our new words in a blocks file a lesson or two hence.

    We will conclude this lesson by defining one more useful word. CLS is a resident fbForth word that clears the screen but does not move the cursor. To also move the cursor to the top of the display screen, we will define PAGE for which we need another fbForth word that sets the cursor:
     

    GOTOXY  ( x y -- )   
    sets the cursor to the x-y coordinates on the stack. The upper left corner of the display screen is at = 0= 0.


    To show GOTOXY in action, we will place the cursor somewhere in the middle of the screen and print an ‘X’ there:

     

    blogentry-29677-0-84983100-1437046367.png


    And, now, our definition of PAGE :
     

    : PAGE ( -- ) 
       CLS 0 0 GOTOXY ;
    clears the screen and sets the cursor to the top left corner of the display screen.


    Here is the screen after the definition and just before execution:

     

    blogentry-29677-0-08494300-1436976898.png


    and after execution:

    blogentry-29677-0-59881300-1436976898.png


    That’s it for this session. We will do more stack manipulation and programming next time.

  21. (in the most scornful tone a rebellious youth could have) Yo.

     

    It's me, Captain TOM. Syzygy1 forcefully pried me from my bodacious babe-bangin' and trapped me here on this dumb forum. They want me to ask you about your favourite Atari 2600 games. Look, I like Atari, but not the freakin' fantasy games. SwordQuest sucks. Centipede would be good if they quit the Smurf-wannabe "enchanted forest" bullcrap. So if you send me those kinds of games, then expect no response. Seriously.

     

    Syzygy says their favourite is Fantastic Voyage. They're not even good at it! Why do they like it? They refuse to tell me, but judging about a post about Suicide Mission they made months ago, I think we all know why. Syzygy's a lunatic! Why do they even call themselves "non-binary?!" They look like a chick thru and thru! Her hair doesn't even look "boyish." Now, I love a good crazy chick, but Syzygy is ripshit bonkers! I wouldn't screw her, no matter how much she's attracted to me! She's got cooties! (Footnote: Cooties are a real menace. They're like, these bugs that live on robots, because we're glued together with library paste; I guess that attracts them or something. They itch. BAD.)

     

    ...So anyway, where were we? Oh. (sarcastic "talk-back" tone) If you have any favourite Atari games, then send them to Syzygy. (glares at the camera) And no fuckin' fanta-- (off my intimidation) ...sorry...

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...