From ce7aa412ad69e0e79ae3e8e231cc5377bcf7ca46 Mon Sep 17 00:00:00 2001 From: Charles Mangin Date: Fri, 6 Sep 2019 09:11:52 -0400 Subject: [PATCH] updated hi-res version uses HRCG to generate high res sprites. --- OCTOPEDE.dsk | Bin 143360 -> 143360 bytes OCTOPEDE.s | 1276 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 1033 insertions(+), 243 deletions(-) diff --git a/OCTOPEDE.dsk b/OCTOPEDE.dsk index 0705ffb964ae20188f3e6dfaeabcc6e05f618e59..470f6d7c6c584a283e93b74542a91cab70c1cae0 100644 GIT binary patch delta 8513 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 WDsaJlK5v~I+9zqWd=LFZ+V?;A*`GWB delta 8292 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 EA1*(8761SM diff --git a/OCTOPEDE.s b/OCTOPEDE.s index 13bca89..9c9f0b9 100644 --- a/OCTOPEDE.s +++ b/OCTOPEDE.s @@ -33,13 +33,15 @@ CHAR EQU $FC ; char/pixel to plot CURRENTPEDE EQU $0F ; 0-F which segment to operate on -PLOTROW EQU $FE ; row/col in text page -PLOTCOLUMN EQU $FF +SPIDERROW EQU $FE ; row/col of spider's left half +SPIDERCOLUMN EQU $FF +SPIDERDELAY EQU $F9 ; how quick to move the spider? CH EQU $24 ; cursor Horiz CV EQU $25 ; cursor Vert WNDWDTH EQU $21 ; Width of text window +WNDTOP EQU $22 ; Top of text window RNDSEED EQU $EA ; +eb +ec @@ -57,39 +59,55 @@ PLAYERCOLUMN EQU $09 ; Where is the player shooting from? PLAYERROW EQU $0A ; Where is the player shooting from? PLAYERDELAY EQU $40 ; how quick to move the player -PROGRESS EQU $FD ; cleared pedes +PROGRESS EQU $FD ; How many lives? + +REVERSEPEDES EQU $1F ; which segments are going UP? + +CSW EQU $36 + +BASL EQU $28 +TABLEPOS EQU $3C ; (BAS2) +SCRN EQU $3E ; (A4) +VECT EQU $3EA + +ITERATIONS EQU $F8 ************************************************** * 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 -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 +CLRLORES EQU $F832 +LORES EQU $C050 +HIRES EQU $C057 +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 +; VTAB EQU $FC22 ; Sets the cursor vertical position (from CV) +COUT EQU $FDED ; Calls the output routine whose address is stored in CSW, + ; normally COUT1 +COUT1 EQU $FDF0 +COUT2 EQU $FBF0 + +PRBYTE EQU $FDDA ; print hex byte in A -STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low +STROUT EQU $DB3A ; Y=String ptr high, A=String ptr low -ALTTEXT EQU $C055 -ALTTEXTOFF EQU $C054 +ALTTEXT EQU $C055 +ALTTEXTOFF EQU $C054 PB0 EQU $C061 ; paddle 0 button. high bit set when pressed. @@ -105,52 +123,80 @@ ALTCHAR EQU $C00F ; enables alternative character set - mousetext BLINK EQU $F3 SPEED EQU $F1 + +HGR EQU $F3E2 ; Initializes to hi-res page1, clears screen. +HGR2 EQU $F3D8 ; Initializes to hi-res page2, clears screen. +HCLR EQU $F3F2 ; Clears current screen to black + + + + + + ************************************************** * START - sets up various fiddly zero page bits ************************************************** - ORG $2000 ; PROGRAM DATA STARTS AT $2000 + ORG $0800 ; PROGRAM DATA STARTS AT $0800 - 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 #$00 - STA BLINK ; blinking text? no thanks. - STA LORES ; low res graphics mode - STA MIXCLR - STA ALTTEXTOFF ; display main text page +RESETSCORE LDA #$00 + STA PLAYERSCORE + STA PLAYERSCORE+1 + STA PLAYERSCORE+2 + STA PLAYERSCORE+3 -RESTART LDA #$00 - STA PEDECOUNTER + LDA #$03 STA PROGRESS +RESTART DEC PROGRESS + BMI RESETSCORE ; no more lives left? start back at 3. + JSR FILLSCREENFAST ; clear screen to black + + JSR HGR ; clear HGR + + BIT LORES ; GRAPHIQUES + BIT MIXCLR ; PLEIN G. + BIT HIRES ; HAUTE RESOLUTION + BIT TXTPAGE1 ; PAGE1 + BIT $C00C ; 40 COL. + + JSR HOOK ; set HRCG output + + + LDA #$00 + STA PEDECOUNTER LDA #$29 ; keeps COUT from linebreaking STA WNDWDTH ; CLC ROR + ADC #$01 STA PLAYERCOLUMN ; middle-ish LDA #$17 STA PLAYERROW ; bottom line - JSR FILLSCREENFAST ; clear screen to black + LDA #$14 + STA SPIDERROW + LDA #$27 + STA SPIDERCOLUMN + + RELOAD JSR RNDINIT ; *should* cycle the random seed. + LDA #$00 ; zeros out accumulator for score display. + JSR UPDATESCORE + JSR DISPLAYHISCORE - INC PROGRESS - - LDA #$08 + LDA #$07 STA PEDEDELAY STA MISSILEDELAY ; bit of a break between missile shots LDA #$FF ; 11111111 STA PEDEBYTE ; all segments live -;PEDECOORDS HEX 00,07,00,06,00,05,00,04,00,03,00,02,00,01,00,00 ; row/col byte pairs for each segment of the OCTOPEDE - LDY #$07 LDX #$00 RESETPEDE LDA #$00 + STA REVERSEPEDES ; all pedes going down STA PEDECOORDS,X ; segment ROW INX TYA @@ -160,7 +206,9 @@ RESETPEDE LDA #$00 BPL RESETPEDE ; Y=0 JSR DRAWSHROOMS ; puts mushrooms in random locations between row 0 and 23 - JSR DRAWPROGRESS ; updates "progress" player score indicator + LDA PROGRESS + BEQ EVERYFRAME ; skip if no lives left. + JSR DRAWLIVES ; updates "progress" player lives indicator @@ -185,19 +233,23 @@ RESETPEDE LDA #$00 EVERYFRAME + LDA PLAYERROW + BEQ RESTART ; player dead if row=0 + LDA PEDEBYTE ; pedes all dead if 0 + BEQ RELOAD + LDA #$00 STA CURRENTPEDE ; start each frame on first segment JSR UPDATEPLAYER JSR UPDATEMISSILE JSR UPDATEPEDE + JSR UPDATESPIDER JSR INTERFRAME + + LDA #$00 ; oops. i'm stuck if this rolls over + STA ITERATIONS ; then what? RTS? - LDA PEDEBYTE ; pedes all dead if 0 - BEQ RELOAD - - LDA PLAYERROW - BEQ RESTART ; player dead if row=0 JMP EVERYFRAME @@ -207,12 +259,122 @@ EVERYFRAME ************************************************** INTERFRAME - LDA #$20 ; wait a bit + LDA #$30 ; wait a bit JSR WAIT - RTS +ANRTS RTS ;/INTERFRAME ************************************************** +UPDATESPIDER LDA SPIDERDELAY + BEQ STARTSPIDER + DEC SPIDERDELAY + RTS + +STARTSPIDER LDA #$0D + STA SPIDERDELAY + + LDA SPIDERROW ; mark for erase + STA ROW + LDA SPIDERCOLUMN + STA COLUMN + +MOVESPIDER ; get random number, 0-FF, clear high nibble, divide by 4. + JSR RND ; 0-FF + AND #$03 ; 0-3 + BEQ DONEMOVING ; 0 stay + ROR ; 1 or 3 - carry set + BCC JUMPSPIDER ; 2 - carry clear, left + BEQ JUMPUP ; zero, jump up + +JUMPDOWN INC SPIDERROW ; 1, jump down + LDA SPIDERROW + CMP #$18 + BNE JUMPSPIDER + LDA #$17 + STA SPIDERROW + JMP JUMPSPIDER + +JUMPUP DEC SPIDERROW + LDA SPIDERROW + CMP #$0A + BNE JUMPSPIDER + LDA #$0B + STA SPIDERROW + +JUMPSPIDER ; determine if the spider is jumping left or right at the moment. + ; if the 100s score is odd, jump left. Otherwise, right. + LDA PLAYERSCORE+2 + ROR + BCC JUMPRIGHT + + +JUMPLEFT DEC SPIDERCOLUMN + BPL DONEMOVING + LDA #$28 ; column zero, reset + STA SPIDERCOLUMN + JMP DONEMOVING + +JUMPRIGHT INC SPIDERCOLUMN + LDA SPIDERCOLUMN + CMP #$28 + BCC DONEMOVING ; > 28, reset. + LDA #$00 ; column zero, reset + STA SPIDERCOLUMN + +DONEMOVING + +ERASESPIDER ;LDA #$A0 + ;STA CHAR + LDA ROW + STA CV + VTAB + LDA COLUMN + STA CH + +COLLIDESPIDER JSR GETCHAR ; hit the player? + CMP #$F0 + BEQ KILLTHEPLAYER + CMP #$F1 + BEQ KILLTHEPLAYER + + INC CH ; right side test. + JSR GETCHAR + CMP #$F0 + BEQ KILLTHEPLAYER + CMP #$F1 + BEQ KILLTHEPLAYER + + DEC CH + +; LDA #$A0 +; JSR PLOTQUICK ; otherwise, clobber mushrooms and pedes. +; JSR PLOTQUICK + JSR ERASEQUICK + JSR ERASEQUICK + +DRAWSPIDER LDA SPIDERCOLUMN + STA CH + LDA SPIDERROW + STA CV + VTAB + + LDA #$C8 ; spider, left side = C8 +; STA CHAR + JSR PLOTQUICK +; INC CHAR ; spider, right side = CA +; INC CHAR + LDA #$CA ; spider, left side = C8 + JSR PLOTQUICK + + RTS + + +KILLTHEPLAYER JMP KILLPLAYER + +************************************************** + + + UPDATEPLAYER LDA PLAYERDELAY ; counts down to 0 BEQ STARTPLAYER ; if 0, set to delay value, and draw the pede @@ -220,24 +382,21 @@ UPDATEPLAYER LDA PLAYERDELAY ; counts down to 0 RTS ; exit if countdown isn't done yet. -STARTPLAYER LDA #$10 +STARTPLAYER LDA #$0B STA PLAYERDELAY ; erase current player position ; calculate new player position ; render new player position LDA PLAYERCOLUMN ; load current position - STA PLOTCOLUMN - STA COLUMN + STA CH ; PLOTCOLUMN + STA COLUMN ; store for erasing later LDA PLAYERROW - STA PLOTROW ; hang onto these in case there's a collision - STA ROW + STA CV ; PLOTROW ; hang onto these in case there's a collision + STA ROW ; store for erasing later - LDA #$00 - STA CHAR - - JSR PLOTQUICK ; erase current position + BIT ANRTS ; set overflow = no movement yet ; read joystickX/pdl0, if less than 0x64(100) move left. if over 0x96(150) move right. @@ -253,13 +412,15 @@ MOVEPLAYER LDX #$00 ; PDL 0 MOVEPLAYERRIGHT LDA PLAYERCOLUMN ; already at col 39? CMP #$27 - BEQ PLOTPLAYER + BEQ COLLIDEPLAYER INC PLAYERCOLUMN + CLV JMP MOVEPLAYER2 MOVEPLAYERLEFT LDA PLAYERCOLUMN ; already at zero - BEQ PLOTPLAYER + BEQ COLLIDEPLAYER DEC PLAYERCOLUMN ; otherwise, go left + CLV MOVEPLAYER2 LDX #$01 ; PDL 1 JSR PREAD ; returns in Y @@ -271,41 +432,63 @@ MOVEPLAYER2 LDX #$01 ; PDL 1 BCS MOVEPLAYERDOWN JMP COLLIDEPLAYER ; no U/D, plot as-is -MOVEPLAYERUP LDA PLAYERROW ; already at col 39? +MOVEPLAYERUP LDA PLAYERROW ; already at col 39? CMP #$13 BEQ COLLIDEPLAYER DEC PLAYERROW - JMP COLLIDEPLAYER ; moving, check collision + CLV + JMP COLLIDEPLAYER ; moving, check collision -MOVEPLAYERDOWN LDA PLAYERROW ; already at zero +MOVEPLAYERDOWN LDA PLAYERROW ; already at zero CMP #$17 BEQ COLLIDEPLAYER - INC PLAYERROW ; otherwise, go left + INC PLAYERROW ; otherwise, go DOWN + CLV COLLIDEPLAYER ; check new position for collisions + + BVS PLOTPLAYER ; overflow still set, skip the move/collide math + +; LDA #$A0 ; plotrow/col should still be intact +; STA CHAR + JSR ERASEQUICK ; erase current position + LDA PLAYERCOLUMN - STA PLOTCOLUMN + STA CH ; PLOTCOLUMN LDA PLAYERROW - STA PLOTROW + STA CV ; PLOTROW JSR GETCHAR ; not zero, collision. revert to old position. + AND #$F0 ; Ax = space + CMP #$A0 BEQ PLOTPLAYER ; not zero, collision. revert to old position. + + CMP #$C0 ; hit a 'pede or spider. DIE. + BEQ PLAYERDIED + LDA ROW - STA PLOTROW + STA CV ; PLOTROW STA PLAYERROW LDA COLUMN - STA PLOTCOLUMN + STA CH ; PLOTCOLUMN STA PLAYERCOLUMN JSR CLICK -PLOTPLAYER LDA #$11 - STA CHAR +PLOTPLAYER + + LDA #$F0 ;F0 +; STA CHAR JSR PLOTQUICK ; plot the player RTS DONEPLAYER RTS ;/UPDATEPLAYER +PLAYERDIED ; moved into a 'pede or the spider. jump to killplayer? + JMP KILLPLAYER + + + ************************************************** UPDATEMISSILE @@ -315,34 +498,40 @@ UPDATEMISSILE LDA PLAYERMISSILE ; row of missile will be FF if not firing BMI NOMISSILE - STA PLOTROW ; erase missile at current coords - LDX #$01 - LDA PLAYERMISSILE,X - STA PLOTCOLUMN - LDA #$00 - STA CHAR - JSR PLOTQUICK + STA CV ; PLOTROW ; erase missile at current coords +; LDX #$01 + LDA PLAYERMISSILE+1 + STA CH ; PLOTCOLUMN +; LDA #$A0 +; STA CHAR + JSR ERASEQUICK - LDX #$02 ; update missile coords - LDA PLAYERMISSILE,X ; if displaybyte is F0, make it 0F, don't update row. - BMI MISSILESTAY +NEWMISSILE ;LDX #$02 ; update missile coords + LDA PLAYERMISSILE+2 ; if displaybyte is AE . , make it A7 ', don't update row. + CMP #$FB + BEQ MISSILESTAY MISSILEUP DEC PLAYERMISSILE ; dec missile row BMI MISSILEDONE ; if FF, all done. + LDA #$FB + JMP MISSILECHAR -MISSILESTAY EOR #$FF ; else dec missile row, make byte F0 - STA PLAYERMISSILE,X +MISSILESTAY LDA #$FD ; + STA PLAYERMISSILE+2 - STA CHAR ; display updated missile at new coords +MISSILECHAR ;STA CHAR ; display updated missile at new coords LDA PLAYERMISSILE - STA PLOTROW - DEX - LDA PLAYERMISSILE,X - STA PLOTCOLUMN + STA CV ; PLOTROW + ;DEX + LDA PLAYERMISSILE+1 + STA CH ; PLOTCOLUMN JSR GETCHAR ; check missile collision + AND #$F0 ; Ax = space + CMP #$A0 BNE COLLIDEMISSILE + LDA PLAYERMISSILE+2 JSR PLOTQUICK RTS @@ -362,30 +551,36 @@ ADDMISSILE LDA #$30 STA MISSILEDELAY ; reset delay for next shot. LDX #$2 ; set missile display byte to #$F0 - LDA #$F0 + LDA #$FD ; . #$F0 STA PLAYERMISSILE,X + STA CHAR DEX LDA PLAYERCOLUMN ; get player COLUMN STA PLAYERMISSILE,X DEX - LDA PLAYERROW ; set row to player + LDA PLAYERROW ; set row to player - 1 + STA PLAYERMISSILE,X - JMP UPDATEMISSILE ; put it on screen. + JMP NEWMISSILE ; UPDATEMISSILE ; put it on screen. MISSILEDONE RTS -COLLIDEMISSILE ; accumulator should tell us what we collided with +COLLIDEMISSILE LDX #$00 ; accumulator should tell us what we collided with + STX MISSILEDELAY ; hit something, set delay to zero, to fire again. ; PLOTROW and PLOTCOLUMN are intact - CMP #$4C ; 4C = turn pede segments into mushrooms - BNE COLLIDESHROOM - LDA #$5F - STA CHAR + AND #$F0 ; clear low nibble to C0 or C1 + CMP #$C0 ; @ ; IS IT A PEDE SEGMENT (Cx)? + BNE COLLIDESHROOM ; NO? check for mushroom + LDA #$D0 ; full shroom + ;STA CHAR JSR PLOTQUICK - + LDA #$25 ; 25 points for a pede + JSR UPDATESCORE -HITPEDE ; hit a pede segment + +HITPEDE ; hit a pede segment - or SPIDER ; determine which segment was hit ; for each segment @@ -394,7 +589,10 @@ HITPEDE ; hit a pede segment LDY #$08 WHICHPEDE DEY ; next pede segment 7-0 - BPL WHICHPEDE2 ; rolled over? RTS + BPL WHICHPEDE2 ; rolled over? KILLED SPIDER + + JMP KILLSPIDER ; spider dead. + RTS WHICHPEDE2 TYA @@ -446,19 +644,26 @@ SETPEDEBYTE2 ROL ; carry into A RTS -COLLIDESHROOM CMP #$26 - BEQ KILLSCORE ; hit the score, skippy. +COLLIDESHROOM CMP #$B0 + BEQ KILLSCORE ; you hit the score, skippy. + CMP #$F0 + BEQ KILLSCORE ; hit the player lives icons - CMP #$5F ; 5F = turn mushrooms into partial mushroom + CMP #$D0 ; ? ; 5F = turn mushrooms into partial mushroom BNE KILLSHROOM - LDA #$05 + LDA #$E0 ; _ JMP KILLSHROOM2 -KILLSHROOM CMP #$05 ; 05 = remove partial mushrooms - LDA #$00 -KILLSHROOM2 STA CHAR +KILLSHROOM CMP #$E0 ; _ ; 05 = remove partial mushrooms + LDA #$A0 +KILLSHROOM2 ;STA CHAR JSR PLOTQUICK + LDA #$10 ; 10 points for a mushroom + JSR UPDATESCORE + + + KILLSCORE LDA #$FF ; reset the missile's coords to off-screen STA PLAYERMISSILE @@ -466,6 +671,35 @@ KILLSCORE LDA #$FF ; reset the missile's coords to off-screen RTS +KILLSPIDER ; erase spider + LDA SPIDERROW + STA CV + VTAB + LDA SPIDERCOLUMN + STA CH + +; LDA #$A0 +; STA CHAR + + JSR ERASEQUICK + JSR ERASEQUICK + + ; set spider countdown to 0 + LDA #$FF + STA SPIDERDELAY + ; reset spider coords + + LDA #$28 + STA SPIDERCOLUMN + + LDA #$50 ; 50 points for the spider + JSR UPDATESCORE + LDA #$50 ; 50 more points for the spider? + JSR UPDATESCORE + + + RTS + ;/UPDATEMISSILE @@ -480,9 +714,6 @@ UPDATEPEDE ; check if frames of delay have elapsed, slows down the pede STARTPEDE LDA PEDEDELAY STA PEDECOUNTER - ; check PEDEBYTE to see if it's zeroed out yet. - ***** - NEXTPEDE LDA CURRENTPEDE ; which segment 0-7 CLC @@ -493,26 +724,26 @@ NEXTPEDE LDA CURRENTPEDE ; which segment 0-7 CMP #$FF ; if FF, ignore BEQ SKIPPEDE -PLOTPEDE STA PLOTROW ; current plot row - +PLOTPEDE STA CV ; PLOTROW ; current plot row + STA ROW INX LDA PEDECOORDS,X ; segment's column - STA PLOTCOLUMN ; current plot column - + STA CH ; PLOTCOLUMN ; current plot column + STA COLUMN JSR GETCHAR ; erasing something other than a pede segment? + AND #$F0 ; Ax = space + CMP #$A0 BEQ CONTINUEPEDE ; 00 - skip the erase step - CMP #$4C + AND #$F0 ; clear low nibble Cn = PEDE + CMP #$C0 ; @ BNE CONTINUEPEDE ; skip the erase step if not 4C ; hit another pede segment, no worries. -ERASEPEDE LDA #$00 ; erase current segment previous position - STA CHAR ; load the char - JSR PLOTQUICK ; erases current segment previous position -CONTINUEPEDE JSR WALKLOOP ; erases previous position +CONTINUEPEDE JSR WALKLOOP ; calculates next position ; plots new position @@ -529,19 +760,44 @@ SKIPPEDE INC CURRENTPEDE ; repeat with next segment ;/UPDATEPEDE -WALKLOOP ; erases previous position + + +WALKLOOP ; calculates next position + ; erases previous position ; plots new position NEXTPOS JSR EVENORODDROW ; calculate next position JSR GETCHAR ; if next position not 00, then down and reverse - BNE NEXTROW - LDA #$4C ; green/dk green - STA CHAR - JSR PLOTQUICK ; plots new position + CMP #$AF ; less than AF = empty, plottable + BCS NEXTROW ; decides which pede direction to plot + +ERASEPEDE LDA CHAR + PHA ; push CHAR + LDA CH ; PLOTCOLUMN ; push PLOTCOLUMN + PHA + LDA CV ; PLOTROW ; push PLOTROW + PHA + + LDA ROW ; segment old position + STA CV ; PLOTROW + LDA COLUMN + STA CH ; PLOTCOLUMN +; LDA #$A0 ; erase current segment previous position +; STA CHAR ; load the char + JSR ERASEQUICK ; erases current segment previous position + + PLA ; pull PLOTROW + STA CV ; PLOTROW + PLA + STA CH ; PLOTCOLUMN ; pull PLOTCOLUMN + PLA +; STA CHAR ; pull CHAR + + JSR PLOTQUICK ; plots pede at new position RTS ;/WALKLOOP @@ -551,100 +807,151 @@ NEXTPOS JSR EVENORODDROW ; calculate next position EVENORODDROW LDA CURRENTPEDE ; segment 0-8 CLC - ROL - TAX - LDA PEDECOORDS,X ; segment ROW to PLOTROW - STA PLOTROW + ROL ; *2 + TAX ; to X - INX - LDA PEDECOORDS,X - STA PLOTCOLUMN ; segment COLUMN to PLOTCOLUMN - - LDA PLOTROW - ROR ; odd, then carry set + LDA PEDECOORDS,X ; segment ROW + STA CV ; PLOTROW ; for checking char at next position + ROR ; ROW = odd, then carry set BCS ODDROW ;/EVENORODDROW EVENROW - LDA CURRENTPEDE ; segment 0-8 - CLC - ROL - TAX - INX + INX ; INX to get to CURRENTPEDE,COLUMN LDY PEDECOORDS,X ; inc segment column INY TYA - STA PEDECOORDS,X - STA PLOTCOLUMN ; to PLOTCOLUMN + STY CH ; PLOTCOLUMN ; to PLOTCOLUMN + STA PEDECOORDS,X CMP #$28 ; if PLOTCOLUMN == #$27, then inc PLOTROW BEQ NEXTROW ; else, loop on current row. - JSR GETCHAR - BNE NEXTROW - + JSR GETCHAR ; get character at next position. + CMP #$AF ; < AF = empty space. + BCS NEXTROW + + LDA #$C0 ; @ + + LDY CURRENTPEDE + BNE EVENPLOT + LDA #$C4 ; "head" +EVENPLOT STA CHAR + RTS ; return and draw pixel ;/EVENROW -ODDROW LDA CURRENTPEDE ; segment 0-8 - CLC - ROL - TAX - INX +ODDROW INX ; INX to get to CURRENTPEDE,COLUMN LDY PEDECOORDS,X ; DEC segment column DEY BMI NEXTROW ; if PLOTCOLUMN rolled over, then inc PLOTROW TYA STA PEDECOORDS,X - STA PLOTCOLUMN ; to PLOTCOLUMN + STA CH ; PLOTCOLUMN ; to PLOTCOLUMN - JSR GETCHAR - BNE NEXTROW + JSR GETCHAR ; get char at next position + CMP #$AF ; less than AF, space. + BCS NEXTROW + + LDA #$C2 ; A - RTS + LDY CURRENTPEDE + BNE ODDPLOT + LDA #$C6 ; "head" +ODDPLOT STA CHAR + + RTS ; return and draw pixel ;/ODDROW -NEXTROW ; hit something, bounce, kill or die. +NEXTROW INC ITERATIONS ; if I'm stuck on a loop too long, kill the pede and move on + BEQ KILLPEDE + ; hit something, bounce, kill or die. or EOL. ; char in A ; hit the player? - CMP #$11 ; hit the player. BEEP and RESTART + CMP #$F0 ; hit the player. BEEP and RESTART + BEQ KILLPLAYER + CMP #$F1 ; hit the player. BEEP and RESTART BEQ KILLPLAYER ; did I hit a missile? - CMP #$F0 - BEQ KILLPEDE - CMP #$0F - BEQ KILLPEDE + ;AND #$F0 + ;CMP #$F0 ; F = missile + ;BEQ KILLPEDE - ; must be a mushroom. - - LDA CURRENTPEDE + ; must be a mushroom or end of line + +; going up or down now? + + LDA #$00 ; ACC back to 0 + SEC ; set carry + + LDX CURRENTPEDE ; X = currentpede +UPORDOWN ROL ; ROL carry into A + DEX ; loop on X + BPL UPORDOWN + AND REVERSEPEDES ; bit in position AND to check REVERSEPEDES + BEQ DOWNPEDE + +UPPEDE LDA CURRENTPEDE CLC ROL TAX - LDY PEDECOORDS,X ; INC PLOTROW + LDY PEDECOORDS,X ; DEC PEDE ROW + DEY + TYA + STA PEDECOORDS,X ; otherwise, keep climbing up + CMP #$13 ; what's the bounce point? #$14? + BEQ UPPEDE2 + JMP EVENORODDROW + ; above #$14, head back down +UPPEDE2 LDA #$00 + SEC + LDY CURRENTPEDE ; Y = currentpede +BACKDOWNPEDE ROL ; ROL carry into A + DEY ; loop on Y + BPL BACKDOWNPEDE + EOR REVERSEPEDES ; OR with REVERSEPEDES + STA REVERSEPEDES ; store new REVERSEPEDES + JMP EVENORODDROW ; continue as down. + +DOWNPEDE LDA CURRENTPEDE + CLC + ROL + TAX + LDY PEDECOORDS,X ; INC PEDE ROW INY TYA - STA PEDECOORDS,X + STA PEDECOORDS,X ; store in PEDE.ROW CMP #$18 ; if PLOTROW == #$18, done - BNE EVENORODDROW - + BNE JMPEVENODD ; spaghetti. + ; == 18, bottom of screen ; bottom of the screen? now what? ; need to start back up the screen for a bit, then back down. Oof. -; or just kill the player and start over at 0. - LDA #$00 ; row back to 0 - STA PEDECOORDS,X + LDA #$16 ; go back up a row + STA PEDECOORDS,X - JMP EVENORODDROW + LDA #$00 ; ACC back to 0 + SEC ; set carry + + LDX CURRENTPEDE ; X = currentpede +BACKPEDE ROL ; ROL carry into A + DEX ; loop on X + BPL BACKPEDE + ORA REVERSEPEDES ; OR with REVERSEPEDES + STA REVERSEPEDES ; store new REVERSEPEDES + + + +JMPEVENODD JMP EVENORODDROW ; X = (PEDE.ROW) ;/NEXTROW ; kill this segment @@ -667,31 +974,31 @@ DRAWSHROOMS ; blank screen routine, counts down random number between p STA SHROOMCOUNT ; how many mushrooms to draw LDA #$16 ; start at bottom ROW - STA PLOTROW + STA CV ; PLOTROW - LDA #$5F ; shroom char - STA CHAR JSR RND ; returns with 0-ff in A ROR ; 1/2 TAX ; random steps between mushrooms in X -SHROOMROW DEC PLOTROW ; next row up +SHROOMROW DEC CV ; PLOTROW ; next row up BNE SHROOMROW2 ; not yet done, next row LDA SHROOMCOUNT ; row 0 AND shroomcount 0? All done. BEQ SHROOMSDONE ; LDA #$16 ; still not done, reset at row 23 - STA PLOTROW + STA CV ; PLOTROW SHROOMROW2 LDA #$28 ; start at column 40 - STA PLOTCOLUMN + STA CH ; PLOTCOLUMN -SHROOMCOL DEC PLOTCOLUMN ; next column +SHROOMCOL DEC CH ; PLOTCOLUMN ; next column BEQ SHROOMROW ; column == 0? next row DEX ; otherwise, DEX and check if it's mushroom time BNE SHROOMCOL ; x=0? + LDA #$D0 ; ? ; shroom char +; STA CHAR JSR PLOTQUICK ; draw mushroom Here DEC SHROOMCOUNT BEQ SHROOMSDONE ; done drawing 24 shrooms? @@ -711,30 +1018,118 @@ SHROOMSDONE RTS ************************************************** -DRAWPROGRESS - LDA #$00 - STA PLOTROW ; start at row 0, column 40 - LDA #$27 - STA PLOTCOLUMN - LDA #$26 ; draw a blue pixel - STA CHAR - LDX PROGRESS ; for each PROGRESS, dec column +DRAWLIVES + LDX #$00 + STX CV ; PLOTROW ; start at row 0, column 40 + LDX #$25 + STX CH ; PLOTCOLUMN + LDA #$F0 ; player icon +; STA CHAR + LDX PROGRESS ; for each PROGRESS, dec column -DRAWPROGRESS2 JSR PLOTQUICK - DEC PLOTCOLUMN +DRAWLIVES2 JSR PLOTQUICK ; increments CH automatically. feh. DEX - BNE DRAWPROGRESS2 - ; repeat draw. - + BNE DRAWLIVES2 + ; repeat draw. RTS -;/DRAWPROGRESS +;/DRAWLIVES + + + +UPDATESCORE ; takes A and adds it to PLAYERSCORE+3 + SED ; decimal mode + CLC + ADC PLAYERSCORE+3 ; tens/ones + STA PLAYERSCORE+3 + BCC SCOREDONE ; carry set? add to next digit. + LDA #$00 + ADC PLAYERSCORE+2 ; 1000/100 + STA PLAYERSCORE+2 + BCC SCOREDONE ; carry set? add to next digit. + LDA #$00 + ADC PLAYERSCORE+1 ; 100.000/10.000 + STA PLAYERSCORE+1 + BCC SCOREDONE ; carry set? add to next digit. + LDA #$00 + ADC PLAYERSCORE ; 10.000.000/1.000.000 + STA PLAYERSCORE +SCOREDONE CLD + + ; prints score at col #$1D, row 0 + LDA #$1D + STA CH + LDA #$00 + STA CV + VTAB + LDA PLAYERSCORE + JSR PRBYTE + LDA PLAYERSCORE+1 + JSR PRBYTE + LDA PLAYERSCORE+2 + JSR PRBYTE + LDA PLAYERSCORE+3 + JSR PRBYTE + +SETHISCORE ; compare bytes of PLAYERSCORE with HISCORE + CLC + LDA HISCORE ; +0 equal, check score+1 + CMP PLAYERSCORE + BCC NEWHISCORE ; PLAYERSCORE higher than HISCORE + BNE KEEPHISCORE + + LDA HISCORE+1 ; +1 equal, check +2 + CMP PLAYERSCORE+1 + BCC NEWHISCORE ; PLAYERSCORE higher than HISCORE + BNE KEEPHISCORE + + LDA HISCORE+2 ; +2 equal, check +3 + CMP PLAYERSCORE+2 + BCC NEWHISCORE ; PLAYERSCORE higher than HISCORE + BNE KEEPHISCORE + + LDA HISCORE+3 + CMP PLAYERSCORE+3 + BCC NEWHISCORE ; PLAYERSCORE higher than HISCORE + BNE KEEPHISCORE ; player lower, no new hiscore + + + + +NEWHISCORE ; copy the PLAYERSCORE to HISCORE and display + LDA PLAYERSCORE+3 + STA HISCORE+3 + LDA PLAYERSCORE+2 + STA HISCORE+2 + LDA PLAYERSCORE+1 + STA HISCORE+1 + LDA PLAYERSCORE + STA HISCORE + +DISPLAYHISCORE ; prints score at col #$1D, row 0 + LDA #$10 + STA CH + LDA #$00 + STA CV + VTAB + LDA HISCORE + JSR PRBYTE + LDA HISCORE+1 + JSR PRBYTE + LDA HISCORE+2 + JSR PRBYTE + LDA HISCORE+3 + JSR PRBYTE + + + +KEEPHISCORE RTS ************************************************** * blanks the screen ************************************************** FILLSCREENFAST ; 5,403 instructions - LDA #$00 + LDA #$A0 ; space LDY #$78 FILL1 DEY STA $400, Y @@ -754,67 +1149,52 @@ FILL1 DEY * used for plotting background elements that don't need collision detection ************************************************** PLOTQUICK ; using COUT so I can maybe update to a HRCG later. - - LDA PLOTROW - STA CV - LDA PLOTCOLUMN - STA CH - JSR VTAB ; sets the Vertical Row memory loc. for COUT +; TXA ; save X +; PHA - LDA CHAR + VTAB +; LDA CHAR + JMP COUT ; sends out through ENTRY - JSR COUT - RTS +; PLA +; TAX ; restore X +; RTS - -;OLD PLOTQUICK - LDY PLOTROW - TYA - CMP #$18 - BCS OUTOFBOUNDS2 ; stop plotting if dimensions are outside screen - - LDA LoLineTableL,Y - STA $0 - LDA LoLineTableH,Y - STA $1 ; now word/pointer at $0+$1 points to line - ;JMP LOADQUICK - -LOADQUICK - 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 - + + +ERASEQUICK + + VTAB + STY $01 + JMP ZEROBYTES + +;/ERASEQUICK ************************************************** * GETS one CHAR at PLOTROW,PLOTCOLUMN - value returns in Accumulator - clobbers Y ************************************************** GETCHAR - LDY PLOTROW - CLC - + LDY CV ; PLOTROW LDA LoLineTableL,Y STA $0 LDA LoLineTableH,Y - ;JMP STORECHAR - -STORECHAR STA $1 ; now word/pointer at $0+$1 points to line - LDY PLOTCOLUMN + STA $1 ; now word/pointer at $0+$1 points to line + LDY CH ; PLOTCOLUMN LDA ($0),Y ; byte at row,col is now in accumulator RTS ;/GETCHAR +VTAB MAC + LDY CV ; sets the Vertical Row memory loc. for COUT + LDA LoLineTableH,Y + STA BASL+1 + LDA LoLineTableL,Y + STA BASL + <<< ; End of Macro + ************************************************** * CLICKS and BEEPS - clobbers X,Y,A @@ -860,7 +1240,7 @@ BONKLOOP LDA #$20 ; longer DELAY RNDINIT LDA $C030 ; #$AB STA RNDSEED - LDA PROGRESS ; $4E ; #$55 + LDA PLAYERSCORE+3 ; $4E ; #$55 STA RNDSEED+1 LDA $C060 ; #$7E STA RNDSEED+2 @@ -892,10 +1272,16 @@ RND16 JSR RND ; limits RND output to 0-F * Data Tables * ************************************************** + DS \ PEDECOORDS HEX 00,07,00,06,00,05,00,04,00,03,00,02,00,01,00,00 ; row/col byte pairs for each segment of the OCTOPEDE -PLAYERMISSILE HEX FF,FF,F0 ; row, column, displaybyte +PLAYERMISSILE HEX FF,FF,E0 ; row, column, displaybyte +PLAYERSCORE DS 4 ; DEC mode 0 - 99999999 + +HISCORE DS 4 ; DEC mode 0 - 99999999 + + ************************************************** * Lores/Text lines @@ -921,7 +1307,6 @@ 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 @@ -948,7 +1333,6 @@ 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 @@ -1011,3 +1395,409 @@ AltLineTableL db ENTRY ; #> PRODUCES HIGH BYTE + STA CSW+1 + + RTS + + +ENTRY STY $01 ; stow Y for later + CMP #$A0 ; CHAR = space? skip the math and zero the bytes + BEQ ZEROBYTES + +EVEODDCOL STA $00 ;PHA ; STORE CHAR + ;PHA ; SAVE Y, since it gets clobbered + + LDY #$00 + STY TABLEPOS+1 ; tablepos hi byte + + LDA $00 + CMP #$BA ; 0-9? + BCC CLEARHI + + LDA CH ; horiz column + AND #$01 ; even or odd? + ROR ; odd bit into carry + + LDA $00 ; CHAR back + ADC #$00 ; add carry to CHAR, odd ones = CHAR + 1 + + +CLEARHI AND #$7F ; CLEAR HI BIT + +CALC1 SEC + SBC #$20 ; CHAR < 96 + ASL ;TABLEPOS ; *2 = CHAR < 192 + ASL ;TABLEPOS ; *4 < 384 + ROL TABLEPOS+1 + ASL ;TABLEPOS ; *8 < 768 + ROL TABLEPOS+1 + STA TABLEPOS +* +* TABLEPOS = (ASCII - $20) * 8 BYTES PER CHAR +* + CLC + LDA #CHARTABLE ; LOW BYTE + ADC TABLEPOS + STA TABLEPOS + LDA #>CHARTABLE ; HIGH BYTE + ADC TABLEPOS+1 + STA TABLEPOS+1 ; TABLEPOS = TABLEPOS + CHARTABLE ADDR + +CALC2 CLC + LDA BASL ; low byte of GR address + ADC CH ; add horiz offset + STA SCRN ; set HR low byte + LDA BASL+1 ; get GR hi BYTE + ADC #$1C ; bump into HR space + STA SCRN+1 ; SCRN = BASL + CH + $1C00 + +GETBYTE LDY #$00 +G1 LDA (TABLEPOS),Y ; first byte of character at TABLEPOS + STA (SCRN),Y ; pop into HR screen +INC INY ; next byte + CLC + LDA SCRN ; adjust for next HR address + ADC #$FF + STA SCRN + LDA SCRN+1 + ADC #$03 + STA SCRN+1 ; SCRN=SCRN+$3FF +* +* $3FF TO MAKE UP FOR GROWING VALUE OF 'Y' +* +DONE? CPY #$08 + BCC G1 + +YES LDA $00 ;PLA + LDY $01 ;TAY ; RESTORE Y + ;PLA ; RESTORE CHAR +OUT JMP COUT3 + + + +ZEROBYTES CLC + LDA BASL ; low byte of GR address + ADC CH ; add horiz offset + STA SCRN ; set HR low byte + LDA BASL+1 ; get GR hi BYTE + ADC #$1C ; bump into HR space + STA SCRN+1 ; SCRN = BASL + CH + $1C00 + + LDY #$00 +G2 LDA #$00 ; Zero out the pixels + STA (SCRN),Y ; pop into HR screen + INY ; next byte + CLC + LDA SCRN ; adjust for next HR address + ADC #$FF + STA SCRN + LDA SCRN+1 + ADC #$03 + STA SCRN+1 ; SCRN=SCRN+$3FF + CPY #$08 + BCC G2 + + LDA #$A0 ;PLA + LDY $01 ;TAY ; RESTORE Y + JMP COUT3 + + + + + + +COUT3 ; mine. doesn't increment CV on CH rollover + LDY CH + STA (BASL),Y + INC CH + RTS + + + + DS \ ; CHAR TABLE now aligned with page boundary, + ; so each 8 bytes will stay on a single hi byte address +CHARTABLE EQU * + + HEX 0000000000000000 ; SPACE A0 + HEX 0000000000000000 ; BLANK A1 + HEX 0000000000000000 ; ! + HEX 0000000000000000 ; ! + HEX 0000000000000000 ; ! + HEX 0000000000000000 ; ! + HEX 1414140000000000 ; " + HEX 14143E143E141400 ; # + HEX 083C0A1C281E0800 ; $ + HEX 0626100804323000 ; % + HEX 040A0A042A122C00 ; & + HEX 0810202020100800 ; ) + HEX 082A1C081C2A0800 ; * + HEX 0008083E08080000 ; + + HEX 0000000000000804 ; , + HEX 0000003E00000000 ; - + HEX 1C22322A26221C00 ; 0 B0 + HEX 080C080808081C00 ; 1 + HEX 1C22201804023E00 ; 2 + HEX 3E20101820221C00 ; 3 + HEX 101814123E101000 ; 4 + HEX 3E021E2020221C00 ; 5 + HEX 1804021E22221C00 ; 6 + HEX 3E20100804040400 ; 7 + HEX 1C22221C22221C00 ; 8 + HEX 1C22223C20100C00 ; 9 B9 + + HEX 1008040204081000 ; < BA + HEX 1008040204081000 ; < BB + HEX 1008040204081000 ; < BC + HEX 1008040204081000 ; < BD + HEX D5D5FFFFFFFFD5D5 ; = progress bar BF + HEX AAAAFFFFFFFFAAAA ; = progress bar BE + + HEX 00007E7F7F7E2A2A ; C0 PEDE <- C0 + ; 0000 0000 + ; 0000 0000 + ; 0111 1110 + ; 0111 1111 + ; 0111 1111 + ; 0111 1110 + ; 0010 1010 + ; 0010 1010 + + HEX 00007E7F7F7E5454 ; C0 PEDE <- C1 + ; 0000 0000 + ; 0000 0000 + ; 0111 1110 + ; 0111 1111 + ; 0111 1111 + ; 0111 1110 + ; 0101 0100 + ; 0101 0100 + + HEX 00003F7F7F3F2A2A ; C2 PEDE -> C2 + ; 0000 0000 + ; 0000 0000 + ; 0011 1111 + ; 0111 1111 + ; 0111 1111 + ; 0011 1111 + ; 0010 1010 + ; 0010 1010 + + HEX 00003F7F7F3F1515 ; C2 PEDE -> C3 + ; 0000 0000 + ; 0000 0000 + ; 0011 1111 + ; 0111 1111 + ; 0111 1111 + ; 0011 1111 + ; 0001 0101 + ; 0001 0101 + + + + HEX D0D0BFFFFFBF2828 ; C6 PEDE HEAD -> C4 + ; 1101 0000 + ; 1101 0000 + ; 1011 1111 + ; 1111 1111 + ; 1111 1111 + ; 1011 1111 + ; 0010 1000 green + ; 0010 1000 + + HEX A0A0BFFFFFBF5454 ; C6 PEDE HEAD -> C5 + ; 1010 0000 + ; 1010 0000 + ; 1011 1111 + ; 1111 1111 + ; 1111 1111 + ; 1011 1111 + ; 0101 0100 green + ; 0101 0100 + + HEX 8585FEFFFFFE2828 ; C4 PEDE HEAD <- C6 + ; 1000 0101 + ; 1000 0101 + ; 1111 1110 + ; 1111 1111 + ; 1111 1111 + ; 1111 1110 + ; 0010 1000 green + ; 0010 1000 + + HEX 8A8AFEFFFFFE5454 ; C4 PEDE HEAD <- C7 + ; 1000 1010 + ; 1000 1010 + ; 1111 1110 + ; 1111 1111 + ; 1111 1111 + ; 1111 1110 + ; 0101 0100 green + ; 0101 0100 + + + HEX 0101247070541111 ; J C8 - SPIDER LEFT + ; 0000 0001 + ; 0000 0100 + ; 0010 0100 + ; 0111 0000 + ; 0111 0000 + ; 0101 0100 + ; 0001 0001 + ; 0001 0001 + + HEX 0208407070280202 ; K C9 - SPIDER LEFT ODD + ; 0000 0010 + ; 0000 1000 + ; 0100 0000 green eyes + ; 0111 0000 white body + ; 0111 0000 + ; 0010 1000 + ; 0000 0010 + ; 0000 0010 + + HEX 4010020707154141 ; H CA - SPIDER RIGHT + ; 0100 0000 + ; 0001 0000 + ; 0000 0010 + ; 0000 0111 + ; 0000 0111 + ; 0001 0101 + ; 0100 0001 + ; 0100 0001 + + HEX 20200907070A2222 ; I CB - SPIDER RIGHT ODD + ; 0010 0000 + ; 0000 1000 + ; 0000 1001 + ; 0000 0111 + ; 0000 0111 + ; 0000 1010 + ; 0010 0010 + ; 0010 0010 + + + + + HEX 0202020202023E00 ; L + HEX 22362A2A22222200 ; M + HEX 2222262A32222200 ; N + HEX 1C22222222221C00 ; O + + HEX BEAAAAAAFF181818 ; : mushroom high EVEN D0 + ; 1011 1110 ; ORANGE top + ; 1010 1010 + ; 1010 1010 + ; 1010 1010 + ; 1111 1111 ; white line + ; 0001 1000 ; white bottom + ; 0001 1000 + ; 0001 1000 + + HEX BED5D5D5FF181818 ; ; mushroom high ODD D1 + ; 1011 1110 ; ORANGE top + ; 1101 0101 + ; 1101 0101 + ; 1101 0101 + ; 1111 1111 ; white line + ; 0001 1000 ; white bottom + ; 0001 1000 + ; 0001 1000 + HEX 1E22221E0A122200 ; R + HEX 1C22021C20221C00 ; S + HEX 3E08080808080800 ; T + HEX 2222222222221C00 ; U + HEX 2222222222140800 ; V + HEX 2222222A2A362200 ; W + HEX 2222140814222200 ; X + HEX 2222221408080800 ; Y + HEX 3E20100804023E00 ; Z + + + HEX 3E06060606063E00 ; [ + HEX 3E06060606063E00 ; [ + + HEX 3E06060606063E00 ; [ + HEX 0002040810200000 ; \ + HEX 0002040810200000 ; \ + + + HEX 00000000FF181818 ; _ mushroom low E0 + ; 0000 0000 + ; 0000 0000 + ; 0000 0000 + ; 0000 0000 + ; 1111 1111 + ; 0001 1000 ; white bottom + ; 0001 1000 + ; 0001 1000 + + + HEX 00000000FF181818 ; _ mushroom low E1 + ; 0000 0000 + ; 0000 0000 + ; 0000 0000 + ; 0000 0000 + ; 1111 1111 + ; 0001 1000 ; white bottom + ; 0001 1000 + ; 0001 1000 + + HEX 02021E2222221E00 ; b + HEX 00003C0202023C00 ; c + HEX 20203C2222223C00 ; d + HEX 00001C223E023C00 ; e + HEX 1824041E04040400 ; f + HEX 00001C22223C201C ; g + HEX 02021E2222222200 ; h + HEX 08000C0808081C00 ; i + HEX 100018101010120C ; j + HEX 020222120E122200 ; k + HEX 0C08080808081C00 ; l + HEX 0000362A2A2A2200 ; m + HEX 00001E2222222200 ; n + HEX 00001C2222221C00 ; o + + HEX 949494B6B6BEFFFF ; ^ player F0 + ; 1001 0100 + ; 1001 0100 + ; 1001 0100 + ; 1011 0110 + ; 1011 0110 + ; 1011 1110 + ; 1111 1111 + ; 1111 1111 + + HEX 8A8A8A9B9B9FFFFF ; ^ player F1 + ; 1000 1010 + ; 1000 1010 + ; 1000 1010 + ; 1001 1011 + ; 1001 1011 + ; 1001 1111 + ; 1111 1111 + ; 1111 1111 + + HEX 00003A0602020200 ; r + HEX 00003C021C201E00 ; s + HEX 04041E0404241800 ; t + HEX 0000222222322C00 ; u + HEX 0000222222140800 ; v + HEX 000022222A2A3600 ; w + HEX 0000221408142200 ; x + HEX 0000222214080806 ; y + HEX 00003E1008043E00 ; z + HEX 0000000018181800 ; . bullet low FB + HEX 0000000018181800 ; . bullet low FC + HEX 1818180000000000 ; ' bullet high FD + HEX 1818180000000000 ; ' bullet high FE + HEX 7F7F7F7F7F7F7F7F ; CURSOR \ No newline at end of file