Prince-of-Persia-Apple-II/03 Disk Protection/YELLOW.MAIN.S

292 lines
3.7 KiB
ArmAsm
Executable File

* yellow.main
lst off
* The job of this routine is to
* set the high-bit of $7C in aux zpage.
* (It does it by rotating in a carry set)
slot = $fd
lastrack = $ff
*-------------------------------------------------
*
* HLS APPLE COPY PROTECTION
* COPYRIGHT (C) 1987 HLS DUPLICATION
*
* Modified by Roland Gustafsson 8/25/89
* for Prince of Persia copy protection.
*
*-------------------------------------------------
OBJSCT = $07 ;PHYSICAL SECTOR #
* ZERO PAGE
HDRC = $30
HDRS = HDRC+1
HDRT = HDRC+2
HDRV = HDRC+3 HEADER SECTOR
LSRETRY = HDRC+4 ;NIB READ RETRIES
PRETRY = HDRC+5 ;OBJSCT RETRIES
NPTR = HDRC+6
NPTRH = HDRC+7
MEM1 = HDRC+8
MEM2 = HDRC+9
zpage = HDRC
zpagelen = 33 ;arbitrarily long (only needs 10)
*-------------------------------------------------
* Jordan says: use $A400-ABFF
* Roland says: OK
orgCHECK = $AAAA ;must be highbyte=lowbyte
org $2000
da lenCHECK
dum $A4A4
zpagebuf ds zpagelen
was27 ds 3 ;should be 1 !!!
was2A ds 5 ; ditto
was26 ds 7 ; ditto again
dend
org orgCHECK
*-------------------------------------------------
start sta $C008 ;switch to main zpage
ldx slot
lda $C089,x ;drive on
jsr swapzpage
* First seek track zero
lda #0
jsr SEEK
* Now check signature
lda #10
sta LSRETRY
ldx slot
lda $C08E,X
lda #>:NIBS
sta NPTRH
lda #:NIBS
sta NPTR
:AGAIN lda #$80
sta PRETRY
:M1 dec PRETRY
beq :LSFAIL
jsr RADR16
bcs :LSFAIL
lda HDRS
cmp #OBJSCT
bne :M1
ldy #0
:M2 lda $C08C,X
bpl :M2
dey
beq :LSFAIL
cmp #$D5
bne :M2
ldy #0
:M3 lda $C08C,X
bpl :M3
dey
beq :LSFAIL
cmp #$E7
bne :M3
:M4 lda $C08C,X
bpl :M4
cmp #$E7
bne :LSFAIL
:M5 lda $C08C,X
bpl :M5
cmp #$E7
bne :LSFAIL
lda $C08D,X
ldy #$10
bit $6 ;3 US. ( FOR //C)
:M6 lda $C08C,X
bpl :M6
dey
beq :LSFAIL
cmp #$EE
bne :M6
* NOW AT 1/2 NIBBLES
ldy #7
:M7 lda $C08C,X * READ DISK DATA
bpl :M7
cmp (NPTR),Y * COMPARE AGAINST TABLE
bne :LSFAIL
dey
bpl :M7
bmi :GOOD
:LSFAIL jmp :LSFAIL1
* A O K
:GOOD jsr swapzpage
sta $C009-zpagelen,x
ror $7C-zpagelen,x
clc
rts
* FAILED
:LSFAIL1 dec LSRETRY
beq :ERROR
jmp :AGAIN
:NIBS db $FC,$EE,$EE,$FC
db $E7,$EE,$FC,$E7
:ERROR jsr swapzpage
sta $C009-zpagelen,x
rts
*-------------------------------------------------
*
* Read address mark
*
RADR16 ldy #$FD
sty MEM1
:RA1 iny
bne :RA2
inc MEM1
beq :RAEXIT
:RA2 lda $C08C,X
bpl :RA2
:RA3 cmp #$D5
bne :RA1
nop
:RA4 lda $C08C,X
bpl :RA4
cmp #$AA
bne :RA3
ldy #3
:RA5 lda $C08C,X
bpl :RA5
cmp #$96
bne :RA3
lda #0
:RA6 sta MEM2
:RA7 lda $C08C,X
bpl :RA7
rol
sta MEM1
:RA8 lda $C08C,X
bpl :RA8
and MEM1
sta HDRC,Y
eor MEM2
dey
bpl :RA6
tay
nop
clc
rts
:RAEXIT sec
rts
*-------------------------------------------------
*
* SEEK, a - track
*
SEEK4 lda #4
SEEK sta was2A
cmp lastrack
beq :RTS0
lda #0
sta was26
:MOVEHEAD lda lastrack
sta was27
sec
sbc was2A
beq :ISTHERE
bcs :T0
eor #$FF
inc lastrack
bcc :T1
:T0 adc #$FE
dec lastrack
:T1 cmp was26
bcc :T2
lda was26
:T2 cmp #$C
bcs :T3
tay
:T3 sec
jsr :CHKPOS
lda ONTBL,Y
jsr :MSWAIT
lda was27
clc
jsr :CHKPOS2
lda OFFTBL,Y
jsr :MSWAIT
inc was26
bne :MOVEHEAD
:ISTHERE jsr :MSWAIT
clc
:CHKPOS lda lastrack
:CHKPOS2 and #3
rol
ora slot
tax
lda $C080,X
ldx slot
:RTS0 rts
:MSWAIT ldx #$12
:T21 dex
bne :T21
sec
sbc #1
bne :MSWAIT
rts
*-------------------------------------------------
swapzpage ldx #0
:0 ldy zpagebuf,x
lda zpage,x
sty zpage,x
sta zpagebuf,x
inx
cpx #zpagelen
bne :0
rts
*-------------------------------------------------
ONTBL db $01,$30,$28,$24,$20,$1E,$1D,$1C,$1C,$1C,$1C,$1C
OFFTBL db $70,$2C,$26,$22,$1F,$1E,$1D,$1C,$1C,$1C,$1C,$1C,$FF,$03
*-------------------------------------------------
lenCHECK = *-orgCHECK
org
*------------------------------------------------- EOF
sav yellow.main