 opt nol
 lib sysdef
 opt lis
 ttl UniFLEX Disk Formatter
 sttl Pennywise DMFP-58 Floppy Diskette
 pag

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

*
ILF_FD equ 2 Interleave factor for Floppy Diskettes
ILF_HD equ 8 Interleave factor for Winchesters

*
* setDP - set up disk parameters
*
setDP pshs d,x,y,u save registers
 ldx diskindex check disk type
 cmpx #HD_DNT yes - Floppy or Hard Disk
 bhs 10f jump for Hard Disk
 lda #ILF_FD set up interleave factor
 sta ILF
 lda disktype+1 get Floppy type (SS, SD, DS, or DD)
 anda #$0F strip "side bits valid" bits
 lsla
 adda disktype
 lsla ** Word index
 ldx #FDtab pick up appropriate entry
 ldy a,x
 bra 20f
10 lda #ILF_HD set up interleave factor
 sta ILF
 ldd N_CYL get number of cylinders
 subd #1
 std HD_cyl
 ldb N_HD+1 get number of heads
 decb
 stb HD_hd
 lda disktype+1 get seek rate value
 pshs a
 lsra
 lsra
 lsra
 lsra
 puls b
 bitb #$04 Buffered seeks allowed?
 beq 15f
 ora #$80 yes - set flag
15 sta HD_srt set seek rate
 ldy #HD set Hard Disk Device Characteristics table
20 ldx #DCT copy characteristics into bootstrap
 ldb #15 length of table
25 lda ,y+
 sta ,x+
 decb
 bne 25b
 puls d,x,y,u,pc return

*
* format
*
* Format disk
*

format
 ldd #0 set up track #
 std track
 sta track+2
 std head current head #
 std cyl current cylinder #
 ldd N_ST get number of sectors / track
 stb fmt_sec set up format buffer
10 lda track end of volume?
 cmpa VOLCNT
 bne 20f
 ldd track+1
 cmpd VOLCNT+1
 lbeq 99f end of volume - all done
20 ldd track+1 get track
 std wsk2+1 save in call
 lda track
 sta wsk2
 ldd head calculate sector map
 std r0+2
 ldd N_ST
 std r1+2
 ldd #0
 std r0
 std r1
 jsr lmul
 lda r0+3 get starting sector #
 ldb N_ST+1 # sectors on track
 ldx #seclist
25 inca
 sta ,x+ update sector map
 decb
 bne 25b
 ldx #seclist perform interleaving
 ldy #secmap
 clrb interleaved sector offset
 lda N_ST+1 sectors on track
 pshs a
26 lda ,x+ move sector #
 sta b,y
 addb ILF adjust by interleaving factor
 cmpb N_ST+1 adjust MOD sectors on track
 blo 27f
 subb N_ST+1
 lda N_ST+1 odd # sectors on track
 lsra
 bcs 27f yes - don't adjust
 incb
27 dec 0,s end of map?
 bne 26b
 leas 1,s clean up stack
 ldx work copy format info into a "solid" buffer
 stx wfmtbuf0 set up system call block
 ldy #fmtbuf
 ldb #FT_SIZ
29 lda ,y+
 sta ,x+
 decb
 bne 29b
 ldd dfd get file desc
 sys ind,wsk do seek
 ldd dfd get file desc
 sys ind,wfmtbuf issue "format track" call
 bec 30f jump if no errors
 jsr setbtk determine bad track #
 bra 40f
30 ldd track+1 bump track #
 addd N_ST
 std track+1
 lda track
 adca #0
 sta track
40 ldd head bump current head #
 addd #1
 cmpd N_HD last head on cylinder?
 beq 42f
 std head
 lbra 10b
42 ldd #0 reset head counter
 std head
 ldd cyl bump cylinder counter
 addd #1
 std cyl
 lbra 10b
99 rts

*
* setbtk - Mark an entire track bad
*
setbtk pshs d,x,y,u save registers
 ldd N_ST get sectors/track
10 pshs d save count
 jsr setbsc mark block bad
 ldd track+1 bump block #
 addd #1
 std track+1
 lda track
 adca #0
 sta track
 puls d update count
 subd #1
 bne 10b
99 puls d,x,y,u,pc return

 data

head fdb 0 current head
cyl fdb 0 current cylinder
dev fcc '/dev/fdc0',0
 rzb 32-(*-dev)
blkdev fcc '/dev/fd0',0
 rzb 32-(*-blkdev)

 lib DNT
*
* 8" Diskette Parameters
*
NUMCYLS equ 77 Cylinders / Side
SD_ST equ 8 Sectors / Track
DD_ST equ 16 Sectors / Track
*
*  8" Floppy Diskette Parameters
*
DNT equ * Device Name Table
 fcc 'FD-SS   '
 fdb NUMCYLS Cylinders
 fdb 1 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 0,0 disk type
 fdb 0 Additional space
 fcc 'FD-SD   '
 fdb NUMCYLS Cylinders
 fdb 1 Heads
 fdb DD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 1,0 disk type
 fdb 0 Additional space
 fcc 'FD-DS   '
 fdb NUMCYLS Cylinders
 fdb 2 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 0,$11 disk type
 fdb 0 Additional space
 fcc 'FD-DD   '
 fdb NUMCYLS Cylinders
 fdb 2 Heads
 fdb DD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 1,$11 disk type
 fdb 0 Additional space

HD_DNT equ *
 lib winchesters

DNTend equ *
*
ILF fcb 0 Interleave factor
seclist rzb 32 space for raw sector list
*
fmtbuf
fmt_sec fcb 0 Number of sectors on track
 fcb 2 Sector length = 512 bytes
 fcb 1 Set FLEX links
 fcb 0 Sector fill character
 fdb 0 Last link
secmap fcb 1,2,3,4,5,6,7,8
       fcb 9,10,11,12,13,14,15,16
 rzb 32-(*-fmtbuf)
FT_SIZ equ 32 Magic Number for Format Track
*
wfmtbuf fcb write
wfmtbuf0 fdb 0 Buffer address (work)
 fdb FT_SIZ
*
FD_SS fcb 0,0,15,35,0,2,0,76,0,0,8,16,0,$50,2
FD_SD fcb 0,0,15,35,0,2,0,76,0,1,8,16,1,$50,2
FD_DS fcb 0,0,15,35,0,2,0,76,1,0,8,16,0,$50,2
FD_DD fcb 0,0,15,35,0,2,0,76,1,1,8,16,1,$50,2
*
FDtab fdb FD_SS Single Sided/Single Density
      fdb FD_SD Single Sided/Double Density
      fdb FD_DS Double Sided/Single Density
      fdb FD_DD Double Sided/Double Density
*
HD    fcb 2,0,0,0
HD_srt fcb $86 Seek Rate
 fcb 2
HD_cyl fdb 305 Max Cyl #
HD_hd fcb 5 Max Head #
 fcb 0,17,17,0,$50,2
 end
