![[Contents]](/images/blue_toc.gif) 
 ![[Commodore]](/images/blue_cbm.gif) 
 ![[New]](/images/blue_new.gif) 
![[Search]](/images/blue_search.gif) 
![[Home]](/images/blue_home.gif) 
Commodore 1571 firmware
    MFM Subroutines
        .page  
	.subttl 'mfmsubr1.src'
; format track
cmdsev  lda  #$f8	; write track
	jsr  strtwd	; send command
	bit  switch	; system 3 iso standard switch
	bvc  no_ind	; write index ?
	ldx  #80
	WDTEST		; chk address
2$      lda  wdstat
	and  #3
	lsr  a
	bcc  v6
	beq  2$
	lda  #$4e
	sta  wddat	; give him the data
	dex
	bne  2$
	ldx  #12
	WDTEST		; chk address
3$	lda  wdstat
	and  #3
	lsr  a
	bcc  v6
	beq  3$
	lda  #0
	sta  wddat
	dex
	bne  3$
	ldx  #3
	WDTEST		; chk address
4$	lda  wdstat
	and  #3
	lsr  a
	bcc  v6
	beq  4$
	lda  #$f6
	sta  wddat
	dex
	bne  4$
	WDTEST		; chk address
5$	lda  wdstat
	and  #3
	lsr  a
	bcc  v6
	beq  5$
	lda  #$fc
	sta  wddat
	ldx  #50
	WDTEST		; chk address
6$      lda  wdstat
	and  #3
	lsr  a
	bcc  v6
	beq  6$
	lda  #$4e
	sta  wddat	; give him the data
	dex
	bne  6$
	beq  inner	; bra... done...
no_ind	ldx  #60
	WDTEST		; chk address
cmd7    lda  wdstat
	and  #3
	lsr  a
v6	bcc  v1	
	beq  cmd7
	lda  #$4e
	sta  wddat	; give him the data
	dex
	bne  cmd7
inner	ldy  #1  	; ss
main7	ldx  #12
	WDTEST		; chk address
cmd70   lda  wdstat
	and  #3
	lsr  a
	bcc  v1	
	beq  cmd70
	lda  #0
	sta  wddat
	dex
	bne  cmd70
	ldx  #3
	WDTEST		; chk address
cmd71   lda  wdstat
	and  #3
	lsr  a
v1	bcc  v2	
	beq  cmd71
	lda  #$f5
	sta  wddat
	dex
	bne  cmd71
	WDTEST		; chk address
cmd7n   lda  wdstat
	and  #3
	lsr  a
	bcc  v2	
	beq  cmd7n
	lda  #$fe   	; id address mark
	sta  wddat
	WDTEST		; chk address
cmd7f   lda  wdstat
	and  #3
	lsr  a
	bcc  v2	
	beq  cmd7f
	lda  mfmcmd	; give him the track
	sta  wddat
	WDTEST		; chk address
cmd7e   lda  wdstat
	and  #3
	lsr  a
	bcc  v2	
	beq  cmd7e
	
	lda  switch
	and  #%00010000 ; what side are we on ?
	bne  1$
	lda  #0
	.byte skip2
1$	lda  #1
	sta  wddat	; side number is ...
	
	WDTEST		; chk address
cmd7d   lda  wdstat
	and  #3
	lsr  a
	bcc  v2	
	beq  cmd7d
	
	lda  cmdbuf+10,y ; sector number actually cmdbuf+11
	sta  wddat
	WDTEST		; chk address
cmd7c   lda  wdstat
	and  #3
	lsr  a
v2	bcc  v3
	beq  cmd7c
	lda  cmdbuf+5	; sz
	sta  wddat
	
	WDTEST		; chk address
cmd7b   lda  wdstat
	and  #3
	lsr  a
	bcc  v3
	beq  cmd7b
	lda  #$f7	; crc 2 bytes written
	sta  wddat
	ldx  #22
	WDTEST		; chk address
cmd72   lda  wdstat
	and  #3
	lsr  a
	bcc  v3
	beq  cmd72
	lda  #$4e
	sta  wddat
	dex
	bne  cmd72
	ldx  #12
	WDTEST		; chk address
cmd73   lda  wdstat
	and  #3
	lsr  a
v3	bcc  v4
	beq  cmd73
	lda  #0
	sta  wddat
	dex
	bne  cmd73
	ldx  #3
	WDTEST		; chk address
cmd74   lda  wdstat
	and  #3
	lsr  a
	bcc  v4
	beq  cmd74
	lda  #$f5	; a1
	sta  wddat
	dex
	bne  cmd74
	WDTEST		; chk address
cmd7a   lda  wdstat
	and  #3
	lsr  a
	bcc  v4
	beq  cmd7a
	lda  #$fb	; dam
	sta  wddat
	
	sty  temp	; save current sector
	ldy  mfmsiz_hi	; high
	WDTEST		; chk address
cmd750  lda  wdstat
	and  #3
	lsr  a
v4	bcc  v5
	beq  cmd750
	lda  cmdbuf+10  ; fl
	sta  wddat
	
	cpx  mfmsiz_lo
	beq  cmd75x
	inx		; increment
	jmp  cmd750
	
cmd75x	inx
	dey
	bne  cmd750
	WDTEST		; chk address
cmd7ff  lda  wdstat
	and  #3
	lsr  a
	bcc  v5
	beq  cmd7ff
	lda  #$f7	; crc
	sta  wddat
	
	ldy  cmdbuf+5	; ss
	lda  gapmfm,y
	ldy  temp	; sector restore
	tax
	WDTEST		; chk address
cmd7fe  lda  wdstat
	and  #3
	lsr  a
	bcc  v5
	beq  cmd7fe
	lda  #$4e	; gap 3
	sta  wddat
	dex
	bne  cmd7fe
	cpy  cmdbuf+7	; ns
	beq  finmfm
	iny		; inc sector
	jmp  main7
	WDTEST		; chk address
finmfm  lda  wdstat
	and  #3
	lsr  a
	bcc  vfin
	beq  finmfm
	clc
	lda  #$4e	; wait for wd to time out
	sta  wddat
	jmp  finmfm
vfin    jsr  waitdn	; wait for sleepy time
	clc		; good carry
        .byte skip1
v5     	sec
	rts
	; min gap size @2% fast
gapmfm 	.byte 7, 12, 23, 44 
	
numsek  .byte 26, 16, 9, 5
	.page
; format disk
;  0     1    2    3      4    5    6    7    8   9   10  + cmdbuf
;  ^     ^    ^    ^      ^    ^    ^    ^    ^   ^    ^
; "U" + $00 + N +  MD  + CP + SZ + LT + NS + ST + S + FL 
cmdeig  lda  switch	; check abort command switch
	and  #%00001000
	beq  1$
	ldx  ctl_dat	; get error
	stx  mfmcmd	; save for prcmd
	sec		; wp error usually
	rts
1$	jsr  clrchn	; close all channels
	lda  cmdsiz	; setup default parms
	sec
	sbc  #4		; less mandatory + 1
	tay
	beq  cp00	; mode only, gave cp
	
	dey
	beq  sz00	; md, cp only, gave sz
	lda  #0
	sta  mfmcmd	; clear status
	lda  cmdbuf+5
	jsr  consek	; setup sector size
	
	dey
	beq  lt00	; md, cp, sz only, gave lt
	dey
	beq  ns00	; md, cp, sz, lt only, gave ns
	
	dey
 	beq  st00       ; md, cp, sz, lt, ns only, gave st
	dey
	beq  s00        ; md, cp, sz, lt, ns, st only, gave s
	dey
	beq  fl00	; md, cp, sz, lt, ns, st, ss only, gave fl
	jmp  start8
	.page
cp00	lda  #0		; default interleave
	sta  cmdbuf+4	
sz00	lda  #0
	sta  mfmcmd	; clear status
	lda  #1		; 256 byte sectors
	sta  cmdbuf+5
	jsr  consek	; setup block size
lt00	lda  #39	; last track is #39, 40 tracks total
	sta  cmdbuf+6
ns00	lda  numsek,x	; x=sector size index for # of sectors per track
	sta  cmdbuf+7
st00	lda  #0		; default track #0 start
	sta  cmdbuf+8
	sta  wdtrk
s00	lda  #0		; default steps from track 00
	sta  cmdbuf+9
fl00	lda  #$e5	; default block fill
	sta  cmdbuf+10
	.page
start8  jsr  go_fmt	; format side zero
	lda  mfmcmd	; error ?
	cpx  #2
	bcs  1$
	lda  switch	; check for double sided opt
	and  #%00100000
	beq  1$
	lda  switch	; set single side
	ora  #%00010000
	sta  switch
	jsr  sel_sid	; selectw
	jsr  go_fmt	; format side one
1$	jmp  cmdone	; restore
	.page
go_fmt	jsr  diskin	; is there a diskette in the unit
	bcs  c_801	; br, nope...
	lda  #1	
	sta  ifr1	; clear irq from write protect
	jsr  cmdone     ; restore to track ozero ?
	lda  cmdbuf+8   ; store logical
	sta  mfmcmd	; in mfmcmd
	sta  wdtrk
	bit  cmdbuf+3	; check table bit
	bvs  1$		; br, table has been given to us
	jsr  sectcv	; generate sector table
	bcs  c_801
1$	lda  cmdbuf+9	; offset track 00 by s steps
	and  #$7f	; clear mode bit
	beq  c_800
	clc
	adc  cmd_trk	; add to it	
	sta  cmd_trk	; physical
	jsr  seke	; & seek to it
c_800	sei
	lda  ifr1	; check for disk change
	lsr  a
	bcs  c_801
	jsr  cmdsev     ; format track
        bcs  c_801      
	lda  ifr1	; check for disk change
	lsr  a
	bcs  c_801
	jsr  verfmt	; verify format 
        bcs  c_801      
	lda  ifr1	; check for disk change
	lsr  a
	bcs  c_801
        lda  mfmcmd	; last track ?
        cmp  cmdbuf+6   ; lt
        beq  c_802      
        inc  cmd_trk
	inc  wdtrk
	inc  mfmcmd	; track to write
        jsr  seke       ; goto next track
        jmp  c_800
c_802   bit  switch
	bpl c_803	; kill next
	sec
	lda  cmdbuf+6	; lt
	sbc  cmdbuf+8	; st
	cmp  #39	; no more than 40 tracks
	bcs  c_803
	
	inc  cmd_trk	; clear next track
	jsr  seke
	ldx  #28
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
	jsr  ptch0d	; *** rom ds 01-13-87 ***,no SO
	nop
	nop
	nop		; fill
;	jsr  jclear	; with gcr 0
;	jsr  kill	; read mode again
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
c_803	ldx  #0
	.byte  skip2
c_801   ldx  #6
	stx  mfmcmd	; ok exit
	jmp  upinst
 ![[Contents]](/images/blue_toc.gif) 
 ![[Commodore]](/images/blue_cbm.gif) 
 ![[New]](/images/blue_new.gif) 
![[Search]](/images/blue_search.gif) 
![[Home]](/images/blue_home.gif)