 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,uboot

*
* 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
*-- Determine controller type
 sys systat,unistat
 lda unistat+1 must be version 11 or higher
 cmpa #11
 blo 50f must be XEBEC
 lda unistat+3
 beq 50f is XEBEC
*-- OMTI 20C controller
*-- Reformat info for OMTI Assign Disk Parameters command
 ldy #DCtbl
 ldd ,y++ get # cylinders
 subd #1
 std DP_cyls
 lda ,y+ get # heads
 deca
 sta DP_heads
 ldd ,y++ Reduced write
 ldd ,y++ Write precomp
 anda #$03
 stb DP_wsi
 sta DP_type
 tst ,y+ skip burst length
 lda IDCcmdSRT get seek rate
 anda #$07
 lsla
 ldx #seek_tbl
 leax a,x
 lda ,x+
 sta DP_width
 lda ,x+
 sta DP_period
 lda ,y+ get imbedded servo indicator
 beq 10f
 lda #%00110000
 ora DP_type
 sta DP_type
10 ldy #O_boot
 bra 60f
*-- XEBEC SA1410 controller
50 ldy #X_boot
60 leau 512,y
 ldx #uboot
65 ldd ,y++
 std ,x++
 pshs u
 cmpy ,s++
 bne 65b
99 puls d,x,y,u,pc return

*
* Seek table - Used to translate Xebec seeks to OMTI
*
seek_tbl equ *
 fcb $09,$3C 0
 fcb $09,$3C 1
 fcb $09,$3C 2
 fcb $09,$3C 3
 fcb $02,$04 4
 fcb $02,$00 5
 fcb $02,$00 6
 fcb $02,$00 7


*
* 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

 bss
unistat rmb 8
uboot rmb 512

 end
