Jump to content

SpiceWare

+AtariAge Subscriber
  • Content Count

    16,912
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by SpiceWare


  1. The loop is basically:

     

    Scanline 1: update playfield, update player

    Scanline 2: update player, calculate values for playfield - but save results for next scanline

     

    • Using Stella you can see the overspill doesn't occur on the very first frame.  Load the ROM
    • hit ` to enter debugger
    • click in the prompt box to give it focus
    • type reset
    • type frame
    • type frame
    • type savesnap
      scene_dbg_8e075401.thumb.png.6bce84b97b18efbd8e4b6d83a0afcd2d.png
    • type frame
    • type savesnap
      scene_dbg_8e078f5e.thumb.png.93d3bea4fbfb17d0367fae505477bd8a.png

     

     

     

    What's happening is the values in the TIA register only change when you tell them to.  If you don't want what's shown at the bottom to repeat at the top then you must change them before the top becomes visible again.


    Simple fix would be in NextFrame - where you see this:

            lda #0
            sta PFIndex	; reset playfield offset
    

     

    just add 3 more lines:

            sta PFIndex	; reset playfield offset
            sta PF0     ; reset playfield
            sta PF1     ; reset playfield
            sta PF2     ; reset playfield
    

    scene_dbg_8e0de4d7.thumb.png.cc881050abe2a1638080ffbc8cba7077.png

     

    The shearing occurs because the video output is turned on mid-scanline:

    ; Wait for end of VBLANK
    	TIMER_WAIT
            lda #0
            sta VBLANK
    


    The way to fix that is to add a sta WSYNC so the video output is turned on at the start of the scanline:

    ; Wait for end of VBLANK
    	TIMER_WAIT
    	sta WSYNC
    	lda #0
    	sta VBLANK
    

    scene_dbg_8e10e242.thumb.png.3ce25a88754691cc3b4b8173339e809a.png

     

    scene.zip

    • Like 1

  2. 1 hour ago, Yoruk said:

    Ok the table it looks like it works as you presented. I don't see why the total of the left column doesn't give me 196 or 196/2, but if I try to modify these values it does affect the pattern height.

     

    192's the usual target mentioned when talking about the 2600, not 196.  It comes from Atari's original in-house documentation, the Stella Programmer's Guide, where you'll find this:

    802563483_ScreenShot2020-04-18at9_00_19AM.thumb.png.418862e37138de763849bc83272ad29d.png

     

    Due to how TIA works, the programmer can change those - such as increase the picture to 200 scanlines while decreasing Vertical Blank to 33 and Overscan to 26. The tradeoff of doing that is you get fewer cycles of CPU time for game logic.

     

    I checked my games once and found my screen sizes ranged from 182 to 202.

     

    You may also find my tutorial to be useful.

     

    • Like 1

  3. Past few days have been awesome for production.  Additionally it's been in the low 70s, so I was able to open up the house instead of using AC.

     

    IMG_0876.thumb.png.06fc75a4e6b6767c0ca0123e76238f30.png IMG_0877.thumb.png.a8a1979ab4d45d7702260f12f44a93a6.png

     

    Next few days will be back into the 80s and rainy, so production will be down and AC will be back on to combat humidity. Will be interesting to see if I manage to finally overproduce for a month or not.


  4. Correct, the (R) means referenced.

    Symbols will be specific to your program, such as Medieval Mayhem doesn't have bombs so BOMB_DROP_RATE doesn't exist in its symbol table, but most games for the Atari include the following line in their source:

       include vcs.h

     

    So their symbol files will have all the TIA and RIOT symbols defined even if they don't use them all.

     

    One thing that can be tricky is a symbol might be indirectly referenced. Take a look at PosObject:

    PosObject:              ; A holds X value
            sec             ; 2  
            sta WSYNC       ; X holds object, 0=P0, 1=P1, 2=M0, 3=M1, 4=Ball
    DivideLoop
            sbc #15         ; 2  
            bcs DivideLoop  ; 2  4
            eor #7          ; 2  6
            asl             ; 2  8
            asl             ; 2 10
            asl             ; 2 12
            asl             ; 2 14
            sta.wx HMP0,X   ; 5 19
            sta RESP0,X     ; 4 23 <- set object position
            dex             ; 2 25
            rts             ; 6 31
    


    HMP0 and RESP0 are both referenced, but HMP1, HMM0, HMM1, HMBL, RESP1, RESM0, RESM1, and RESBL are not even though PosObject will use them (based on the value of the X register).  So if you positioned all objects, but only used PosObject to do so, your symbol file would show:

    ...
    HMBL                     0024                  
    HMCLR                    002b              (R )
    HMM0                     0022                  
    HMM1                     0023                  
    HMP0                     0020              (R )
    HMP1                     0021                  
    ...
    RESBL                    0014                  
    RESM0                    0012                  
    RESM1                    0013                  
    RESP0                    0010              (R )
    RESP1                    0011                  
    ...




     


  5. One thing I always do is have dasm generate a listing via the -l option.  That lets you see exactly what dasm did.

     

    I had Kaboom! Deluxe! open, so dropped your REPEAT/REPEND example in it.  I assembled it using:

     

    dasm kaboom_deluxe.asm -f3 -v0 -skaboom_deluxe.sym -lkaboom_deluxe.lst -okaboom_deluxe.bin
     

     

    The listing is file kaboom_deluxe.lst which contains:

       2170  fc1f					      REPEAT	192	; scanlines
       2171  fc1f		       e8		      inx
       2172  fc20		       86 09		      stx	COLUBK
       2173  fc22		       85 02		      sta	WSYNC
       2170  fc22					      REPEND
       2171  fc24		       e8		      inx
       2172  fc25		       86 09		      stx	COLUBK
       2173  fc27		       85 02		      sta	WSYNC
       2170  fc27					      REPEND
    ...
       2171  ffda		       e8		      inx
       2172  ffdb		       86 09		      stx	COLUBK
       2173  ffdd		       85 02		      sta	WSYNC
       2174  ffdf					      REPEND


    The columns in the listing are:

    • Source code line number
    • ROM address in the BIN
    • assembled values for the instructions, e8 is the opcode for inx, 86 for stx, 09 the address of COLUBK, etc.
    • the instructions

     

     

    Dasm's -s option creates a symbol file.  Shows you all the symbols and their values, and whether or not they were referenced by your program.  Example from Kaboom! Deluxe!:
     

    ...
    AUDV0                    0019              (R )
    AUDV1                    001a                  
    backgroundColor          0086              (R )
    BCD2DigitPtrs            f79a                  
    BLACK                    0000              (R )
    Blank                    fb00              (R )
    BLUE                     0080              (R )
    BOMB_DROP_RATE           0001              (R )
    BOMB_GROUP_MAX           0008              (R )
    ...


    AUDV0 was referenced, AUDV1 was not as Kaboom! only uses audio channel 0.


  6. I thought the break would be a week max, turned out to be a month. The last feature request is quite nice, I should have thought of it myself - you can now start a new game of Kaboom! Deluxe! via the paddle button.

     

    Anyway, this weekend I plan to review where I left off on the CDFJ tutorial, then start work on Part 9 - Arena.

    • Like 1

  7. 2 minutes ago, JohnnyRockets said:

    Newbie here.  I cannot find the REPEAT-REPEND command anywhere in any literature that I have.

     

    Check the new dasm homepage, it has ready to use builds and links to the documentation.

    • Like 1

  8. Figured it out - instead of the variable gameState I had to use remainingBuckets, which contains the # of buckets that are shown on screen - 1-3 during an active game, and 0 if the game is inactive.

     

    When I initially implemented this a new game started as soon as you pressed the button.  Problem with that is the same button press would also start dropping the bombs - that was slightly disorienting as the buckets weren't onscreen yet, so you didn't know where your buckets were in relation to the Mad Bomber. 

     

    Final implementation starts the new game when you release the button, which was a bit more complicated to do.  This results in:

    • first button press/release will start a new game and show the buckets
    • second button press will release the bombs

     

    I think I'm done with this hack, (made some more revisions, see reply 94) so have included the source.

     

    Summary of changes:

    • Added sunset city skyline.
    • Updated Activision logo to the rainbow variant.
    • Added game variations 3-8, Pitch and Catch where the other player controls the Mad Bomber. Mad Bomber moves slowest in 3, fastest in 8. Game play for variations 1 and 2 is the same as in the original Kaboom!
    • Paddle position indicator for Mad Bomber player.
    • Paddle button to start new game.

     

    Skyline & Rainbow logo:

    kaboom_deluxe_20200413_NTSC.thumb.png.78ecddb4fe83eef8a3d528de05566508.png

     

    Paddle position indicator shows up behind the score:

    kaboom_deluxe_20200413_NTSC_1.thumb.png.52ec1cda7761633882aaee1c26f9e36d.png

     

    NTSC

    kaboom_deluxe_20200413_NTSC.bin

     

    PAL

    kaboom_deluxe_20200413_PAL.bin

     

    PAL60

    kaboom_deluxe_20200413_PAL60.bin

     

    Source:

    kaboom_deluxe.asm

     

    Note: source was initially uploaded with COMPILE_VERSION = PAL60. I've re-uploaded it with COMPILE_VERSION = NTSC.

    • Like 3
    • Thanks 7

  9. 1 hour ago, Kaboomer said:

    Question for SpiceWare: Is it too late to add "Restart by pressing red paddle button" feature?

     

    I took a quick look - it appeared to be simple change, but turned out the game active/inactive wasn't implemented like I thought. This resulted in the game reseting (score to 0) every time you press the button.

     

    Out of time for now, will look into it more later.

    • Like 1
    • Thanks 1

  10. New build based on feedback from the live stream. The throttle routines use Game # + Level # / 2, and dropped starting speed by 1, so the max distance the Mad Bomber can move per frame is:

    • Game 3 moves 1-4
    • Game 4 moves 2-5
    • Game 5 moves 3-6
    • Game 6 moves 4-7
    • Game 7 moves 5-8
    • Game 8 moves 6-9

     

    If this looks good then I'm done with the hack.

     

    NTSC

    kaboom_deluxe_20200411_NTSC.bin

     

    PAL

    kaboom_deluxe_20200411_PAL.bin

     

    PAL60

    kaboom_deluxe_20200411_PAL60.bin

    • Like 1
    • Thanks 3

  11. 6 minutes ago, Cafeman said:

    So what is the reason of using a melody board if it doesn't have an arm on it?

     

    What is a Melody Board?

     

    Quote
    • Melody boards can be reprogrammed without having to open the cartridge.  Thus, you can "recycle" your Melody-based game and get a significant 50% credit towards a new game, or, if an upgrade for the game becomes available you can get the latest version by sending the cartridge to us and paying return shipping.
       
    • The Melody has on-board RAM and supports every known Atari 2600 bankswitching method up to 32K in size.  This includes SARA-based (Superchip) games and all the unique bankswitching schemes developed by third-party 2600 game developers.  This gives homebrew authors more flexibility in developing new games down the road.

     

    • Like 1

  12. 22 minutes ago, BIGHMW said:

    I just tried 3 times to download it and it will not work on my Flashback 9, hardware issue or will it just not read or work???

     

    Flashback doesn't support DPC+, CDF, or CDFJ games. To play the demo you need to use a real Atari with a Harmony cart, Stella on your computer, or a Retron 77 that has been updated with the latest version of Stella.
     

    • Like 1

  13. On 3/28/2020 at 3:37 AM, Rastignac said:

    Note that these quite old apps can't run on modern iOS versions and/or on modern iDevices.

    (Even if someone still has the ".ipa" somewhere, it won't install at all or it just won't run; only a very old iDevice would work; what a pity indeed)

    Sorry.

     

    Correct - I have both 2600 Magic 1.1.ipa and DragstrMagic 1.0.ipa. Haven't been able to run them in a long time.


  14. Missed a couple months again.

    • $73 for May, was $130 last year (solar only active for half this billing cycle)
    • $35 for June, was $180 last year
    • $60 for July, was $235 last year
    • $10 for August, was $302 last year (was out of town 10 days with AC set to 90°F)
    • $53 for September, was $297 last year
    • $42 for October, was $235 last year
    • $18 for November, was $108 last year
    • $28 for December, was $99 last year
    • $12 for January, was $103 last year
    • $25 for February, was $93 last year
    • $1 for March, was $93 last year

     
    $357 to date, was $1875 last year


    February
    Feb.thumb.png.39f07018e25508f93849b8fe5df8ee12.png

     

    March

    439130763_Mar2.thumb.png.b9088473c242bbdce351096c95702f66.png

     

     

    Mar.thumb.png.4176fbc542d560bfdc5ae85704270b84.png

×
×
  • Create New...