.Page ;++ ; ; Write Adr Field Subroutine ; ; (16 sector format) writes 27, 40-usec (10-bit) self-sync nibls, adr fields ; 16-sector start marks (0D5,0AA,096), Body (Track, Sector, Side, Volume, ; Checksum), end field marks, and the write turn off nibl. It then jumps to ; the "WrSync" code which will write the starting sync for the data field, ; write the data fields and then return to the caller. ;-- .Org 1200 WrSynTrK .Equ * ; Write a sync track before first track Ldy #00 ; 256 sync bytes * 6 to write (about 2 sectors) Beq WrAdr01 WAdr16 .Equ * Ldy FmtGap ; Default to 6*5 20 usec 'FF's WrAdr01 Bit IIob+Track ; Look for bit six Bvc $23 Lda #01 Ora IIob+Side Sta IIob+side ; set bit zero in side $23 Lda #1 ; flag for usage of AdrMk 1 & 2 Jsr Sync20 ; 6 10/10 Write sync fields Lda AdrMk3 ; 3 19 Last byte in starting bitslip Jsr WrNibl1 ; 6 Ldy #02 ; 2 $37 Ldx IIob+Side,y ; 4 Write Track, Sector, then Side Jsr WrByteX ; 6 Dey Bpl $37 Ldx FmtType ; 3 9 Format type Jsr WrByteX ; 6 13/6 Lda IIob+Track ; 3 9 Create Address Checksum Eor IIob+Sector ; 3 12 Eor IIob+Side ; 3 15 Eor FmtType ; 3 18 Jsr WrByte ; 6 24/6 Write the address checksum Lda AdrMk4 ; 3 9 Jsr WrNibl ; 6 Lda AdrMk5 ; 3 9 Last byte in address field Jsr WrNibl ; 6 Jsr ShtOff ; 6 16 Return to Sense mode Lda #ErrHdr ; 2 UnderRun during header Bcs WstTm ; 2,3 Abort upon error Jmp Write16 ; 3 Go & write data to disk WstTm Rts ; 6 10 .Page ;++ ; RdAdr ;-- RdAdr .Equ * Lda #0 Sta RangeL Lda #RdAdrTmt Sta RangeH Jsr SetRMode ; Setup PAL on Sony to read mode Lda Q6L ; Switch from SENSE to READ RdAsyn Inc RangeL ; 5 Bne RdAd1 ; 2,3 Dec RangeH ; 5 Beq RaErr1 ; 2,3 RdAd1 Ldx #00 $24 Lda Q7L ; 4... Bmi RdAsn1 ; 2,3 Valid if high bit = 1 Dex ; 2 Bne $24 ; 2,3 Loop 255 times = 85 bytes Beq RaErr1 ; 3 RdAsn1 Cmp AdrMk1 ; 2 Address mark 1? Bne RdAsyn ; 2,3 Branch if not RdAd2 Lda Q7L ; 4... Bpl RdAd2 ; 2,3 Cmp AdrMk2 ; 2... Address mark 2? Bne RdAsn1 ; 2,3 RdAd3 Lda Q7L ; 4... Bpl RdAd3 ; 2,3 Cmp AdrMk3 ; 2... Bne RdAsn1 ; 2,3 ; Marks read now read address ; Carry is set Ldx #AdrsLen ; 2 Lda #000 ; 2 Clear CSum Rfld Sta CSum ; 3 27 RdAd4 Ldy Q7L ; 4 Bpl RdAd4 ; 2 6 Do again if no valid data Lda DNibl,y ; 4 12 Unpack the data Sta CsmFnd,X ; 4 16 Store in FOUND table Eor CSum ; 3 19 Update the checksum Dex ; 2 21 Next field Bpl Rfld ; 2,3 24 Loop until "x" become negative Tax ; 2 If "CSum" = 0 then AOK Bne RaErr5 ; 2,3 No OK, signal on error ; Now compare against two final bytes and make sure at right track and sector RaSlp1 Lda Q7L ; 4... Bpl RaSlp1 ; 2,3 Cmp AdrMk4 ; 2... Bne RaErr2 ; 2,3 Lda #01 ; 2 Bit SdFnd ; 3 Beq RaSlp2 ; 2,3 Lda #40 Ora TrkFnd Sta TrkFnd RaSlp2 Lda Q7L ; 4... Bpl RaSlp2 ; 2,3 Cmp AdrMk5 ; 2... Bne RaErr2 ; 2,3 Lda IIob+Track ; 3 Cmp TrkFnd ; 2 Bne RaErr4 ; 2 Lda IIob+Sector ; 3 Cmp SecFnd ; 2 Bne RaErr3 ; 2 Clc ; 2... No error Lda VolFnd ; Load the disk ID value just read. Sta Iob+DiskID ; Tell host about what type of disk it is RaExit Clv ; Clear the overflow bit (previously used for FATAL) RaExit1 Lda Q6H ; Switch back from READ to SENSE Rts ; We abort upon seeing first error-no matter what it is. These all get reset ; on seeking (even micro stepping). RaErr1 Inc RaStrt ; Start bitslip error -- Fatal error Sec Bcs RaExit RaErr2 Inc RaEnd ; Ending bitslip error Sec Bcs RaExit RaErr5 Inc RaCSum ; Checksum error Sec Bcs RaExit RaErr4 Inc RaTrk ; Track error RaErr6 Sec Bcs RaExit