mirror of
https://github.com/antoinevignau/source.git
synced 2024-11-15 13:05:18 +00:00
ba63c9b7c1
Antoine's source code of Bill Palmer
611 lines
10 KiB
ArmAsm
611 lines
10 KiB
ArmAsm
*
|
|
* Bill Palmer
|
|
*
|
|
* (c) 1987, François Coulon
|
|
* (c) 2021, Brutal Deluxe
|
|
*
|
|
|
|
lst off
|
|
rel
|
|
dsk bill.l
|
|
|
|
mx %00
|
|
xc
|
|
xc
|
|
|
|
*--------------------------------------
|
|
|
|
use 4/Locator.Macs
|
|
use 4/Mem.Macs
|
|
use 4/Misc.Macs
|
|
use 4/Sound.Macs
|
|
use 4/Util.Macs
|
|
|
|
*--------------------------------------
|
|
|
|
Debut = $00
|
|
Arrivee = $04
|
|
Second = $08
|
|
Third = $0c
|
|
|
|
proDOS = $e100a8
|
|
|
|
*--------------------------------------
|
|
|
|
phk
|
|
plb
|
|
|
|
_TLStartUp
|
|
pha
|
|
_MMStartUp
|
|
pla
|
|
sta myID
|
|
_MTStartUp
|
|
|
|
*--------------------------------------
|
|
|
|
okINIT1
|
|
PushLong #0
|
|
PushLong #$8fffff
|
|
PushWord myID
|
|
PushWord #%11000000_00000000
|
|
PushLong #0
|
|
_NewHandle
|
|
_DisposeHandle
|
|
_CompactMem
|
|
|
|
*--------------------------------------
|
|
|
|
PushLong #0
|
|
PushLong #$10000
|
|
PushWord myID
|
|
PushWord #%11000000_00011100
|
|
PushLong #0
|
|
_NewHandle
|
|
phd
|
|
tsc
|
|
tcd
|
|
lda [3]
|
|
sta ptrUNPACK
|
|
ldy #2
|
|
lda [3],y
|
|
sta ptrUNPACK+2
|
|
pld
|
|
pla
|
|
pla
|
|
bcc okINIT2
|
|
inc fgMEM
|
|
|
|
okINIT2
|
|
PushLong #0
|
|
PushLong #$10000
|
|
PushWord myID
|
|
PushWord #%11000000_00011100
|
|
PushLong #0
|
|
_NewHandle
|
|
phd
|
|
tsc
|
|
tcd
|
|
lda [3]
|
|
sta ptrDG
|
|
ldy #2
|
|
lda [3],y
|
|
sta ptrDG+2
|
|
pld
|
|
pla
|
|
pla
|
|
bcc okINIT3
|
|
inc fgMEM
|
|
|
|
okINIT3
|
|
PushLong #0
|
|
PushLong #$40000
|
|
PushWord myID
|
|
PushWord #%11000000_00001100
|
|
PushLong #0
|
|
_NewHandle
|
|
phd
|
|
tsc
|
|
tcd
|
|
lda [3]
|
|
sta ptrMUSIC
|
|
ldy #2
|
|
lda [3],y
|
|
sta ptrMUSIC+2
|
|
pld
|
|
pla
|
|
pla
|
|
bcc okINIT4
|
|
inc fgSND
|
|
|
|
*--------------------------------------
|
|
|
|
okINIT4
|
|
ldx #0
|
|
txa
|
|
]lp stal $e12000,x
|
|
inx
|
|
inx
|
|
bpl ]lp
|
|
|
|
sep #$20
|
|
lda #$c1
|
|
stal $e0c029
|
|
rep #$20
|
|
|
|
*--------------------------------------
|
|
|
|
lda fgMEM
|
|
bne okINIT5
|
|
|
|
lda #pTITLE
|
|
ldx ptrUNPACK+2
|
|
ldy ptrUNPACK
|
|
jsr loadFILE
|
|
bcs okINIT5
|
|
|
|
lda proREAD+12
|
|
jsr unpackLZ4
|
|
|
|
ldx ptrDG+2
|
|
ldy ptrDG
|
|
lda #-1
|
|
jsr fadeIN
|
|
|
|
*--------------------------------------
|
|
|
|
okINIT5
|
|
lda fgSND
|
|
bne koINIT2
|
|
|
|
lda #pSAMPLE
|
|
ldx ptrMUSIC+2
|
|
ldy ptrMUSIC
|
|
jsr loadFILE
|
|
bcc okINIT6
|
|
|
|
koINIT inc fgSND
|
|
koINIT2 brl initOFF
|
|
|
|
*--------------------------------------
|
|
|
|
okINIT6
|
|
tdc
|
|
clc
|
|
adc #$100
|
|
pha
|
|
_SoundStartUp
|
|
bcs okINIT7
|
|
|
|
PushWord #1
|
|
PushLong #pBlockPtr
|
|
_FFStartSound
|
|
|
|
okINIT7
|
|
lda #15
|
|
jsr nowWAIT
|
|
|
|
lda fgSND
|
|
bne initOFF
|
|
|
|
PushWord #$7fff
|
|
_FFStopSound
|
|
|
|
_SoundShutDown
|
|
|
|
*--------------------------------------
|
|
|
|
initOFF
|
|
_MTShutDown
|
|
|
|
PushWord myID
|
|
_DisposeAll
|
|
PushWord myID
|
|
_MMShutDown
|
|
_TLShutDown
|
|
|
|
jsl proDOS
|
|
dw $2029
|
|
adrl proQUIT
|
|
|
|
brk $bd
|
|
|
|
*--------------------------------------
|
|
|
|
nowWAIT dec ; Attend A secondes
|
|
tax
|
|
lda #0
|
|
]lp clc
|
|
adc #60
|
|
cpx #0
|
|
beq nowWAIT1
|
|
dex
|
|
bra ]lp
|
|
nowWAIT1 pha
|
|
jsr waitVBL
|
|
jsr clickIT
|
|
bcc nowWAIT2
|
|
]lp ldal $e0c018
|
|
bmi ]lp
|
|
pla
|
|
dec
|
|
bne nowWAIT1
|
|
sec
|
|
rts
|
|
nowWAIT2 pla
|
|
clc
|
|
rts
|
|
|
|
*--------------------------------------
|
|
|
|
clickIT ldal $e0bfff
|
|
bpl clickIT1
|
|
sep #$20
|
|
stal $e0c010
|
|
rep #$20
|
|
clc
|
|
rts
|
|
clickIT1 sec
|
|
rts
|
|
|
|
*--------------------------------------
|
|
|
|
loadFILE
|
|
sta proOPEN+4
|
|
sty proREAD+4
|
|
stx proREAD+6
|
|
|
|
jsl proDOS
|
|
dw $2010
|
|
adrl proOPEN
|
|
bcs loadERR
|
|
|
|
lda proOPEN+2
|
|
sta proGETEOF+2
|
|
sta proREAD+2
|
|
sta proCLOSE+2
|
|
|
|
jsl proDOS
|
|
dw $2019
|
|
adrl proGETEOF
|
|
bcs loadERR
|
|
|
|
lda proGETEOF+4
|
|
sta proREAD+8
|
|
lda proGETEOF+6
|
|
sta proREAD+10
|
|
|
|
jsl proDOS
|
|
dw $2012
|
|
adrl proREAD
|
|
bcs loadERR
|
|
|
|
jsl proDOS
|
|
dw $2014
|
|
adrl proCLOSE
|
|
rts
|
|
|
|
loadERR
|
|
php
|
|
jsl proDOS
|
|
dw $2014
|
|
adrl proCLOSE
|
|
plp
|
|
brk $bc
|
|
rts
|
|
|
|
*--------------------------------------
|
|
|
|
nextVBL lda #75
|
|
pha
|
|
]lp ldal $e0c02e
|
|
and #$7f
|
|
cmp 1,s
|
|
blt ]lp
|
|
cmp #100
|
|
bge ]lp
|
|
pla
|
|
waitVBL ldal $e0c018
|
|
bpl waitVBL
|
|
rts
|
|
|
|
*--------------------------------------
|
|
|
|
fadeIN sty Debut
|
|
stx Debut+2
|
|
|
|
ldy #$2000
|
|
sty Arrivee
|
|
ldx #$00e1
|
|
stx Arrivee+2
|
|
|
|
cmp #0
|
|
beq fadeIN1
|
|
|
|
ldy #$7dfe
|
|
]lp lda [Debut],y
|
|
sta [Arrivee],y
|
|
dey
|
|
dey
|
|
bpl ]lp
|
|
|
|
fadeIN1 lda Debut
|
|
clc
|
|
adc #$7e00
|
|
sta Debut
|
|
lda Debut+2
|
|
adc #0
|
|
sta Debut+2
|
|
|
|
lda Arrivee
|
|
clc
|
|
adc #$7e00
|
|
sta Arrivee
|
|
lda Arrivee+2
|
|
adc #0
|
|
sta Arrivee+2
|
|
|
|
ldx #$000f
|
|
fadeIN2 ldy #$01fe
|
|
fadeIN3 lda [Arrivee],y
|
|
and #$000f
|
|
sta temp
|
|
lda [Debut],y
|
|
and #$000f
|
|
cmp temp
|
|
beq fadeIN4
|
|
lda [Arrivee],y
|
|
clc
|
|
adc #$0001
|
|
sta [Arrivee],y
|
|
fadeIN4 lda [Arrivee],y
|
|
and #$00f0
|
|
sta temp
|
|
lda [Debut],y
|
|
and #$00f0
|
|
cmp temp
|
|
beq fadeIN5
|
|
lda [Arrivee],y
|
|
clc
|
|
adc #$0010
|
|
sta [Arrivee],y
|
|
fadeIN5 lda [Arrivee],y
|
|
and #$0f00
|
|
sta temp
|
|
lda [Debut],y
|
|
and #$0f00
|
|
cmp temp
|
|
beq fadeIN6
|
|
lda [Arrivee],y
|
|
clc
|
|
adc #$0100
|
|
sta [Arrivee],y
|
|
|
|
fadeIN6 dey
|
|
dey
|
|
bpl fadeIN3
|
|
jsr nextVBL
|
|
dex
|
|
bpl fadeIN2
|
|
rts
|
|
|
|
*---
|
|
|
|
fadeOUT lda #$9e00
|
|
sta Debut
|
|
lda #$00e1
|
|
sta Debut+2
|
|
|
|
ldx #$000f
|
|
fadeOUT1 ldy #$01fe
|
|
fadeOUT2 lda [Debut],y
|
|
and #$000f
|
|
beq fadeOUT3
|
|
lda [Debut],y
|
|
sec
|
|
sbc #$0001
|
|
sta [Debut],y
|
|
fadeOUT3 lda [Debut],y
|
|
and #$00f0
|
|
beq fadeOUT4
|
|
lda [Debut],y
|
|
sec
|
|
sbc #$0010
|
|
sta [Debut],y
|
|
fadeOUT4 lda [Debut],y
|
|
and #$0f00
|
|
beq fadeOUT5
|
|
lda [Debut],y
|
|
sec
|
|
sbc #$0100
|
|
sta [Debut],y
|
|
|
|
fadeOUT5 dey
|
|
dey
|
|
bpl fadeOUT2
|
|
jsr nextVBL
|
|
dex
|
|
bpl fadeOUT1
|
|
rts
|
|
|
|
*----------------------------
|
|
* unpackLZ4
|
|
* Unpacks a LZ4 file
|
|
* Uses the two pointers:
|
|
* - ptrUNPACK: packed img (MUST BE AT $0000)
|
|
* - ptrDG: temp unpack zone
|
|
*
|
|
* Entry:
|
|
* A: packed data size
|
|
*
|
|
* Exit:
|
|
* A: unpacked data size
|
|
*
|
|
*----------------------------
|
|
|
|
unpackLZ4
|
|
sta LZ4_Limit+1
|
|
|
|
sep #$20
|
|
sei
|
|
|
|
*--- Source
|
|
|
|
lda ptrUNPACK+2
|
|
sta LZ4_Literal_3+2
|
|
sta LZ4_ReadToken+3
|
|
sta LZ4_Match_1+3
|
|
sta LZ4_GetLength_1+3
|
|
|
|
*--- Destination
|
|
|
|
lda ptrDG+2
|
|
sta LZ4_Literal_3+1
|
|
sta LZ4_Match_5+1
|
|
sta LZ4_Match_5+2
|
|
|
|
rep #$20
|
|
|
|
* REP #$30
|
|
* STY LZ4_Limit+1
|
|
|
|
*--
|
|
|
|
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
|
|
tya
|
|
cli
|
|
rts
|
|
|
|
*---
|
|
|
|
lenDATA ds 2
|
|
|
|
*--------------------------------------
|
|
* All the data
|
|
*--------------------------------------
|
|
|
|
*--- Prodos
|
|
|
|
proQUIT dw 2
|
|
adrl pPALMER
|
|
ds 2
|
|
|
|
proOPEN dw 2
|
|
ds 2
|
|
adrl pTITLE
|
|
|
|
proGETEOF dw 2
|
|
ds 2
|
|
ds 4
|
|
|
|
proREAD dw 4 ; 0
|
|
ds 2 ; 2
|
|
ds 4 ; 4 dataBuffer
|
|
ds 4 ; 8 requestCount
|
|
ds 4 ; 12 transferCount
|
|
|
|
proCLOSE dw 1
|
|
ds 2
|
|
|
|
*--- Nom des fichiers
|
|
|
|
pPALMER strl '1/Palmer'
|
|
pTITLE strl '1/Data/Title.lz4'
|
|
pSAMPLE strl '1/Data/Sample'
|
|
|
|
*--- Flags
|
|
|
|
temp dw 1
|
|
fgMEM ds 2
|
|
fgSND ds 2
|
|
|
|
pBlockPtr
|
|
ptrMUSIC
|
|
ds 4
|
|
dw $35a
|
|
dw 312 ; for 16037 Hz
|
|
dw $0000
|
|
dw $0000
|
|
ds 4
|
|
dw $ff
|
|
|
|
*--- Memoire
|
|
|
|
myID ds 2
|
|
|
|
ptrUNPACK ds 4
|
|
ptrDG ds 4
|