.Page ;++ ; ; NRead16 ; ; NRead16 assumes that the disk is spinning at the proper speed ; and the head is located at the proper Side/Track and that the header ; for the sector desired has already been found. First it will read in ; the beginning data marks, then the data, and finally the trailing data ; bytes. It will abort if the proper starting or ending sequence of ; data bytes is not found. ; ; REGISTERS ; IN ; All = Any value ; OUT ; All = Destroyed ; ;-- .Org 1800 .Page Read16 .Equ * Jsr SetRMode ; Setup PAL on Sony to read mode Jsr RDSynTop ; Read the sync nibbles Bcc $03 ; If bitslip marks found then carry = 0 Rts $03 Ldy #0F4 ; 2 15 First time only 12 bytes RdBF01 .Equ * Inc InxPtrH ; 5 28 Point to next page RdBF02 .Equ * Ldx Q7L ; 4 Bpl RdBF02 ; 2,3 Lda DNibl,x ; 4 10 Map from 8 bits ==> 6 bits Asl A ; 2 12 Asl A ; 2 14 Tax ; 2 16 Save temporarily Asl A ; 2 18 Asl A ; 2 20 Sta Temp1 ; 3 23 >BBCC0000< Txa ; 2 25 And #0C0 ; 2 27 >AA000000< $10 Ldx Q7l ; 4 Read low bits of byte A Bpl $10 ; 2,3 Ora DNibl,x ; 4 10 Combine low and high bits Sta @InxPtrL,y ; 6 16 Lda Temp1 ; 3 19 >BBCC0000< Iny ; 2 21 Bne $20 ; 2,3 23/24 Inc InxPtrH ; 5 28 Point to next page $20 Ldx Q7L ; 4 Read low bits of byte B Bpl $20 ; 2,3 And #0C0 ; 2 8 >BB000000< Ora DNibl,x ; 4 12 Add low & high bits Sta @InxPtr,y ; 6 18 Iny ; 2 20 Beq RdCSM01 ; 2/3 22/23 Lda Temp1 ; 3 24 >BBCC0000< Asl A ; 2 26 Asl A ; 2 28 $30 Ldx Q7L ; 4 Read low bits of byte C Bpl $30 ; 2,3 And #0C0 ; 2 8 >CC000000< Ora @DNibl,x ; 4 12 Add low and high bits Sta @InxPtr,y ; 6 18 Iny ; 2 20 Beq RdBF01 ; 2/3 22/23 Inc to next page if = 0 Bne RdBF02 ; 3 25 Branch always taken .Page RdCSM01 .Equ * ; Read 4 bytes of checksum Ldx Q7L ; 4 Bpl RdSCM01 ; 2,3 Lda DNibl,x ; 4 10 Map from 8 bits ==> 6 bits Asl A ; 2 12 Asl A ; 2 14 Tay ; 2 16 >AABBCC00< And #0C0 ; 2 18 >AA000000< $10 Ldx Q7L ; 4 Read low bits of byte A Bpl $10 ; 2,3 Ora Dnibl,x ; 4 10 Add low and high bits Sta Cksum1 ; 3 13 Tya ; 2 15 Asl A ; 2 17 Asl A ; 2 19 Tay ; 2 21 >BBCC0000< And #0C0 ; 2 23 >BB000000< $20 Ldx Q7L ; 4 Read low bits of byte B Bpl $20 ; 2,3 Ora DNibl,x ; 4 10 Add high and low bits Sta Cksum2 ; 3 13 Tya ; 5 15 Asl A ; 2 17 Asl A ; 2 19 >CC000000< $30 Ldx Q7L ; 4 Read low bits of byte C Bpl $30 ; 2,3 Ora DNibl,x ; 4 10 Combine low and high bits Sta Cksum3 ; 3 13 Rd9 Lda Q7L ; 4 Check bitslip mark 1 Bpl Rd9 ; 2,3 Cmp DatMk4 ; 3 Bne BSErr ; 2,3 Rd10 Lda Q7L ; 4 Check bitslip mark 2 Bpl Rd10 ; 2,3 Cmp DatMk5 ; 3 Bne BSErr ; 2,3 Clc RdExit Lda Q6H ; Sense mode RdWaste Rts .Page BSErr Inc BSCnt ; Trailing bitslip mark & error counter Sec Bcs RdExit ; Return to Sense mode & exit CSErr Inc CsErr ; Checksum error counter RdErr Sec Bcs RdExit RdErr2 Inc StSlp ; Starting bitslip error count Sec Bcs RdExit RdSynTop .Equ * ; Starting to read starting bitslip marks Lda Q6L ; Subroutine to read starting bitslip marks Ldx #000 ; Switch from sense to read mode Ldy #NiblRetr ; No. of retries allowed for bitslip read RSync Dey Beq RdErr2 RS1 Lda Q7L ; 4 Bpl RS1 ; 2,3 6 RSync1 Cmp DatMk1 ; 3 9 Data mark 1 Bne RSync ; 2,3 11,12 Stx InxptrL ; 3 14 RS2 Lda Q7L ; 4 Bpl RS2 ; 2,3 6 Cmp DatMk2 ; 3 9 Data mark 2 Bne RSync1 ; 2,3 11,12 Stx InxptrH ; 3 14 RS3 Lda Q7L ; 4 Bpl RS3 ; 2,3 6 Cmp DatMk3 ; 3 9 Data mark 3 Bne RSync1 ; 2,3 11,12 Clc ; 2 13 RS4 Lda Q7l ; 4 Read sector number ( unchecked ) Bpl RS4 ; 2,3 6 Rts ; Back to caller