 opt nol
 lib sysdef
 lib DNT
 opt lis
 ttl UniFLEX Disk Formatter
 sttl 5" Winchester Format
 pag

 text
 global blkdev,dev,DNT,DNTend,format,setDP

*
* setDP - set up disk parameters
*
setDP pshs d,x,y,u save registers
 ldd N_CYL set up Boot
 std DCtbl
 ldd BRW
 std DCtbl+3
 ldd BWP
 std DCtbl+5
 ldd N_HD set up Boot
 stb DCtbl+2
 ldx diskindex compute seek rate control byte
 lda DNTtype+1,x -- seek rate indicator
 anda #$0F
 ora DNTtype+2,x -- imbedded servo indicator
 sta RSScmdSRT set up boot I/O commands
 sta IDCcmdSRT
 sta RDScmdSRT
 puls d,x,y,u,pc return

*
* format
*
* Format disk
*

format
 ldd #0 set up track #
 std track
 sta track+2
10 lda track end of volume?
 cmpa VOLCNT
 bne 20f
 ldd track+1
 cmpd VOLCNT+1
 beq 99f end of volume - all done
20 ldd track+1 get track
 std wsk2+1 save in call
 lda track
 sta wsk2
 ldd dfd get file desc
 sys ind,wsk do seek
 ldd dfd get file desc
 sys write,secmap,FD_SIZE write track
 bec 99f no error - move to next track
 bsr findbtk determine bad track #
 bra 10b
99 rts

*
* findbtk - determine bad track #
*
findbtk pshs d,x,y,u save registers
 ldd dfd get file descriptor
 sys ttyget,errbuf get error status
 lda errbuf+3 get track high byte
 anda #$0F strip out drive number
 sta track
 ldd errbuf+4 get track low word
 std track+1
*
* Now, mark all blocks in sector bad
*
 ldd N_ST get sectors/track
10 pshs d
 jsr setbsc mark block as bad
 ldd track+1 bump block #
 addd #1
 std track+1
 lda track
 adca #0
 sta track
 puls d pop count
 subd #1
 bne 10b continue until no more
 puls d,x,y,u,pc return

 data

dev fcc '/dev/hdc0',0
 rzb 32-(*-dev)
blkdev fcc '/dev/hd0',0
 rzb 32-(*-blkdev)

*
errbuf rzb 6 error buffer

DNT equ *
 lib winchesters
DNTend equ *
*
secmap
 fcb 0,$01
 fcb 0,$0A
 fcb 0,$02
 fcb 0,$0B
 fcb 0,$03
 fcb 0,$0C
 fcb 0,$04
 fcb 0,$0D
 fcb 0,$05
 fcb 0,$0E
 fcb 0,$06
 fcb 0,$0F
 fcb 0,$07
 fcb 0,$10
 fcb 0,$08
 fcb 0,$11
 fcb 0,$09
FT_SIZE equ *-secmap Magic Number for Format Track
FD_SIZE equ 17 Magic Number for Format Drive
 end
