This commit is contained in:
Antoine Vignau 2024-02-20 21:37:01 +01:00
parent 3edc17e527
commit 9170c2cbdd
16 changed files with 65553 additions and 217 deletions

Binary file not shown.

View File

@ -0,0 +1,16 @@
*
* Lode Runner
* (c) 1983, Broderbund Software
* (s) 2014, Brutal Deluxe Software
*
*-----------------------------------
*
*-----------------------------------
ptrUNPACK ent
ds 32768
ptrBACKGND ent
ds 32768

View File

@ -0,0 +1,16 @@
*
* Lode Runner
* (c) 1983, Broderbund Software
* (s) 2014, Brutal Deluxe Software
*
*-----------------------------------
*
*-----------------------------------
ptrIMAGE ent
ds 32768
ptrTITLE ent
ds 32768

View File

@ -0,0 +1,12 @@
*
* Lode Runner
* (c) 1983, Broderbund Software
* (s) 2014, Brutal Deluxe Software
*
*-----------------------------------
*
*-----------------------------------
ptrLEVELS ent
ds 65536

View File

@ -400,36 +400,59 @@ L62F7 INC fgODDEVEN
* LOAD/SAVE LEVEL FROM/TO DISK
*-----------------------------------
diskLEVEL STA LB7F4
diskLEVEL tax
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
cpx #1
beq dlLOAD
cpx #2
bne dlERR
LDA #<levelDISK ; buffer
STA LB7F0
LDA #>levelDISK
STA LB7F0+1
LDA #$00
STA LB7EB
jmp saveLEVELS ; save all levels
diskRWTS LDY #<LB7E8
LDA #>LB7E8
jsr callRWTS ; LoGo - JSR $0023 - Souvenir from protection
BCC L6344
JMP showTITLEPAGE
L6344 RTS
dlLOAD rep #$30 ; load a level
pea ^ptrLEVELS
lda intLEVEL
and #$ff
xba
pha
PushLong #levelDISK
PushLong #256
_BlockMove
sep #$30
rts
dlERR jmp showTITLEPAGE
* STA LB7F4
* 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
@ -444,33 +467,38 @@ L6350 LDA (ptrHGR1),Y
RTS
*-------------------------------
* CALL RWTS
* READ/WRITE SCORE FILE
*-------------------------------
readSCORE STA LB7F4 ; command
LDA #$0C
STA LB7EC ; track
LDA #$0F
STA LB7ED ; sector
ldx #0 ; **logo**
]lp lda scoreREF,x
sta scorebuf,x
inx
bne ]lp
beq L6381
readSCORE cmp #1 ; load scores file from disk
beq rsLOAD
cmp #2 ; save scores file to disk
bne rsERR
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
jsr saveSCORES
bra L6381
rsLOAD jsr loadSCORES
bra L6381
* 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
rsERR JMP showTITLEPAGE
*--- Check disk (not a LR disk, data disk, master disk)
@ -485,18 +513,20 @@ L6387 LDA scorebuf+$F4,Y ; magic key
BPL L6387
LDA theMASK1
BEQ L639B
LDA #$00 ; 0 means not a LR disk
LDA #$00 ; 00 means not a LR disk
RTS
L639B LDA #$01 ; master disk
L639B LDA #$01 ; 01 master disk
LDX scorebuf+$FF
BNE L63A4
LDA #$FF ; FF means master disk
LDA #$FF ; FF means data disk
L63A4 RTS
callRWTS clc
rts
JMP $bd00 ; LoGo - ($0036) to be replaced with JMP $BD00
*-----------------------------------
*callRWTS JMP $bd00 ; LoGo - ($0036) to be replaced with JMP $BD00
LB7F4 ds 1 ; The RWTS command
L63A8 ASC "LODE RUNNER"
@ -3990,9 +4020,7 @@ L7CD5 JMP editNEXT
* M - MOVE LEVEL
*-------------------------------
editMOVE jmp editLOOP ; **logo**
JSR printSTRING
editMOVE JSR printSTRING
ASC 8D
ASC ">>MOVE LEVEL"00
JSR inputLEVEL
@ -4003,108 +4031,137 @@ editMOVE jmp editLOOP ; **logo**
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
* 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
jsr iigsMOVELEVEL
JMP editLOOP
L7D5A JMP editNEXT
*-------------------------------
* I - INITIALIZE DISKETTE
mx %00
iigsMOVELEVEL
rep #$30
pea ^ptrLEVELS ; set source level
lda L824F
and #$ff
xba
pha
pea ^ptrLEVELS ; set destination level
lda L8250
and #$ff
xba
pha
PushLong #256 ; set length
_BlockMove
jmp saveLEVELS ; save levels and return 8-bit
mx %11
*-------------------------------
* I - INITIALIZE DISKETTE => CLEAR LEVELS
*-------------------------------
editINIT jmp editLOOP ; **logo**
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
editINIT jmp editLOOP
* 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
@ -4551,8 +4608,8 @@ L824C RTS
L824D RTS
L824E DB $85
L824F DB $0F
L8250 DB $60
L824F DB $0F ; level from
L8250 DB $60 ; level to
L8251 HEX 02110F040000FE000000000000000000
HEX 00000000000000000000000000000000
@ -5438,16 +5495,16 @@ getXY LDA ytable,Y ; in: board X/Y
TAY
RTS
getBYBI LDA bytable,X
PHA
LDA bitable,X
getBYBI LDA bytable,X ; in: board X
PHA ; out: A: HGR column (0..39)
LDA bitable,X ; X: sprite table (0..6)
TAX
PLA
RTS
getXBYBI LDA xbytable,X
PHA
LDA xbitable,X
getXBYBI LDA xbytable,X ; in: X: HGR x-coord
PHA ; out: A: HGR column (0..39)
LDA xbitable,X ; X: sprite table (0..6)
TAX
PLA
RTS

View File

@ -729,23 +729,24 @@ xbitable DB $00 ; 0..4: sprite is 2-col wide
DB $05
*--- Boot 1 of data disks (T0/S0)
*
*boot HEX 012058FC2093FE2089FEA000B93408F0
* HEX 0E20F0FDC98DD004A9098524C8D0EDA6
* HEX 2B9D88C08A4A4A4A4A09C08D3308200C
* HEX FD4C00C68D8D8D8D8D8D8DCCCFC4C5A0
* HEX D2D5CECEC5D2A0C4C1D4C1A0C4C9D3CB
* HEX BA8DADADADADADADADADADADADADADAD
* HEX ADADADADADADADAD8D8DC4C9D3CBC5D4
* HEX D4C5A0D7C9CCCCA0CECFD4A0C2CFCFD4
* HEX 8D8DA0C9CED3C5D2D4A0CEC5D7A0C4C9
* HEX D3CBA0C1CEC48DA0C8C9D4A0C1A0CBC5
* HEX D9A0D4CFA0D2C5C2CFCFD48D8DA0A0A0
* HEX A0A0A0A0A0A0A0000000000000000000
* HEX 00000000000000000000000000000000
* HEX 00000000000000000000000000000000
* HEX 00000000000000000000000000000000
* HEX 00000000000000000000000000000000
boot HEX 012058FC2093FE2089FEA000B93408F0
HEX 0E20F0FDC98DD004A9098524C8D0EDA6
HEX 2B9D88C08A4A4A4A4A09C08D3308200C
HEX FD4C00C68D8D8D8D8D8D8DCCCFC4C5A0
HEX D2D5CECEC5D2A0C4C1D4C1A0C4C9D3CB
HEX BA8DADADADADADADADADADADADADADAD
HEX ADADADADADADADAD8D8DC4C9D3CBC5D4
HEX D4C5A0D7C9CCCCA0CECFD4A0C2CFCFD4
HEX 8D8DA0C9CED3C5D2D4A0CEC5D7A0C4C9
HEX D3CBA0C1CEC48DA0C8C9D4A0C1A0CBC5
HEX D9A0D4CFA0D2C5C2CFCFD48D8DA0A0A0
HEX A0A0A0A0A0A0A0000000000000000000
HEX 00000000000000000000000000000000
HEX 00000000000000000000000000000000
HEX 00000000000000000000000000000000
HEX 00000000000000000000000000000000
ds \
*--- $1F00 - Score buffer
@ -785,4 +786,37 @@ scoreREF hex CED5C71C00173125
hex 0000000000000000
hex 0000000000000000
hex 00000000CCCFC4C5A0D2D5CECEC5D2
hex FF ; <= the tag
hex 00 ; <= data disk
scoreEMPTY hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 0000000000000000
hex 00000000CCCFC4C5A0D2D5CECEC5D2
hex 00 ; <= data disk

View File

@ -149,6 +149,9 @@ fgKEYBTN0 = $ac ; 1: no key/btn0 pressed, 0: key/btn0 pressed
fgCHANGE = $ad ; 1: no change, 0: change
sprDATA = $df ; $df..$ff
Debut = $e0 ; the good old DP variables
Arrivee = Debut+4
chrLA = $88
chrRET = $8d
chrRA = $95

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +1 @@
LR.CODE=Type(00),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
LodeRunner=Type(B3),AuxType(DB00),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)

View File

@ -1,8 +1,7 @@
*
* La Belle Zohra
*
* (c) 1992, François Coulon
* (c) 2023, Antoine Vignau & Olivier Zardini
* Lode Runner
* (c) 1983, Broderbund Software
* (s) 2014, Brutal Deluxe Software
*
mx %00
@ -35,8 +34,15 @@
*----------------------------------- Constantes
ext ptrUNPACK
ext ptrBACKGND
ext ptrIMAGE
ext ptrTITLE
ext ptrLEVELS
*-------------- Softswitches
RDVBLBAR = $e0c019
GSOS = $e100a8
*-------------- GUI
@ -49,13 +55,15 @@ refIsPointer = 0
refIsHandle = 1
refIsResource = 2
appleKey = $0100
mouseDownEvt = $0001
mouseUpEvt = $0002
keyDownEvt = $0003
ptr012000 = $012000
ptrE12000 = $e12000
ptrSCREENE1 = $e02000
*---
TRUE = 255
FALSE = 0
*----------------------------------- Entry point
phk
@ -76,6 +84,95 @@ ptrSCREENE1 = $e02000
tdc
sta myDP
*--- Version du systeme
jsl GSOS
dw $202a
adrl proVERS
lda proVERS+2
and #%01111111_11111111
cmp #$0402
bcs okVERS
pha
PushLong #verSTR1
PushLong #verSTR2
PushLong #errSTR1
PushLong #errSTR2
_TLTextMountVolume
pla
brl meQUIT1
*--- Compacte la mémoire
okVERS PushLong #0
PushLong #$8fffff
PushWord myID
PushWord #%11000000_00000000
PushLong #0
_NewHandle
_DisposeHandle
_CompactMem
*--- Chargement des outils
pha
pha
PushWord mainID
PushWord #refIsResource
PushLong #1
_StartUpTools
PullLong SStopREC
bcc okTOOL
pha
PushLong #tolSTR1
PushLong #errSTR2
PushLong #errSTR1
PushLong #errSTR2
_TLTextMountVolume
pla
brl meQUIT1
*--- Test default shadowing...
okTOOL PushWord #0
_GetMasterSCB
pla
bmi okSHADOW ; shadowing is on if bit 15 is set
lda #^ptrE12000 ; shadowing is off, use slow RAM
sta ptrSCREEN+2
*--- Et la musique...
okSHADOW pha
_SoundToolStatus
pla
bne noSOUND
lda #1
sta fgSND
noSOUND _HideMenuBar
_InitCursor
_HideCursor
PushWord #0
PushWord #%11111111_11111111
PushWord #0
_FlushEvents
pla
PushLong #0
PushWord #5 ; SetDeskPat
PushWord #$4000
PushWord #$0000
_Desktop
pla
pla
*----------------------------------- Exit point
lda #theGAME
@ -83,20 +180,247 @@ ptrSCREENE1 = $e02000
lda #^theGAME
stal $302
sep #$30
ldx #256-2 ; efface la page directe
]lp stz $00,x
dex
dex
bpl ]lp
lda #^ptrSCREENE1
sep #$30 ; MAJ le banc des pages
lda ptrSCREEN+2
sta ptrDATA+2
sta ptrHGR1+2
sta ptrHGR2+2
brl theGAME
*----------------------------------- Exit point
*-----------------------------------
* AUTRES ROUTINES
*-----------------------------------
rep #$30
*----------------------------------- Open LEVELS
doLOAD jsr saveBACK
PushWord #30
PushWord #43
PushLong #strLOADFILE
PushLong #0
PushLong #typeLIST
PushLong #replyPTR
_SFGetFile
jsr loadBACK
PushWord myID
lda replyPTR
bne doLOAD1
rts
doLOAD1 jsr copyPATH
jsr loadLEVELS
jmp loadSCORES
*----------------------------------- Save
doSAVE jsr saveBACK
PushWord #25
PushWord #36
PushLong #strSAVEFILE
PushLong #namePATH
PushWord #15
PushLong #replyPTR
_SFPutFile
jsr loadBACK
lda replyPTR
bne doSAVE1
rts
doSAVE1 jsr copyPATH
jsr saveLEVELS
jmp saveSCORES
*--- Recopie le filename du fichier de sauvegarde
copyPATH sep #$20
ldx #16-1
]lp lda namePATH1,x
sta pLEVELS+4,x
sta pSCORES+4,x
dex
bpl ]lp
lda namePATH
inc ; add 2 chars
inc ; for '1/'
sta pLEVELS
rep #$20
rts
*----------------------------------- Load/Save LEVELS/SCORES
mx %00
*---------------------- Load LEVELS
loadLEVELS rep #$30
jsl GSOS
dw $2010
adrl proOPEN
bcs loadLEVELS9
lda proOPEN+2
sta proREAD+2
sta proCLOSE+2
jsl GSOS
dw $2012
adrl proREAD
php
jsl GSOS
dw $2014
adrl proCLOSE
plp
bcs loadLEVELS9
sep #$30
rts
mx %00
loadLEVELS9 ldx #0 ; clear all levels
txa
]lp stal ptrLEVELS,x
inx
inx
cpx #38400
bcc ]lp
sep #$30
rts
mx %00
*---------------------- Save LEVELS
saveLEVELS rep #$30
jsl GSOS
dw $2002
adrl proDESTROY
jsl GSOS
dw $2001
adrl proCREATE
bcs saveLEVELS9
jsl GSOS
dw $2010
adrl proOPEN
bcs saveLEVELS9
lda proOPEN+2
sta proWRITE+2
sta proCLOSE+2
jsl GSOS
dw $2013
adrl proWRITE
jsl GSOS
dw $2014
adrl proCLOSE
saveLEVELS9 sep #$30
rts
mx %00
*---------------------- Load SCORES
loadSCORES rep #$30
jsl GSOS
dw $2010
adrl proOPENSCORES
bcs loadSCORES9
lda proOPENSCORES+2
sta proREADSCORES+2
sta proCLOSE+2
jsl GSOS
dw $2012
adrl proREADSCORES
php
jsl GSOS
dw $2014
adrl proCLOSE
plp
bcs loadSCORES9
sep #$30
rts
mx %00
loadSCORES9 ldx #256-2
]lp lda scoreEMPTY,x
sta scorebuf,x
dex
dex
bpl ]lp
sep #$30
rts
mx %00
*---------------------- Save SCORES
saveSCORES rep #$30
jsl GSOS
dw $2002
adrl proDESTROYSCORES
jsl GSOS
dw $2001
adrl proCREATESCORES
bcs saveSCORES9
jsl GSOS
dw $2010
adrl proOPENSCORES
bcs saveSCORES9
lda proOPENSCORES+2
sta proWRITESCORES+2
sta proCLOSE+2
jsl GSOS
dw $2013
adrl proWRITESCORES
jsl GSOS
dw $2014
adrl proCLOSE
saveSCORES9 sep #$30
rts
mx %00
*----------------------------------- Quit
meQUIT PushWord #refIsHandle
PushLong SStopREC
_ShutDownTools
meQUIT1 PushWord myID
_DisposeAll
PushWord mainID
@ -111,43 +435,265 @@ ptrSCREENE1 = $e02000
dw $2029
adrl proQUIT
brk $bd
*----------------------------------------
* MEMOIRE
* GFX
*----------------------------------------
make64KB pha
pha
PushLong #$010000
PushWord myID
PushWord #%11000000_00011100
PushLong #0
_NewHandle
phd
tsc
tcd
lda [3]
tax ; low in X
ldy #2
lda [3],y
txy ; low in Y
tax ; high in X
pld
pla ; we do not keep track of the handle
pla
*----------------------------
* unpackLZ4
* Unpacks a LZ4 file
* Uses the two pointers:
* - ptrUNPACK: packed img (MUST BE AT $0000)
* - ptrIMAGE: temp unpack zone
*
* Entry:
* A: packed data size
*
* Exit:
* lenDATA: unpacked data size
*
*----------------------------
mx %00
unpackLZ4 sta LZ4_Limit+1
sep #$20
lda ptrUNPACK+2 ; Source
sta LZ4_Literal_3+2
sta LZ4_ReadToken+3
sta LZ4_Match_1+3
sta LZ4_GetLength_1+3
lda ptrIMAGE+2 ; Destination
sta LZ4_Literal_3+1
sta LZ4_Match_5+1
sta LZ4_Match_5+2
rep #$20
*--
ldy #0 ; Init Target unpacked Data offset
ldx #16 ; Offset after header
LZ4_ReadToken
LDAL $AA0000,X ; Read Token Byte
INX
STA LZ4_Match_2+1
*----------------
LZ4_Literal
AND #$00F0 ; >>> Process Literal Bytes <<<
BEQ LZ4_Limit ; No Literal
CMP #$00F0
BNE LZ4_Literal_1
JSR LZ4_GetLengthLit ; Compute Literal Length with next bytes
BRA LZ4_Literal_2
LZ4_Literal_1
LSR ; Literal Length use the 4 bit
LSR
LSR
LSR
LZ4_Literal_2
DEC ; Copy A+1 Bytes
LZ4_Literal_3
MVN $AA,$BB ; Copy Literal Bytes from packed data buffer
PHK ; X and Y are auto incremented
PLB
*----------------
LZ4_Limit CPX #$AAAA ; End Of Packed Data buffer ?
BEQ LZ4_End
*----------------
LZ4_Match TYA ; >>> Process Match Bytes <<<
SEC
LZ4_Match_1 SBCL $AA0000,X ; Match Offset
INX
INX
STA LZ4_Match_4+1
LZ4_Match_2 LDA #$0000 ; Current Token Value
AND #$000F
CMP #$000F
BNE LZ4_Match_3
JSR LZ4_GetLengthMat ; Compute Match Length with next bytes
LZ4_Match_3 CLC
ADC #$0003 ; Minimum Match Length is 4 (-1 for the MVN)
PHX
LZ4_Match_4 LDX #$AAAA ; Match Byte Offset
LZ4_Match_5 MVN $BB,$BB ; Copy Match Bytes from unpacked data buffer
PHK ; X and Y are auto incremented
PLB
PLX
BRA LZ4_ReadToken
*----------------
LZ4_GetLengthLit
LDA #$000F ; Compute Variable Length (Literal or Match)
LZ4_GetLengthMat
STA LZ4_GetLength_2+1
LZ4_GetLength_1
LDAL $AA0000,X ; Read Length Byte
INX
AND #$00FF
CMP #$00FF
BNE LZ4_GetLength_3
CLC
LZ4_GetLength_2
ADC #$000F
STA LZ4_GetLength_2+1
BRA LZ4_GetLength_1
LZ4_GetLength_3
ADC LZ4_GetLength_2+1
RTS
*----------------
LZ4_End sty lenDATA ; Y = length of unpacked data
rts
*---
lenDATA ds 4
*-----------------------------------
* SAVE THE SHR SCREEN
*-----------------------------------
saveBACK _HideCursor
PushLong ptrSCREEN
PushLong #ptrBACKGND
PushLong #32768
_BlockMove
exitBACK _ShowCursor
rts
*-----------------------------------
* RESTORE THE SHR SCREEN
*-----------------------------------
loadBACK _HideCursor
PushLong #ptrBACKGND
PushLong ptrSCREEN
PushLong #32768
_BlockMove
_ShowCursor
rts
*----------------------------------------
* DATA
*----------------------------------------
fgSND ds 2
*----------------------- Tool locator
verSTR1 str 'System 6.0.1 Required!'
verSTR2 str 'Press a key to quit'
tolSTR1 str 'Error while loading tools'
memSTR1 str 'Cannot allocate memory'
filSTR1 str 'Cannot load file'
errSTR1 str 'Quit'
errSTR2 str ''
errSTR3 str 'Continue'
*----------------------- Memory manager
mainID ds 2 ; app ID
myID ds 2 ; user ID
myDP ds 2
SStopREC ds 4
ptrSCREEN adrl ptr012000
*----------------------- GS/OS
*--- LEVELS
proCREATE dw 7 ; pcount
adrl pLEVELS ; pathname
dw $c3 ; access_code
dw $5d ; file_type
adrl $8022 ; aux_type
ds 2 ; storage_type
adrl 38400 ; eof
ds 4 ; resource_eof
proDESTROY dw 1 ; pcount
adrl pLEVELS ; pathname
proOPEN dw 2
ds 2
adrl pLEVELS
proREAD dw 4 ; 0 - nb parms
ds 2 ; 2 - file id
adrl ptrLEVELS ; 4 - pointer
adrl 38400 ; 8 - length
ds 4 ; C - length read
proWRITE dw 5 ; 0 - pcount
ds 2 ; 2 - ref_num
adrl ptrLEVELS ; 4 - data_buffer
adrl 38400 ; 8 - request_count
ds 4 ; C - transfer_count
dw 1 ; cache_priority
*--- SCORES
proCREATESCORES
dw 7 ; pcount
adrl pSCORES ; pathname
dw $c3 ; access_code
dw $5d ; file_type
adrl $8023 ; aux_type
ds 2 ; storage_type
adrl 256 ; eof
ds 4 ; resource_eof
proDESTROYSCORES
dw 1 ; pcount
adrl pLEVELS ; pathname
proOPENSCORES
dw 2
ds 2
adrl pSCORES
proREADSCORES
dw 4 ; 0 - nb parms
ds 2 ; 2 - file id
adrl scorebuf ; 4 - pointer
adrl 256 ; 8 - length
ds 4 ; C - length read
proWRITESCORES
dw 5 ; 0 - pcount
ds 2 ; 2 - ref_num
adrl scorebuf ; 4 - data_buffer
adrl 256 ; 8 - request_count
ds 4 ; C - transfer_count
dw 1 ; cache_priority
*--- Global
proCLOSE dw 1
ds 2
proQUIT dw 2 ; pcount
ds 4 ; pathname
ds 2 ; flags
@ -155,14 +701,37 @@ proQUIT dw 2 ; pcount
proVERS dw 1 ; pcount
ds 2 ; version
*---------- Files
pLEVELS strl '1/levels/loderunner'
pSCORES strl '1/levels/loderunner.sc'
*----------------------- Standard File Toolset
strLOADFILE str 'Load which file?'
strSAVEFILE str 'Save as...'
typeLIST hex 01
hex 5d ; Game/Edu files
replyPTR ds 2 ; 0 good
ds 2 ; 2 fileType
ds 2 ; 4 auxFileType
namePATH
hex 06 ; 6 fileName
namePATH1
asc 'Levels' ; 7 fileName (16 normally)
ds 9
loadPATH
ds 1 ; 22 fullPathname (string length)
loadPATH1
ds 129 ; 23 fullPathname (128 normally)
*----------------------------------------
* LES AUTRES FICHIERS
*----------------------------------------
ds \
put LR.Code.s
put LR.RWTS.s
* put LR.RWTS.s
put LR.Data.s
put LR.Tables.s
put LR.Sprites.s
@ -177,7 +746,7 @@ proVERS dw 1 ; pcount
asc " Antoine Vignau "0d
asc "Olivier Zardini"0d
asc " "0d
asc " Noel 2023 "0d
asc " Paques 2024 "0d
asc " "0d
asc "----------------"0d

View File

@ -11,4 +11,16 @@
KND $0000
SNA DougESmith
ASM LR.BANK1.S
KND $0000
SNA Brutal
ASM LR.BANK2.S
KND $0000
SNA Deluxe
ASM LR.BANK3.S
KND $0000
SNA Software
* END