antoine-source/loderunner/source/LR.CODE.S

6164 lines
90 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

*
* 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 trŽsor
* 8 ennemi
* 9 hŽros
* 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 dŽmarrer
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+1
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-<2D>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 ; vŽrifie 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 ; buffer
STA LB7F0
LDA #>levelDISK
STA LB7F0+1
LDA #$00
STA LB7EB
diskRWTS LDY #<LB7E8
LDA #>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 #<L9E00
STY ptrHGR1
L6350 LDA (ptrHGR1),Y
STA levelDISK,Y
INY
BNE L6350
RTS
*-------------------------------
* CALL RWTS
*-------------------------------
readSCORE STA LB7F4 ; command
LDA #$0C
STA LB7EC ; track
LDA #$0F
STA LB7ED ; sector
LDA #<scorebuf ; where to load
STA LB7F0
LDA #>scorebuf
STA LB7F0+1
LDA #$00
STA LB7EB
LDY #<LB7E8 ; IOB table
LDA #>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 entrŽs 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 n¡0
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 " <ESC> 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 ; Save T0/S0
STA LB7F0
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 ; pointer to index of sprite in each table
STA ptrDATA
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 ; 1<>re entrŽe
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 ; derni<6E>re entrŽe
BCC L84DF
L8514 RTS
L8515 CPY #$0A ; dŽcale 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