diff --git a/JUMPYGUY.s b/JUMPYGUY.s new file mode 100644 index 0000000..b71c812 --- /dev/null +++ b/JUMPYGUY.s @@ -0,0 +1,1797 @@ + DSK JUMPYGUY + +************************************************** +* To Do: +* +************************************************** +* Variables +************************************************** + +ROW EQU $FA ; row/col in text screen +COLUMN EQU $FB +CHAR EQU $FC ; char/pixel to plot +PROGRESS EQU $FD ; write to main or alt +PLOTROW EQU $FE ; row/col in text page +PLOTCOLUMN EQU $FF +RNDSEED EQU $EA ; +eb +ec +SPRITEOFFSET EQU $CE ; where am I in the midst of drawing +SPRITEINDEX EQU $1D ; which table do I look for sprite data +SPRITELO EQU $1E ; address of sprite pixel table +SPRITEHI EQU $1F +PLOTINDEX EQU $1C ; which sprite am i drawing +SPRITEWIDTH EQU $ED +SPRITEHEIGHT EQU $EF +BGCHAR EQU $40 ; stores the background pixel for overwriting +JUMPING EQU $41 ; are we jumping, and if so, what frame are we on +COLLISIONROW EQU $E1 ; address of colliding pixels +COLLISIONCOLUMN EQU $E2 +COLLISIONFLAG EQU $E3 ; has there been a collision this frame? + +PLAYERSCORE EQU $09 +HISCORE EQU $0A + + +************************************************** +* Apple Standard Memory Locations +************************************************** +CLRLORES EQU $F832 +LORES EQU $C050 +TXTSET EQU $C051 +MIXCLR EQU $C052 +MIXSET EQU $C053 +TXTPAGE1 EQU $C054 +TXTPAGE2 EQU $C055 +KEY EQU $C000 +C80STOREOFF EQU $C000 +C80STOREON EQU $C001 +STROBE EQU $C010 +SPEAKER EQU $C030 +VBL EQU $C02E +RDVBLBAR EQU $C019 ;not VBL (VBL signal low +WAIT EQU $FCA8 +RAMWRTAUX EQU $C005 +RAMWRTMAIN EQU $C004 +SETAN3 EQU $C05E ;Set annunciator-3 output to 0 +SET80VID EQU $C00D ;enable 80-column display mode (WR-only) +HOME EQU $FC58 ; clear the text screen +CH EQU $24 ; cursor Horiz +CV EQU $25 ; cursor Vert +VTAB EQU $FC22 ; Sets the cursor vertical position (from CV) +COUT EQU $FDED ; Calls the output routine whose address is stored in CSW, + ; normally COUTI +STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low + +ALTTEXT EQU $C055 +ALTTEXTOFF EQU $C054 + +ROMINIT EQU $FB2F +ROMSETKBD EQU $FE89 +ROMSETVID EQU $FE93 + +ALTCHAR EQU $C00F ; enables alternative character set - mousetext + +BLINK EQU $F3 +SPEED EQU $F1 + +************************************************** +* START - sets up various fiddly zero page bits +************************************************** + + ORG $2000 ; PROGRAM DATA STARTS AT $2000 + + JSR ROMSETVID ; Init char output hook at $36/$37 + JSR ROMSETKBD ; Init key input hook at $38/$39 + JSR ROMINIT ; GR/HGR off, Text page 1 + + LDA #$01 + STA PROGRESS ; which page do we write to + + LDA #$00 + STA BLINK ; blinking text? no thanks. + STA JUMPING + STA BGCHAR + STA LORES ; low res graphics mode + STA COLLISIONFLAG ; no collision yet + STA NUMBEROFSPRITES ; just the runner for attract screen + STA HISCORE + STA PLAYERSCORE + JSR CLRLORES ; clear screen + + +DRAWBOARD JSR HOME + + LDA #$70 + STA SPEED ; re-using the applesoft variable. fun. + + + STA ALTTEXTOFF ; display main text page + JSR RNDINIT ; *should* cycle the random seed. + LDA #$00 + STA NUMBEROFSPRITES ; just the runner for attract screen + STA SPRITECOLUMN + STA LASTCOLUMN ; reset runner position + INC PROGRESS + + +* SPRITECOLUMN HEX 01,28,40,58 +* need to reset the runner and sprites for next try + LDX #$0 + LDA #$01 + STA SPRITECOLUMN,X + INX + LDA #$28 + STA SPRITECOLUMN,X + INX + LDA #$40 + STA SPRITECOLUMN,X + INX + LDA #$58 + STA SPRITECOLUMN,X + + + +************************************************** +* blanks the screen +************************************************** +; FOR EACH ROW/COLUMN + + LDA #$18 ; X = 24 + STA PLOTROW +ROWLOOP2 ; (ROW 20 to 0) + DEC PLOTROW ; start columnloop (COLUMN 0 to 40) + LDA #$28 + STA PLOTCOLUMN +COLUMNLOOP2 DEC PLOTCOLUMN + + LDA PLOTROW +PLOTZERO LDA #$00 ; set all pixels to 00 +PLOTLINE STA CHAR + JSR PLOTQUICK ; plot 00 + INC PROGRESS + JSR PLOTQUICK ; plot 00 to alt + INC PROGRESS + + LDA PLOTCOLUMN ; last COLUMN? + BNE COLUMNLOOP2 ; loop + +; /columnloop2 + + LDA PLOTROW ; last ROW? + BNE ROWLOOP2 ; loop + +; /rowloop2 + JSR DRAWGROUND + INC PROGRESS + JSR DRAWGROUND + JSR DRAWCLOUDS + JSR DRAWSCOREBD + +* if the high score is above, say, 90. You get a burger. + + LDA PLAYERSCORE + CMP #$5A + BCS BURGERTIME + + JSR DRAWLOGO + INC PROGRESS + JSR DRAWLOGO + + JMP FIXJUMP + +BURGERTIME JSR DRAWBURGER + INC PROGRESS + JSR DRAWBURGER + + +FIXJUMP LDA #$11 ; fix jumper masking on first frame of attract mode + STA LASTROW + STA SPRITEROW + + LDA PLAYERSCORE + CMP HISCORE + BCC NOHISCORE +* if the current PLAYERSCORE is higher than hiscore, set HISCORE, then reset PLAYERSCORE + STA HISCORE +NOHISCORE JSR UPDATEHISCORE + LDA #$00 + STA PLAYERSCORE + + + + +************************************************** +* MAIN LOOP +* waits for keyboard input, moves cursor, etc +************************************************** + +ATTRACT + JSR NEXTSCREEN ; animate one frame per loop + + LDA SPEED + JSR WAIT + + LDA KEY ; check for keydown + CMP #$A0 ; space bar pause? + BEQ STARTGAME + + CMP #$9B ; ESC + BEQ END ; exit on ESC? + + JSR DRAWCLOUDS + + + JMP ATTRACT ; loop until a key + +STARTGAME STA STROBE + + JSR ERASELOGO + INC PROGRESS + JSR ERASELOGO + + LDA #$03 + STA NUMBEROFSPRITES ; add obstacle sprites + + JMP MAIN ; back to waiting for a key + + + + + + + + + +************************************************** +* MAIN LOOP +* waits for keyboard input, moves cursor, etc +************************************************** + +MAIN +MAINLOOP JSR NEXTSCREEN ; animate one frame per loop + + LDA COLLISIONFLAG ; collided with something on last go-round. time to reset. + BNE GOTRESET + + LDA KEY ; check for keydown + CMP #$A0 ; space bar + BEQ GOTJUMP ; + CMP #$D2 ; R to reset + BEQ GOTRESET + + CMP #$9B ; ESC + BEQ END ; exit on ESC? + + CMP #$CA ; J also jumps + BEQ GOTJUMP ; + +GOLOOP JMP MAINLOOP ; loop until a key + + + +GOTJUMP STA STROBE +* if jumping == 0, then jumping == 1 + LDA JUMPING + BNE ALREADYJUMPING ; not zero, skip + INC JUMPING ; should be 1 now. + +ALREADYJUMPING + JMP MAINLOOP ; back to waiting for a key + +GOTRESET STA STROBE + JMP DRAWBOARD + +END STA STROBE + STA ALTTEXTOFF + STA TXTSET + JSR HOME + RTS ; END + + +************************************************** +* subroutines +* +************************************************** + +************************************************** +* main animation loop +************************************************** + +NEXTSCREEN + +* MASK ALL THE SPRITES *THEN* +* RENDER ALL THE SPRITES + + +LOADSPRITES + LDX NUMBEROFSPRITES ; number of sprites, starts with last one + STX PLOTINDEX ; start with last sprite, PLOTINDEX decrements per loop + INC PLOTINDEX + +* MASK the sprites *i just rendered* on the hidden frame +MASKALLTHETHINGS + + DEC PLOTINDEX + LDX PLOTINDEX + LDA SPRITEINDEXTABLE,X ; use spriteindex to mask sprites. all else is X for position, velocity + STA SPRITEINDEX + LDX SPRITEINDEX + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + LDX PLOTINDEX ; return X to plotindex for plotting position + LDA SPRITEROW,X + STA PLOTROW + STA LASTROW,X + LDA SPRITECOLUMN,X + STA PLOTCOLUMN + STA LASTCOLUMN,X + INC PROGRESS + JSR CLEARSPRITE ; be sure to clear previous frames before animating, since it's not triggered by movement + INC PROGRESS + + LDA PLOTINDEX + BNE MASKALLTHETHINGS ; do runner/sprite zero last. +;/MASKALLTHETHINGS + + INC PROGRESS + JSR DRAWGROUND ; covers the mask with green grass layer + INC PROGRESS + + + +* plot the runner, sprite 0 +* define the proper sprite + +RUNNINGMAN +* animate sprite 0 - should rotate between runners on each frame. + LDA JUMPING + BNE JUMPINGMAN +* if JUMPING not zero, skip to JUMPINGMAN + + LDX #$0 ; load SPRITEINDEXTABLE,0 + STX PLOTINDEX ; reset plotindex for sprite 0 + LDA SPRITEINDEXTABLE,X + CLC + ADC #$01 ; INC it 05->06->07->08 + CMP #$09 + BCC SWAPTY ; if more than 8, set to 5 then swap + LDA #$05 +SWAPTY JSR SWAPSPRITE ; SWAP SPRITEINDEX + + + LDX SPRITEINDEXTABLE ; use spriteindex to swap sprites. all else is plotindex for position, velocity + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + LDX #$0 + + LDA SPRITEROW,X + STA PLOTROW + STA LASTROW + LDA SPRITECOLUMN,X + STA PLOTCOLUMN + STA LASTCOLUMN + JSR PLOTSPRITE ; plot sprite zero, runner. + + + JMP CONTINUERUNNING + + + +JUMPINGMAN + LDX #$0 ; load SPRITEINDEXTABLE,0 + STX PLOTINDEX ; reset plotindex for sprite 0 + +* if spriteindex,0 (runner) != 9, swapsprite to 9. + LDA SPRITEINDEXTABLE + CMP #$09 + BEQ DONEYET + LDA #$09 + JSR SWAPSPRITE + + + +* if jumping > 11, done jumping, swapsprite to 5. set jumping to 0 +DONEYET INC JUMPING + LDA JUMPING + CMP #$12 ; 18 frames of jumping + BCC CONTINUEJUMPING + +DONEJUMPING LDA #$0 + STA JUMPING + LDA #$05 + JSR SWAPSPRITE + + LDX SPRITEINDEXTABLE ; use spriteindex to mask sprites. all else is X for position, velocity + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + LDX #$0 ; return X to plotindex of 0 for plotting position + LDA SPRITEROW,X + STA PLOTROW + STA LASTROW + LDA SPRITECOLUMN,X + STA PLOTCOLUMN + STA LASTCOLUMN + + JSR CLEARSPRITE ; be sure to clear previous frames before animating, since it's not triggered by movement + + + +* otherwise +STILLJUMPING +* increment jumping frame number + +CONTINUEJUMPING + + LDX JUMPING ; if not jumping, or *done* jumping, uses JUMPINGCURVE,0 + LDA JUMPINGCURVE,X ; what row to render on which frame of the JUMP + STA SPRITEROW ; spriterow, 0 + STA LASTROW ; LASTROW,0 + + LDX SPRITEINDEXTABLE ; use spriteindex to swap sprites. all else is plotindex for position, velocity + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + LDX #$0 + + LDA SPRITEROW,X + STA PLOTROW + STA LASTROW + LDA SPRITECOLUMN,X + STA PLOTCOLUMN + STA LASTCOLUMN + JSR PLOTSPRITE ; plot sprite zero, runner. + + +CONTINUERUNNING + +COLLIDINGORNOT +* set colliding sprites to FF + LDA #$FF + LDY #$0 + STY COLLISIONFLAG ; clear collision detector flag + STA COLLIDINGSPRITES,Y + LDY #$1 + STA COLLIDINGSPRITES,Y + + + +* plot obstacle sprites + + LDX NUMBEROFSPRITES ; number of sprites, starts with last one + STX PLOTINDEX ; start with last sprite, PLOTINDEX decrements per loop + LDA PLOTINDEX + BNE NEXTSPRITE + JMP UPDATESCREEN ; sprite zero already done. chill. + + +NEXTSPRITE LDA SPRITEINDEXTABLE,X ; get the index of that sprite - may be out of order + STA SPRITEINDEX + + + + + +* define the obstacle sprite + LDX SPRITEINDEX ; use spriteindex to swap sprites. all else is plotindex for position, velocity + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + LDX PLOTINDEX ; return X to plotindex for plotting position + + +* update obstacle position + +* if moving left, decrement SPRITECOLUMN +* if moving right, increment SPRITECOLUMN +HORIZONTAL LDA HORIZSIGN,X + BEQ MOVINGLEFT + LDA SPRITECOLUMN,X + CLC + ADC HVELOCITY,X + STA SPRITECOLUMN,X + STA PLOTCOLUMN + JMP NEXTOBSTACLE +MOVINGLEFT LDA SPRITECOLUMN,X + SEC + SBC HVELOCITY,X + STA SPRITECOLUMN,X + STA PLOTCOLUMN + CLC + ADC SPRITEWIDTH ; add the sprite width to see if it's all the way off screen + BMI OFFLEFT + JMP NEXTOBSTACLE ; still positive number, still on screen + +OFFLEFT LDA #$40 ; off the left side. wrap around to right side + STA SPRITECOLUMN,X + +* cleared an obstacle. Increment the player score. In DECIMAL + LDA PLAYERSCORE + SED + CLC + ADC #$01 + STA PLAYERSCORE + CLD + +* display updated player score + + STX $07 ; hang onto X + JSR UPDATESCORE + LDX $07 ; back to X, thanks. + +* twinkle the stars. + JSR DRAWCLOUDS + + + +* as one obstacle goes off to the left, kick another off from the right. speed up runner + + LDA SPEED + CMP #$40 ; faster than $40, start ramping forward "level 2" + BCC GOTTAGOFAST ; speed max at 1, not 0. odd. + + DEC SPEED ; running slightly faster with each iteration + JMP NEXTOBSTACLE +GOTTAGOFAST ; already running at full speed. +* start sending the obstacles two at a time? + DEC SPEED ; running slightly faster with each iteration + + +* move runner closer to obstacles + +* need to mask the runner left side + STX $07 ; hang onto X + + LDX SPRITEINDEXTABLE ; use spriteindex to mask sprites. all else is X for position, velocity + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + + LDX #$0 ; zero for the runner sprite + JSR CLEARSPRITE ; flicker? + INC PROGRESS + JSR CLEARSPRITE ; flicker? + INC PROGRESS ; do i need both of these? + +REDRAWRUNNER LDX SPRITEINDEXTABLE ; use spriteindex to swap sprites. all else is plotindex for position, velocity + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + + LDX #$0 + +* don't go completely off the screen + LDA SPRITECOLUMN + CMP #$1C + BCS REPLOTRUNNER + +MOVERIGHT INC SPRITECOLUMN ; spritecolumn, 0 = runner horiz position. + INC LASTCOLUMN + +REPLOTRUNNER LDA SPRITEROW,X + STA PLOTROW + STA LASTROW + LDA SPRITECOLUMN,X + STA PLOTCOLUMN + STA LASTCOLUMN + JSR PLOTSPRITE ; plot sprite zero, runner. + + + LDX $07 ; back to X, thanks. + + + +NEXTOBSTACLE + LDA SPRITEROW,X + STA PLOTROW + LDA SPRITECOLUMN,X + STA PLOTCOLUMN + + LDA SPRITEINDEXTABLE,X ; get the index of that sprite - may be out of order + STA SPRITEINDEX + +* redefine the ball sprite + LDX SPRITEINDEX ; use spriteindex to swap sprites. all else is plotindex for position, velocity + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + +* plot new sprite on next frame +PLOTOBSTACLE JSR PLOTSPRITE + + +CHECKCOLLISION LDA COLLISIONFLAG + BEQ NOCOLLISION ; still zero, no collision yet + + +* collision detected. +* show crash sprite, centered on collision location. +* save the current score +* compare to the high score +* if higher, adjust the high score +* kill the player and return to ATTRACT + + + LDA COLLISIONROW + STA PLOTROW + DEC PLOTROW + DEC PLOTROW + LDA COLLISIONCOLUMN + STA PLOTCOLUMN + DEC PLOTCOLUMN + DEC PLOTCOLUMN + DEC PLOTCOLUMN +* redefine the obstacle sprite + LDX #$0 ; spriteindex 0 = splosion. + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + +* plot new sprite on next frame + INC PROGRESS + JSR PLOTSPRITE + INC PROGRESS + LDA COLLISIONROW + STA PLOTROW + DEC PLOTROW + DEC PLOTROW + LDA COLLISIONCOLUMN + STA PLOTCOLUMN + DEC PLOTCOLUMN + DEC PLOTCOLUMN + DEC PLOTCOLUMN + JSR PLOTSPRITE + + JSR BONK ; animation *and* sound? Dinner *and* a show? + + LDA #$ff + JSR WAIT + + JMP ENDSCREEN + + +NOCOLLISION + +* loop for next sprite + DEC PLOTINDEX + BEQ UPDATESCREEN ; plotindex of 0, we already did the runner + BNE LOOPTY ; not yet 0, go back and plot another sprite + + +LOOPTY LDX PLOTINDEX + JMP NEXTSPRITE + + +UPDATESCREEN + INC PROGRESS + ROR PROGRESS ; lowest bit into carry + BCC ALTSCREEN ; carry set on odd, not on even + STA ALTTEXTOFF + JMP NORMSCREEN + +ALTSCREEN STA ALTTEXT + + +* wait after screen swap, to let it happen? +NORMSCREEN ROL PROGRESS + + LDA SPEED + JSR WAIT + +ENDSCREEN RTS + +;/NEXTSCREEN + + + + +************************************************** +* Draw a sprite at PLOTROW, PLOTCOLUMN - clobbers A, Y +************************************************** + +PLOTSPRITE + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + + LDA #$0 + STA ROW ; for each ROW in X + +SPRITEROWS LDA #$0 + STA COLUMN ; for each COLUMN in Y + LDA PLOTCOLUMN + CLC + ADC COLUMN + STA PLOTCOLUMN +SPRITECOLUMNS LDY SPRITEOFFSET + LDA (SPRITELO),Y ; LDA Sprite Origin,OFFSET + STA CHAR ; store character + INC PROGRESS + JSR PLOTCHAR ; PLOT on offscreen frame + INC PROGRESS + INC SPRITEOFFSET + INC PLOTCOLUMN + INC COLUMN + LDA SPRITEWIDTH + CMP COLUMN + BCS SPRITECOLUMNS ; do next column + + INC PLOTROW + INC ROW + DEC PLOTCOLUMN + LDA PLOTCOLUMN ; PLOTCOLUMN back to sprite's origin + SEC + SBC SPRITEWIDTH + STA PLOTCOLUMN + + LDA SPRITEHEIGHT + CMP ROW + BCS SPRITEROWS ; do next row + +SPRITEDONE RTS + + + + +************************************************** +* Erase sprite-sized hole at lastrow, lastcolumn - clobbers A +************************************************** + +CLEARSPRITE + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + STA ROW ; for each ROW in X + + LDA LASTROW,X + STA PLOTROW + LDA LASTCOLUMN,X + SEC + SBC HVELOCITY,X ; obstacles moving left, dammit. + STA PLOTCOLUMN + + +CLEARROWS LDA #$0 + STA COLUMN ; for each COLUMN in Y + LDA PLOTCOLUMN + CLC + ADC COLUMN + STA PLOTCOLUMN +CLEARCOLUMNS LDY SPRITEOFFSET + LDA #$00 + STA CHAR ; store character + JSR PLOTQUICK ; PLOT on offscreen frame + INC SPRITEOFFSET + INC PLOTCOLUMN + INC COLUMN + ; LDA SPRITEWIDTH + LDA #$08 ; clear 9px wide mask + CMP COLUMN + BCS CLEARCOLUMNS ; do next column + + INC PLOTROW + INC ROW + DEC PLOTCOLUMN + LDA PLOTCOLUMN ; PLOTCOLUMN back to sprite's origin + SEC + ; SBC SPRITEWIDTH + SBC #$08 + STA PLOTCOLUMN + + LDA SPRITEHEIGHT + CMP ROW + BCS CLEARROWS ; do next row + +CLEARDONE RTS + + + + + +************************************************** +* process two digit score (decimal) into two +* numeral sprites - clobbers A, X +************************************************** + +UPDATESCORE + +* get score + LDA PLAYERSCORE +* get low nibble of score +* AND score with 0F + AND #$0F +* load sprite for that digit + CLC + ADC #$0A +* spriteindex = digit + #$0A to X + TAX + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + +* plotrow = 0 + LDA #$0 + STA PLOTROW +* plotcolumn = #$0C and #$11 + LDA #$11 + STA PLOTCOLUMN + JSR PLOTSPRITE + INC PROGRESS +* plot sprite again for alternate frame + LDA #$0 + STA PLOTROW + LDA #$11 + STA PLOTCOLUMN + JSR PLOTSPRITE ; plot those sprites where they already are + INC PROGRESS + +* get score + LDA PLAYERSCORE +* get HI nibble of score +* AND score with F0 + AND #$F0 + LSR + LSR + LSR + LSR +* load sprite for that digit + CLC + ADC #$0A +* spriteindex = digit + #$0A to X + TAX + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + +* plotrow = 0 + LDA #$0 + STA PLOTROW +* plotcolumn = #$0C and #$11 + LDA #$0C + STA PLOTCOLUMN + JSR PLOTSPRITE + INC PROGRESS +* plot sprite again for alternate frame + LDA #$0 + STA PLOTROW + LDA #$0C + STA PLOTCOLUMN + JSR PLOTSPRITE ; plot those sprites where they already are + INC PROGRESS + + + + RTS + +************************************************** +* process two digit high score (decimal) into two +* numeral sprites - clobbers A, X +************************************************** + + +UPDATEHISCORE + +* get score + LDA HISCORE +* get low nibble of score +* AND score with 0F + AND #$0F +* load sprite for that digit + CLC + ADC #$0A +* spriteindex = digit + #$0A to X + TAX + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + +* plotrow = 0 + LDA #$0 + STA PLOTROW +* plotcolumn = #$1D and #$23 + LDA #$23 + STA PLOTCOLUMN + JSR PLOTSPRITE + INC PROGRESS +* plot sprite again for alternate frame + LDA #$0 + STA PLOTROW + LDA #$23 + STA PLOTCOLUMN + JSR PLOTSPRITE ; plot those sprites where they already are + INC PROGRESS + +* get score + LDA HISCORE +* get HI nibble of score +* AND score with F0 + AND #$F0 + LSR + LSR + LSR + LSR +* load sprite for that digit + CLC + ADC #$0A +* spriteindex = digit + #$0A to X + TAX + + LDA SPRITELOTABLE,X + STA SPRITELO + LDA SPRITEHITABLE,X + STA SPRITEHI + + LDA SPRITEWIDTHTABLE,X + STA SPRITEWIDTH + LDA SPRITEHEIGHTTABLE,X + STA SPRITEHEIGHT + +* plotrow = 0 + LDA #$0 + STA PLOTROW +* plotcolumn = #$1D and #$23 + LDA #$1e + STA PLOTCOLUMN + JSR PLOTSPRITE + INC PROGRESS +* plot sprite again for alternate frame + LDA #$0 + STA PLOTROW + LDA #$1e + STA PLOTCOLUMN + JSR PLOTSPRITE ; plot those sprites where they already are + INC PROGRESS + + + + RTS + + + + + + +************************************************** +* prints one CHAR at PLOTROW,PLOTCOLUMN - clobbers A,Y +* used for plotting background elements that don't need collision detection +************************************************** +PLOTQUICK + LDY PLOTROW + TYA + CMP #$18 + BCS OUTOFBOUNDS2 ; stop plotting if dimensions are outside screen + + ROR PROGRESS + BCC PLOTQUICKALT ; every other frame, write to alt text page + + LDA LoLineTableL,Y + STA $0 + LDA LoLineTableH,Y + STA $1 ; now word/pointer at $0+$1 points to line + JMP LOADQUICK + +PLOTQUICKALT LDA AltLineTableL,Y + STA $0 + LDA AltLineTableH,Y + STA $1 ; now word/pointer at $0+$1 points to line + +LOADQUICK ROL PROGRESS ; return progress state for next ROR + + LDY PLOTCOLUMN + TYA + CMP #$28 + BCS OUTOFBOUNDS2 ; stop plotting if dimensions are outside screen + + STY $06 ; hang onto Y for a sec... + + LDA CHAR + LDY $06 + STA ($0),Y + +OUTOFBOUNDS2 RTS +;/PLOTQUICK + + + + + + + +************************************************** +* prints one CHAR at PLOTROW,PLOTCOLUMN - clobbers A,Y +* checks for collisions. This is the tricky part. +************************************************** +PLOTCHAR + +* "foreground" is obstacle sprite +* "background" is already rendered sprite 0, runner + +* get char to overwrite +* if CHAR and BGCHAR are the same, skip? + JSR GETCHAR + STA BGCHAR + ; CMP CHAR + ; BEQ OUTOFBOUNDS + + LDA CHAR + BEQ OUTOFBOUNDS ; don't plot 00 px + + LDY PLOTROW + TYA + CMP #$18 + BCS OUTOFBOUNDS ; stop plotting if dimensions are outside screen + + CLC + ROR PROGRESS + BCC PLOTCHARALT ; every other frame, write to alt text page + ROL PROGRESS + + LDA LoLineTableL,Y + STA $0 + LDA LoLineTableH,Y + STA $1 ; now word/pointer at $0+$1 points to line + JMP LOADCHAR + +PLOTCHARALT ROL PROGRESS + LDA AltLineTableL,Y + STA $0 + LDA AltLineTableH,Y + STA $1 ; now word/pointer at $0+$1 points to line + +LOADCHAR ; return progress state for next ROR + + LDY PLOTCOLUMN + TYA + CMP #$28 + BCS OUTOFBOUNDS ; stop plotting if dimensions are outside screen + + STY $06 ; hang onto Y for a sec... + + + +* check collisions only on rows with runner/obstacles + LDY PLOTROW + TYA + CMP #$17 + BCS FULLPIXEL + + CMP #$0F + BCC FULLPIXEL + + +CLOBBER LDA CHAR ; this would be a byte with two pixels + BEQ FULLPIXEL ; zero foreground pixel? ignore for collision + CMP #$CC ; green "grass" pixel? ignore + LDA BGCHAR + BEQ FULLPIXEL ; zero background pixel? ignore + CMP #$CC ; green "grass" pixel? ignore + BEQ FULLPIXEL + +NONZERO + LDA #$01 + STA COLLISIONFLAG ; set collision detected + + JMP PLOTCOLLISION + +FULLPIXEL LDA CHAR + LDY $06 + STA ($0),Y + + +OUTOFBOUNDS RTS +;/PLOTCHAR + + +* DEBUG where pixels overlap, make a purple spot to track. #$33 + +PLOTCOLLISION + ;LDA #$33 ; collision spot purple for debugging + ;LDY PLOTCOLUMN + ;STA (COLLISIONLO),Y ; collision spot purple + + LDA CHAR + LDY $06 + STA ($0),Y + + LDA PLOTCOLUMN + STA COLLISIONCOLUMN + LDA PLOTROW + STA COLLISIONROW + +COLLISIONDONE RTS + + +************************************************** +* changes index in SPRITEINDEXTABLE to new value from Accumulator - clobbers Y +************************************************** + +SWAPSPRITE + LDY PLOTINDEX ; get current plotindex + STA SPRITEINDEXTABLE,Y ; put accumulator's sprite index into table instead of current ball + RTS + +************************************************** +* GETS one CHAR at PLOTROW,PLOTCOLUMN - value returns in Accumulator - clobbers Y +************************************************** +GETCHAR + LDY PLOTROW + CLC + ROR PROGRESS + BCC GETCHARALT ; every other frame, write to alt text page + ROL PROGRESS ; return progress state for next ROR + + LDA LoLineTableL,Y + STA $0 + LDA LoLineTableH,Y + JMP STORECHAR + +GETCHARALT ROL PROGRESS ; return progress state for next ROR + LDA AltLineTableL,Y + STA $0 + LDA AltLineTableH,Y + +STORECHAR STA $1 ; now word/pointer at $0+$1 points to line + LDY PLOTCOLUMN + LDA ($0),Y ; byte at row,col is now in accumulator + RTS +;/GETCHAR + + + + +************************************************** +* draws the splash screen logo - clobbers A, Y +************************************************** + +DRAWLOGO ; draws the moon and clouds + LDA #$26 + STA PLOTCOLUMN + LDA #$B ; down a bit. + STA PLOTROW + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + + LDA #$05 + STA ROW ; for each ROW +LOGOROWS LDA #$24 + STA COLUMN ; for each COLUMN + LDA PLOTCOLUMN + SEC + SBC COLUMN + STA PLOTCOLUMN +LOGOCOLUMNS LDY SPRITEOFFSET + LDA LOGO1,Y ; LDA Sprite Origin,OFFSET + STA CHAR ; store character + JSR PLOTQUICK ; PLOT on frame + INC SPRITEOFFSET + INC PLOTCOLUMN + DEC COLUMN ; count down columns from 40 + BNE LOGOCOLUMNS ; do next column + + INC PLOTROW + DEC ROW ; count down rows from 4 + BNE LOGOROWS ; do next row + + + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + LDA #$05 + STA ROW ; for each ROW +LOGO2ROWS LDA #$24 + STA COLUMN ; for each COLUMN + LDA PLOTCOLUMN + SEC + SBC COLUMN + STA PLOTCOLUMN +LOGO2COLUMNS LDY SPRITEOFFSET + LDA LOGO2,Y ; LDA Sprite Origin,OFFSET + STA CHAR ; store character + JSR PLOTQUICK ; PLOT on frame + INC SPRITEOFFSET + INC PLOTCOLUMN + DEC COLUMN ; count down columns from 40 + BNE LOGO2COLUMNS ; do next column + + INC PLOTROW + DEC ROW ; count down rows from 4 + BNE LOGO2ROWS ; do next row + +LOGODONE + RTS + + + + + + + +************************************************** +* erases the logo, ready to start game - clobbers A +************************************************** +; FOR EACH ROW/COLUMN + +ERASELOGO LDA #$16 ; X = 22 + STA PLOTROW +ERASELOOP ; (ROW 22 to 12) + DEC PLOTROW ; start columnloop (COLUMN 0 to 40) + LDA #$28 + STA PLOTCOLUMN +ERASELOOP2 DEC PLOTCOLUMN + + LDA PLOTROW + LDA #$00 ; set all pixels to 00 + STA CHAR + JSR PLOTQUICK ; plot 00 + LDA PLOTCOLUMN ; last COLUMN? + BNE ERASELOOP2 ; loop + +; /ERASELOOP2 + LDA PLOTROW ; last ROW? + CMP #$0B + BCS ERASELOOP ; loop +; /ERASELOOP + RTS + + + +************************************************** +* draws the header moon and clouds - clobbers A, Y +************************************************** + +DRAWCLOUDS ; draws the moon and clouds + LDA #$28 + STA PLOTCOLUMN + LDA #$5 ; down a bit. + STA PLOTROW + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + + LDA #$04 + STA ROW ; for each ROW +CLOUDROWS LDA #$28 + STA COLUMN ; for each COLUMN + LDA PLOTCOLUMN + SEC + SBC COLUMN + STA PLOTCOLUMN +CLOUDCOLUMNS LDY SPRITEOFFSET + + JSR RND + CMP #$80 + BCC TWINKLESTARS + LDA CLOUDS,Y ; LDA Sprite Origin,OFFSET + JMP NORMALSTARS +TWINKLESTARS LDA TWINKLE,Y ; LDA Sprite Origin,OFFSET +NORMALSTARS STA CHAR ; store character + JSR PLOTQUICK ; PLOT on frame + INC PROGRESS + JSR PLOTQUICK ; PLOT on offscreen frame + INC PROGRESS + INC SPRITEOFFSET + INC PLOTCOLUMN + DEC COLUMN ; count down columns from 40 + BNE CLOUDCOLUMNS ; do next column + + INC PLOTROW + DEC ROW ; count down rows from 4 + BNE CLOUDROWS ; do next row +CLOUDSDONE + RTS + + + +************************************************** +* draws the scoreboard and initial zero scores - clobbers A, Y +************************************************** + +DRAWSCOREBD ; draws the scoreboard + LDA #$28 + STA PLOTCOLUMN + LDA #$0 ; down a bit. + STA PLOTROW + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + + LDA #$04 + STA ROW ; for each ROW +SCOREBDROWS LDA #$28 + STA COLUMN ; for each COLUMN + LDA PLOTCOLUMN + SEC + SBC COLUMN + STA PLOTCOLUMN +SCOREBDCOLUMNS LDY SPRITEOFFSET + LDA SCOREBOARD,Y ; LDA Sprite Origin,OFFSET + STA CHAR ; store character + JSR PLOTQUICK ; PLOT on frame + INC PROGRESS + JSR PLOTQUICK ; PLOT on offscreen frame + INC PROGRESS + INC SPRITEOFFSET + INC PLOTCOLUMN + DEC COLUMN ; count down columns from 40 + BNE SCOREBDCOLUMNS ; do next column + + INC PLOTROW + DEC ROW ; count down rows from 4 + BNE SCOREBDROWS ; do next row +SCOREBDDONE + RTS + + + + +************************************************** +* redraws the brown and green ground/footer - clobbers A +************************************************** + +DRAWGROUND + LDA #$16 + STA PLOTROW + LDA #$28 + STA PLOTCOLUMN + +COLUMNLOOP3 DEC PLOTCOLUMN + LDA #$CC ; set all pixels to CC green + STA CHAR + JSR PLOTQUICK ; plot CC + LDA PLOTCOLUMN ; last COLUMN? + BNE COLUMNLOOP3 ; loop + +; /columnloop3 + INC PLOTROW + + LDA #$28 + STA PLOTCOLUMN +COLUMNLOOP4 DEC PLOTCOLUMN + LDA #$84 ; set all pixels to 84 green/brown + STA CHAR + JSR PLOTQUICK ; plot 84 + LDA PLOTCOLUMN ; last COLUMN? + BNE COLUMNLOOP4 ; loop + +; /columnloop4 + + RTS + + + + +************************************************** +* draws the BURGER - clobbers A, Y +* congratulations on finding the easter egg. +************************************************** + +DRAWBURGER ; draws the BURGER + LDA #$20 + STA PLOTCOLUMN + LDA #$B ; down a bit. + STA PLOTROW + LDA #$0 + STA SPRITEOFFSET ; set offset to 0 + + LDA #$07 + STA ROW ; for each ROW +BURGERROWS LDA #$17 + STA COLUMN ; for each COLUMN + LDA PLOTCOLUMN + SEC + SBC COLUMN + STA PLOTCOLUMN +BURGERCOLUMNS LDY SPRITEOFFSET + LDA BURGER,Y ; LDA Sprite Origin,OFFSET + STA CHAR ; store character + JSR PLOTQUICK ; PLOT on frame + INC SPRITEOFFSET + INC PLOTCOLUMN + DEC COLUMN ; count down columns from 40 + BNE BURGERCOLUMNS ; do next column + + INC PLOTROW + DEC ROW ; count down rows from 4 + BNE BURGERROWS ; do next row + + +BURGERDONE + RTS + + +************************************************** +* CLICKS and BEEPS - clobbers X,Y,A +************************************************** +CLICK LDX #$06 +CLICKLOOP LDA #$10 ; SLIGHT DELAY + JSR WAIT + LDA SPEAKER + DEX + BNE CLICKLOOP + RTS +;/CLICK + +BEEP LDX #$30 +BEEPLOOP LDA #$08 ; short DELAY + JSR WAIT + LDA SPEAKER + DEX + BNE BEEPLOOP + RTS +;/BEEP + + +BONK LDX #$50 +BONKLOOP LDA #$20 ; longer DELAY + JSR WAIT + LDA SPEAKER + DEX + BNE BONKLOOP + RTS +;/BONK + + + +************************************************** +* DATASOFT RND 6502 +* BY JAMES GARON +* 10/02/86 +* Thanks to John Brooks for this. I modified it slightly. +* +* returns a randomish number in Accumulator. +************************************************** +RNDINIT + LDA $C030 ; #$AB + STA RNDSEED + LDA $4E ; #$55 + STA RNDSEED+1 + LDA PROGRESS ; #$7E + STA RNDSEED+2 + RTS + +* RESULT IN ACC +RND LDA RNDSEED + ROL RNDSEED + EOR RNDSEED + ROR RNDSEED + INC RNDSEED+1 + BNE RND10 + LDA RNDSEED+2 + INC RNDSEED+2 +RND10 ADC RNDSEED+1 + BVC RND20 + INC RNDSEED+1 + BNE RND20 + LDA RNDSEED+2 + INC RNDSEED+2 +RND20 STA RNDSEED + RTS + + +************************************************** +* Data Tables +* +************************************************** +************************************************** +* sprites definitions +************************************************** + +REDBALL HEX 10,B1,F1,10 + HEX 11,BB,BB,11 + HEX 01,1B,1B,01 + +PURPLEBALL HEX 30,b3,f3,30 + HEX 33,00,00,33 + HEX 03,3b,3b,03 + + +STUMP HEX 00,80,08,08,08,08,80,00,00 + HEX 00,88,88,08,88,88,88,00,00 + HEX 84,88,08,80,88,08,88,84,cc + HEX 84,84,88,88,84,84,88,84,84 + +ROCK HEX 00,50,aa,5a,af,a0,00,00,00 + HEX 00,5a,55,5a,aa,a5,5a,00,00 + HEX c4,45,50,05,50,55,45,44,cc + +PIT1 HEX 42,26,26,26,26,26,42,cc,cc + HEX 88,22,22,22,22,22,88,84,84 + +RUNNER1 HEX 00,00,00,90,90,90,00,00 + HEX 00,b0,f0,f9,fb,b0,00,b0 + HEX 0b,00,00,ff,ff,00,0b,00 + HEX 00,00,00,22,02,02,20,00 + HEX 00,11,02,00,00,00,12,10 + HEX CC,c4,c4,c4,c4,c4,c4,c4 +RUNNER2 HEX 00,00,00,90,90,90 + HEX 00,00,00,f9,fb,00 + HEX 00,00,B0,ff,fb,b0 + HEX 00,00,00,22,02,20 + HEX 00,00,11,02,01,02 + HEX CC,CC,c4,c4,c4,c4 +RUNNER3 HEX 00,00,00,90,90,90,00,00 + HEX 00,00,b0,f9,fb,f0,00,b0 + HEX 00,0b,00,ff,ff,00,0b,00 + HEX 00,00,00,22,02,20,00,00 + HEX 00,11,02,00,00,12,10,00 + HEX CC,c4,c4,c4,c4,c4,c4,CC +RUNNER4 HEX 00,00,00,90,90,90 + HEX 00,00,00,f9,fb,00 + HEX 00,00,bb,ff,ff,b0 + HEX 00,00,00,22,22,00 + HEX 00,00,11,00,12,10 + HEX CC,CC,c4,c4,c4,c4 +JUMPY HEX 00,00,00,00,00,00,00,00,00 + HEX 00,00,00,90,90,90,00,00,00 + HEX 00,00,b0,f9,fb,f0,00,b0,00 + HEX 00,0b,00,ff,ff,00,0b,00,10 + HEX 10,20,20,02,02,02,02,02,01 + HEX 01,00,00,00,00,00,00,00,00 + HEX 00,00,00,00,00,00,00,00,00 + +SPRITELOTABLE db SPLOSION,>PURPLEBALL,>STUMP,>ROCK,>PIT1,>RUNNER1,>RUNNER2,>RUNNER3,>RUNNER4,>JUMPY,>ZERO,>ONE,>TWO,>THREE,>FOUR,>FIVE,>SIX,>SEVEN,>EIGHT,>NINE + +SPRITEHEIGHTTABLE HEX 02,02,03,02,01,05,05,05,05,06,02,02,02,02,02,02,02,02,02,02 +SPRITEWIDTHTABLE HEX 04,03,08,08,08,07,05,07,05,08,03,03,03,03,03,03,03,03,03,03 + +SPRITEINDEXTABLE HEX 05,02,03,04 ; on-screen sprites can be any of the above, in any order + +************************************************** +* sprite position, velocity, etc of on-screen sprites +************************************************** + +SPRITEROW HEX 11,14,14,16 +SPRITECOLUMN HEX 01,28,40,58 +LASTROW HEX 11,16,00,00 ; location of last sprite drawn, for erasure +LASTCOLUMN HEX 01,28,40,58 +HORIZSIGN HEX 00,00,00,00 ; 1 for positive H velocity, 0 for negative H velocity +VERTSIGN HEX 00,00,00,00 ; 1 or 0 for direction +HVELOCITY HEX 00,01,01,01 ; horizontal delta +VVELOCITY HEX 00,00,00,00 ; vertical delta + +COLLIDINGSPRITES HEX FF,FF + +NUMBEROFSPRITES HEX 00 + + +CLOUDS HEX 00,00,A0,FA,ff,ff,ff,fa,a0,00,00,00,00,00,00,00,00,00,00,00,00,00,0a,00,00,00,00,00,00,00,00,f0,00,00,00,00,00,00,00,00 + HEX 05,05,f5,f5,f5,a5,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55 + HEX 55,55,55,5a,5f,5f,5f,5f,5a,50,50,50,a0,00,00,00,00,00,0a,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05 + HEX 05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,0f,00,00,00,00,00,00,00,00,00,00,00,f0,00,00,00,00,00,00,00,00,00,00,00 + +TWINKLE HEX 00,00,A0,FA,ff,ff,ff,fa,a0,00,00,00,00,00,00,00,00,00,00,00,00,00,0f,00,00,00,00,00,00,00,00,50,00,00,00,00,00,00,00,00 + HEX 05,05,f5,f5,f5,a5,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55 + HEX 55,55,55,5a,5f,5f,5f,5f,5a,50,50,50,a0,00,00,00,00,00,0a,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05,05 + HEX 05,05,05,05,05,00,00,00,00,00,00,00,00,00,00,00,0a,00,00,00,00,00,00,00,00,00,00,00,a0,00,00,00,00,00,00,00,00,00,00,00 + + +JUMPINGCURVE HEX 11,10,0f,0e,0d,0c,0b,0a,09,09,09,09,0a,0b,0c,0d,0e,0f,0f +* how far up from base to be on each frame. +*** make this a nice smooth curve. + +LOGO1 HEX 00,00,55,5a,5a,aa,00,55,aa,00,00,55,aa,00,50,a5,aa,aa,a5,aa,aa,a0,00,50,a5,5a,5a,aa,a5,00,55,aa,00,00,55,aa + HEX 00,00,00,00,55,aa,00,55,aa,00,00,55,aa,00,55,aa,05,55,aa,05,55,aa,00,55,aa,00,00,55,aa,00,55,aa,00,00,55,aa + HEX 00,00,00,00,55,aa,00,55,aa,a0,50,a5,aa,00,55,aa,00,55,aa,00,55,aa,00,55,aa,00,50,a5,aa,00,55,aa,00,00,55,aa + HEX 50,a0,00,00,55,aa,00,00,05,0a,0a,0a,00,00,05,5a,00,05,5a,00,05,5a,00,55,aa,0a,0a,0a,05,00,00,05,5a,5a,5a,aa + HEX 55,aa,00,00,55,aa,00,00,00,50,a5,5a,5a,5a,00,00,00,00,00,00,00,00,00,05,5a,00,00,00,00,00,05,5a,5a,5a,5a,05 +LOGO2 HEX 00,05,5a,5a,5a,05,00,00,55,aa,05,00,00,00,00,55,aa,00,00,55,aa,00,55,aa,00,00,55,aa,00,00,00,00,00,00,00,00 + HEX 00,00,00,00,00,00,00,00,55,aa,00,55,5a,aa,00,55,aa,00,00,55,aa,00,55,aa,00,00,55,aa,00,00,00,00,00,00,00,00 + HEX 00,00,00,00,00,00,00,00,55,aa,50,00,55,aa,00,55,aa,a0,50,a5,aa,00,55,aa,00,00,55,aa,00,00,00,00,00,00,00,00 + HEX 00,00,00,00,00,00,00,00,00,05,5a,5a,5a,5a,00,00,05,0a,0a,0a,00,00,00,05,5a,5a,5a,aa,00,00,00,00,00,00,00,00 + HEX 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,5a,5a,5a,5a,05,00,00,00,00,00,00,00,00 + + +SCOREBOARD HEX 22,22,22,22,22,22,22,22,22,22,22,22,f2,f2,f2,f2,22,f2,f2,f2,f2,22,22,22,22,22,22,22,22,22,f2,f2,f2,f2,22,f2,f2,f2,f2,22 + HEX 22,2a,aa,22,a2,22,a2,22,a2,a2,a2,22,ff,22,22,ff,22,ff,22,22,ff,22,22,22,aa,22,aa,22,2a,22,ff,22,22,ff,22,ff,22,22,ff,22 + HEX 22,22,aa,22,aa,a2,aa,22,aa,a2,aa,22,ff,f2,f2,ff,22,ff,f2,f2,ff,22,22,22,aa,2a,aa,22,aa,22,ff,f2,f2,ff,22,ff,f2,f2,ff,22 + HEX 22,22,22,22,22,22,22,22,2a,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22 + +ZERO HEX f2,f2,f2,f2,ff,22,22,ff,ff,f2,f2,FF +ONE HEX 22,f2,f2,22,22,22,ff,22,22,22,ff,22 +TWO HEX f2,f2,f2,f2,F2,F2,F2,FF,FF,F2,F2,F2 +THREE HEX f2,f2,f2,f2,22,F2,F2,FF,F2,F2,F2,FF +FOUR HEX F2,22,22,F2,FF,F2,F2,FF,22,22,22,FF +FIVE HEX f2,f2,f2,f2,FF,F2,F2,F2,F2,F2,F2,FF +SIX HEX f2,f2,f2,f2,FF,F2,F2,F2,FF,F2,F2,ff +SEVEN HEX f2,f2,f2,f2,22,22,22,FF,22,22,22,FF +EIGHT HEX f2,f2,f2,f2,FF,F2,F2,FF,FF,F2,F2,ff +NINE HEX f2,f2,f2,f2,FF,F2,F2,FF,F2,F2,F2,FF + +DIGITSLO db ZERO,>ONE,>TWO,>THREE,>FOUR,>FIVE,>SIX,>SEVEN,>EIGHT,>NINE + + +SPLOSION HEX b0,00,30,00,b0 + HEX 30,93,d9,93,30 + HEX b0,03,39,03,b0 + +BURGER HEX 00,00,00,00,90,90,d9,99,d9,99,d9,99,d9,99,d9,99,d9,90,90,00,00,00,00 + HEX 00,00,90,89,d8,9d,d9,9d,d9,9d,d9,9d,d9,9d,d9,9d,d9,9d,d9,99,90,00,00 + HEX 00,00,d0,d9,18,19,d9,d9,19,d9,d9,d9,d9,d9,d9,d9,19,19,19,d9,d0,00,00 + HEX 0c,0c,84,8c,84,84,84,c4,4d,4d,8d,88,88,88,4c,4c,84,81,8c,8c,8c,04,0c + HEX 00,08,80,88,80,88,88,88,88,88,88,88,88,88,88,88,88,88,80,88,80,08,00 + HEX 00,00,00,99,89,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,00,00,00 + HEX 00,00,00,00,09,08,09,09,09,09,09,09,09,09,09,09,09,09,09,00,00,00,00 + + +************************************************** +* Lores/Text lines +* Thanks to Dagen Brock for this. +************************************************** +Lo01 equ $400 +Lo02 equ $480 +Lo03 equ $500 +Lo04 equ $580 +Lo05 equ $600 +Lo06 equ $680 +Lo07 equ $700 +Lo08 equ $780 +Lo09 equ $428 +Lo10 equ $4a8 +Lo11 equ $528 +Lo12 equ $5a8 +Lo13 equ $628 +Lo14 equ $6a8 +Lo15 equ $728 +Lo16 equ $7a8 +Lo17 equ $450 +Lo18 equ $4d0 +Lo19 equ $550 +Lo20 equ $5d0 +* the "plus four" lines +Lo21 equ $650 +Lo22 equ $6d0 +Lo23 equ $750 +Lo24 equ $7d0 + + +Alt01 equ $800 +Alt02 equ $880 +Alt03 equ $900 +Alt04 equ $980 +Alt05 equ $A00 +Alt06 equ $A80 +Alt07 equ $B00 +Alt08 equ $B80 +Alt09 equ $828 +Alt10 equ $8a8 +Alt11 equ $928 +Alt12 equ $9a8 +Alt13 equ $A28 +Alt14 equ $Aa8 +Alt15 equ $B28 +Alt16 equ $Ba8 +Alt17 equ $850 +Alt18 equ $8d0 +Alt19 equ $950 +Alt20 equ $9d0 +* the "plus four" lines +Alt21 equ $A50 +Alt22 equ $Ad0 +Alt23 equ $B50 +Alt24 equ $Bd0 + + + + +LoLineTable da Lo01,Lo02,Lo03,Lo04 + da Lo05,Lo06,Lo07,Lo08 + da Lo09,Lo10,Lo11,Lo12 + da Lo13,Lo14,Lo15,Lo16 + da Lo17,Lo18,Lo19,Lo20 + da Lo21,Lo22,Lo23,Lo24 + +AltLineTable da Alt01,Alt02,Alt03,Alt04 + da Alt05,Alt06,Alt07,Alt08 + da Alt09,Alt10,Alt11,Alt12 + da Alt13,Alt14,Alt15,Alt16 + da Alt17,Alt18,Alt19,Alt20 + da Alt21,Alt22,Alt23,Alt24 + + +** Here we split the table for an optimization +** We can directly get our line numbers now +** Without using ASL +LoLineTableH db >Lo01,>Lo02,>Lo03 + db >Lo04,>Lo05,>Lo06 + db >Lo07,>Lo08,>Lo09 + db >Lo10,>Lo11,>Lo12 + db >Lo13,>Lo14,>Lo15 + db >Lo16,>Lo17,>Lo18 + db >Lo19,>Lo20,>Lo21 + db >Lo22,>Lo23,>Lo24 +LoLineTableL db Alt01,>Alt02,>Alt03 + db >Alt04,>Alt05,>Alt06 + db >Alt07,>Alt08,>Alt09 + db >Alt10,>Alt11,>Alt12 + db >Alt13,>Alt14,>Alt15 + db >Alt16,>Alt17,>Alt18 + db >Alt19,>Alt20,>Alt21 + db >Alt22,>Alt23,>Alt24 +AltLineTableL db