;------------------------------- ; ReadSector ; high-level function to read a single sector. ; in: gIsProtDOS is TRUE or FALSE ; if gProtDOS is FALSE, callrwts+2 has been set to ; the RWTS entry point (e.g. $BD or $3D) ; out: all registers clobbered ; C clear if read was successful ; C set if read failed ;------------------------------- ReadSector lda #$AA ; lots of custom RWTS routines sta $31 ; need these zero page locations lda #$AD ; set to magic values sta $4E lda gIsProtDOS beq _protread setuprwts ldy #gRWTSParams callrwts jsr $FF00 ; modified at runtime (see Inspect1) bcc endread lda gOnAClearDayYouCanReadForever beq setuprwts endread rts ; ; "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. ; !zone { _protread lda gTrack ; T02,S05+ use "protected" mode cmp #$03 ; (altered data prologue and bcs .protected ; nibble translate table) cmp #$02 ; T00,S00 - T02,S04 use bcc .standard ; "standard" mode lda gSector cmp #$05 bcs .protected .standard lda #$9B sta $BF2C bne .go ; unconditional branch .protected lda #$B5 sta $4E lda #$D5 sta $BF2C ; execution falls through here .go lda #gRWTSParams jsr $BA00 ; note non-standard entry point bcc endprotread lda gOnAClearDayYouCanReadForever beq .go endprotread rts } gRWTSParams ; used to read each sector !byte $01,$60,$01,$00 gTrack !byte $00 gSector !byte $00 !word dct gAddress !word $1F00 !byte $00,$00,$01,$00,$FE,$60,$01,$00,$00 dct !byte $00,$01,$EF,$D8,$00