884 lines
10 KiB
ArmAsm
Executable File
884 lines
10 KiB
ArmAsm
Executable File
* unpack 3.5
|
|
ThreeFive = 1
|
|
org = $ea00
|
|
lst off
|
|
*-------------------------------
|
|
*
|
|
* Sits in main l.c. bank 2
|
|
*
|
|
*-------------------------------
|
|
org org
|
|
|
|
jmp SNGEXPAND
|
|
jmp DBLEXPAND
|
|
jmp DELTAEXPPOP
|
|
jmp INVERTY
|
|
jmp DELTAEXPWIPE
|
|
|
|
jmp PURPLE
|
|
jmp PROMPT
|
|
jmp BLACKOUT
|
|
jmp CLR
|
|
jmp TEXT
|
|
|
|
jmp SETDHIRES
|
|
jmp FADEIN
|
|
jmp LOADSUPER
|
|
jmp FADEOUT
|
|
|
|
*-------------------------------
|
|
lst
|
|
put gameeq
|
|
lst
|
|
put eq
|
|
lst off
|
|
|
|
IOUDISoff = $c07f
|
|
IOUDISon = $c07e
|
|
DHIRESoff = $c05f
|
|
DHIRESon = $c05e
|
|
HIRESon = $c057
|
|
HIRESoff = $c056
|
|
PAGE2on = $c055
|
|
PAGE2off = $c054
|
|
MIXEDon = $c053
|
|
MIXEDoff = $c052
|
|
TEXTon = $c051
|
|
TEXToff = $c050
|
|
ALTCHARon = $c00f
|
|
ALTCHARoff = $c00e
|
|
ADCOLon = $c00d
|
|
ADCOLoff = $c00c
|
|
ALTZPon = $c009
|
|
ALTZPoff = $c008
|
|
RAMWRTaux = $c005
|
|
RAMWRTmain = $c004
|
|
RAMRDaux = $c003
|
|
RAMRDmain = $c002
|
|
ADSTOREon = $c001
|
|
ADSTOREoff = $c000
|
|
|
|
RWBANK2 = $c083
|
|
RWBANK1 = $c08b
|
|
|
|
*-------------------------------
|
|
* RW18 ID bytes
|
|
|
|
POPside1 = $a9
|
|
POPside2 = $ad
|
|
|
|
* RW18 zero page vars
|
|
|
|
slot = $fd
|
|
track = $fe
|
|
lastrack = $ff
|
|
|
|
* RW18 commands
|
|
|
|
DrvOn = $00
|
|
DrvOff = $01
|
|
Seek = $02
|
|
RdSeqErr = $03
|
|
RdGrpErr = $04
|
|
WrtSeqErr = $05
|
|
WrtGrpErr = $06
|
|
ModID = $07
|
|
RdSeq = $83
|
|
RdGrp = $84
|
|
WrtSeq = $85
|
|
WrtGrp = $86
|
|
Inc = $40 ;.Inc to inc track
|
|
|
|
*-------------------------------
|
|
*
|
|
* Unpack single hi-res screen into page 1
|
|
* (Sorry about the code--it's lifted directly from DRAZ)
|
|
*
|
|
*-------------------------------
|
|
dum $00
|
|
|
|
PAC ds 2
|
|
PIC ds 2
|
|
V2 ds 1
|
|
V3 ds 1
|
|
V4 ds 1
|
|
V5 ds 1
|
|
V8 ds 1
|
|
V9 ds 1
|
|
VA ds 1
|
|
VB ds 1
|
|
VC ds 1
|
|
|
|
dend
|
|
|
|
*-------------------------------
|
|
SNGEXPAND
|
|
sta RAMRDaux
|
|
sta RAMWRTmain
|
|
|
|
STA PAC+1 ;org addr
|
|
|
|
LDA #$20
|
|
STA PIC+1 ;dest addr
|
|
|
|
LDA #0
|
|
STA PAC
|
|
STA PIC
|
|
|
|
LDA #$FE
|
|
STA V8
|
|
LDA #0
|
|
STA VA
|
|
LDY #$27
|
|
:4 LDA #$78
|
|
STA V2
|
|
LDA #$20
|
|
STA V3
|
|
:0 LDA V2
|
|
SEC
|
|
SBC #$28
|
|
STA V2
|
|
BCS :1
|
|
DEC V3
|
|
:1 LDA V2
|
|
STA V4
|
|
LDA V3
|
|
CLC
|
|
ADC #4
|
|
STA V5
|
|
:2 LDA V4
|
|
SEC
|
|
SBC #$80
|
|
STA V4
|
|
BCS :3
|
|
DEC V5
|
|
:3 LDA V4
|
|
STA PIC
|
|
LDA V5
|
|
CLC
|
|
ADC #$20
|
|
STA PIC+1
|
|
:5 LDA PIC+1
|
|
SEC
|
|
SBC #4
|
|
STA PIC+1
|
|
CLC
|
|
BCC :6
|
|
:13 LDA PIC+1
|
|
CMP V5
|
|
BNE :5
|
|
LDA V4
|
|
CMP V2
|
|
BNE :2
|
|
LDA V5
|
|
CMP V3
|
|
BNE :2
|
|
LDA V2
|
|
BNE :0
|
|
DEY
|
|
BPL :4
|
|
RTS
|
|
:6 BIT VA
|
|
BMI :11
|
|
LDX #0
|
|
LDA (PAC,X)
|
|
STA VB
|
|
CMP V8
|
|
BNE :10
|
|
INC PAC
|
|
BNE :7
|
|
INC PAC+1
|
|
:7 LDA (PAC,X)
|
|
STA V9
|
|
INC PAC
|
|
BNE :8
|
|
INC PAC+1
|
|
:8 LDA (PAC,X)
|
|
STA VB
|
|
INC PAC
|
|
BNE :9
|
|
INC PAC+1
|
|
:9 LDA #$80
|
|
STA VA
|
|
CLC
|
|
BCC :11
|
|
:10 LDA VB
|
|
ORA #$80
|
|
STA (PIC),Y
|
|
INC PAC
|
|
BNE :12
|
|
INC PAC+1
|
|
:12 CLC
|
|
BCC :13
|
|
:11 LDA VB
|
|
ORA #$80
|
|
STA (PIC),Y
|
|
DEC V9
|
|
BNE :13
|
|
LDA #0
|
|
STA VA
|
|
BEQ :13
|
|
|
|
*-------------------------------
|
|
*
|
|
* Unpack crunched double hi-res screen
|
|
*
|
|
* Robert A. Cook 3/89
|
|
*
|
|
* In: A = hi byte of crunched data address
|
|
* RAMRD set to main/aux depending on where crunched
|
|
* data is stored
|
|
*
|
|
*-------------------------------
|
|
|
|
dum $f0
|
|
|
|
CrnDatPtr ds 2
|
|
XClmPos ds 1
|
|
YScrPos ds 1
|
|
ByteHld ds 1
|
|
RepeatCdn ds 1
|
|
ScrBasPtr ds 2
|
|
|
|
dend
|
|
|
|
*-------------------------------
|
|
DBLEXPAND
|
|
sta CrnDatPtr+1
|
|
|
|
lda #1
|
|
sta CrnDatPtr
|
|
;(CrnDatPtr),0 is crunch type (unused)
|
|
jmp WipeRgtExp
|
|
|
|
*-------------------------------
|
|
*
|
|
* Wipe Right Expand
|
|
*
|
|
*-------------------------------
|
|
WipeRgtExp
|
|
lda #0
|
|
sta XClmPos
|
|
|
|
:Loop lda #0
|
|
sta YScrPos
|
|
jsr ExpandClm
|
|
|
|
lda #1
|
|
sta YScrPos
|
|
jsr ExpandClm
|
|
|
|
inc XClmPos
|
|
|
|
lda XClmPos
|
|
cmp #80
|
|
bne :Loop
|
|
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Delta Expand
|
|
*
|
|
* In: A = hi byte of crunched data address (in auxmem)
|
|
*
|
|
*-------------------------------
|
|
DeltaExp
|
|
sta RAMRDaux
|
|
|
|
sta CrnDatPtr+1
|
|
|
|
lda #0
|
|
sta CrnDatPtr
|
|
|
|
sta XClmPos
|
|
|
|
:Loop ldy #0
|
|
lda (CrnDatPtr),y
|
|
cmp #-1
|
|
beq :Done
|
|
|
|
sta ByteHld
|
|
and #$80
|
|
beq :ExpandOne
|
|
|
|
lda ByteHld
|
|
and #$7f
|
|
beq :NewCoord
|
|
|
|
tax
|
|
|
|
ldy #1
|
|
lda (CrnDatPtr),y
|
|
jsr ExpClmSeq1
|
|
|
|
clc
|
|
lda CrnDatPtr
|
|
adc #2
|
|
sta CrnDatPtr
|
|
bcc :a4
|
|
inc CrnDatPtr+1
|
|
:a4
|
|
jmp :Next
|
|
|
|
:NewCoord
|
|
ldy #1
|
|
lda (CrnDatPtr),y
|
|
sta XClmPos
|
|
|
|
ldy #2
|
|
lda (CrnDatPtr),y
|
|
sta YScrPos
|
|
|
|
clc
|
|
lda CrnDatPtr
|
|
adc #3
|
|
sta CrnDatPtr
|
|
bcc :a7
|
|
inc CrnDatPtr+1
|
|
:a7
|
|
jmp :Next
|
|
|
|
:ExpandOne
|
|
lda ByteHld
|
|
ldx #1
|
|
jsr ExpClmSeq1
|
|
|
|
inc CrnDatPtr
|
|
bne :sysi8
|
|
inc CrnDatPtr+1
|
|
:sysi8
|
|
|
|
:Next lda XClmPos
|
|
cmp #$80
|
|
bne :Loop
|
|
|
|
:Done sta RAMRDmain
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Expand Column
|
|
*
|
|
*-------------------------------
|
|
ExpandClm
|
|
|
|
:Loop ldy #0
|
|
lda (CrnDatPtr),y
|
|
sta ByteHld
|
|
and #$80
|
|
beq :ExpandOne
|
|
|
|
ldy #1
|
|
lda (CrnDatPtr),y
|
|
tax
|
|
lda ByteHld
|
|
and #$7f
|
|
jsr ExpClmSeq
|
|
|
|
clc
|
|
lda CrnDatPtr
|
|
adc #2
|
|
sta CrnDatPtr
|
|
bcc :a4
|
|
inc CrnDatPtr+1
|
|
:a4
|
|
jmp :Next
|
|
|
|
:ExpandOne
|
|
lda ByteHld
|
|
ldx #1
|
|
jsr ExpClmSeq
|
|
|
|
inc CrnDatPtr
|
|
bne :sysi5
|
|
inc CrnDatPtr+1
|
|
:sysi5
|
|
|
|
:Next lda YScrPos
|
|
cmp #192
|
|
bcc :Loop
|
|
|
|
rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Expand Column Sequence
|
|
*
|
|
*-------------------------------
|
|
*
|
|
* In: XClmPos
|
|
* YScrPos
|
|
* A (byte pattern)
|
|
* X (repeat count)
|
|
*
|
|
* Out: YScrPos (modified)
|
|
*
|
|
*-------------------------------
|
|
ExpClmSeq
|
|
sta ByteHld
|
|
stx RepeatCdn
|
|
|
|
:Loop ldx XClmPos
|
|
ldy YScrPos
|
|
lda ByteHld
|
|
jsr PutScrByte
|
|
|
|
lda YScrPos
|
|
clc
|
|
adc #2
|
|
sta YScrPos
|
|
|
|
dec RepeatCdn
|
|
bne :Loop
|
|
|
|
rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Expand Column Sequence 1
|
|
*
|
|
*-------------------------------
|
|
ExpClmSeq1
|
|
sta ByteHld
|
|
stx RepeatCdn
|
|
|
|
:Loop ldx XClmPos
|
|
ldy YScrPos
|
|
lda ByteHld
|
|
bmi :Next
|
|
|
|
jsr PutScrByte
|
|
|
|
:Next inc YScrPos
|
|
|
|
lda YScrPos
|
|
cmp #192
|
|
bne :SkipXInc
|
|
|
|
lda #0
|
|
sta YScrPos
|
|
|
|
inc XClmPos
|
|
|
|
:SkipXInc
|
|
dec RepeatCdn
|
|
bne :Loop
|
|
|
|
rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Put DHires Byte Value
|
|
*
|
|
*-------------------------------
|
|
*
|
|
* In: X (XClmPos)
|
|
* Y (YScrPos)
|
|
* A (Byte value)
|
|
*
|
|
*-------------------------------
|
|
PutScrByte
|
|
sta ByteHld
|
|
;YScrPos in Y
|
|
lda YLO,y
|
|
sta ScrBasPtr
|
|
lda YHI,y
|
|
ora #$20 ;DHires page 1
|
|
sta ScrBasPtr+1
|
|
|
|
txa ;XClmPos in X
|
|
lsr
|
|
tay
|
|
bcs NoAuxSet
|
|
|
|
sta RAMWRTaux
|
|
|
|
NoAuxSet lda ByteHld
|
|
sta (ScrBasPtr),y
|
|
|
|
sta RAMWRTmain
|
|
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* P U R P L E
|
|
*
|
|
*-------------------------------
|
|
do ThreeFive
|
|
PURPLE rts
|
|
|
|
else
|
|
put purple
|
|
fin
|
|
|
|
*-------------------------------
|
|
*
|
|
* Delta Expand (Pop or Wipe)
|
|
*
|
|
* In: A = hi byte of crunched data address (in auxmem)
|
|
*
|
|
*-------------------------------
|
|
DELTAEXPPOP
|
|
sta PAGE2on
|
|
]DE jsr DeltaExp
|
|
sta PAGE2off
|
|
sta RAMRDaux
|
|
sta RAMWRTaux
|
|
]rts rts
|
|
|
|
DELTAEXPWIPE
|
|
sta PAGE2off
|
|
jmp ]DE
|
|
|
|
*-------------------------------
|
|
*
|
|
* Invert Y-tables
|
|
*
|
|
*-------------------------------
|
|
INVERTY
|
|
ldx #191 ;low line
|
|
ldy #0 ;high line
|
|
|
|
* Switch low & high lines
|
|
|
|
:loop lda YLO,x
|
|
pha
|
|
lda YLO,y
|
|
sta YLO,x
|
|
pla
|
|
sta YLO,y
|
|
|
|
lda YHI,x
|
|
pha
|
|
lda YHI,y
|
|
sta YHI,x
|
|
pla
|
|
sta YHI,y
|
|
|
|
* Move 1 line closer to ctr
|
|
|
|
dex
|
|
iny
|
|
cpy #96
|
|
bcc :loop
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Prompt user to insert correct disk side
|
|
*
|
|
*-------------------------------
|
|
do ThreeFive
|
|
msg1 asc " Insert Prince of Persia Disk@"
|
|
else
|
|
msg1 asc "Insert Prince of Persia Disk, Side "
|
|
fin
|
|
|
|
msg2 asc "C@"
|
|
|
|
*-------------------------------
|
|
PROMPT
|
|
lda #"A"
|
|
ldx BBundID
|
|
cpx #POPside1
|
|
beq :1
|
|
lda #"B"
|
|
:1 sta msg2 ;side A or B?
|
|
|
|
jsr blackout
|
|
|
|
sta RAMWRTmain
|
|
|
|
ldx #0
|
|
:loop lda msg1,x
|
|
cmp #"@"
|
|
beq :done
|
|
sta $528+2,x ;midscrn
|
|
inx
|
|
bpl :loop
|
|
|
|
:done sta RAMWRTaux
|
|
jsr whoop ;whoop spkr
|
|
|
|
:wloop lda $c000
|
|
ora $c061
|
|
ora $c062
|
|
bpl :wloop
|
|
sta $c010
|
|
|
|
jmp clr ;clear screen
|
|
|
|
*-------------------------------
|
|
CLR bit RWBANK2
|
|
bit RWBANK2
|
|
|
|
sta $c010
|
|
|
|
lda #" "
|
|
jmp _lrcls ;in hires
|
|
|
|
*-------------------------------
|
|
*
|
|
* Show black screen (text page 1)
|
|
*
|
|
*-------------------------------
|
|
BLACKOUT
|
|
jsr CLR
|
|
|
|
TEXT sta RAMRDaux
|
|
jsr vblank
|
|
sta TEXTon
|
|
sta ADCOLoff
|
|
sta PAGE2off
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
* Set dbl hires
|
|
*-------------------------------
|
|
SETDHIRES
|
|
sta RAMRDaux
|
|
sta RAMWRTaux
|
|
jsr vblank
|
|
sta ADCOLon
|
|
bit HIRESon
|
|
|
|
bit DHIRESon
|
|
bit DHIRESoff
|
|
bit DHIRESon
|
|
bit DHIRESoff
|
|
bit DHIRESon ;for old Apple RGB card
|
|
|
|
sta TEXToff
|
|
rts
|
|
|
|
**************************************************
|
|
**************************************************
|
|
**************************************************
|
|
xc
|
|
xc
|
|
|
|
stlx mac bank;addr
|
|
hex 9f
|
|
da ]2
|
|
db ]1
|
|
<<<
|
|
ldlx mac bank;addr
|
|
hex bf
|
|
da ]2
|
|
db ]1
|
|
<<<
|
|
|
|
*-------------------------------
|
|
*
|
|
* FADE IN
|
|
*
|
|
* In: s-hires data in $2000.9FFF
|
|
* A = 0 main, 1 aux
|
|
*
|
|
*-------------------------------
|
|
FADEIN
|
|
sta RAMRDmain
|
|
sta :sm1+2
|
|
sta :sm2+2
|
|
|
|
clc
|
|
xce
|
|
|
|
sep $30 ;axy
|
|
|
|
lda #%00011110
|
|
sta $C035 ;shadow reg
|
|
lda #$41
|
|
sta $C029 ;SH reg
|
|
|
|
rep $30 ;AXY
|
|
|
|
* Clear scan line control byte table
|
|
* and palette 0 to black
|
|
|
|
lda #$0000
|
|
ldx #$011E
|
|
:scbclr dex
|
|
dex
|
|
stlx $E1;$9D00
|
|
bne :scbclr
|
|
|
|
* Now move data over
|
|
|
|
ldx #$2000
|
|
ldy #$2000
|
|
lda #32000-1
|
|
phb
|
|
:sm1 mvn $E1,1 ;main/aux
|
|
plb
|
|
|
|
* Turn on Super Hires mode
|
|
|
|
sep $20
|
|
lda #$C1
|
|
sta $C029
|
|
rep $20
|
|
|
|
* Move desired palette over to PalFade area
|
|
|
|
ldx #$9D00 ;aux mem
|
|
ldy #new_palette
|
|
lda #32-1
|
|
phb
|
|
:sm2 mvn 0,1 ;aux to main/aux
|
|
plb
|
|
|
|
* Now fade in the picture
|
|
|
|
bra PalFade ;switches back to e-mode
|
|
|
|
*-------------------------------
|
|
*
|
|
* FADE OUT
|
|
*
|
|
*-------------------------------
|
|
FADEOUT
|
|
mx 3
|
|
|
|
* Clear the "destination" palette back to zero
|
|
|
|
ldx #31
|
|
lda #$00
|
|
:palclr sta new_palette,x
|
|
dex
|
|
bpl :palclr
|
|
|
|
* Now fade out
|
|
|
|
bra PalFade ;switches back to e-mode
|
|
|
|
*------------------------------------------------- PalFade
|
|
*
|
|
* Given current palette at $E19E00.1F, fade to
|
|
* new palette given in new_palette
|
|
*
|
|
|
|
new_palette ds 32
|
|
|
|
PalFade dum 0
|
|
:green ds 1
|
|
:blue ds 1
|
|
dend
|
|
|
|
sec
|
|
xce
|
|
|
|
bit $C019
|
|
bmi *-3
|
|
|
|
ldy #16
|
|
|
|
:fadein ldx #3
|
|
|
|
:fadein2 bit $C019
|
|
bpl *-3
|
|
|
|
bit $C019
|
|
bmi *-3
|
|
|
|
dex
|
|
bne :fadein2
|
|
|
|
ldx #30
|
|
:palloop ldlx $E1;$9E01
|
|
and #$0f
|
|
cmp new_palette+1,x
|
|
beq :red_ok
|
|
inc
|
|
blt :red_ok
|
|
dec
|
|
dec
|
|
|
|
:red_ok stlx $E1;$9E01
|
|
|
|
lda new_palette,x
|
|
and #$F0
|
|
sta :green
|
|
|
|
ldlx $E1;$9E00
|
|
and #$F0
|
|
cmp :green
|
|
beq :green_ok
|
|
blt :grn_add
|
|
sbc #$20
|
|
:grn_add clc
|
|
adc #$10
|
|
|
|
:green_ok sta :green
|
|
|
|
lda new_palette,x
|
|
and #$0F
|
|
sta :blue
|
|
|
|
ldlx $E1;$9E00
|
|
and #$0F
|
|
cmp :blue
|
|
beq :blue_ok
|
|
inc
|
|
blt :blue_ok
|
|
dec
|
|
dec
|
|
|
|
:blue_ok ora :green
|
|
stlx $E1;$9E00
|
|
|
|
dex
|
|
dex
|
|
bpl :palloop
|
|
|
|
dey
|
|
bpl :fadein
|
|
|
|
rts
|
|
|
|
xc off
|
|
mx 3
|
|
|
|
*===============================
|
|
*
|
|
* Load super hi-res data
|
|
*
|
|
*-------------------------------
|
|
LOADSUPER
|
|
jsr rw18
|
|
db ModID,$79 ;set "side C"
|
|
|
|
lda #0
|
|
sta track
|
|
sta RAMWRTmain
|
|
jsr loadscrn ;"Tracks" 0-6: palace (mainmem)
|
|
|
|
sta RAMWRTaux
|
|
jmp loadscrn ;"Tracks" 7-13: epilog (auxmem)
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load super hi-res screen into $2000.9FFF
|
|
*
|
|
*-------------------------------
|
|
loadscrn
|
|
lda #$20
|
|
:loop sta :sm
|
|
jsr rw18
|
|
db RdSeq.Inc
|
|
:sm db $20
|
|
lda :sm
|
|
clc
|
|
adc #$12
|
|
cmp #$9e
|
|
bcc :loop ;load 7 tracks
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
lst
|
|
eof ds 1
|
|
usr $a9,2,$a00,*-org
|
|
lst off
|