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