passport/src/rwts.a

236 lines
6.3 KiB
Plaintext
Raw Normal View History

2021-04-20 04:27:11 +00:00
gTrack !byte $00
gSector !byte $00
gRWTSParams
!byte $01,$60,$01,$00
_track !byte $00
_sector !byte $00
!word dct
gAddress !word $1F00
!byte $00,$00
gCommand !byte $01,$00,$FE,$60,$01,$00,$00
dct !byte $00,$01,$EF,$D8,$00
2017-01-08 03:35:35 +00:00
;-------------------------------
; ReadSector
; high-level function to read a single sector.
; in: gIsProtDOS is TRUE or FALSE
; if gProtDOS is FALSE, jCallRWTS has been set to
; the RWTS entry point (e.g. $BDxx or $3Dxx)
2017-01-08 03:35:35 +00:00
; out: all registers clobbered
; C clear if read was successful
; C set if read failed
;-------------------------------
ReadSectorXY
stx gTrack
sty gSector
2017-01-08 03:35:35 +00:00
ReadSector
;
; Lots of custom RWTS routines need these zero page locations
; set to magic values. Always the same values though!
;
lda #$AA
sta $31
lda #$AD
2017-01-08 03:35:35 +00:00
sta $4E
;
; Copy requested track and sector into RWTS parameter table.
; These are maintained outside the table because some disks
; alter the values from inside the RWTS. (MUSE)
;
lda gTrack
sta _track
lda gSector
sta _sector
2017-01-08 03:35:35 +00:00
lda gIsProtDOS
beq _protread
2021-04-20 04:27:11 +00:00
@go
2017-01-08 03:35:35 +00:00
ldy #<gRWTSParams
lda #>gRWTSParams
jsr jCallRWTS
2021-04-20 04:27:11 +00:00
bcc +
lda gOnAClearDayYouCanReadForever
2021-04-20 04:27:11 +00:00
beq @go
+ rts
2017-01-08 03:35:35 +00:00
;
; "Protected.DOS" has enough differences that we just
; split everything out here. The hi/lo RWTS parameter
; table address is set in A/Y instead of Y/A. The
; RWTS entry point is $BA00. The third data prologue
; nibble is stored in zp$4E and varies based on track
; and sector.
;
_protread
lda gTrack ; T02,S05+ use "protected" mode
cmp #$03 ; (altered data prologue and
2021-04-20 04:27:11 +00:00
bcs @protected ; nibble translate table)
2017-01-08 03:35:35 +00:00
cmp #$02 ; T00,S00 - T02,S04 use
2021-04-20 04:27:11 +00:00
bcc @standard ; "standard" mode
2017-01-08 03:35:35 +00:00
lda gSector
cmp #$05
2021-04-20 04:27:11 +00:00
bcs @protected
@standard
2017-01-08 03:35:35 +00:00
lda #$9B
sta $BF2C
2021-04-20 04:27:11 +00:00
bne @go ; unconditional branch
@protected
2017-01-08 03:35:35 +00:00
lda #$B5
sta $4E
lda #$D5
sta $BF2C ; execution falls through here
2021-04-20 04:27:11 +00:00
@go lda #<gRWTSParams
2017-01-08 03:35:35 +00:00
ldy #>gRWTSParams
jsr $BA00 ; note non-standard entry point
2021-04-20 04:27:11 +00:00
bcc +
lda gOnAClearDayYouCanReadForever
2021-04-20 04:27:11 +00:00
beq @go
+ rts
2017-01-08 03:35:35 +00:00
;-------------------------------
; PreReadSector
; in: A contains sector map code that specifies what to do
; out: A contains (possibly new) sector map code
; assume all other things clobbered
;-------------------------------
PreReadSector
cmp #kSectorResetAdaptiveRWTS
2021-04-20 03:48:41 +00:00
beq @reset
cmp #kSectorIgnoreAddressChecksum
2020-07-22 23:01:07 +00:00
beq IgnoreAddressChecksum
cmp #kSectorCustomDOS32B4BB
2021-04-20 03:48:41 +00:00
beq @b4bb
cmp #kSectorCustomEarthware
beq @earthware
rts
2021-04-20 03:48:41 +00:00
@reset
jsr CopyUniversal
lda #kSectorRequired
rts
2021-04-20 03:48:41 +00:00
@b4bb
ldx jCallRWTS+2
dex
dex
dex
dex
2021-04-20 03:48:41 +00:00
stx @a+2
stx @b+2
ldx #$D5
2021-04-20 03:48:41 +00:00
@a stx $FF76
ldx #$ED
2021-04-20 03:48:41 +00:00
@b stx $FFB2
rts
@earthware
ldx #$4C
stx $B8F6
ldx #$89
stx $B8F7
ldx #$B6
stx $B8F8
rts
IgnoreAddressChecksum
; out: A,Y preserved
; X clobbered
ldx #$00
stx $B98A
rts
2021-04-20 03:48:41 +00:00
;-------------------------------
; ChangeTrack
; in: A = new track
;-------------------------------
ChangeTrack
2021-04-20 04:27:11 +00:00
sta @new+1
2021-04-20 03:48:41 +00:00
jsr WriteTrack
2021-04-20 04:27:11 +00:00
@new lda #$d1 ; modified at runtime
2021-04-20 03:48:41 +00:00
; note: execution falls through here
2021-04-20 03:48:41 +00:00
ChangeTrackNW ; "N"o "W"rite
sta gTrack
jsr ClearTSBuffer
rts
2021-04-20 03:48:41 +00:00
;-------------------------------
; ChangeSector
; in: A = new sector
;-------------------------------
ChangeSector
sta gSector
clc
adc #BASEPAGE
sta gAddress+1
2020-07-22 23:01:07 +00:00
rts
2021-04-20 03:48:41 +00:00
;-------------------------------
; WriteTrack
; in: none
;-------------------------------
WriteTrack
jsr AnalyzeTrack
WriteTrackNA ; entry point used by Special Delivery tracer
; to write track with 'N'o 'A'nalysis
bit gMode
bpl @exit ; don't write anything in verify mode
lda gSaidWriting
beq @doTheWriteThing ; only print 'writing to' message once
; we haven't yet printed any 'writing to...' message in the log, so
; figure out what that should look like and do it now
lda #s_writingto
jsr PrintByID
lda gHardDiskRef
beq @maybeWritingToRAMDisk
; we are writing to a file on a hard disk, so print the
; full pathname of that file
jsr PrintHardDiskImagePath
bvc @doneSaidWriting ; always branches
@maybeWritingToRAMDisk
lda gRAMDiskRef
beq @notWritingToRAMDisk
lda #s_ramdisk ; writing to (a file on) a RAM disk
!byte $2C
@notWritingToRAMDisk
lda #s_slotanddrive ; writing to a slot and drive
jsr PrintByID
2021-04-20 03:48:41 +00:00
@doneSaidWriting
lda #TRUE
2021-04-20 03:48:41 +00:00
sta gSaidWriting
2021-04-20 03:48:41 +00:00
@doTheWriteThing
jsr SwapProDOS ; ProDOS out -> in
jsr WriteTrackFirstPass
jsr SwapProDOS ; ProDOS in -> out
bcs FatalWriteError
@exit rts
;-------------------------------
; FatalWriteError
2021-04-20 04:27:11 +00:00
; in: A has MLI error code
2021-04-20 03:48:41 +00:00
; out: does not return, exits via TheEnd
;-------------------------------
FatalWriteError
2021-04-20 04:27:11 +00:00
sta gDisplayBytes
2021-04-20 03:48:41 +00:00
tax
lda #s_writeioerr
cpx #MLI_IOERR
2021-04-20 04:27:11 +00:00
beq @print
2021-04-20 03:48:41 +00:00
lda #s_writenodev
cpx #MLI_NODEV
2021-04-20 04:27:11 +00:00
beq @print
2021-04-20 03:48:41 +00:00
lda #s_writeprot
cpx #MLI_WRITEPROT
2021-04-20 04:27:11 +00:00
beq @print
2021-04-20 03:48:41 +00:00
lda #s_othermli
2021-04-20 04:27:11 +00:00
@print pha
2021-04-20 03:48:41 +00:00
lda #s_writeerr
jsr PrintByID
pla
jsr PrintByID
jmp TheEnd