.Page ;++ ; Write16 ; ; $10 Ldx Q6L ; 1 1 Assume worst case ; Bpl $10 ; 3 4 branch taken ; Ldx Q6L ; 4 8 bit will be set ; Bpl $10 ; 2 10 fall thru ; Sta Q6H ; 4 14 put the data into reg ; 31 cycles max after bit is set before UnderRun bit is set. Using above code ; as start of time critical code, ; total time = ((32-14)+31) = 49 cycles ;-- .Page .Org 1A00 Write16 .Equ * Ldx IIob+Sector Lda Nibl,x Sta Sv4 Ldy #0 ; No speed check bytes Sty InxPtrH Tya ; Flag will tell Sync20 to use data mark fields Iny ; Write only one set of self_sync bytes Jsr Sync20 ; 6 6 Turn on write circuitry & write self-sync bytes Ldy #0F4 ; 2 8 Lda #0AD ; 2 10 Last byte of header field Bne Pg1x ; 3 13 Pg1 .Equ * ; Code to write out las 12 bytes of page #1 Stx Sv4 ; 3 Pg1x Ldx Q6L ; 4 17 Bpl Pg1x ; 2,3 19/20 Sta Q6H ; 4 14 Worst case possible Ldx Page01+2,y ; 4 18 Lda Nibl,x ; 4 22 Sta Sv3 ; 3 25 Txa ; 2 27 Lsr A ; 2 29 Lsr A ; 2 31 Sta Temp1 ; 3 34 Ldx Page01+1,y ; 4 38 Lda Nibl,x ; 4 42 Sta Sv2 ; 3 45 Txa ; 2 47 And #0C0 ; 2 49 Ora Temp1 ; 3 52 Lsr A ; 2 54 Ldx Sv4 ; 3 57 61-14 = 47 Stx Q6H ; 4 61 Write last byte of previous loop Lsr A ; 2 2 Sta Temp1 ; 3 5 Lda Page01,y ; 4 9 And #0C0 ; 2 11 Ora Temp1 ; 3 14 Lsr A ; 2 16 Lsr A ; 2 18 Tax ; 2 20 Lda Nibl,x ; 4 24 Sta Q6H ; 4 28 Ldx Page01,y ; 4 4 Iny ; 2 6 Iny ; 2 8 Lda Nibl,x ; 2 12 $15 Ldx Q6L ; 4 16 Bpl $15 ; 2,3 18 Sta Q6H ; 4 22 Lda Sv2 ; 3 3 Second byte of loop Ldx Sv3 ; 3 6 Third byte Iny ; 2 8 Bne Pg1 ; 2,3 10 Fetch rest of 12 bytes ; fall thru $|& start on Page #2 ;++ ; ;-- Pg2 .Equ * ; Code to write out first 255 bytes of Page #2 Stx Sv4 ; 3 $40 Ldx Q6L ; 4 Bpl $40 ; 2,3 Sta Q6H ; 4 14 Worst case possible Ldx Page02,y ; 4 18 Lda Nibl,x ; 4 22 Sta Sv3 ; 3 25 Txa ; 2 27 Lsr A ; 2 29 Lsr A ; 2 31 Sta Temp1 ; 3 34 Ldx Page02+1,y ; 4 38 Lda Nibl,x ; 4 42 Sta Sv2 ; 3 45 Txa ; 2 47 And #0C0 ; 2 49 Ora Temp1 ; 3 52 Lsr A ; 2 54 Ldx Sv4 ; 3 57 61-14=47 Stx Q6H ; 4 61 Write out last byte of previous loop Lsr A ; 2 2 Sta Temp1 ; 3 5 Lda Page02,y ; 4 9 And #0C0 ; 2 11 Ora Temp1 ; 3 14 Lsr A ; 2 16 Lsr A ; 2 18 Tax ; 2 20 Lda Nibl,x ; 4 24 Sta Q6H ; 4 28 Ldx Page02 ; 4 4 Iny ; 2 6 Iny ; 2 8 Lda Nibl,x ; 4 12 $55 Ldx Q6L ; 4 16 Bpl $55 ; 2,3 18 Sta Q6H ; 4 22 Lda Sv2 ; 3 3 Second byte of loop Ldx Sv3 ; 3 6 Third byte Iny ; 2 8 Cpy #Pg2Len ; 2 10 Bne Pg2 ; 2,3 12 Fetch rest of 255 bytes Jsr WrAX ; 6 26/6 Write Nibls in A and X Lda Page03 ; 4 10 Lda Nibl,x ; 4 14 Sta Sv4 ; 3 17 Lda CpBy01 ; 3 20 Jsr WrNibl ; 6 26/6 Ldy #02 ; 2 8 For use in Pg3 Ldx Page02+0FF ; 4 12 Jsr WrByteX ; 6 18/6 Ldx Page03 ; 4 10 Lda Nibl,x ; 4 14 Bne Pg3x ; 3 17 WrAX .Equ * ; Write nibls that are in A & X (Sv3) Jsr WrNibl ; 6 32/6 Lda Sv3 ; 3 9 Jmp WrNibl ; 3 12/6 ;++ ; ;-- WrByte .Equ * ; Nibbize byte in A-reg before starting Tax ; 2 WrByteX .Equ * ; Use byte in X-reg Lda Nibl,x ; 4 WrNibl .Equ * ; Wait for handshake bit, then write data in A-reg Ldx Q6L ; 4 Bpl WrNibl ; 2,3 Sta Q6H ; 4 Rts ; 6 .Align 0100 Pg3 .Equ * ; Code to write out first 254 bytes of page #3 Stx Sv4 ; 3 Pg3x Ldx Q6L ; 4 Bpl Pg3x ; 2,3 Sta Q6H ; 4 14 Ldx Page03+2,y ; 4 18 Lda Nibl,x ; 4 22 Sta Sv3 ; 3 25 Txa ; 2 27 Lsr A ; 2 29 Lsr A ; 2 31 Sta Temp1 ; 3 34 Ldx Page03 ; 4 38 Lda Nibl,x ; 4 42 Sta Sv2 ; 3 45 Txa ; 2 47 And #0C0 ; 2 49 Ora Temp1 ; 3 52 Lsr A ; 2 54 Ldx Sv4 ; 3 57 61-14 = 47 Stx Q6H ; 4 61 Write last byte of previous loop Lsr A ; 2 2 Sta Temp1 ; 3 5 Lda Page03 ; 4 9 And #0C0 ; 2 11 Ora Temp1 ; 3 14 Lsr A ; 2 16 Lsr A ; 2 18 Tax ; 2 20 Lda Nibl,x ; 4 24 Sta Q6H ; 4 28 Composite of 3 bytes Ldx Page03,y ; 4 4 Iny ; 2 6 Iny ; 2 8 Lda Nibl,x ; 4 12 $85 Ldx Q6L ; 4 16 Bpl $85 ; 2,3 18 Sta Q6H ; 4 22 Lda Sv2 ; 3 3 Second byte of loop Ldx Sv3 ; 3 6 Third loop Iny ; 2 8 Cpy #Pg3Len ; 2 10 Bne Pg3 ; 2,3 12 Fetch rest of 254 bytes Jsr WrAX ; 6 26/6 Write Nibls in A & X (Sv3) Ldx Page03+0FF ; 4 10 Lda Nibl,x ; 4 14 Sta Sv3 ; 3 17 Lda CpBy02 ; 3 20 Jsr WrNibl ; 6 26/6 Ldx Page03+0FE ; 4 10 Lda Nibl,x ; 4 14 Jsr WrAX ; 6 20/6 Ldy #Cksum1 ; 2 8 Absolute addr of 3 cksum bytes Sty InxPtrL ; 3 11 Lda CpCkSum ; 3 14 $95 Ldx Q6L ; 4 18 Bpl $95 ; 2,3 20 Sta Q6H ; 4 24 Ldy #0 ; 2 2 $99 Lda @InxPtrL,y ; 6 8 Jsr WrByte ; 3 11/6 Iny ; 2 8 Cpy #3 ; 2 10 Bne $99 ; 2,3 12 ; Fall thru & write final bitslip marks & end Lda DatMk4 ; 3 Jsr WrNibl ; 6 Lda DatMk5 ; 3 Jsr WrNibl ; 6 ShtOff .Equ * ; Write 2 bitslip and return /WrUnderRun Lda #0FF ; 2 Jsr WrNibl ; 6 Jsr WrNibl ; 6 Clc ; 2 Lda Q6L ; 4 Bit6 = UnderRun bit And #40 ; 2 Leave only bit 6 Bne $38 ; 2,3 If = 1 then no underrun occurred Lda #ErrWrt ; Obscure error code # Sec ; 2 $38 Sta Q6H ; 4 Put into write load state Ldx Q7L ; 4 Now into write protect - Sense state Rts ; 6