Prince-of-Persia-Apple-II/02 POP Disk Routines/RW1835/MOVE35.S

307 lines
3.6 KiB
ArmAsm
Raw Normal View History

2012-04-17 07:23:12 +00:00
lst off
org $E00
errcode = 0
get8bit = $E74C
buffer = $1000 ;7 tracks long
bufferend = buffer+$7E00
rw18 = $D000 ;both versions!
slot = $FD
track = $FE
lastrack = $FF
*-------------------------------------------------
*
* CALL RT - moves rw18 routines to their homes in aux mem
*
* CALL RT+3,<5.25" slot>,<BbundID>,<start track>,<end track>
* ,<3.5" slot>,<block offset>
*
jmp move
* Get DEST information:
start jsr get8bit
stx slot525
jsr get8bit
stx BbundID
jsr get8bit
stx track
jsr get8bit
inx
stx ENDtrack
* SOURCE information
jsr get8bit
stx slot35
jsr $DEBE ;get16bit
jsr $DD67
jsr $E752
sty Boffset
sta Boffset+1
* From now on we are using aux zpage and $D000
lda track
sta $C009
sta track
jsr recal525
loop lda track
pha
jsr read35
bcs :plarts
pla
sta track
jsr write525
bcs :rts
lda track
eor ENDtrack
bne loop
pha
:plarts pla
:rts lda #0
rol
sta $C008 ;back to main mem
sta errcode
bit $C081
rts
ENDtrack db $11
*------------------------------------------------- write525
*
* Write up to 7 tracks from 5.25" floppy.
*
write525 jsr prep525
* Drive on, delay 1 second
jsr rw18
db 0,1,10
* Write until buffer is empty or END track reached
lda #>buffer
:loop sta :writebuf
jsr rw18
db $45 ;auto-inc, writesequ
:writebuf db $11
bcs :error
lda :writebuf
jsr buffend?
bcc :loop
clc
:error php
jsr rw18
db 1 ;drive off
plp
rts
*------------------------------------------------- buffend?
*
* Have we reached the end of buffer, or ENDtrack?
* Enter: a - last buffer address
*
* Exit: cs - no more buffer, or ENDtrack reached
* cc - keep going, a=new buffer address
*
buffend? clc
adc #$12
cmp #>bufferend
bcs :rts
ldy track
cpy ENDtrack
:rts rts
*------------------------------------------------- prep525
*
* Prepare to use 5.25" RW18 routine
*
* Normal RW18 routine is in second bank of $D000
prep525 bit $C08B
bit $C08B
* Set slot of 5.25" drive
lda #$11
slot525 = *-1
asl
asl
asl
asl
sta slot
tax
* Turn off all phases
lda $C080,x
lda $C082,x
lda $C084,x
lda $C086,x
* Set Broderbund ID byte
jsr rw18
db 7
BbundID db $11
rts
*------------------------------------------------- recal525
*
* Recalibrate 5.25" floppy drive
*
recal525 jsr prep525
lda #$A0
sta lastrack
* Drive on
jsr rw18
db 0,1,3 ;.3 second delay
* Seek to track zero
lda track
pha
jsr rw18
db 2,0,0
pla
sta track
sta :track
* Now seek first track
jsr rw18
db 2,0
:track db $11
jsr rw18
db 1 ;drive off
rts
*------------------------------------------------- read35
*
* Read up to 7 tracks to 3.5" disk.
*
read35 jsr prep35
* Write until no more buffer, or ENDtrack is reached
lda #>buffer
:loop sta :readbuf
jsr rw18
db $43 ;auto-inc, writesequ
:readbuf db $11
bcs :error
lda :readbuf
jsr buffend?
bcc :loop
clc
:error rts
*------------------------------------------------- prep35
*
* Prepare to use 3.5" RW18 routine
*
* 3.5" RW18 routine is in first bank of $D000
prep35 bit $C083
bit $C083
* Set slot of 3.5" drive
lda #$11
slot35 = *-1
asl
asl
asl
asl
sta slot
tax
* Set offset into 3.5" disk
jsr rw18
db 8
Boffset da $1111
rts
*------------------------------------------------- move
*
* Move the RW18 routines to their respective homes.
*
* $1000 - 3.5" rw18 routine
* $2000 - 5.25" rw18 routine
*
move ldx #$83
lda #$10
jsr :0
ldx #$8B
lda #$20
:0 sta :source+2
lda #$D0
sta :dest+2
lda $C000,x
lda $C000,x
sta $C009 ;aux $D000
ldx #$10
ldy #0
:source lda $1000,y
:dest sta $D000,y
iny
bne :source
inc :source+2
inc :dest+2
dex
bne :source
sta $C008
bit $C081
rts
*------------------------------------------------- EOF