* * Lode Runner * (c) 1983, Broderbund Software * (s) 2014, Brutal Deluxe Software * mx %11 org $0 lst off ds $800 * 0 vide * 1 mur * 2 mur dur * 3 chelle visible * 4 liane * 5 trappe * 6 chelle invisible * 7 trsor * 8 ennemi * 9 hros * Sprite quand heros ennemi tombe dans un trou : * - venant de gauche : 20 53 (35h) * - venant de droite : 19 54 (36h) * *----------------------------------- * EQUATES *----------------------------------- lvlWIDTH = 28 ; $1c lvlHEIGHT = 16 ; $10 sprWIDTH = 10 sprHEIGHT = 11 nbLIVES = 5 maxLEVEL = 150 maxHEIGHT = 192 ; lines modeEDIT = 0 ; to decode level modeGAME = 1 sprEMPTY = 0 sprWALL = 1 sprWALLI = 2 ; mur indestructible sprLADDER = 3 sprBAR = 4 sprTRAP = 5 sprLADDERI = 6 sprCHEST = 7 sprFOE = 8 sprHERO = 9 sprCURSOR = 10 spr0 = $3b ; until $44 sprA = $45 ; until $5e >.()/-< (latest sprite is $65) minJOY = $12 ; joystick min/center/max values ctrJOY = $2e maxJOY = $3b *--- The big zero page usage boardX = $00 boardY = $01 heroSTEPX = $02 heroSTEPY = $03 heroINDEX = $04 fgLEFTRIGHT = $05 ptrBOARD = $06 ; $06..$07: pointer to board ptrBBACK = $08 ; $08..$09: pointer to back board ptrDATA = $0a ; $0a..$0b: pointer to data (HGR or other) ptrHGR1 = $0c ; $0c..$0d ptrHGR2 = $0e ; $0e..$0f ptrSTRSND = $10 ; $10..$11: pointer to some table (string, sound) foeX = $12 foeY = $13 foeINDEX = $14 foeLEFTRIGHT = $15 foeACTION = $16 foeSTEPX = $17 ; coordinate foeSTEPY = $18 ; coordinate idxFOE = $19 ; current foe index fgODDEVEN = $1a theYSCREEN = $1b theXSCREEN = $1c nbLINES = $1d theA = $1e hgrPAGE = $1f CH = $24 ; ** CV = $25 ; ** CSWL = $36 ; ** CSWH = $37 ; ** KSWL = $38 ; ** KSWH = $39 ; ** theMASK1 = $50 theMASK2 = $51 fgCOLLISION = $52 tempX6 = $53 idxNOTE = $54 tempX4 = $55 tempY1 = $56 tempX5 = $57 tempX3 = $5a tempX2 = $5b temp1 = $5c tempX = $5d tempY = $5e theJOYX = $65 theJOYY = $66 sprTABLE = $71 theX = $85 theY = $86 activePAGE = $87 tempINDEX = $88 theCENTAINE = $89 theDIZAINE = $8a ; 8a theUNITE = $8b ; 8b theSPEED = $8c ; 8c nbFOE = $8d ; 8d theSCORE = $8e ; 8e..8f.90..91 idxLVLDISK = $92 ; index in level buffer from disk nbCHEST = $93 ; 93 fgCHEST = $94 ; 94 1: not a chest, 0: a chest fgINPUT = $95 ; "J"oystick, "K"eyboard intLEVEL = $96 ; 96 theLEVEL-1 theMEN = $98 ; 5 bonshommes pour dmarrer fgSOUND = $99 ; 0: no sound, -1: sound on fgPLAY = $9a ; 1: alive, 0: dead fgHEROFELL = $9b ; 0: hero fell into a hole, $20: tempo for game speed fgHOLE = $9c ; -1: left hole, 0: none, 1: right hole fgGOODSTART = $9d ; 1: start from level 0 / allow score update, 0: not true theKEY1 = $9e theKEY2 = $9f idxDIG = $a0 ; dig index in sprite list counter = $a1 ; a simple counter fgLVLMODE = $a2 ; 0: edit, <>0: game idxLADDERI = $a3 fgSPEED = $a4 ; speed of the game fgCIRCLE = $a5 ; 0: show level, 1: hide level theLEVEL = $a6 ; current level fgDEMO = $a7 ; 1: in demo mode ptrDEMO = $a8 ; $a8..$a9 - pointer to demo data demoKEY = $aa ; the demo key actions demoREPEAT = $ab ; the demo repeat factor fgKEYBTN0 = $ac ; 1: no key/btn0 pressed, 0: key/btn0 pressed fgCHANGE = $ad ; 1: no change, 0: change sprDATA = $df ; $df..$ff chrLA = $88 chrRET = $8d chrRA = $95 chrESC = $9b chrSPC = " " chrZERO = "0" chrNINE = "9" chrDOT = "." chrA = "A" chrI = "I" chrJ = "J" chrK = "K" chrL = "L" chrN = "N" chrO = "O" chrU = "U" chrY = "Y" chrZ = "Z" *----------------------------------- * SOFTSWITCHES *----------------------------------- KBD EQU $C000 KBDSTROBE EQU $C010 SPKR EQU $C030 TXTCLR EQU $C050 MIXCLR EQU $C052 TXTPAGE1 EQU $C054 TXTPAGE2 EQU $C055 HIRES EQU $C057 BUTN0 EQU $C061 BUTN1 EQU $C062 PADDL0 EQU $C064 PADDL1 EQU $C065 PTRIG EQU $C070 SETKBD EQU $FE89 *----------------------------------- * DONNEES *----------------------------------- put LR.Data *----------------------------------- * PAGES GRAPHIQUES *----------------------------------- HGR1 ds 8192 HGR2 ds 8192 HGR3 = * *----------------------------------- * ENTRY POINT *----------------------------------- L6000 JSR checkJOYSTICK LDA #$01 ; read score table JSR readSCORE *--- Show title page * Data from $0F00 to $1A84 showTITLEPAGE JSR clearHGR1 ; display the compressed title page LDA #logo-1 STA L6030+2 LDY #$00 STY theY STY fgDEMO STY intLEVEL LDA #>HGR1 STA hgrPAGE STA activePAGE L6023 JSR setHGRPOINTER LDY #$00 L6028 INC L6030+1 BNE L6030 INC L6030+2 L6030 LDA L6028 BEQ L603F BPL L603C STA (ptrHGR1),Y INY BPL L6028 L603C TAY BPL L6028 L603F INC theY LDY theY CPY #maxHEIGHT ; until line 192 BCC L6023 STA TXTPAGE1 STA HIRES STA MIXCLR STA TXTCLR JMP L618E *--- L6056 LDA #$00 STA theSCORE STA theSCORE+1 STA theSCORE+2 STA theSCORE+3 STA $97 ; l'intelligence des ennemis peut-tre ? STA fgCIRCLE STA tempX6 STA demoREPEAT STA ptrDEMO ; demo actions LDA #>demoDATA STA ptrDEMO+1 LDA #nbLIVES ; 5 men to start with STA theMEN LDA fgDEMO LSR BEQ L6099 LDA #$01 JSR readSCORE ; load score CMP #$00 BNE L6086 JSR tellNODATADISK JMP showTITLEPAGE ; start again L6086 LDA scorebuf+$FF BNE L6091 LDA CSWL ; this code is useless LDX CSWH ; if no copy protection remains BNE L6095 L6091 LDA KSWL LDX KSWH L6095 STA CH STX CV L6099 JSR clearHGRPAGES ; clear HGR pages and draw board STA TXTPAGE1 L609F LDX #modeGAME JSR prepareLEVEL LDA #$00 STA theKEY1 STA theKEY2 LDA fgDEMO ; are we in demo mode? LSR BEQ L60BF ; yes JSR waitKEYUP LDA boardX STA theX LDA boardY STA theY LDA #sprHERO JSR blinkSPRITE L60BF LDX #$00 STX fgHOLE STX idxNOTE LDA $97 CLC ADC nbFOE TAY LDX L6214,Y LDA L6CA7,X STA $60 LDA L6CA7+1,X STA $61 LDA L6CA7+2,X STA $62 LDY $97 LDA L621D,Y STA $5F L60E4 JSR handleHERO LDA fgPLAY ; are we dead? BEQ L613F ; yes JSR playMELODY LDA nbCHEST ; remaining chests? BNE L60F5 ; yes JSR showINVISIBLELADDERS L60F5 LDA boardY ; are we on top row BNE L6107 LDA heroSTEPY ; are we going up? CMP #$02 BNE L6107 LDA nbCHEST ; are there chests left? BEQ L611A ; no CMP #$FF BEQ L611A ; no, we won L6107 JSR checkHOLE ; are there holes active? LDA fgPLAY ; are we dead? BEQ L613F ; yes JSR playMELODY JSR handleFOE ; handle the foes LDA fgPLAY ; am I dead? BEQ L613F ; yes... BNE L60E4 ; no, loop L611A INC theLEVEL ; next level, no chests left INC intLEVEL INC theMEN ; man++ BNE L6124 DEC theMEN ; man-- L6124 LDX #$0F STX temp1 L6128 LDY #$01 ; ajoute 15 x 100 points LDA #$00 JSR printSCORE JSR scoreSOUND JSR scoreSOUND JSR scoreSOUND DEC temp1 BNE L6128 L613C JMP L609F L613F DEC theMEN ; man-- JSR printMEN JSR prepareMELODY HEX 02400240035003500460046005700570 HEX 068006800790079008A008A009B009B0 HEX 0AC00AC00BD00BD00CE00CE00DF00DF0 HEX 00 L6178 JSR playMELODY BCS L6178 LDA fgDEMO LSR BEQ L61D0 LDA theMEN ; man BNE L613C JSR checkHIGHSCORE JSR animGAMEOVER ; we are dead, anim GAME OVER BCS L61F6 L618E JSR waitKEYUP LDX #$FF LDY #$FF LDA #$03 STA theY L6199 LDA fgINPUT CMP #chrK BEQ L61A9 LDA BUTN1 BMI L6201 LDA BUTN0 BMI L6201 L61A9 LDA KBD BMI L61F6 DEX BNE L6199 DEY BNE L6199 DEC theY BNE L6199 LDA fgDEMO BNE L61DE LDX #$01 STX fgDEMO STX theLEVEL STX fgKEYBTN0 STX fgGOODSTART LDX fgSOUND STX L61D0+1 STA fgSOUND JMP L6056 L61D0 LDA #$00 STA fgSOUND LDA KBD LDX fgKEYBTN0 BEQ L61F6 JMP L618E L61DE CMP #$01 BNE L61F3 BEQ L61E9 L61E4 LDA #$01 JSR readSCORE L61E9 JSR showALLSCORES LDA #$02 STA fgDEMO JMP L618E L61F3 JMP showTITLEPAGE L61F6 STA KBDSTROBE CMP #$85 ; Ctrl-E - Editor BEQ L6211 CMP #chrRET ; Return BEQ L61E4 L6201 LDX #$00 STX intLEVEL INX STX theLEVEL STX fgGOODSTART LDA #$02 STA fgDEMO JMP L6056 L6211 JMP enterEDITOR ; Jump to the Editor L6214 HEX 000306090C0F121518 ; 0..3..6..9..12..15..18..21..24 (index in 6CA7) L621D HEX 26262E4447494A4B4C4D4E4F50 scoreSOUND LDA temp1 ; son pour le score ASL ASL ASL ASL LDX #$06 JSR getNOTE JMP playMELODY *----------------------------------- * PREPARE LEVEL *----------------------------------- prepareLEVEL STX fgLVLMODE ; 0: edit, <>0: game LDX #$FF STX boardX INX STX idxLADDERI ; index in table of for hidden ladder STX nbCHEST STX nbFOE STX idxFOE STX idxDIG STX idxLVLDISK STX fgODDEVEN STX theY TXA LDX #sizeHOLE-2 L6252 STA tblHOLET,X DEX BPL L6252 LDX #sizeFOE-3 L625A STA tblFOETEMPO,X DEX BPL L625A LDA #$01 STA fgPLAY JSR diskLEVEL LDY theY L6269 LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDA #$00 ; vrifie le contenu STA theX ; du niveau L627E LDA fgODDEVEN ; que des valeurs 0-9 LSR LDY idxLVLDISK LDA levelDISK,Y BCS L628C AND #$0F BPL L6292 L628C LSR LSR LSR LSR INC idxLVLDISK L6292 INC fgODDEVEN LDY theX CMP #sprHERO+1 BCC L629C LDA #sprEMPTY L629C STA (ptrBOARD),Y STA (ptrBBACK),Y INC theX LDA theX CMP #lvlWIDTH BCC L627E INC theY LDY theY CPY #lvlHEIGHT BCC L6269 JSR decodeLEVEL BCC L62C3 LDA intLEVEL BEQ L62C4 LDX #$00 STX intLEVEL INC $97 DEX ; mode game JMP prepareLEVEL L62C3 RTS L62C4 JMP showTITLEPAGE *----------------------------------- * ENCODE A LEVEL BEFORE SAVING IT *----------------------------------- encodeLEVEL LDA #$00 STA idxLVLDISK STA fgODDEVEN STA theY L62CF LDY theY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY #$00 STY theX L62DF LDA fgODDEVEN LSR LDA (ptrBOARD),Y BCS L62EA STA theA BPL L62F7 L62EA ASL ASL ASL ASL ORA theA LDY idxLVLDISK STA levelDISK,Y INC idxLVLDISK L62F7 INC fgODDEVEN INC theX LDY theX CPY #lvlWIDTH BCC L62DF INC theY LDA theY CMP #lvlHEIGHT BCC L62CF LDA #$02 ; write level JMP diskLEVEL *----------------------------------- * LOAD/SAVE LEVEL FROM/TO DISK *----------------------------------- diskLEVEL STA LB7F4 LDA fgDEMO ; are we in demo mode? LSR BEQ diskDEMO ; yes LDA intLEVEL ; no, use internal level LSR LSR LSR LSR CLC ADC #$03 STA LB7EC ; track LDA intLEVEL AND #$0F STA LB7ED ; sector LDA #levelDISK STA LB7F0+1 LDA #$00 STA LB7EB diskRWTS LDY #LB7E8 jsr callRWTS ; LoGo - JSR $0023 - Souvenir from protection BCC L6344 JMP showTITLEPAGE L6344 RTS diskDEMO LDA theLEVEL ; demo mode uses levels in RAM CLC ADC #>L9E00 STA ptrHGR1+1 LDY #scorebuf STA LB7F0+1 LDA #$00 STA LB7EB LDY #LB7E8 JSR callRWTS BCC L6381 JMP showTITLEPAGE *--- Check disk (not a LR disk, data disk, master disk) L6381 LDY #$0A ; check magic number LDA #$00 STA theMASK1 L6387 LDA scorebuf+$F4,Y ; magic key EOR L63A8,Y ORA theMASK1 STA theMASK1 DEY BPL L6387 LDA theMASK1 BEQ L639B LDA #$00 ; 0 means not a LR disk RTS L639B LDA #$01 ; master disk LDX scorebuf+$FF BNE L63A4 LDA #$FF ; FF means master disk L63A4 RTS callRWTS JMP $bd00 ; LoGo - ($0036) to be replaced with JMP $BD00 L63A8 ASC "LODE RUNNER" *----------------------------------- * DECODE A LEVEL *----------------------------------- decodeLEVEL LDY #lvlHEIGHT-1 STY theY L63B7 LDA tblBOARDALLL,Y ; $0800 STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y ; $0a00 STA ptrBBACK+1 LDY #lvlWIDTH-1 STY theX L63CC LDA (ptrBOARD),Y LDX fgLVLMODE ; mode edit? BEQ L63EE ; yes CMP #sprLADDERI BNE L63F0 LDX idxLADDERI CPX #sizeLI-3 BCS L63E8 INC idxLADDERI INX LDA theY STA tblLADDERIY,X TYA STA tblLADDERIX,X L63E8 LDA #sprEMPTY ; hide it STA (ptrBOARD),Y STA (ptrBBACK),Y L63EE BEQ L6450 ; mode edit L63F0 CMP #sprCHEST BNE L63F8 INC nbCHEST BNE L6450 L63F8 CMP #sprFOE BNE L642A LDX nbFOE ; nbFOE CPX #sizeFOE-3 ; max BCS L63E8 INC nbFOE INX TYA STA tblFOEX,X LDA theY STA tblFOEY,X LDA #$00 STA tblFOEACTION,X STA tblFOEINDEX,X LDA #$02 STA tblFOESTEPX,X ; x-step movement STA tblFOESTEPY,X ; y-step movement LDA #sprEMPTY STA (ptrBBACK),Y LDA #sprFOE ; output a foe BNE L6450 L6426 BPL L63B7 L6428 BPL L63CC L642A CMP #sprHERO ; if the hero BNE L644A LDX boardX ; -1 on entry BPL L63E8 ; we'll never return STY boardX ; save a positive value LDX theY STX boardY LDX #$02 STX heroSTEPX ; x-step movement STX heroSTEPY ; y-step movement LDX #$08 STX heroINDEX ; index in sprite table LDA #sprEMPTY ; blank in background STA (ptrBBACK),Y LDA #sprHERO BNE L6450 L644A CMP #sprTRAP ; if a trap BNE L6450 LDA #sprWALL ; output a wall L6450 JSR coutHGR2 ; put the char in background DEC theX ; x-- LDY theX BPL L6428 DEC theY ; y-- LDY theY BPL L6426 LDA fgLVLMODE ; mode edit? BEQ L6469 ; yes LDA boardX ; we met the hero BPL L648B ; continue to the animation SEC ; not ok RTS *--- Level is decode for the edit mode L6469 LDA #>HGR1 ; copy HGR1 > HGR2 STA ptrHGR2+1 LDA #>HGR2 STA ptrHGR1+1 LDA #$00 STA ptrHGR2 STA ptrHGR1 TAY L6478 LDA (ptrHGR1),Y STA (ptrHGR2),Y INY BNE L6478 INC ptrHGR2+1 INC ptrHGR1+1 LDX ptrHGR1+1 CPX #>HGR3 ; >HGR2+$20 BUG BCC L6478 CLC ; oookkkkk RTS *--- Level is decoded for the game mode L648B JSR circleANIMATION LDY #lvlHEIGHT-1 ; clear HGR2 background STY theY ; for hero and foes L6492 LDA tblBOARDALLL,Y ; the background contains all other sprites STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY #lvlWIDTH-1 STY theX L64A0 LDA (ptrBOARD),Y CMP #sprHERO BEQ L64AA CMP #sprFOE BNE L64AF L64AA LDA #sprEMPTY JSR coutHGR2 L64AF DEC theX LDY theX BPL L64A0 DEC theY LDY theY BPL L6492 CLC ; and say OOOKKKKKK RTS *----------------------------------- * *----------------------------------- handleHERO LDA #$01 STA fgCHEST LDA fgHOLE BEQ L64CD BPL L64CA JMP L67E7 L64CA JMP L68AD L64CD LDY boardY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY boardX LDA (ptrBBACK),Y CMP #sprLADDER BEQ L6522 CMP #sprBAR BNE L64EB LDA heroSTEPY CMP #$02 BEQ L6522 L64EB LDA heroSTEPY CMP #$02 BCC L6525 LDY boardY CPY #lvlHEIGHT-1 BEQ L6522 LDA tblBOARDALLL+1,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH+1,Y STA ptrBOARD+1 LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY boardX LDA (ptrBOARD),Y CMP #sprEMPTY BEQ L6525 CMP #sprFOE BEQ L6522 LDA (ptrBBACK),Y CMP #sprWALL BEQ L6522 CMP #sprWALLI BEQ L6522 CMP #sprLADDER BNE L6525 L6522 JMP L6584 L6525 LDA #$00 ; hero fell in a hole, tell the program STA fgHEROFELL ; to change speed JSR calcSPRITEXY JSR drawSPRITEXY LDA #$07 ; index in sprite table: fall in a left hole LDX fgLEFTRIGHT BMI L6537 LDA #$0F ; fall in a right hole L6537 STA heroINDEX JSR heroNEXTSTEPX INC heroSTEPY LDA heroSTEPY CMP #$05 BCS L654A JSR checkCHEST JMP checkCOLLISION L654A LDA #$00 STA heroSTEPY LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY boardX LDA (ptrBBACK),Y CMP #sprWALL BNE L656B LDA #sprEMPTY L656B STA (ptrBOARD),Y INC boardY LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY boardX LDA #sprHERO STA (ptrBOARD),Y JMP checkCOLLISION L6584 LDA fgHEROFELL BNE L658F LDA #$64 LDX #$08 JSR playSOUND L658F LDA #$20 STA fgSPEED STA fgHEROFELL JSR getPLAYERINPUT LDA theKEY1 CMP #chrI ; move up BNE L65A4 JSR checkMOVEUP BCS L65C2 RTS L65A4 CMP #chrK ; move down BNE L65AE JSR checkMOVEDOWN BCS L65C2 RTS L65AE CMP #chrU ; dig left BNE L65B8 JSR checkDIGLEFT BCS L65C2 RTS L65B8 CMP #chrO ; dig right BNE L65C2 JSR checkDIGRIGHT BCS L65C2 RTS L65C2 LDA theKEY2 CMP #chrJ ; move left BNE L65CB JMP checkMOVELEFT L65CB CMP #chrL ; move right BNE L65D2 JMP checkMOVERIGHT L65D2 RTS *----------------------------------- * CHECK IF WE CAN MOVE LEFT *----------------------------------- checkMOVELEFT LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDX heroSTEPX CPX #$03 BCS L6600 LDY boardX ; already at column 0 BEQ L65FF DEY ; what do we have to the left? LDA (ptrBOARD),Y CMP #sprWALLI BEQ L65FF CMP #sprWALL BEQ L65FF CMP #sprTRAP BNE L6600 L65FF RTS ; we cannot move L6600 JSR calcSPRITEXY JSR drawSPRITEXY LDA #$FF STA fgLEFTRIGHT JSR heroNEXTSTEPY DEC heroSTEPX BPL L662A LDY boardX LDA (ptrBBACK),Y CMP #sprWALL BNE L661B LDA #sprEMPTY L661B STA (ptrBOARD),Y DEC boardX DEY LDA #sprHERO STA (ptrBOARD),Y LDA #$04 STA heroSTEPX BNE L662D L662A JSR checkCHEST L662D LDY boardX ; define sprites LDA (ptrBBACK),Y ; if we are on a bar CMP #sprBAR BEQ L663B LDA #$00 ; run left first step LDX #$02 ; last step BNE L663F L663B LDA #$03 ; bar left first step LDX #$05 ; last step L663F JSR setHEROSTEP JMP checkCOLLISION *----------------------------------- * CHECK IF WE CAN MOVE RIGHT *----------------------------------- checkMOVERIGHT LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDX heroSTEPX CPX #$02 BCC L6674 LDY boardX CPY #lvlWIDTH-1 BEQ L6673 INY LDA (ptrBOARD),Y CMP #sprWALLI BEQ L6673 CMP #sprWALL BEQ L6673 CMP #sprTRAP BNE L6674 L6673 RTS L6674 JSR calcSPRITEXY JSR drawSPRITEXY LDA #$01 STA fgLEFTRIGHT JSR heroNEXTSTEPY INC heroSTEPX LDA heroSTEPX CMP #$05 BCC L66A2 LDY boardX LDA (ptrBBACK),Y CMP #sprWALL BNE L6693 LDA #sprEMPTY L6693 STA (ptrBOARD),Y INC boardX INY LDA #sprHERO STA (ptrBOARD),Y LDA #$00 STA heroSTEPX BEQ L66A5 L66A2 JSR checkCHEST L66A5 LDY boardX LDA (ptrBBACK),Y CMP #sprBAR BEQ L66B3 LDA #$08 ; run right step 1 LDX #$0A ; run right step 3 BNE L66B7 L66B3 LDA #$0B ; bar right step 1 LDX #$0D ; bar right step 3 L66B7 JSR setHEROSTEP JMP checkCOLLISION *----------------------------------- * CAN WE MOVE UP *----------------------------------- checkMOVEUP LDY boardY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY boardX LDA (ptrBBACK),Y CMP #sprLADDER BEQ L66ED LDY heroSTEPY CPY #$03 BCC L66EB LDY boardY LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY boardX LDA (ptrBBACK),Y CMP #sprLADDER BEQ L6711 L66EB SEC RTS L66ED LDY heroSTEPY CPY #$03 BCS L6711 LDY boardY BEQ L66EB LDA tblBOARDALLL-1,Y STA ptrBOARD LDA tblBOARDALLH-1,Y STA ptrBOARD+1 LDY boardX LDA (ptrBOARD),Y CMP #sprWALL BEQ L66EB CMP #sprWALLI BEQ L66EB CMP #sprTRAP BEQ L66EB L6711 JSR calcSPRITEXY JSR drawSPRITEXY LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 JSR heroNEXTSTEPX DEC heroSTEPY BPL L6757 LDY boardX LDA (ptrBBACK),Y CMP #sprWALL BNE L673B LDA #$00 L673B STA (ptrBOARD),Y DEC boardY LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY boardX LDA #sprHERO STA (ptrBOARD),Y LDA #$04 STA heroSTEPY BNE L675A L6757 JSR checkCHEST L675A LDA #$10 ; climb ladder step 1 LDX #$11 ; climb ladder step 2 JSR setHEROSTEP JSR checkCOLLISION CLC RTS *----------------------------------- * CHECK IF CAN MOVE DOWN *----------------------------------- checkMOVEDOWN LDY heroSTEPY CPY #$02 BCC L678A LDY boardY CPY #lvlHEIGHT-1 BCS L6788 LDA tblBOARDALLL+1,Y STA ptrBOARD LDA tblBOARDALLH+1,Y STA ptrBOARD+1 LDY boardX LDA (ptrBOARD),Y CMP #sprWALLI BEQ L6788 CMP #sprWALL BNE L678A L6788 SEC RTS L678A JSR calcSPRITEXY JSR drawSPRITEXY LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 JSR heroNEXTSTEPX INC heroSTEPY LDA heroSTEPY CMP #$05 BCC L67D5 LDY boardX LDA (ptrBBACK),Y CMP #sprWALL BNE L67B8 LDA #$00 L67B8 STA (ptrBOARD),Y INC boardY LDY boardY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY boardX LDA #sprHERO STA (ptrBOARD),Y LDA #$00 STA heroSTEPY JMP L675A L67D5 JMP L6757 L67D8 JMP L6892 *----------------------------------- * CHECK IF WE CAN DIG LEFT *----------------------------------- checkDIGLEFT LDA #$FF STA fgHOLE STA theKEY1 STA theKEY2 LDA #$00 STA idxDIG L67E7 LDY boardY ; are we on last line? CPY #lvlHEIGHT-1 BCS L67D8 INY JSR setBOARDLINEPOINTERS LDY boardX ; are we on first column? BEQ L67D8 DEY LDA (ptrBOARD),Y ; what do we have on our left? CMP #sprWALL ; a wall? BNE L67D8 LDY boardY ; yes JSR setBOARDLINEPOINTERS LDY boardX DEY LDA (ptrBOARD),Y CMP #sprEMPTY BNE L686E JSR calcSPRITEXY JSR drawSPRITEXY JSR heroNEXTSTEPX JSR heroNEXTSTEPY LDY idxDIG LDA digNOTE,Y LDX digDURATION,Y JSR getNOTE LDX idxDIG LDA #$00 CPX #$06 BCS L682B LDA #$06 L682B STA heroINDEX JSR checkCOLLISION LDX idxDIG CPX #$0C BEQ L6898 CPX #$00 BEQ L684C LDA seqDIGLEFT-1,X ; dig left - 1 PHA LDX boardX DEX LDY boardY JSR getXY PLA JSR drawSPRITEXY LDX idxDIG L684C LDA seqDIGLEFT,X ; dig left PHA LDX boardX DEX STX theX LDY boardY STY theY JSR getXY PLA JSR drawSPRXYCOLLISION LDX idxDIG LDA seqDIGSTONE,X ; dig stone INC theY JSR coutHGR1 INC idxDIG CLC RTS L686E LDY boardY INY STY theY LDY boardX DEY STY theX LDA #sprWALL JSR coutHGR1 LDX idxDIG BEQ L6892 DEX LDA seqDIGLEFT,X PHA LDY boardY LDX boardX DEX JSR getXY PLA JSR drawSPRITEXY L6892 LDA #$00 STA fgHOLE SEC RTS L6898 LDX boardX DEX JMP addNEWHOLE L689E JMP L695C *----------------------------------- * CHECK IF WE CAN DIG RIGHT *----------------------------------- checkDIGRIGHT LDA #$01 STA fgHOLE STA theKEY1 STA theKEY2 LDA #$0C STA idxDIG L68AD LDY boardY ; are we on last line? CPY #lvlHEIGHT-1 BCS L689E INY JSR setBOARDLINEPOINTERS LDY boardX ; are we on lat column? CPY #lvlWIDTH-1 BCS L689E INY LDA (ptrBOARD),Y CMP #sprWALL ; do we have a wall? BNE L689E LDY boardY JSR setBOARDLINEPOINTERS LDY boardX INY LDA (ptrBOARD),Y CMP #sprEMPTY BNE L6936 JSR calcSPRITEXY JSR drawSPRITEXY JSR heroNEXTSTEPX JSR heroNEXTSTEPY LDY idxDIG LDA seqDIGSTONE,Y ; dig stone LDX digNOTE2,Y JSR getNOTE LDX idxDIG LDA #$08 CPX #$12 BCS L68F3 LDA #$0E L68F3 STA heroINDEX JSR checkCOLLISION LDX idxDIG CPX #$18 BEQ L6962 CPX #$0C BEQ L6914 LDA seqDIGLEFT-1,X PHA LDX boardX INX LDY boardY JSR getXY PLA JSR drawSPRITEXY LDX idxDIG L6914 LDA seqDIGLEFT,X PHA LDX boardX INX STX theX LDY boardY STY theY JSR getXY PLA JSR drawSPRXYCOLLISION INC theY LDX idxDIG LDA seqDIGRIGHT,X JSR coutHGR1 INC idxDIG CLC RTS L6936 LDY boardY INY STY theY LDY boardX INY STY theX LDA #$01 JSR coutHGR1 LDX idxDIG CPX #$0C BEQ L695C DEX LDA seqDIGLEFT,X PHA LDX boardX INX LDY boardY JSR getXY PLA JSR drawSPRITEXY L695C LDA #$00 STA fgHOLE SEC RTS L6962 LDX boardX ; we're digging INX JMP addNEWHOLE * Enchanement des sprites seqLODERUNNER DB $0B ; 0 court gauche DB $0C ; 1 DB $0D ; 2 DB $18 ; 3 barre gauche DB $19 ; 4 DB $1A ; 5 DB $0F ; 6 creuse gauche DB $13 ; 7 tombe dans un trou gauche DB $09 ; 8 court droite DB $10 ; 9 LR court vers la droite step 1 DB $11 ; A LR court vers la droite step 2 DB $15 ; B LR est sur la barre vers la droite step 1 DB $16 ; C LR est sur la barre vers la droite step 2 DB $17 ; D LR est sur la barre vers la droite step 3 DB $25 ; E creuse droite DB $14 ; F tombe dans un trou droite DB $0E ; 10 monte chelle step 1 DB $12 ; 11 monte chelle step 2 seqDIGLEFT DB $1B ; 12 creuse 1 DB $1B ; 13 creuse 1 DB $1C ; 14 creuse 2 DB $1C ; 15 creuse 2 DB $1D ; 16 creuse 3 DB $1D ; 17 creuse 3 DB $1E ; 18 creuse 4 DB $1E ; 19 creuse 4 DB $00 ; 1A DB $00 ; 1B DB $00 ; 1C DB $00 ; 1D seqDIGRIGHT DB $26 ; 1E creuse droite step 1 DB $26 ; 1F creuse droite step 1 DB $27 ; 20 creuse droite step 2 DB $27 ; 21 creuse droite step 2 DB $1D ; 22 creuse droite step 3 DB $1D ; 23 creuse droite step 3 DB $1E ; 24 creuse droite step 4 DB $1E ; 25 creuse droite step 4 DB $00 ; 26 DB $00 ; 27 DB $00 ; 28 DB $00 ; 29 seqDIGSTONE DB $1F ; 2A dig stone sequence DB $1F ; 2B DB $20 ; 2C DB $20 ; 2D DB $21 ; 2E DB $21 ; 2F DB $22 ; 30 DB $22 ; 31 DB $23 ; 32 DB $23 ; 33 DB $24 ; 34 DB $24 ; 35 *--- Sound data digNOTE DB $20 ; musical notes when we dig digNOTE2 DB $20 ; DB $20 ; DB $20 ; DB $20 ; DB $20 ; DB $20 ; DB $20 ; DB $24 ; DB $24 ; DB $24 ; DB $24 ; DB $24 ; digDURATION DB $04 ; duration DB $04 ; DB $04 ; DB $04 ; DB $04 ; DB $04 ; DB $04 ; DB $04 ; DB $03 ; DB $03 ; DB $02 ; DB $02 ; DB $01 ; *----------------------------------- * DEMO MODE ENGINE ENTRY POINT *----------------------------------- L69B8 LDA KBD BMI L69CD LDA fgINPUT CMP #chrK BEQ L69D6 LDA BUTN1 BMI L69CD LDA BUTN0 BPL L69D6 L69CD LSR fgKEYBTN0 LSR fgPLAY LDA #$01 STA theMEN ; one man RTS L69D6 LDA demoREPEAT ; are we currently handling a movement? BNE L69F2 ; yes LDY #$00 ; no, get values LDA (ptrDEMO),Y ; the keys STA demoKEY INY LDA (ptrDEMO),Y STA demoREPEAT ; the repeat LDA ptrDEMO ; next entry CLC ADC #$02 STA ptrDEMO LDA ptrDEMO+1 ADC #$00 STA ptrDEMO+1 L69F2 LDA demoKEY ; first entry is the fisrt key AND #$0F TAX LDA tblDEMO2KEY,X STA theKEY1 LDA demoKEY LSR LSR LSR LSR TAX LDA tblDEMO2KEY,X STA theKEY2 ; second key DEC demoREPEAT RTS * 0123456 tblDEMO2KEY ASC "IJKLOU " *----------------------------------- * GAME ENGINE ENTRY POINT *----------------------------------- getPLAYERINPUT LDA fgDEMO CMP #$01 BEQ L69B8 LDX KBD STX KBDSTROBE STX theA BMI L6A2B LDA fgINPUT CMP #chrK BEQ L6A55 L6A28 JMP getJOYSTICKKEY L6A2B CPX #chrSPC BCS L6A49 STX theA LDY #$FF L6A33 INY LDA tblKEY,Y BEQ L6A49 CMP theA BNE L6A33 TYA ASL TAY LDA tblKEYADR+1,Y PHA LDA tblKEYADR,Y PHA RTS L6A49 LDA fgINPUT CMP #chrJ BEQ L6A28 LDX theA STX theKEY1 STX theKEY2 L6A55 RTS *------------------------------- * 9E - CTRL-^ - NEXT LEVEL *------------------------------- doNEXTLEVEL INC theMEN ; man++ INC theLEVEL INC intLEVEL LSR fgPLAY LSR fgGOODSTART RTS *------------------------------- * 80 - CTRL-@ - EXTRA MAN *------------------------------- doEXTRAMAN INC theMEN ; man++ BNE L6A67 DEC theMEN ; man-- L6A67 JSR printMEN LSR fgGOODSTART JMP getPLAYERINPUT *--- dead code INC $97 INC theMEN ; man++ LSR fgPLAY RTS *------------------------------- * 9B - ESC - PAUSE GAME *------------------------------- doPAUSE JSR waitKEYDOWN CMP #$9B BNE doPAUSE JMP getPLAYERINPUT *------------------------------- * 92 - CTRL-R - TERMINATES CURRENT GAME *------------------------------- doTERMINATE LDA #$01 STA theMEN ; man *------------------------------- * 81 - CTRL-A - ABORTS MAN *------------------------------- doABORTMAN LSR fgPLAY RTS *------------------------------- * 93 - CTRL-S - TOGGLES SOUND *------------------------------- doTOGGLESOUND LDA fgSOUND EOR #$FF STA fgSOUND JMP getPLAYERINPUT *------------------------------- * 8A - DOWN ARROW - MOVE LEFT *------------------------------- doDOWNARROW LDA #chrJ STA fgINPUT JMP getPLAYERINPUT *------------------------------- * 8B - UP ARROW - MOVE DOWN *------------------------------- doUPARROW LDA #chrK STA fgINPUT JMP getPLAYERINPUT *------------------------------- * 98 - CTRL-X - FLIPS X-AXIS *------------------------------- doFLIPX LDA joyXMIN LDX joyXMAX STA joyXMAX STX joyXMIN JMP getPLAYERINPUT *------------------------------- * 99 - CTRL-Y - FLIPS Y-AXIS *------------------------------- doFLIPY LDA joyYMIN LDX joyYMAX STA joyYMAX STX joyYMIN JMP getPLAYERINPUT *------------------------------- * 88 - LEFT ARROW - SLOWS DOWN *------------------------------- doSLOWDOWN LDA theSPEED BEQ L6ACD DEC theSPEED JMP getPLAYERINPUT *------------------------------- * 95 - RIGHT ARROW - SPEEDS UP *------------------------------- doSPEEDUP LDA theSPEED CMP #$0F BEQ L6ACD INC theSPEED L6ACD JMP getPLAYERINPUT *------------------------------- * GET JOYSTICK KEY *------------------------------- getJOYSTICKKEY LDA BUTN1 BPL L6AD9 LDA #chrU ; dig BNE L6AE0 L6AD9 LDA BUTN0 BPL L6AE5 LDA #chrO ; dig L6AE0 STA theKEY1 STA theKEY2 RTS L6AE5 JSR readJOYSTICK ; no keys pressed LDY theJOYX ; read joystick LDA joyXMAX ; clamp CMP #$2E ; return key BEQ L6AFA CPY joyXMAX BCS L6B03 LDA #chrL BNE L6B1E L6AFA CPY joyXMAX BCC L6B03 LDA #chrL BNE L6B1E L6B03 LDA joyXMIN CMP #$2E BEQ L6B13 CPY joyXMIN BCS L6B1C LDA #chrJ BNE L6B1E L6B13 CPY joyXMIN BCC L6B1C LDA #chrJ BNE L6B1E L6B1C LDA #chrA-1 L6B1E STA theKEY2 LDY theJOYY LDA joyYMIN CMP #$2E BEQ L6B32 CPY joyYMIN BCS L6B3B LDA #chrI BNE L6B56 L6B32 CPY joyYMIN BCC L6B3B LDA #chrI BNE L6B56 L6B3B LDA joyYMAX CMP #$2E BEQ L6B4B CPY joyYMAX BCS L6B54 LDA #chrK BNE L6B56 L6B4B CPY joyYMAX BCC L6B54 LDA #chrK BNE L6B56 L6B54 LDA #chrA-1 L6B56 STA theKEY1 RTS *---------------------------------- * KEYS AND ASSOCIATED JUMPS *---------------------------------- tblKEY HEX 9E809B9281938A8B889598998D00 tblKEYADR DA doNEXTLEVEL-1 ; 9E - CTRL-^ DA doEXTRAMAN-1 ; 80 - CTRL-@ DA doPAUSE-1 ; 9B - ESCAPE DA doTERMINATE-1 ; 92 - CTRL-R DA doABORTMAN-1 ; 81 - CTRL-A DA doTOGGLESOUND-1 ; 93 - CTRL-S DA doDOWNARROW-1 ; 8A - DOWN ARROW DA doUPARROW-1 ; 8B - UP ARROW DA doSPEEDUP-1 ; 88 - LEFT ARROW DA doSLOWDOWN-1 ; 95 - RIGHT ARROW DA doFLIPX-1 ; 98 - CTRL-X DA doFLIPY-1 ; 99 - CTRL-Y DA displayHIGHSCORES-1 ; 8D - RETURN joyXMIN DB minJOY ; x-low joyXMAX DB ctrJOY ; x-high joyYMIN DB minJOY ; y-low joyYMAX DB ctrJOY ; y-high *----------------------------------- * CALC SPRITE X/Y *----------------------------------- calcSPRITEXY LDX boardX ; calc next HGR X position LDY heroSTEPX JSR calcHGRX STX theA ; save it LDY boardY ; calc next HGR Y position LDX heroSTEPY JSR calcHGRY ; we keep it in Y LDX heroINDEX ; get sprite index LDA seqLODERUNNER,X LDX theA RTS *----------------------------------- * CHECK CHEST *----------------------------------- * Check if we are on a chest * If so, add 250 to the score checkCHEST LDA heroSTEPX ; is sprite still in X CMP #$02 BNE L6BF3 LDA heroSTEPY ; is sprite still in Y CMP #$02 BNE L6BF3 LDY boardY ; yes LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY boardX ; are we on a chest? LDA (ptrBBACK),Y CMP #sprCHEST BNE L6BF3 LSR fgCHEST ; collision avec un coffre DEC nbCHEST ; chest-- LDY boardY ; remove it from background STY theY LDY boardX STY theX LDA #sprEMPTY STA (ptrBBACK),Y JSR coutHGR2 LDY theY ; draw it on screen LDX theX JSR getXY LDA #sprCHEST JSR drawSPRITEXY LDY #$02 ; add 250 to score LDA #$50 JSR printSCORE JSR prepareMELODY ; and beep it HEX 07450655054404540343025300 L6BF3 RTS *----------------------------------- * STEP HERO STEP *----------------------------------- setHEROSTEP INC heroINDEX ; A is the first step CMP heroINDEX ; X the last BCC L6BFD ; sets the step accordingly L6BFA STA heroINDEX RTS L6BFD CPX heroINDEX BCC L6BFA RTS *----------------------------------- * CHECK COLLISION *----------------------------------- checkCOLLISION JSR calcSPRITEXY JSR drawSPRXYCOLLISION LDA fgCOLLISION ; les sprites sont-ils entrs en collision ? BEQ L6C12 ; non LDA fgCHEST ; en collision avec un coffre ? BEQ L6C12 ; oui, on ne perd pas LSR fgPLAY ; non, perdu L6C12 RTS *----------------------------------- * SET HERO NEXT STEP X *----------------------------------- heroNEXTSTEPX LDA heroSTEPX CMP #$02 BCC L6C20 BEQ L6C25 DEC heroSTEPX JMP checkCHEST L6C20 INC heroSTEPX JMP checkCHEST L6C25 RTS *----------------------------------- * SET HERO NEXT STEP Y *----------------------------------- heroNEXTSTEPY LDA heroSTEPY CMP #$02 BCC L6C33 BEQ L6C38 DEC heroSTEPY JMP checkCHEST L6C33 INC heroSTEPY JMP checkCHEST L6C38 RTS *----------------------------------- * ADD A NEW HOLE *----------------------------------- addNEWHOLE LDA #$00 ; tell we're digging STA fgHOLE LDY boardY INY STX theX STY theY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA #sprEMPTY ; make the hole visible LDY theX STA (ptrBOARD),Y JSR coutHGR1 LDA #sprEMPTY JSR coutHGR2 DEC theY LDA #sprEMPTY JSR coutHGR1 INC theY LDX #$FF ; add the hole to the list L6C67 INX CPX #sizeHOLE-2 BEQ L6C81 LDA tblHOLET,X ; <>0 tempo means there is a hole BNE L6C67 LDA theY STA tblHOLEY,X LDA theX STA tblHOLEX,X LDA #$B4 ; its tempo STA tblHOLET,X SEC L6C81 RTS *----------------------------------- * *----------------------------------- handleFOE LDX nbFOE ; no foe, skip BEQ L6CA6 INC $64 LDY $64 CPY #$03 BCC L6C92 LDY #$00 STY $64 L6C92 LDA |$0060,Y STA $63 L6C97 LSR $63 BCC L6CA2 JSR doFOEACTION LDA fgPLAY BEQ L6CA6 L6CA2 LDA $63 BNE L6C97 L6CA6 RTS *----------------------------------- * *----------------------------------- L6CA7 HEX 000000 HEX 000101 HEX 010101 HEX 010301 HEX 010303 HEX 030303 HEX 030307 HEX 030707 HEX 070707 HEX 07070F HEX 070F0F HEX 0F0F0F seqFOE DB $08 ; 0 - foe runs left 1 DB $2B ; 1 - ...left 2 DB $2C ; 2 - ...left 3 DB $30 ; 3 - foe bar left 1 DB $31 ; 4 - ... left 2 DB $32 ; 5 - ... left 3 DB $36 ; 6 - foe falls left DB $28 ; 7 - foe runs right 1 DB $29 ; 8 - ... right 2 DB $2A ; 9 - ... right 3 DB $2D ; A - foe bar right 1 DB $2E ; B - ... right 2 DB $2F ; C - ... right 3 DB $35 ; D - foe falls right DB $33 ; E - foe ladder 1 DB $34 ; F - ... ladder 2 *----------------------------------- * *----------------------------------- doFOEACTION INC idxFOE LDX nbFOE CPX idxFOE BCS L6CE7 LDX #$01 STX idxFOE L6CE7 JSR loadFOEDATA LDA foeACTION BMI L6D08 BEQ L6D08 DEC foeACTION LDY foeACTION CPY #$0D BCS L6CFB JMP L6E65 L6CFB LDX idxFOE LDA tblFOETEMPO,X BEQ L6D05 JMP saveFOEDATA L6D05 JMP L6DB7 L6D08 LDY foeY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX LDA (ptrBBACK),Y CMP #sprLADDER BEQ L6D61 CMP #sprBAR BNE L6D26 LDA foeSTEPY CMP #$02 BEQ L6D61 L6D26 LDA foeSTEPY CMP #$02 BCC L6D64 LDY foeY CPY #lvlHEIGHT-1 BEQ L6D61 LDA tblBOARDALLL+1,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDA tblBOARDALLH+1,Y STA ptrBOARD+1 LDY foeX LDA (ptrBOARD),Y CMP #sprEMPTY BEQ L6D64 CMP #sprHERO BEQ L6D64 CMP #sprFOE BEQ L6D61 LDA (ptrBBACK),Y CMP #sprWALL BEQ L6D61 CMP #sprWALLI BEQ L6D61 CMP #sprLADDER BNE L6D64 L6D61 JMP L6E85 L6D64 JSR calcFOESPRITEXY JSR drawSPRITEXY JSR foeNEXTSTEPX LDA #$06 ; foe falls left LDY foeLEFTRIGHT BMI L6D75 LDA #$0D ; foe falls right L6D75 STA foeINDEX INC foeSTEPY LDA foeSTEPY CMP #$05 BCS L6DC0 LDA foeSTEPY CMP #$02 BNE L6DB7 JSR foeTAKECHEST LDY foeY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX LDA (ptrBBACK),Y CMP #sprWALL BNE L6DB7 LDA foeACTION BPL L6DA2 DEC nbCHEST L6DA2 LDA $5F STA foeACTION LDY #$00 ; we trapped a foe LDA #$75 JSR printSCORE JSR prepareMELODY HEX 06200430024000 L6DB7 JSR calcFOESPRITEXY JSR drawSPRXYCOLLISION JMP saveFOEDATA L6DC0 LDA #$00 STA foeSTEPY LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX LDA (ptrBBACK),Y CMP #sprWALL BNE L6DE1 LDA #sprEMPTY L6DE1 STA (ptrBOARD),Y INC foeY LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX LDA (ptrBOARD),Y CMP #sprHERO BNE L6E02 LSR fgPLAY ; found the hero, he's now dead L6E02 LDA (ptrBBACK),Y CMP #sprWALL BNE L6E58 LDA foeACTION BPL L6E58 LDY foeY DEY STY theY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX STY theX LDA (ptrBBACK),Y CMP #sprEMPTY BEQ L6E31 DEC nbCHEST JMP L6E46 L6E31 LDA #sprCHEST STA (ptrBOARD),Y STA (ptrBBACK),Y JSR coutHGR2 LDY theY LDX theX JSR getXY LDA #sprCHEST JSR drawSPRXYCOLLISION L6E46 LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA #$00 STA foeACTION LDY foeX L6E58 LDA #sprFOE STA (ptrBOARD),Y JSR calcFOESPRITEXY JSR drawSPRXYCOLLISION JMP saveFOEDATA L6E65 CPY #$07 BCC L6E85 JSR calcFOESPRITEXY JSR drawSPRITEXY LDY foeACTION LDA L6E7F-7,Y STA foeSTEPX L6E76 JSR calcFOESPRITEXY JSR drawSPRXYCOLLISION JMP saveFOEDATA L6E7F HEX 020102030201 L6E85 LDX foeX LDY foeY JSR L70D8 ASL TAY LDA L6E97+1,Y PHA LDA L6E97,Y PHA RTS L6E97 DA saveFOEDATA-1 ; 0 DA L6FBC-1 ; 1 DA L7047-1 ; 2 DA L6EAC-1 ; 3 DA L6F39-1 ; 4 L6EA1 LDA foeACTION BEQ L6EA9 BMI L6EA9 INC foeACTION L6EA9 JMP saveFOEDATA *--- 3 L6EAC LDY foeSTEPY CPY #$03 BCS L6ED5 LDY foeY BEQ L6EA1 DEY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY foeX LDA (ptrBOARD),Y CMP #$01 BEQ L6EA1 CMP #$02 BEQ L6EA1 CMP #$05 BEQ L6EA1 CMP #$08 BEQ L6EA1 L6ED5 JSR calcFOESPRITEXY JSR drawSPRITEXY JSR foeNEXTSTEPX LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 DEC foeSTEPY BPL L6F26 JSR checkDROPCHEST LDY foeX LDA (ptrBBACK),Y CMP #$01 BNE L6F02 LDA #$00 L6F02 STA (ptrBOARD),Y DEC foeY LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY foeX LDA (ptrBOARD),Y CMP #sprHERO BNE L6F1C LSR fgPLAY L6F1C LDA #$08 STA (ptrBOARD),Y LDA #$04 STA foeSTEPY BNE L6F29 L6F26 JSR foeTAKECHEST L6F29 LDA #$0E LDX #$0F JSR setFOESTEP JSR calcFOESPRITEXY JSR drawSPRXYCOLLISION JMP saveFOEDATA L6F39 LDY foeSTEPY CPY #$02 BCC L6F63 LDY foeY CPY #$0F BCS L6F60 INY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY foeX LDA (ptrBOARD),Y CMP #sprWALLI BEQ L6F60 CMP #sprFOE BEQ L6F60 CMP #sprWALL BNE L6F63 L6F60 JMP saveFOEDATA L6F63 JSR calcFOESPRITEXY JSR drawSPRITEXY JSR foeNEXTSTEPX LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 INC foeSTEPY LDA foeSTEPY CMP #$05 BCC L6FB9 JSR checkDROPCHEST LDY foeX LDA (ptrBBACK),Y CMP #sprWALL BNE L6F94 LDA #sprEMPTY L6F94 STA (ptrBOARD),Y INC foeY LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY foeX LDA (ptrBOARD),Y CMP #sprHERO BNE L6FAE LSR fgPLAY ; we're dead L6FAE LDA #sprFOE STA (ptrBOARD),Y LDA #$00 STA foeSTEPY JMP L6F29 L6FB9 JMP L6F26 L6FBC LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDX foeSTEPX CPX #$03 BCS L6FF1 LDY foeX BEQ L6FEE DEY LDA (ptrBOARD),Y CMP #sprFOE BEQ L6FEE CMP #sprWALLI BEQ L6FEE CMP #sprWALL BEQ L6FEE LDA (ptrBBACK),Y CMP #sprTRAP BNE L6FF1 L6FEE JMP saveFOEDATA L6FF1 JSR calcFOESPRITEXY JSR drawSPRITEXY JSR foeNEXTSTEPY LDA #$FF STA foeLEFTRIGHT DEC foeSTEPX BPL L7026 JSR checkDROPCHEST LDY foeX LDA (ptrBBACK),Y CMP #sprWALL BNE L700F LDA #sprEMPTY L700F STA (ptrBOARD),Y DEC foeX DEY LDA (ptrBOARD),Y CMP #sprHERO BNE L701C LSR fgPLAY ; foe catched hero L701C LDA #sprFOE STA (ptrBOARD),Y LDA #$04 STA foeSTEPX BNE L7029 L7026 JSR foeTAKECHEST L7029 LDY foeX LDA (ptrBBACK),Y CMP #sprBAR BEQ L7037 LDA #$00 ; foe runs left LDX #$02 BNE L703B L7037 LDA #$03 ; foe bars left LDX #$05 L703B JSR setFOESTEP JSR calcFOESPRITEXY JSR drawSPRXYCOLLISION JMP saveFOEDATA L7047 LDY foeY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDX foeSTEPX CPX #$02 BCC L707E LDY foeX CPY #lvlWIDTH-1 BEQ L707B INY LDA (ptrBOARD),Y CMP #$08 BEQ L707B CMP #$02 BEQ L707B CMP #$01 BEQ L707B LDA (ptrBBACK),Y CMP #$05 BNE L707E L707B JMP saveFOEDATA L707E JSR calcFOESPRITEXY JSR drawSPRITEXY JSR foeNEXTSTEPY LDA #$01 STA foeLEFTRIGHT INC foeSTEPX LDA foeSTEPX CMP #$05 BCC L70B7 JSR checkDROPCHEST LDY foeX LDA (ptrBBACK),Y CMP #sprWALL BNE L70A0 LDA #$00 L70A0 STA (ptrBOARD),Y INC foeX INY LDA (ptrBOARD),Y CMP #sprHERO BNE L70AD LSR fgPLAY L70AD LDA #sprFOE STA (ptrBOARD),Y LDA #$00 STA foeSTEPX BEQ L70BA L70B7 JSR foeTAKECHEST L70BA LDY foeX LDA (ptrBBACK),Y CMP #sprBAR BEQ L70C8 LDA #$07 ; foe runs right LDX #$09 BNE L70CC L70C8 LDA #$0A ; foe bars right LDX #$0C L70CC JSR setFOESTEP JSR calcFOESPRITEXY JSR drawSPRXYCOLLISION JMP saveFOEDATA L70D8 STX tempX4 STY tempY1 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX4 LDA (ptrBBACK),Y CMP #sprWALL BNE L70F7 LDA foeACTION BEQ L70F7 BMI L70F7 LDA #$03 ; action 3 RTS L70F7 LDY tempY1 CPY boardY BEQ L7100 JMP L7186 L7100 LDY tempX4 STY tempX5 CPY boardX BCS L7147 L7108 INC tempX5 LDY tempY1 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX5 LDA (ptrBBACK),Y CMP #sprLADDER BEQ L713E CMP #sprBAR BEQ L713E LDY tempY1 CPY #lvlHEIGHT-1 BEQ L713E LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX5 LDA (ptrBBACK),Y CMP #sprEMPTY BEQ L7186 CMP #sprTRAP BEQ L7186 L713E LDY tempX5 CPY boardX BNE L7108 LDA #$02 ; action 2 RTS L7147 DEC tempX5 LDY tempY1 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX5 LDA (ptrBBACK),Y CMP #sprLADDER BEQ L717D CMP #sprBAR BEQ L717D LDY tempY1 CPY #lvlHEIGHT-1 BEQ L717D LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX5 LDA (ptrBBACK),Y CMP #sprEMPTY BEQ L7186 CMP #sprTRAP BEQ L7186 L717D LDY tempX5 CPY boardX BNE L7147 LDA #$01 ; action 1 RTS L7186 LDA #$00 STA $58 LDA #$FF STA $59 LDX tempX4 LDY tempY1 JSR L743E JSR L7275 JSR L71A2 JSR L720C LDA $58 RTS L71A1 RTS L71A2 LDY tempX3 CPY tempX4 BEQ L71A1 LDY tempY1 CPY #lvlHEIGHT-1 BEQ L71DA LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX3 LDA (ptrBBACK),Y CMP #sprWALL BEQ L71DA CMP #sprWALLI BEQ L71DA LDX tempX3 LDY tempY1 JSR L739D LDX tempX3 JSR L72D4 CMP $59 BCS L71DA STA $59 LDA #$01 STA $58 L71DA LDY tempY1 BEQ L7206 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX3 LDA (ptrBBACK),Y CMP #sprLADDER BNE L7206 LDY tempY1 LDX tempX3 JSR L7300 LDX tempX3 JSR L72D4 CMP $59 BCS L7206 STA $59 LDA #$01 STA $58 L7206 INC tempX3 JMP L71A2 L720B RTS L720C LDY tempX2 CPY tempX4 BEQ L720B LDY tempY1 CPY #$0F BEQ L7244 LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX2 LDA (ptrBBACK),Y CMP #sprWALL BEQ L7244 CMP #sprWALLI BEQ L7244 LDX tempX2 LDY tempY1 JSR L739D LDX tempX2 JSR L72D4 CMP $59 BCS L7244 STA $59 LDA #$02 STA $58 L7244 LDY tempY1 BEQ L7270 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX2 LDA (ptrBBACK),Y CMP #sprLADDER BNE L7270 LDY tempY1 LDX tempX2 JSR L7300 LDX tempX2 JSR L72D4 CMP $59 BCS L7270 STA $59 LDA #$02 STA $58 L7270 DEC tempX2 JMP L720C L7275 LDY tempY1 CPY #lvlHEIGHT-1 BEQ L72A7 LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX4 LDA (ptrBBACK),Y CMP #sprWALL BEQ L72A7 CMP #sprWALLI BEQ L72A7 LDX tempX4 LDY tempY1 JSR L739D LDX tempX4 JSR L72D4 CMP $59 BCS L72A7 STA $59 LDA #$04 STA $58 L72A7 LDY tempY1 BEQ L72D3 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX4 LDA (ptrBBACK),Y CMP #sprLADDER BNE L72D3 LDX tempX4 LDY tempY1 JSR L7300 LDX tempX4 JSR L72D4 CMP $59 BCS L72D3 STA $59 LDA #$03 STA $58 L72D3 RTS L72D4 STA fgODDEVEN CMP boardY BNE L72EB CPX foeX BCC L72E3 TXA SEC SBC foeX RTS L72E3 STX fgODDEVEN LDA foeX SEC SBC fgODDEVEN RTS L72EB BCC L72F4 SEC SBC boardY CLC ADC #$C8 RTS L72F4 LDA boardY SEC SBC fgODDEVEN CLC ADC #$64 RTS L72FD LDA tempY RTS L7300 STY tempY STX tempX L7304 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX LDA (ptrBBACK),Y CMP #sprLADDER BNE L72FD DEC tempY LDY tempX BEQ L734A DEY LDA (ptrBBACK),Y CMP #sprWALL BEQ L7340 CMP #sprWALLI BEQ L7340 CMP #sprLADDER BEQ L7340 LDY tempY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX DEY LDA (ptrBBACK),Y CMP #sprBAR BNE L734A L7340 LDY tempY STY temp1 CPY boardY BCC L7397 BEQ L7397 L734A LDY tempX CPY #lvlWIDTH-1 BEQ L738C LDY tempY LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX INY LDA (ptrBBACK),Y CMP #sprWALL BEQ L7382 CMP #sprWALLI BEQ L7382 CMP #sprLADDER BEQ L7382 LDY tempY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX INY LDA (ptrBBACK),Y CMP #sprBAR BNE L738C L7382 LDY tempY STY temp1 CPY boardY BCC L7397 BEQ L7397 L738C LDY tempY CPY #$01 BCC L7395 JMP L7304 L7395 TYA RTS L7397 LDA temp1 RTS L739A LDA tempY RTS L739D STY tempY STX tempX L73A1 LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX LDA (ptrBBACK),Y CMP #sprWALL BEQ L739A CMP #sprWALLI BEQ L739A LDY tempY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX LDA (ptrBBACK),Y CMP #sprEMPTY BEQ L742D CPY #$00 ; first column? BEQ L73FB ; yes DEY LDA (ptrBBACK),Y CMP #sprBAR BEQ L73F3 LDY tempY LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX DEY LDA (ptrBBACK),Y CMP #sprWALL BEQ L73F3 CMP #sprWALLI BEQ L73F3 CMP #sprLADDER BNE L73FB L73F3 LDY tempY STY temp1 CPY boardY BCS L743B L73FB LDY tempX CPY #lvlWIDTH-1 BCS L742D INY LDA (ptrBBACK),Y CMP #sprBAR BEQ L7425 LDY tempY LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX INY LDA (ptrBBACK),Y CMP #sprWALL BEQ L7425 CMP #sprLADDER BEQ L7425 CMP #sprWALLI BNE L742D L7425 LDY tempY STY temp1 CPY boardY BCS L743B L742D INC tempY ; next column LDY tempY CPY #lvlHEIGHT BCS L7438 JMP L73A1 L7438 LDA #$0F RTS L743B LDA temp1 RTS L743E STX tempX3 STX tempX2 STY theYSCREEN L7444 LDA tempX3 BEQ L7490 LDY theYSCREEN LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY tempX3 DEY LDA (ptrBOARD),Y CMP #$01 BEQ L7490 CMP #$02 BEQ L7490 CMP #$03 BEQ L748A CMP #$04 BEQ L748A LDY theYSCREEN CPY #$0F BEQ L748A LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX3 DEY LDA (ptrBBACK),Y CMP #$01 BEQ L748A CMP #$02 BEQ L748A CMP #$03 BNE L748E L748A DEC tempX3 BPL L7444 L748E DEC tempX3 L7490 LDA tempX2 CMP #lvlWIDTH-1 BEQ L74DE LDY theYSCREEN LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY tempX2 INY LDA (ptrBOARD),Y CMP #sprWALL BEQ L74DE CMP #sprWALLI BEQ L74DE CMP #sprLADDER BEQ L74D8 CMP #sprBAR BEQ L74D8 LDY theYSCREEN CPY #lvlHEIGHT-1 BEQ L74D8 LDA tblBOARDALLL+1,Y STA ptrBBACK LDA tblBOARDBACKH+1,Y STA ptrBBACK+1 LDY tempX2 INY LDA (ptrBBACK),Y CMP #$01 BEQ L74D8 CMP #$02 BEQ L74D8 CMP #$03 BNE L74DC L74D8 INC tempX2 BPL L7490 L74DC INC tempX2 L74DE RTS *----------------------------------- * CALC FOE SPRITE X/Y *----------------------------------- calcFOESPRITEXY LDX foeX LDY foeSTEPX JSR calcHGRX STX theA LDY foeY LDX foeSTEPY JSR calcHGRY LDX foeINDEX LDA seqFOE,X LDX theA RTS *----------------------------------- * FOE TAKES A CHEST *----------------------------------- foeTAKECHEST LDA foeSTEPX CMP #$02 BNE L753D LDA foeSTEPY CMP #$02 BNE L753D LDY foeY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX LDA (ptrBBACK),Y CMP #sprCHEST BNE L753D LDA foeACTION ; deja un tresor ? BMI L753D ; oui LDA #$FF ; prends-le SEC SBC tempX6 STA foeACTION LDA #sprEMPTY STA (ptrBBACK),Y LDY foeY STY theY LDY foeX STY theX JSR coutHGR2 LDY theY LDX theX JSR getXY LDA #sprCHEST JMP drawSPRITEXY L753D RTS *----------------------------------- * FOE DROPS CHEST *----------------------------------- checkDROPCHEST LDA foeACTION BPL L7573 ; skip if positive INC foeACTION ; here is negative BNE L7573 LDY foeY ; here if 0 STY theY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY foeX STY theX LDA (ptrBBACK),Y CMP #sprEMPTY BNE L7571 LDA #sprCHEST STA (ptrBBACK),Y JSR coutHGR2 LDY theY LDX theX JSR getXY LDA #sprCHEST JMP drawSPRXYCOLLISION L7571 DEC foeACTION L7573 RTS *----------------------------------- * SET FOE ANIMATION STEP *----------------------------------- setFOESTEP INC foeINDEX ; tutu CMP foeINDEX BCC L757D L757A STA foeINDEX RTS L757D CPX foeINDEX BCC L757A RTS *----------------------------------- * SET FOE NEXT STEP X *----------------------------------- foeNEXTSTEPX LDA foeSTEPX CMP #$02 BCC L758F BEQ L7594 DEC foeSTEPX JMP foeTAKECHEST L758F INC foeSTEPX JMP foeTAKECHEST L7594 RTS *----------------------------------- * SET FOE NEXT STEP Y *----------------------------------- foeNEXTSTEPY LDA foeSTEPY CMP #$02 BCC L75A2 BEQ L75A7 DEC foeSTEPY JMP foeTAKECHEST L75A2 INC foeSTEPY JMP foeTAKECHEST L75A7 RTS *----------------------------------- * SAVE FOE DATA AFTER WE USED IT *----------------------------------- saveFOEDATA LDX idxFOE LDA foeX STA tblFOEX,X LDA foeY STA tblFOEY,X LDA foeSTEPX STA tblFOESTEPX,X LDA foeSTEPY STA tblFOESTEPY,X LDA foeACTION STA tblFOEACTION,X LDA foeLEFTRIGHT STA tblFOELEFTRIGHT,X LDA foeINDEX STA tblFOEINDEX,X RTS *----------------------------------- * LOAD FOE DATA TO USE IT *----------------------------------- loadFOEDATA LDX idxFOE LDA tblFOEX,X STA foeX LDA tblFOEY,X STA foeY LDA tblFOESTEPX,X STA foeSTEPX LDA tblFOESTEPY,X STA foeSTEPY LDA tblFOEINDEX,X STA foeINDEX LDA tblFOELEFTRIGHT,X STA foeLEFTRIGHT LDA tblFOEACTION,X STA foeACTION RTS *----------------------------------- * CHECK HOLE - Who/What is in the hole? *----------------------------------- checkHOLE JSR checkRESURRECT INC tempX6 ; next one LDA tempX6 CMP #lvlWIDTH ; ok, we browsed the line BCC L7603 LDA #$00 ; start again at column 0 STA tempX6 L7603 LDX #sizeHOLE-2 L7605 LDA tblHOLET,X STX tempINDEX BNE L760F JMP L770D L760F DEC tblHOLET,X BEQ L7641 LDA tblHOLEX,X STA theX LDA tblHOLEY,X STA theY LDA tblHOLET,X CMP #$14 ; 20 BNE L7639 LDA #$37 ; 1er sprite L7627 JSR coutHGR2 LDX theX LDY theY JSR getXY LDA #sprEMPTY JSR drawSPRITEXY L7636 JMP L770D L7639 CMP #$0A ; 10 BNE L7636 LDA #$38 ; 2nd sprite BNE L7627 L7641 LDX tempINDEX LDY tblHOLEY,X STY theY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tblHOLEX,X STY theX LDA (ptrBOARD),Y CMP #sprEMPTY BNE L7667 JMP L7701 L7667 CMP #sprHERO BNE L766D LSR fgPLAY ; the hero was in the hole... he's dead L766D CMP #sprFOE BEQ L767A ; it was a foe CMP #sprCHEST BNE L7677 DEC nbCHEST ; a chest, remove one L7677 JMP L7701 *--- kill the foe L767A LDA #sprWALL ; put a wall STA (ptrBOARD),Y STA (ptrBBACK),Y JSR coutHGR1 LDA #sprWALL JSR coutHGR2 LDX nbFOE ; find the foe L768A LDA tblFOEX,X CMP theX BNE L76FE LDA tblFOEY,X CMP theY BNE L76FE LDA tblFOEACTION,X ; was he holding a chest? BPL L769F DEC nbCHEST ; yes, remove it L769F LDA #$7F ; no chest STA tblFOEACTION,X STX idxFOE JSR loadFOEDATA JSR calcFOESPRITEXY JSR drawSPRITEXY LDX idxFOE LDY #$01 ; we resurrect him on line 1 STY theY L76B5 LDY theY LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY tempX6 L76C3 LDA (ptrBBACK),Y CMP #sprEMPTY ; only if there is a space BEQ L76D9 INC tempX6 LDY tempX6 CPY #lvlWIDTH BCC L76C3 INC theY LDA #$00 STA tempX6 BEQ L76B5 L76D9 TYA STA tblFOEX,X LDA theY STA tblFOEY,X LDA #$14 STA tblFOETEMPO,X LDA #$02 STA tblFOESTEPY,X STA tblFOESTEPX,X LDA #$00 STA tblFOEINDEX,X LDY #$00 ; we killed an ennemy LDA #$75 JSR printSCORE JMP L770D L76FE DEX BNE L768A L7701 LDA #sprWALL STA (ptrBOARD),Y JSR coutHGR1 LDA #sprWALL JSR coutHGR2 L770D LDX tempINDEX DEX BMI L7715 JMP L7605 L7715 RTS *----------------------------------- * CHECK RESURRECT - Can/Do we resurrect a foe? *----------------------------------- checkRESURRECT LDX nbFOE ; ennemi 0 n'existe pas BEQ L7715 LDA idxFOE PHA L771D LDA tblFOETEMPO,X BEQ nextFOE STX idxFOE JSR loadFOEDATA LDA #$7F STA tblFOEACTION,X LDA tblFOEX,X STA theX LDA tblFOEY,X STA theY DEC tblFOETEMPO,X ; foe must live BEQ resurrectFOE LDA tblFOETEMPO,X CMP #$13 BNE L7752 LDA #$39 ; foe appears again JSR coutHGR2 JSR calcFOESPRITEXY LDA #$39 JSR drawSPRXYCOLLISION JMP nextFOEalt L7752 CMP #$0A BNE nextFOE LDA #$3A ; foe appears again sprite 2 JSR coutHGR2 JSR calcFOESPRITEXY LDA #$3A JSR drawSPRXYCOLLISION nextFOEalt LDX idxFOE ; next ennemy nextFOE DEX BNE L771D PLA ; restore STA idxFOE RTS ; exit *----------------------------------- * RESURRECT FOE *----------------------------------- resurrectFOE LDY theY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDX idxFOE INC tblFOETEMPO,X LDY theX LDA (ptrBOARD),Y BNE nextFOE LDA #sprFOE STA (ptrBOARD),Y LDA #sprEMPTY JSR coutHGR2 LDA #$00 LDX idxFOE STA tblFOEACTION,X STA tblFOETEMPO,X LDA #sprFOE JSR coutHGR1 JSR prepareMELODY HEX 027C03780474057000 LDX idxFOE JMP nextFOE *------------------------------- * 8D - RETURN - DISPLAYS HIGH SCORE *------------------------------- displayHIGHSCORES JSR showALLSCORES LDX #$FF LDY #$FF LDA #$04 STA counter L77B7 LDA fgINPUT CMP #chrK BEQ L77C7 LDA BUTN1 BMI L77D6 LDA BUTN0 BMI L77D6 L77C7 LDA KBD BMI L77D6 DEX BNE L77B7 DEY BNE L77B7 DEC counter BNE L77B7 L77D6 STA KBDSTROBE STA TXTPAGE1 JSR clearHGR2 LDY #lvlHEIGHT-1 STY theY L77E3 LDA tblBOARDALLL,Y STA ptrBBACK LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY #lvlWIDTH-1 STY theX L77F1 LDA (ptrBBACK),Y CMP #sprTRAP BNE L77F9 LDA #sprWALL L77F9 JSR coutHGR2 DEC theX LDY theX BPL L77F1 DEC theY LDY theY BPL L77E3 LDX #sizeHOLE-2 L780A STX tempINDEX LDA tblHOLET,X BEQ L7838 LDY tblHOLEY,X STY theY LDY tblHOLEX,X STY theX CMP #$15 BCC L7827 LDA #sprEMPTY JSR coutHGR2 JMP L7838 L7827 CMP #$0B BCC L7833 LDA #$37 ; rebuild wall step 1 JSR coutHGR2 JMP L7838 L7833 LDA #$38 ; rebuild wall step 2 JSR coutHGR2 L7838 LDX tempINDEX DEX BPL L780A LDX nbFOE BEQ L7868 ; skip foe n0 L7841 LDA tblFOETEMPO,X STX tempINDEX BEQ L7863 LDY tblFOEX,X STY theX LDY tblFOEY,X STY theY CMP #$14 BCS L7863 CMP #$0B BCC L785E LDA #$39 ; foe revives step 1 BNE L7860 L785E LDA #$3A ; foe revives step 2 L7860 JSR coutHGR2 L7863 LDX tempINDEX DEX BNE L7841 L7868 JMP getPLAYERINPUT *------------------------------- * SHOW ALL SCORES *------------------------------- showALLSCORES JSR clearHGR2 LDA #>HGR2 STA activePAGE LDA #$00 STA theX STA theY JSR printSTRING ASC " LODE RUNNER HIGH SCORES"8D8D8D ASC " INITIALS LEVEL SCORE"8D ASC " -------- ----- --------"8D00 LDA #$01 ; for x=1 to...10 STA tempX4 L78D4 CMP #$0A BNE L78E5 LDA #$01 JSR outputCHAR LDA #$00 JSR outputCHAR JMP L78EF L78E5 LDA #chrSPC JSR printCHAR LDA tempX4 JSR outputCHAR L78EF JSR printSTRING ASC ". "00 LDX tempX4 LDY scoreoffset,X STY tempY1 LDA scorebuf+$03,Y BNE L7907 JMP L798C * +0..+2 INITIALS * +3 LEVEL * +4..+7 SCORE L7907 LDY tempY1 LDA scorebuf,Y JSR printCHAR LDY tempY1 LDA scorebuf+$01,Y JSR printCHAR LDY tempY1 LDA scorebuf+$02,Y JSR printCHAR JSR printSTRING ASC " "00 LDY tempY1 LDA scorebuf+$03,Y JSR hex2dec LDA theCENTAINE JSR outputCHAR LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR JSR printSTRING ASC " "00 LDY tempY1 LDA scorebuf+$04,Y JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR LDY tempY1 LDA scorebuf+$05,Y JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR LDY tempY1 LDA scorebuf+$06,Y JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR LDY tempY1 LDA scorebuf+$07,Y JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR L798C JSR L7B7D INC tempX4 LDA tempX4 CMP #$0B BCS L799A JMP L78D4 L799A STA TXTPAGE2 LDA #>HGR1 STA activePAGE RTS scoreoffset HEX 0000081018202830384048 ; offset of each score *------------------------------- * CLEAR PAGES *------------------------------- clearHGRPAGES JSR clearHGR1 JSR clearHGR2 *------------------------------- * DRAW GAME FRAME *------------------------------- drawINFOBAR LDY #$27 ; met la barre bleue LDA activePAGE CMP #>HGR2 BEQ L79DD L79BB LDA #$AA STA $2350,Y STA $2750,Y STA $2B50,Y STA $2F50,Y DEY LDA #$D5 STA $2350,Y STA $2750,Y STA $2B50,Y STA $2F50,Y DEY BPL L79BB BMI L79FD L79DD LDA #$AA ; pareil mais sur HGR2 STA $4350,Y STA $4750,Y STA $4B50,Y STA $4F50,Y DEY LDA #$D5 STA $4350,Y STA $4750,Y STA $4B50,Y STA $4F50,Y DEY BPL L79DD L79FD LDA #$10 STA theY LDA #$00 STA theX JSR printSTRING ASC "SCORE MEN LEVEL "00 JSR printMEN JSR printLEVEL LDA #$00 ; score de 0 TAY JMP printSCORE *------------------------------- * SET HGR POINTER *------------------------------- setHGRPOINTER LDA xhgr,Y STA ptrHGR1 LDA yhgr,Y ORA hgrPAGE STA ptrHGR1+1 RTS *------------------------------- * SET HGR POINTERS *------------------------------- setHGRPOINTERS LDA xhgr,Y STA ptrHGR1 STA ptrHGR2 LDA yhgr,Y ORA #>HGR1 STA ptrHGR1+1 EOR #$60 STA ptrHGR2+1 RTS *------------------------------- * CLEAR HGR1 *------------------------------- clearHGR1 LDA #>HGR1 LDX #>HGR2 ; >HGR1+$20 BNE L7A5B *------------------------------- * CLEAR HGR2 *------------------------------- clearHGR2 LDA #>HGR2 LDX #>HGR3 ; >HGR2+$20 *--- clear now L7A5B STA ptrDATA+1 LDA #$00 STA ptrDATA TAY LDA #$80 L7A64 STA (ptrDATA),Y INY BNE L7A64 INC ptrDATA+1 CPX ptrDATA+1 BNE L7A64 RTS *------------------------------- * PRINT MEN *------------------------------- printMEN LDA theMEN ; print number of men LDX #$10 L7A74 STX theX ; show byte2dec JSR hex2dec LDA #$10 ; print three values (0-255) STA theY LDA theCENTAINE JSR outputCHAR LDA theDIZAINE JSR outputCHAR LDA theUNITE JMP outputCHAR *------------------------------- * PRINT LEVEL *------------------------------- printLEVEL LDA theLEVEL ; print level LDX #$19 ; column offset BNE L7A74 *------------------------------- * ADD & PRINT SCORE *------------------------------- printSCORE CLC SED ADC theSCORE STA theSCORE TYA ADC theSCORE+1 STA theSCORE+1 LDA #$00 ADC theSCORE+2 STA theSCORE+2 LDA #$00 ADC theSCORE+3 STA theSCORE+3 CLD LDA #$05 STA theX LDA #$10 STA theY LDA theSCORE+3 JSR bcd2dec LDA theUNITE JSR outputCHAR LDA theSCORE+2 JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR LDA theSCORE+1 JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JSR outputCHAR LDA theSCORE JSR bcd2dec LDA theDIZAINE JSR outputCHAR LDA theUNITE JMP outputCHAR *------------------------------- * BCD TO DECIMAL CONVERSION *------------------------------- bcd2dec STA theDIZAINE AND #$0F STA theUNITE ; unit LDA theDIZAINE LSR LSR LSR LSR STA theDIZAINE ; dizaine RTS *------------------------------- * HEX TO DECIMAL CONVERSION *------------------------------- hex2dec LDX #$00 STX theDIZAINE STX theCENTAINE ; centaine L7AFE CMP #100 BCC L7B08 INC theCENTAINE SBC #100 BNE L7AFE L7B08 CMP #10 BCC L7B12 INC theDIZAINE SBC #10 BNE L7B08 L7B12 STA theUNITE RTS *------------------------------- * PRINT A CHARACTER *------------------------------- outputCHAR CLC ; print a char ADC #spr0 LDX activePAGE CPX #>HGR2 BEQ L7B24 JSR coutHGR1 ; print HGR1 INC theX RTS L7B24 JSR coutHGR2 ; print HGR2 INC theX RTS *------------------------------- * FILTER CHARACTER *------------------------------- filterCHAR CMP #"A" BCC L7B32 CMP #"Z"+1 BCC L7B60 L7B32 LDX #$7C CMP #" " ; 7C = 00 BEQ L7B5F LDX #$DB CMP #">" ; DB = 5F BEQ L7B5F INX CMP #"." ; DC = 60 BEQ L7B5F INX CMP #"(" ; DD = 61 BEQ L7B5F INX CMP #")" ; DE = 62 BEQ L7B5F INX CMP #"/" ; DF = 63 BEQ L7B5F INX CMP #"-" ; E0 = 64 BEQ L7B5F INX CMP #"<" ; E1 = 65 BEQ L7B5F LDA #$10 ; The still Lode Runner RTS L7B5F TXA ; calculate offset L7B60 SEC SBC #$7C RTS *----------------------------------- * OUTPUT A CHARACTER *----------------------------------- printCHAR CMP #chrRET BEQ L7B7D JSR filterCHAR LDX activePAGE CPX #>HGR2 BEQ L7B77 JSR coutHGR1 ; output in HGR1 INC theX RTS L7B77 JSR coutHGR2 ; output in HGR2 INC theX RTS L7B7D INC theY ; next line LDA #$00 STA theX RTS *----------------------------------- * CTRL-E - LEVEL EDITOR *----------------------------------- enterEDITOR LDA #$00 STA theSCORE STA theSCORE+1 STA theSCORE+2 STA theSCORE+3 LDA CSWL STA CH LDA CSWH STA CV LDA #$05 STA theMEN STA fgDEMO LDA fgINPUT ; save interface mode STA L7C76+1 LDA #chrK ; force keyboard in editor STA fgINPUT STA TXTPAGE1 LDA intLEVEL ; check level CMP #maxLEVEL BCC editMAIN LDA #$00 ; start at 0 if > 149 STA intLEVEL editMAIN JSR clearHGR1 ; clear HGR1 LDA #>HGR1 STA activePAGE LDA #$00 STA theX STA theY JSR printSTRING ASC " LODE RUNNER BOARD EDITOR"8D ASC "----------------------------"8D ASC " ABORTS ANY COMMAND"8D00 editLOOP LDA theY ; are we at the CMP #$09 ; end of the screen? BCS editMAIN ; yes, bottom line JSR printSTRING ; no, show command ASC 8D ASC "COMMAND>"00 JSR editWAITKEY ; wait for key LDX #$00 L7C2E LDY tblEDITKEY,X ; authorized key? BEQ editNEXT CMP tblEDITKEY,X BEQ L7C41 INX BNE L7C2E editNEXT JSR doBEEP ; beep JMP editLOOP ; loop L7C41 TXA ; yes, we know the key ASL ; jump to the feature TAX ; and handle it LDA tblEDITADD+1,X PHA LDA tblEDITADD,X PHA RTS tblEDITKEY ASC "PCEMIS"00 tblEDITADD DA editPLAY-1 ; Play level DA editCLEAR-1 ; Clear level DA editEDIT-1 ; Edit level DA editMOVE-1 ; Move level DA editINIT-1 ; Initialize DA editCLEARSCORE-1 ; Clear Score file *------------------------------- * P - PLAY LEVEL *------------------------------- editPLAY JSR printSTRING ASC 8D ASC ">>PLAY LEVEL"00 JSR inputLEVEL BCS L7C8B L7C76 LDA #$00 STA fgINPUT LDA #$03 STA fgDEMO LDA #$01 STA fgGOODSTART LDA intLEVEL ; do we start at level 1? BEQ L7C88 LSR fgGOODSTART ; no, we cannot change scores L7C88 JMP L6056 L7C8B JMP editNEXT *------------------------------- * C - CLEAR LEVEL *------------------------------- editCLEAR JSR printSTRING ASC 8D ASC ">>CLEAR LEVEL"00 JSR inputLEVEL BCS L7CB9 JSR checkDISK LDY #$00 TYA L7CAB STA levelDISK,Y INY BNE L7CAB LDA #$02 ; write JSR diskLEVEL JMP editLOOP L7CB9 JMP editNEXT *------------------------------- * E - EDIT LEVEL *------------------------------- editEDIT JSR printSTRING ASC 8D ASC ">>EDIT LEVEL"00 JSR inputLEVEL ; is level valid? BCS L7CD5 ; no JMP editEDITLEVEL ; yes, handle edit L7CD5 JMP editNEXT *------------------------------- * M - MOVE LEVEL *------------------------------- editMOVE JSR printSTRING ASC 8D ASC ">>MOVE LEVEL"00 JSR inputLEVEL BCS L7D5A STY L824F JSR printSTRING ASC " TO LEVEL"00 JSR inputLEVEL BCS L7D5A STY L8250 JSR printSTRING ASC 8D ASC " SOURCE DISKETTE"00 JSR editWAITKEY JSR checkDISK LDA L824F STA intLEVEL LDA #$01 ; read JSR diskLEVEL JSR printSTRING ASC 8D ASC " DESTINATION DISKETTE"00 JSR editWAITKEY JSR checkDISK LDA L8250 STA intLEVEL LDA #$02 ; write JSR diskLEVEL JMP editLOOP L7D5A JMP editNEXT *------------------------------- * I - INITIALIZE DISKETTE *------------------------------- editINIT JSR printSTRING ASC 8D ASC ">>INITIALIZE"8D ASC " THIS FORMATS THE DISKETTE"8D ASC " FOR USER CREATED LEVELS."8D ASC " (CAUTION. IT ERASES THE"8D ASC " ENTIRE DISKETTE FIRST)"8D8D ASC " ARE YOU SURE (Y/N) "00 JSR editWAITKEY CMP #chrY BNE L7E72 NOP ; NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP LDA intLEVEL PHA LDA #$04 ; Init command JSR diskLEVEL LDA #boot STA LB7F0+1 LDA #$00 STA LB7ED STA LB7EC LDA #$02 STA LB7F4 JSR diskRWTS LDA #$E0 STA intLEVEL LDA #$01 JSR diskLEVEL LDY #$37 L7E33 LDA L8251,Y STA levelDISK,Y DEY BPL L7E33 LDA #$02 JSR diskLEVEL LDA #$EF STA intLEVEL LDA #$01 JSR diskLEVEL LDY #$20 L7E4C LDA L8289,Y STA levelDISK+$B,Y DEY BPL L7E4C LDA #$02 JSR diskLEVEL LDA #$01 JSR readSCORE LDY #$0A L7E61 LDA L63A8,Y STA scorebuf+$F4,Y DEY BPL L7E61 LDA #$02 JSR readSCORE PLA STA intLEVEL L7E72 JMP editLOOP *------------------------------- * C - CLEAR SCORE FILE *------------------------------- editCLEARSCORE JSR printSTRING ASC 8D ASC ">>CLEAR SCORE FILE"8D ASC " THIS CLEARS THE HIGH"8D ASC " SCORE FILE OF ALL"8D ASC " ENTRIES."8D8D ASC " ARE YOU SURE (Y/N) "00 JSR editWAITKEY CMP #chrY BNE L7EFE LDA #$01 JSR readSCORE CMP #$00 BNE L7EEF JSR tellNODATADISK JMP editMAIN L7EEF LDY #$4F ; clear score file LDA #$00 L7EF3 STA scorebuf,Y DEY BPL L7EF3 LDA #$02 JSR readSCORE ; write score file L7EFE JMP editLOOP *------------------------------- * EDIT THE LEVEL *------------------------------- editEDITLEVEL JSR clearHGR2 ; clear HGR2 LDA #>HGR2 STA activePAGE JSR drawINFOBAR ; show frame LDA #>HGR1 STA activePAGE JSR checkDISK ; check diskette (master or data disk) LDX #$01 STX fgCHANGE DEX ; mode edit JSR prepareLEVEL BCC L7F1F JMP editNEXT L7F1F LDA #$00 ; cursor is at 0,0 STA theX STA theY L7F25 JSR blinkATXY ; wait for key CMP #"9"+1 BCS L7F54 ; no sprite CMP #"0" ; means check commands BCC L7F54 AND #$0F STA theA ; save key LDY theY ; get Y LDA tblBOARDALLL,Y ; get line address STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY theX ; get X LDA theA ; get sprite EOR (ptrBOARD),Y ; same as before? BEQ L7F4A ; yes LSR fgCHANGE ; no, tell there's a change L7F4A LDA theA ; get sprite STA (ptrBOARD),Y ; save it JSR coutHGR1 ; print sprite JMP L7F25 ; loop L7F54 STA theA ; same key LDY #$FF L7F58 INY LDA tblEDITKEYS,Y ; is that a command? BEQ L7F6E CMP theA ; same as our key? BNE L7F58 TYA ; yes, jump ASL TAY LDA tblEDITCODE+1,Y PHA LDA tblEDITCODE,Y PHA RTS L7F6E JSR doBEEP ; beep JMP L7F25 ; loop *------------------------------- * I - MOVE CURSOR UP *------------------------------- editUP LDA theY BEQ L7F6E DEC theY BPL L7F25 *------------------------------- * J - MOVE CURSOR LEFT *------------------------------- editLEFT LDA theX BEQ L7F6E DEC theX BPL L7F25 *------------------------------- * K - MOVE CURSOR RIGHT *------------------------------- editRIGHT LDA theX CMP #lvlWIDTH-1 BCS L7F6E INC theX BNE L7F25 *------------------------------- * M - MOVE CURSOR DOWN *------------------------------- editDOWN LDA theY CMP #lvlHEIGHT-1 BCS L7F6E INC theY BNE L7F25 *------------------------------- * SAVE THE LEVEL *------------------------------- saveLEVEL LDA theY ; save parms PHA LDA theX PHA LDA #$01 ; check disk JSR readSCORE CMP #$00 BNE L7FAD JSR tellNODATADISK JMP L7FC5 L7FAD CMP #$01 BNE L7FB7 JSR tellMASTERDISK JMP L7FC5 L7FB7 JSR encodeLEVEL ; prepare the level & save it PLA STA theX PLA STA theY LDA #$01 STA fgCHANGE RTS ; and return L7FC5 LDA #$00 STA theX STA theY JMP L7F25 *------------------------------- * CTRL-S - SAVE YOUR GAME *------------------------------- editSAVE JSR saveLEVEL JMP L7F25 *------------------------------- * CTRL-U - NEXT LEVEL *------------------------------- editLOAD LDA intLEVEL CMP #maxLEVEL-1 ; 150-1 L7FD8 BEQ L7F6E JSR editSAVECHANGES INC intLEVEL INC theLEVEL JMP editEDITLEVEL *------------------------------- * CTRL-H - PREVIOUS LEVEL *------------------------------- editPREVIOUS LDA intLEVEL BEQ L7FD8 JSR editSAVECHANGES DEC theLEVEL DEC intLEVEL JMP editEDITLEVEL *------------------------------- * CTRL-Q - QUIT GAME GENERATOR *------------------------------- editQUIT JSR editSAVECHANGES JMP editMAIN *------------------------------- * WANT TO SAVE CHANGES *------------------------------- editSAVECHANGES LDA fgCHANGE BNE L8075 JSR clearHGR2 LDA #>HGR2 STA activePAGE LDA #$00 STA theX STA theY JSR printSTRING ASC "LEVEL HAS BEEN CHANGED BUT"8D ASC "NOT SAVED. DO YOU WISH TO"8D ASC "SAVE MODIFIED LEVEL (Y/N) "00 JSR doBEEP STA TXTPAGE2 L8062 LDA #$00 JSR L85F3 STA KBDSTROBE CMP #chrN BEQ L8075 CMP #chrY BNE L8062 JSR saveLEVEL L8075 STA TXTPAGE1 LDA #$00 STA theX STA theY RTS *----------------------------------- * CHECK DISK *----------------------------------- checkDISK LDA #$01 ; load score JSR readSCORE CMP #$00 ; 00 means disk not identified BNE L808E JSR tellNODATADISK JMP editMAIN L808E CMP #$01 ; 01 means master disk BNE L8105 JSR tellMASTERDISK JMP editMAIN *----------------------------------- * MASTER DISK FOUND *----------------------------------- tellMASTERDISK JSR clearHGR2 LDA #>HGR2 STA activePAGE LDA #$00 STA theX STA theY JSR printSTRING ASC "USER NOT ALLOWED TO"8D ASC "MANIPULATE MASTER DISKETTE."00 *----------------------------------- * WAIT FOR A KEYPRESS *----------------------------------- L80D8 JSR printSTRING ASC 8D8D ASC "HIT A KEY TO CONTINUE "00 JSR doBEEP STA TXTPAGE2 LDA #$00 JSR L85F3 STA KBDSTROBE STA TXTPAGE1 L8105 RTS *----------------------------------- * LR DATA DISK NOT IDENTIFIED *----------------------------------- tellNODATADISK JSR clearHGR2 LDA #>HGR2 STA activePAGE LDA #$00 STA theX STA theY JSR printSTRING ASC "DISKETTE IN DRIVE IS NOT A"8D ASC "LODE RUNNER DATA DISK."00 JMP L80D8 *----------------------------------- * BLINK AT XY *----------------------------------- blinkATXY LDY theY LDA tblBOARDALLL,Y STA ptrBOARD LDA tblBOARDALLH,Y STA ptrBOARD+1 LDY theX LDA (ptrBOARD),Y JSR blinkSPRITE STA KBDSTROBE RTS tblEDITKEYS ASC "JIKM" HEX 9395889100 tblEDITCODE DA editLEFT-1 ; J move left DA editUP-1 ; I move up DA editRIGHT-1 ; K move right DA editDOWN-1 ; M move down DA editSAVE-1 ; CTRL-S to save your game DA editLOAD-1 ; CTRL-U to load next level DA editPREVIOUS-1 ; CTRL-H to load previous level DA editQUIT-1 ; CTRL-Q to quit game generator *------------------------------- * INPUT LEVEL NUMBER *------------------------------- inputLEVEL LDY intLEVEL INY TYA JSR hex2dec LDA theX STA L824E LDY #$00 L8189 LDA |$0089,Y STY L824D JSR outputCHAR LDY L824D INY CPY #$03 BCC L8189 LDA L824E STA theX LDY #$00 STY L824D L81A4 LDX L824D LDA theCENTAINE,X CLC ADC #spr0 ; spr0 JSR blinkSPRITE STA KBDSTROBE CMP #chrRET ; return BEQ L820D CMP #chrLA ; left arrow BNE L81C7 LDX L824D BEQ L8207 DEC L824D DEC theX JMP L81A4 L81C7 CMP #chrRA ; right arrow BNE L81DA LDX L824D CPX #$02 BEQ L8207 INC theX INC L824D JMP L81A4 L81DA CMP #chrESC ; esc BNE L81E1 JMP editLOOP L81E1 CMP #chrZERO ; 0 BCC L8207 CMP #chrNINE+1 ; 9+1 BCS L8207 SEC SBC #chrZERO LDY L824D STA |$0089,Y JSR outputCHAR INC L824D LDA L824D CMP #$03 BCC L81A4 DEC L824D DEC theX JMP L81A4 L8207 JSR doBEEP JMP L81A4 *------------------------------- * TRANSFORM A ASC NUMBER IN HEX *------------------------------- L820D LDA L824E CLC ADC #$03 STA theX LDA #$00 LDX theCENTAINE BEQ L8223 CLC L821C ADC #100 BCS L823C DEX BNE L821C L8223 LDX theDIZAINE BEQ L822F CLC L8228 ADC #10 BCS L823C DEX BNE L8228 L822F CLC ADC theUNITE BCS L823C STA theLEVEL TAY DEY STY intLEVEL ; and make it our level CPY #maxLEVEL L823C RTS editWAITKEY LDA #sprEMPTY JSR blinkSPRITE STA KBDSTROBE CMP #$9B ; escape BNE L824C JMP editLOOP L824C RTS L824D RTS L824E DB $85 L824F DB $0F L8250 DB $60 L8251 HEX 02110F040000FE000000000000000000 HEX 00000000000000000000000000000000 HEX 000000000000007A0000000000000000 HEX FFFF0000230F0001 L8289 HEX 220F8888888888888888CCCFC4C5A0D2 HEX D5CECEC5D2A0C4C1D4C1A0C4C9D3CBA0 HEX A0 *--------------------------------------- * PRINT CHAR *--------------------------------------- coutHGR1 STA theA ; char in $1E LDA #>HGR1 ; print HGR1 BNE L82B4 coutHGR2 STA theA ; char in $1E LDA #>HGR2 ; print HGR2 L82B4 STA hgrPAGE ; page in $1F LDY theY ; take Y JSR getXY STY theYSCREEN ; make it Y screen LDX theX ; take X JSR getBYBI STA theXSCREEN ; make it X screen STX sprTABLE LDA tblMASK1,X STA theMASK1 LDA tblMASK2,X STA theMASK2 JSR getSPRITEDATA LDA #sprHEIGHT STA nbLINES LDX #$00 LDA sprTABLE ; derniere table de sprite? CMP #$05 BCS L8301 *--- sprite de 2 de large L82DF LDY theYSCREEN JSR setHGRPOINTER LDY theXSCREEN LDA (ptrHGR1),Y ; 1 AND theMASK1 ORA sprDATA,X STA (ptrHGR1),Y INX INY LDA (ptrHGR1),Y ; 2 AND theMASK2 ORA sprDATA,X STA (ptrHGR1),Y INX INX INC theYSCREEN DEC nbLINES BNE L82DF RTS *--- sprite de 3 de large L8301 LDY theYSCREEN JSR setHGRPOINTER LDY theXSCREEN LDA (ptrHGR1),Y ; 1 AND theMASK1 ORA sprDATA,X STA (ptrHGR1),Y INX INY LDA sprDATA,X ; 2 STA (ptrHGR1),Y INX INY LDA (ptrHGR1),Y ; 3 AND theMASK2 ORA sprDATA,X STA (ptrHGR1),Y INX INC theYSCREEN DEC nbLINES BNE L8301 RTS tblMASK1 HEX 000103070F1F3F ; mask1 tblMASK2 HEX F8F0E0C080FEFC ; mask2 *--------------------------------------- * DRAW SPRITE AT X,Y *--------------------------------------- * draw a sprite at real HGR X,Y (eg. 175,111) drawSPRITEXY STY theYSCREEN STA theA JSR getXBYBI STA theXSCREEN STX sprTABLE JSR getSPRITEDATA LDX #sprHEIGHT ; nb lignes STX nbLINES LDX #$00 LDA sprTABLE CMP #$05 BCS L8376 *--- sprite de 2 de large L8350 LDY theYSCREEN JSR setHGRPOINTERS LDY theXSCREEN LDA sprDATA,X EOR #$7F AND (ptrHGR1),Y ORA (ptrHGR2),Y STA (ptrHGR1),Y INX INY LDA sprDATA,X EOR #$7F AND (ptrHGR1),Y ORA (ptrHGR2),Y STA (ptrHGR1),Y INX INX INC theYSCREEN DEC nbLINES BNE L8350 RTS *--- sprite de 3 de large L8376 LDY theYSCREEN JSR setHGRPOINTERS LDY theXSCREEN LDA sprDATA,X EOR #$7F AND (ptrHGR1),Y ORA (ptrHGR2),Y STA (ptrHGR1),Y INX INY LDA sprDATA,X EOR #$7F AND (ptrHGR1),Y ORA (ptrHGR2),Y STA (ptrHGR1),Y INX INY LDA sprDATA,X EOR #$7F AND (ptrHGR1),Y ORA (ptrHGR2),Y STA (ptrHGR1),Y INX INC theYSCREEN DEC nbLINES BNE L8376 RTS *--------------------------------------- * DRAW SPRITE AT X,Y WITH COLLISION *--------------------------------------- * $52: 00 if no collision (empty background) * <>00 if collision drawSPRXYCOLLISION STY theYSCREEN STA theA JSR getXBYBI STA theXSCREEN STX sprTABLE JSR getSPRITEDATA LDA #sprHEIGHT STA nbLINES LDX #$00 STX fgCOLLISION LDA sprTABLE CMP #$05 BCS L83F5 *--- sprite de 2 de large L83C3 LDY theYSCREEN JSR setHGRPOINTERS LDY theXSCREEN LDA (ptrHGR1),Y EOR (ptrHGR2),Y AND sprDATA,X ORA fgCOLLISION STA fgCOLLISION LDA sprDATA,X ORA (ptrHGR1),Y STA (ptrHGR1),Y INX INY LDA (ptrHGR1),Y EOR (ptrHGR2),Y AND sprDATA,X ORA fgCOLLISION STA fgCOLLISION LDA sprDATA,X ORA (ptrHGR1),Y STA (ptrHGR1),Y INX INX INC theYSCREEN DEC nbLINES BNE L83C3 RTS *--- sprite de 3 de large L83F5 LDY theYSCREEN JSR setHGRPOINTERS LDY theXSCREEN LDA (ptrHGR1),Y EOR (ptrHGR2),Y AND sprDATA,X ORA fgCOLLISION STA fgCOLLISION LDA sprDATA,X ORA (ptrHGR1),Y STA (ptrHGR1),Y INX INY LDA (ptrHGR1),Y EOR (ptrHGR2),Y AND sprDATA,X ORA fgCOLLISION STA fgCOLLISION LDA sprDATA,X ORA (ptrHGR1),Y STA (ptrHGR1),Y INX INY LDA (ptrHGR1),Y EOR (ptrHGR2),Y AND sprDATA,X ORA fgCOLLISION STA fgCOLLISION LDA sprDATA,X ORA (ptrHGR1),Y STA (ptrHGR1),Y INX INC theYSCREEN DEC nbLINES BNE L83F5 RTS *--------------------------------------- * GET SPRITE DATA *--------------------------------------- * Move sprite data at $df..$ff getSPRITEDATA LDA #sprHEIGHT ; char height STA nbLINES LDA #tblOFFSPR STA ptrDATA+1 LDA tblPTRSPR,X ; one of the six tables STA L845A+2 STA L8466+2 STA L848B+2 STA L8497+2 LDX #$00 L8455 LDY theA LDA (ptrDATA),Y TAY L845A LDA LA000,Y ; a STA L846F+1 CLC ADC #$01 STA L8474+1 L8466 LDA LA080,Y ; a+1 STA L846F+2 STA L8474+2 L846F LDA LA000 ; b STA sprDATA,X L8474 LDA LA000 ; b+1 STA $E0,X LDA ptrDATA ; next line CLC ADC #$68 STA ptrDATA LDA ptrDATA+1 ADC #$00 STA ptrDATA+1 LDY theA LDA (ptrDATA),Y TAY L848B LDA LA000,Y ; c STA L84A0+1 CLC ADC #$01 STA L84A7+1 L8497 LDA LA080,Y ; c+1 STA L84A0+2 STA L84A7+2 L84A0 LDA LA000 ; d ORA $E0,X STA $E0,X L84A7 LDA LA000 ; d+1 STA $E1,X LDA ptrDATA ; next data CLC ADC #$68 ; b/c we have 68 sprites STA ptrDATA LDA ptrDATA+1 ADC #$00 STA ptrDATA+1 INX INX INX DEC nbLINES BNE L8455 RTS tblPTRSPR DB >LA200 ; The six tables of sprites DB >LA300 DB >LA400 DB >LA500 DB >LA600 DB >LA700 DB >LA800 *--------------------------------------- * CHECK HIGH SCORE *--------------------------------------- checkHIGHSCORE LDA fgGOODSTART BEQ L8514 LDA theSCORE ORA theSCORE+1 ORA theSCORE+2 ORA theSCORE+3 BEQ L8514 LDA #$01 JSR readSCORE BEQ L8514 LDY #$01 ; 1re entre L84DF LDX scoreoffset,Y LDA theLEVEL CMP scorebuf+$03,X BCC L850F BNE L8515 LDA theSCORE+3 CMP scorebuf+$04,X BCC L850F BNE L8515 LDA theSCORE+2 CMP scorebuf+$05,X BCC L850F BNE L8515 LDA theSCORE+1 CMP scorebuf+$06,X BCC L850F BNE L8515 LDA theSCORE CMP scorebuf+$07,X BCC L850F BNE L8515 L850F INY CPY #$0B ; dernire entre BCC L84DF L8514 RTS L8515 CPY #$0A ; dcale les scores vers le bas BEQ L8536 STY tempY1 LDY #$09 L851D LDX scoreoffset,Y LDA #$08 STA nbLINES L8524 LDA scorebuf,X STA scorebuf+$08,X INX DEC nbLINES BNE L8524 CPY tempY1 BEQ L8536 DEY BNE L851D L8536 LDX scoreoffset,Y ; permet la saisie des initiales LDA #chrSPC STA scorebuf,X STA scorebuf+$01,X STA scorebuf+$02,X LDA theLEVEL STA scorebuf+$03,X LDA theSCORE+3 STA scorebuf+$04,X LDA theSCORE+2 STA scorebuf+$05,X LDA theSCORE+1 STA scorebuf+$06,X LDA theSCORE STA scorebuf+$07,X STY $69 LDA scoreoffset,Y STA L8582+1 STA L85C9+1 JSR showALLSCORES LDA #>HGR2 STA activePAGE LDA $69 CLC ADC #$04 STA theY LDA #$07 STA theX LDX #$00 STX L824D L857F LDX L824D L8582 LDA scorebuf,X JSR filterCHAR JSR L85F3 STA KBDSTROBE CMP #chrRET BEQ L85E7 CMP #chrLA BNE L85A3 LDX L824D BEQ L85E1 DEC L824D DEC theX JMP L857F L85A3 CMP #chrRA BNE L85B6 LDX L824D CPX #$02 BEQ L85E1 INC theX INC L824D JMP L857F L85B6 CMP #chrDOT BEQ L85C6 CMP #chrSPC BEQ L85C6 CMP #chrA BCC L85E1 CMP #chrZ+1 BCS L85E1 L85C6 LDY L824D L85C9 STA scorebuf,Y JSR printCHAR INC L824D LDA L824D CMP #$03 ; max nb chars BCC L857F DEC L824D DEC theX JMP L857F L85E1 JSR doBEEP JMP L857F L85E7 LDA #>HGR1 STA activePAGE LDA #$02 JSR readSCORE JMP L618E L85F3 STA bsDATA L85F6 LDA #$68 STA counter LDA bsDATA BNE L8601 LDA #sprCURSOR L8601 JSR coutHGR2 L8604 LDA KBD BMI L8628 JSR checkMOVEMENT DEC counter BNE L8604 LDA #sprEMPTY JSR coutHGR2 LDA #$68 STA counter L8619 LDA KBD BMI L8628 JSR checkMOVEMENT DEC counter BNE L8619 JMP L85F6 L8628 PHA LDA bsDATA JSR coutHGR2 PLA RTS *----------------------------------- * SHOW INVISIBLE LADDERS *----------------------------------- showINVISIBLELADDERS LDA #$00 STA tblLADDERIX LDX idxLADDERI STX L869E L863B LDX L869E BEQ L8696 LDA tblLADDERIX,X BMI L8690 STA theX LDA tblLADDERIY,X STA theY TAY LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 LDY theX LDA (ptrBBACK),Y BNE L868B LDA #sprLADDER STA (ptrBBACK),Y LDA (ptrBOARD),Y BNE L8670 LDA #sprLADDER STA (ptrBOARD),Y L8670 LDA #sprLADDER JSR coutHGR2 LDX theX LDY theY JSR getXY LDA #sprLADDER JSR drawSPRXYCOLLISION LDX L869E LDA #$FF STA tblLADDERIX,X BMI L8690 L868B LDA #$01 STA tblLADDERIX L8690 DEC L869E JMP L863B L8696 LDA tblLADDERIX BNE L869D DEC nbCHEST L869D RTS L869E DB $00 *----------------------------------- * WAIT KEY UP *----------------------------------- waitKEYUP STA KBDSTROBE LDA KBD BMI waitKEYUP RTS *----------------------------------- * WAIT KEY DOWN *----------------------------------- waitKEYDOWN LDA KBD BPL waitKEYDOWN STA KBDSTROBE RTS *----------------------------------- * WAIT *----------------------------------- doWAIT LDA L86BE,X TAX doWAIT1 LDY #$B4 ]lp DEY BNE ]lp DEX BNE doWAIT1 RTS L86BE HEX 020406080A0C0E10121416181A1C1E20 *----------------------------------- * The CTRL-G of Lode Runner *----------------------------------- doBEEP LDY #$C0 L86D0 LDX #$80 L86D2 DEX BNE L86D2 LDA fgSOUND BEQ L86DC LDA SPKR L86DC DEY BNE L86D0 RTS *----------------------------------- * PRINT STRING *----------------------------------- printSTRING PLA STA ptrSTRSND PLA STA ptrSTRSND+1 BNE L86F1 L86E8 LDY #$00 LDA (ptrSTRSND),Y BEQ L86F9 JSR printCHAR L86F1 INC ptrSTRSND BNE L86E8 INC ptrSTRSND+1 BNE L86E8 L86F9 LDA ptrSTRSND+1 PHA LDA ptrSTRSND PHA RTS *----------------------------------- * BLINK SPRITE *----------------------------------- * sprite is in A blinkSPRITE STA bsDATA L8703 LDA #$68 STA counter LDA #sprEMPTY LDX bsDATA BNE L8710 LDA #sprCURSOR ; cursor sprite L8710 JSR coutHGR1 ; output empty L8713 LDA KBD ; key pressed? BMI L873C ; yes JSR checkMOVEMENT ; buttons pressed? BCS L873C ; yes DEC counter BNE L8713 LDA bsDATA ; output sprite JSR coutHGR1 LDA #$68 ; redo the wait STA counter L872B LDA KBD BMI L873C JSR checkMOVEMENT BCS L873C DEC counter BNE L872B JMP L8703 L873C PHA ; exit with LDA bsDATA ; sprite JSR coutHGR1 PLA RTS bsDATA DB ptrBOARD *----------------------------------- * READ JOYSTICK *----------------------------------- readJOYSTICK LDA #$00 STA theJOYX STA theJOYY LDA PTRIG L874F LDX #$01 L8751 LDA PADDL0,X BPL L8769 INC theJOYX,X L8758 DEX BPL L8751 LDA PADDL0 ORA PADDL1 BPL L876C LDA theJOYX ORA theJOYY BPL L874F L8769 NOP BPL L8758 L876C RTS *----------------------------------- * CHECK MOVEMENT *----------------------------------- checkMOVEMENT LDA fgINPUT CMP #chrK BEQ L8798 JSR readJOYSTICK LDA theJOYX CMP #minJOY BCC L8796 CMP #maxJOY BCS L8796 LDA theJOYY CMP #minJOY BCC L8796 CMP #maxJOY BCS L8796 LDA BUTN1 BMI L8796 LDA BUTN0 BMI L8796 CLC RTS L8796 SEC RTS L8798 LDX #$02 ; wait routine L879A DEY ; to compensate BNE L879A ; the skipped code above DEX BNE L879A CLC RTS *----------------------------------- * CHECK JOYSTICK *----------------------------------- checkJOYSTICK LDA PTRIG LDX #$10 L87A7 LDA PADDL0 ORA PADDL1 BPL L87B9 DEY BNE L87A7 DEX BNE L87A7 LDA #chrK STA fgINPUT L87B9 RTS *----------------------------------- * PLAY A SOUND *----------------------------------- playSOUND STA ptrDATA STX $0B L87BE LDA fgSOUND BEQ L87C5 LDA SPKR L87C5 DEY BNE L87CC DEC $0B BEQ L87D4 L87CC DEX BNE L87C5 LDX ptrDATA JMP L87BE L87D4 RTS *----------------------------------- * GET NOTE *----------------------------------- getNOTE INC idxNOTE LDY idxNOTE STA sndNOTE,Y TXA STA sndDURATION,Y RTS *----------------------------------- * PREPARE SOUND *----------------------------------- prepareMELODY PLA STA ptrSTRSND PLA STA ptrSTRSND+1 BNE L8802 L87E9 LDY #$00 ; move sound LDA (ptrSTRSND),Y ; to the two BEQ L880A ; buffers INC idxNOTE LDX idxNOTE STA sndDURATION,X INY LDA (ptrSTRSND),Y STA sndNOTE,X INC ptrSTRSND BNE L8802 INC ptrSTRSND+1 L8802 INC ptrSTRSND BNE L87E9 INC ptrSTRSND+1 BNE L87E9 L880A LDA ptrSTRSND+1 PHA LDA ptrSTRSND PHA RTS *----------------------------------- * PLAY MELODY *----------------------------------- playMELODY LDY idxNOTE BEQ L8832 LDA sndNOTE,Y LDX sndDURATION,Y JSR playSOUND ; play note LDY idxNOTE DEC idxNOTE LDA theSPEED SEC SBC sndDURATION,Y BEQ L8830 BCC L8830 TAX JSR doWAIT1 ; wait L8830 SEC RTS L8832 LDA fgHEROFELL ; is the hero in a hole? BNE L8844 ; yes LDA fgSPEED LSR INC fgSPEED LDX theSPEED INX INX JSR playSOUND CLC RTS L8844 LDX theSPEED ; wait.... JSR doWAIT CLC RTS *------------------------------- * SET BOARD LINE POINTERS *------------------------------- setBOARDLINEPOINTERS LDA tblBOARDALLL,Y STA ptrBOARD STA ptrBBACK LDA tblBOARDALLH,Y STA ptrBOARD+1 LDA tblBOARDBACKH,Y STA ptrBBACK+1 RTS *------------------------------- * FROM A Y IN TEXT TO A Y IN HGR *------------------------------- getXY LDA ytable,Y ; in: board X/Y PHA ; out: hgr X/Y LDA xtable,X TAX PLA TAY RTS getBYBI LDA bytable,X PHA LDA bitable,X TAX PLA RTS getXBYBI LDA xbytable,X PHA LDA xbitable,X TAX PLA RTS *------------------------------- * CALCULATE HGR Y-COORD *------------------------------- * on entry: * X is a sprite step * Y is a board index * on exit: * X is garbage * Y is the HGR coordinate calcHGRY TXA ; in: board X/Y PHA ; out: hgr X / diff Y JSR getXY PLA TAX TYA CLC ADC tblDELTAY,X TAY RTS tblDELTAY HEX FBFD000204 ; -5, -3, 0, 2, 4 *------------------------------- * CALCULATE HGR X-COORD *------------------------------- * on entry: * X is a board index * Y is a sprite step * on exit: * X is the HGR coordinate * Y is garbage calcHGRX TYA PHA JSR getXY PLA TAY TXA ; X in HGR + Y step CLC ADC tblDELTAX,Y TAX RTS tblDELTAX HEX FEFF000102 ; -2, -1, 0, 1, 2 *------------------------------- * CIRCLE ANIMATION *------------------------------- circleANIMATION LDA #$58 ; 88 STA $73 LDA #$8C ; 140 STA $74 LDA fgCIRCLE ; inner or outer animation? BEQ L88BD ; show the level *--- hide the level LDX #$AA ; 170 STX $6D LDX #$00 ; 0 STX $72 L88B6 JSR L88D7 DEC $6D BNE L88B6 *--- show the level L88BD LDA #$01 ; 1 STA $6D STA fgCIRCLE STA $72 ; 1 JSR printMEN JSR printLEVEL L88CB JSR L88D7 INC $6D LDA $6D CMP #$AA ; 170 BNE L88CB RTS L88D7 LDA $6D STA $69 LDA #$00 STA $6A STA $67 STA $68 LDA $69 ASL STA $6B LDA $6A ROL STA $6C LDA #$03 SEC SBC $6B STA $6B LDA #$00 SBC $6C STA $6C LDA $73 SEC SBC $6D STA $75 LDA #$00 SBC #$00 STA $79 LDA $73 STA $76 STA $77 LDA #$00 STA $7A STA $7B LDA $73 CLC ADC $6D STA $78 LDA #$00 ADC #$00 STA $7C LDA $74 SEC SBC $6D TAX LDA #$00 SBC #$00 JSR L8A45 STY $7D STA $81 LDX $74 LDA #$00 JSR L8A45 STY $7E STY $7F STA $82 STA $83 LDA $74 CLC ADC $6D TAX LDA #$00 ADC #$00 JSR L8A45 STY $80 STA $84 L8951 LDA $68 CMP $6A BCC L896F BEQ L8969 L8959 LDA $67 CMP $69 BNE L8968 LDA $68 CMP $6A BNE L8968 JMP L8A69 L8968 RTS L8969 LDA $67 CMP $69 BCS L8959 L896F JSR L8A69 LDA $6C BPL L89A7 LDA $67 ASL STA $6F LDA $68 ROL STA $70 LDA $6F ASL STA $6F LDA $70 ROL STA $70 LDA $6B CLC ADC $6F STA $6F LDA $6C ADC $70 STA $70 LDA #$06 CLC ADC $6F STA $6B LDA #$00 ADC $70 STA $6C JMP L8A14 L89A7 LDA $67 SEC SBC $69 STA $6F LDA $68 SBC $6A STA $70 LDA $6F ASL STA $6F LDA $70 ROL STA $70 LDA $6F ASL STA $6F LDA $70 ROL STA $70 LDA $6F CLC ADC #$10 STA $6F LDA $70 ADC #$00 STA $70 LDA $6F CLC ADC $6B STA $6B LDA $70 ADC $6C STA $6C LDA $69 PHP DEC $69 PLP BNE L89EC DEC $6A L89EC INC $75 BNE L89F2 INC $79 L89F2 DEC $84 BPL L89FC LDA #$06 STA $84 DEC $80 L89FC INC $81 LDA $81 CMP #$07 BNE L8A0A LDA #$00 STA $81 INC $7D L8A0A DEC $78 LDA $78 CMP #$FF BNE L8A14 DEC $7C L8A14 INC $67 BNE L8A1A INC $68 L8A1A INC $83 LDA $83 CMP #$07 BNE L8A28 LDA #$00 STA $83 INC $7F L8A28 DEC $76 LDA $76 CMP #$FF BNE L8A32 DEC $7A L8A32 INC $77 BNE L8A38 INC $7B L8A38 DEC $82 BPL L8A42 LDA #$06 STA $82 DEC $7E L8A42 JMP L8951 L8A45 STX $6F LDY #$08 SEC SBC #$07 L8A4C PHP ROL $70 ASL $6F ROL PLP BCC L8A5A SBC #$07 JMP L8A5C L8A5A ADC #$07 L8A5C DEY BNE L8A4C BCS L8A64 ADC #$07 CLC L8A64 ROL $70 LDY $70 RTS L8A69 LDY $7C BNE L8A8C LDY $78 CPY #$B0 BCS L8A8C JSR setHGRPOINTERS LDY $7F CPY #$28 BCS L8A81 LDX $83 JSR L8AF6 L8A81 LDY $7E CPY #$28 BCS L8A8C LDX $82 JSR L8AF6 L8A8C LDY $79 BNE L8AAF LDY $75 CPY #$B0 BCS L8AAF JSR setHGRPOINTERS LDY $7F CPY #$28 BCS L8AA4 LDX $83 JSR L8AF6 L8AA4 LDY $7E CPY #$28 BCS L8AAF LDX $82 JSR L8AF6 L8AAF LDY $7B BNE L8AD2 LDY $77 CPY #$B0 BCS L8AD2 JSR setHGRPOINTERS LDY $80 CPY #$28 BCS L8AC7 LDX $84 JSR L8AF6 L8AC7 LDY $7D CPY #$28 BCS L8AD2 LDX $81 JSR L8AF6 L8AD2 LDY $7A BNE L8AF5 LDY $76 CPY #$B0 BCS L8AF5 JSR setHGRPOINTERS LDY $80 CPY #$28 BCS L8AEA LDX $84 JSR L8AF6 L8AEA LDY $7D CPY #$28 BCS L8AF5 LDX $81 JMP L8AF6 L8AF5 RTS L8AF6 LDA $72 BNE L8B02 LDA (ptrHGR1),Y AND L8B0C,X STA (ptrHGR1),Y RTS L8B02 LDA (ptrHGR2),Y AND L8B13,X ORA (ptrHGR1),Y STA (ptrHGR1),Y RTS L8B0C HEX F0F0F0F08F8F8F L8B13 HEX 8F8F8F8FF0F0F0 *------------------------------- * SHOW GAME OVER *------------------------------- animGAMEOVER LDA #$01 STA L8D4B LDA #>HGR1 STA hgrPAGE L8B23 JSR L8BCF JSR L8BBE JSR L8BAD JSR L8B9C JSR L8B8B JSR L8B7A JSR L8B8B JSR L8B9C JSR L8BAD JSR L8BBE JSR L8BCF JSR L8C24 JSR L8C13 JSR L8C02 JSR L8BF1 JSR L8BE0 JSR L8BF1 JSR L8C02 JSR L8C13 JSR L8C24 LDA L8D4B CMP #$64 BCC L8B23 JSR L8BCF JSR L8BBE JSR L8BAD JSR L8B9C JSR L8B8B JSR L8B7A CLC RTS L8B7A JSR drawGOLINE HEX 000102030405060708090A020100 L8B8B JSR drawGOLINE HEX 0000010203040507090A02010000 L8B9C JSR drawGOLINE HEX 00000001020304090A0201000000 L8BAD JSR drawGOLINE HEX 000000000102030A020100000000 L8BBE JSR drawGOLINE HEX 000000000001030A010000000000 L8BCF JSR drawGOLINE HEX 0000000000000101000000000000 L8BE0 JSR drawGOLINE HEX 0001020A09080706050403020100 L8BF1 JSR drawGOLINE HEX 000001020A090705040302010000 L8C02 JSR drawGOLINE HEX 00000001020A0904030201000000 L8C13 JSR drawGOLINE HEX 0000000001020A03020100000000 L8C24 JSR drawGOLINE HEX 0000000000010A03010000000000 L8C35 HEX 8080808080808080808080808080 L8C43 HEX C0AAD5AAD5AAD5AAD5AAD5AAD580 L8C51 HEX 9080808080808080808080808082 L8C5F HEX 90AAD1A2D5A885A8C5A2D4A29582 L8C6D HEX 908291A2C5A88088C5A294A09082 L8C7B HEX 908290A2C4A88088C5A294A09082 L8C89 HEX 908290A2C4A88188C4A2D4A09582 L8C97 HEX 90A2D1A2C4888088C4A284A08582 L8CA5 HEX 908291A2C4888088C4AA84A08582 L8CB3 HEX 908291A2C4888088C48A84A09182 L8CC1 HEX 90AA91A2C4A885A88582D4A29182 L8CCF DA L8C35-$D DA L8C43-$D DA L8C51-$D DA L8C5F-$D DA L8C6D-$D DA L8C7B-$D DA L8C89-$D DA L8C97-$D DA L8CA5-$D DA L8CB3-$D DA L8CC1-$D drawGOLINE PLA ; pour afficher game over STA ptrDATA PLA STA ptrDATA+1 LDY #$50 STY theY BNE L8D12 L8CF1 JSR setHGRPOINTER LDY #$00 LDA (ptrDATA),Y ASL TAX LDA L8CCF,X STA L8D08+1 LDA L8CCF+1,X STA L8D08+2 LDY #$0D L8D08 LDA L8D08,Y STA (ptrHGR1),Y INY CPY #lvlWIDTH-1 BCC L8D08 L8D12 JSR L8D4C INC theY LDY theY CPY #$5F BCC L8CF1 LDX L8D4B LDY #$FF L8D22 DEY BNE L8D22 DEX BNE L8D22 INC L8D4B LDA fgINPUT CMP #chrK BEQ L8D3B LDA BUTN1 BMI L8D41 LDA BUTN0 BMI L8D41 L8D3B LDA KBD BMI L8D41 RTS L8D41 PLA PLA SEC LDA KBD STA KBDSTROBE RTS L8D4B DB $9D L8D4C INC ptrDATA BNE L8D52 INC ptrDATA+1 L8D52 RTS ds \ *------------------------------- * NOT USED? *------------------------------- L8E00 LDA #$44 ; MASTER DISKETTE STA $0478 LDA #$00 JSR LB9A0 NOP NOP NOP NOP NOP NOP LDA #$20 STA $4F L8E14 DEY BNE L8E20 DEC $4F BNE L8E20 JMP LBEAF NOP NOP L8E20 LDA $C08C,X BPL L8E20 L8E25 CMP #$D4 BNE L8E14 NOP L8E2A LDA $C08C,X BPL L8E2A L8E2F CMP #$D5 BNE L8E25 NOP L8E34 LDA $C08C,X BPL L8E34 CMP #$D6 BNE L8E2F LDA $C088,X JSR tellMASTERDISK JMP editMAIN DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 DB $00 JMP LB7B5 ds \ *--------------------------------------- put LR.Tables put LR.RWTS