Commodore 1571 firmware
MFM Subroutines
.page
.subttl 'mfmsubr3.src'
; mfm verify for write operation
cmdele lda #3
sta bufpnt+1 ; buffer #0
ldy #0 ; even page
sty bufpnt
ldx mfmsiz_hi ; get sector high
lda cmdbuf+3 ; get track address
sta wdtrk ; give track to wd
lda cmdbuf+4 ; get sector address
sta wdsec ; give sector to wd
cmd_11 lda #$88 ; read sector command
jsr strtwd ; send cmd
WDTEST ; chk address
c_1100 lda wdstat ; get a byte
and #3
lsr a
bcc c_1101
and #1
beq c_1100 ; byte ready
lda wddat ; get a byte from wd
cmp (bufpnt),y ; put it in the buffer
bne c_1101 ; flag error
cpy mfmsiz_lo ; done buffer
beq c_1102 ; next
iny
bne c_1100
c_1102 iny ; y=0
dex
c_1103 beq c_1104
inc bufpnt+1 ; next buffer
jmp c_1100
c_1101 lda #$d0 ; abort wd1770
WDTEST ; chk address
sta wdstat ; send cmd
jsr jslowd ; wait 40 uS.
ldx #7
.byte skip2
c_1104 ldx #0
stx mfmcmd
jmp waitdn ; wait for the wd1770 to sleep
.page
; verify sector to fill byte
; track and sector must be setup previous
cmdtwv lda #3
sta bufpnt+1 ; buffer #1
ldy #0 ; even page
sty bufpnt
ldx mfmsiz_hi ; get sector high
cmd_12 lda #$88 ; read sector command
jsr strtwd ; send cmd
WDTEST ; chk address
c_1200 lda wdstat ; get a byte
and #3
lsr a
bcc c_1201
and #1
beq c_1200 ; byte ready
lda wddat ; get a byte from wd
cmp cmdbuf+10 ; same as fill byte ?
bne c_1201 ; br, on error
cpy mfmsiz_lo ; get lo sector size
beq c_1202
iny
bne c_1200 ; done ?
c_1202 iny
dex
c_1203 beq c_1204
inc bufpnt+1 ; next buffer
jmp c_1200
c_1201 lda #$d0 ; abort wd1770
WDTEST ; chk address
sta wdstat ; send cmd
jsr jslowd ; wait 40 uS.
ldx #7
.byte skip2
c_1204 ldx #0
stx mfmcmd
jmp waitdn ; wait for the wd1770 to sleep
.page
cmdthi php
sei
jsr cmdone ; track zero start
bit switch ; seek to n-track ?
bpl 1$
lda cmdbuf+3
sta cmd_trk ; goto this track
jsr seke
1$ lda #0
sta cpmsek ; clear # of sectors
jsr cmdfiv ; read address
ldx mfmcmd ; check status
cpx #2
bcs 2$
lda mfmhdr+2
sta cmd_sec ; this is where we stop
3$ jsr cmdfiv ; read address
lda mfmhdr+2 ; get next sector
ldy cpmsek
sta cmdbuf+11,y
inc cpmsek ; inc sector count
cpy #31 ; went too far ?
bcs 2$
cmp cmd_sec ; done yet ?
bne 3$ ; wait for rap...
lda mfmhdr ; get track
sta cmd_trk ; save for later
ldx #0
.byte skip2
2$ ldx #2
stx mfmcmd
plp
rts