 opt pag,nol
 lib sysdef
 ttl UniFLEX Disk Formatter
 sttl 8" Floppy Disk Format
 opt lis
 pag

*
* 8" Diskette Parameters
*
NUMCYLS equ 77 Cylinders / Side
SD_SIZ equ 5100 Single Density Size (bytes)
SD_ST equ 8 Sectors / Track
SD_GAP equ 86 Inter-sector gap
SD_SSZ equ 629 Sector + Header size
DD_SIZ equ 10200 Double Density Size (bytes)
DD_ST equ 16 Sectors / Track
DD_GAP equ 60 Inter-sector gap
DD_SSZ equ 632 Sector + Header size

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

*
* setDP - set up disk parameters
*
setDP pshs d,x,y,u save registers
 ldd disktype copy disk type information
 std dden
 std ubflgs copy for boot
 puls d,x,y,u,pc return

*
* format - Main entry point
*
format pshs d,x,y,u
 ldd work set up write track system call
 std w_addr
 tst dden double density format?
 bne 10f yes - jump
 ldd #SD_SIZ single density track size
 std w_size
 bsr frmsd no - single density format
 bra 99f
10 ldd #DD_SIZ double density track size
 std w_size
 bsr frmdd double density format
99 puls d,x,y,u,pc return

*
* frmsd
*
* Format single density.
*

frmsd lda #$ff set background pattern
 jsr setwrk fill buffer
 jsr frame set track frame
frmsd2 ldu #secmap point to sector map
 tst intopt interleave option?
 beq frmsd3
 ldu #dscmp2 set 2nd map
frmsd3 bsr ftrk setup track
 pshs u save sector map
 jsr sdwt write out track
 puls u reset map ptr
 tst dsid double sided?
 beq frmsd4
 inc sid2 set side 2
 bsr ftrk setup track
 jsr sdwt write track
 clr sid2 clear side
frmsd4 inc track bump track count
 lda track get track
 cmpa N_CYL+1 finished?
 bne frmsd2 no - continue
 rts return

*
* ftrk
*
* Set up track and sector info in track frame.
*

ftrk ldx secstr point to sector start
 leax 7,x point to track byte
 ldb #SD_ST set counter
ftrk2 lda track get track
 sta 0,x set in sector
 lda disktype+1 are side bits valid?
 bita #$10
 bne 05f yes - jump
 clra no - set side 0
 bra 10f
05 lda sid2 set side flag
10 sta 1,x
 lda 0,u+ get sector
 sta 2,x save in sector
 leax SD_SSZ,x bump to next sector
 decb dec the count
 bne ftrk2 repeat?
 rts return

*
* frmdd
*
* Format a double density disk.
*

frmdd lda #$4e set up background
 jsr setwrk
 jsr dframe set up track frame
frmdd2 ldu #dscmap point to sector map
 tst intopt interleave option?
 beq frmdd3
 ldu #dscmp2 set 2nd map
frmdd3 bsr dftrk do track
 pshs u save sec ptr
 jsr ddwt write track
 puls u
 tst dsid double sided?
 beq frmdd4
 inc sid2 set 2nd side
 bsr dftrk do track
 jsr ddwt write track
 clr sid2 set 1st side
frmdd4 inc track bump track count
 lda track get track
 cmpa N_CYL+1 finished?
 bne frmdd2
 rts return

*
* dftrk
*
* Set up track and sector info in track frame.
*

dftrk ldx secstr point to sector start
 leax 16,x point to track byte
 ldb #DD_ST set counter
dftrk2 lda track get track
 sta 0,x set in sector
 lda disktype+1 are side bits valid?
 bita #$10
 bne 05f yes - jump
 clra no - set side 0
 bra 10f
05 lda sid2 set side flag
10 sta 1,x
 lda 0,u+ get sector
 sta 2,x save in sector
 leax DD_SSZ,x bump to next sector
 decb dec the count
 bne dftrk2 repeat?
 rts return

*
* setwrk
*
* Set up work buffer with background byte in A.
*

setwrk pshs u,d save registers
 ldx work point to buffer
 ldd w_size get length of track
 leau d,x compute end of buffer
 ldd 0,s restore pattern
setwr2 sta 0,x+ store byte
 pshs u
 cmpx ,s++ end of buffer?
 bne setwr2
 puls d,u,pc return

*
* frame
*
* Setup track frame in work buffer (single density).
*

frame ldx work point to buffer
 leax 40,x setup header gap
 clra
 ldb #6
 bsr set put 6 0's
 lda #$fc set index mark
 sta 0,x+
 leax 26,x leave gap
 stx secstr save sector start pos
 ldb #SD_ST set sector count
 pshs b
frame4 bsr sec setup sector info
 dec 0,s dec the count
 bne frame4
 puls b,pc return

*
* sec
*
* Set up single density sector info.
*

sec clra
 ldb #6
 bsr set put 6 0's
 lda #$fe id address mark
 sta 0,x+
 clr 1,x 0 after track number
 leax 3,x skip track & sector
 lda #2 set sector size (512)
 sta 0,x+
 lda #$f7 set crc
 sta 0,x+
 leax 11,x leave gap
 ldb #6
 clra
 bsr set put 6 0's
 lda #$fb data address mark
 sta 0,x+
 jsr clsec zero out sector
 leax SD_GAP,x leave gap
 rts return

*
* set
*
* Write B bytes of A at X.
*

set sta 0,x+
 decb
 bne set finished?
 rts return

*
* dframe
*
* Set up double density track frame.
*

dframe ldx work point to buffer
 leax 16,x setup header gap
 clra
 ldb #12
 bsr set put 12 0's
 lda #$f6 synch bytes
 ldb #3
 bsr set
 lda #$fc index mark
 sta 0,x+
 leax 30,x leave gap
 stx secstr save sector start
 ldb #DD_ST set sector count
 pshs b
dfram4 bsr dsec setup sector
 dec 0,s finished?
 bne dfram4
 puls b,pc return

*
* dsec
*
* Setup double density sector.
*

dsec clra
 ldb #12
 bsr set put 12 0's
 ldb #3
 lda #$f5 set synch bytes
 bsr set
 lda #$fe set id address mark
 sta 0,x+
 clr 1,x zero byte after track
 leax 3,x skip track & sector info
 lda #2 set sector size (512)
 sta 0,x+
 lda #$f7 set crc
 sta 0,x+
 leax 22,x leave gap
 clra
 ldb #12
 bsr set put 12 0's
 lda #$f5 set synch bytes
 ldb #3
 bsr set
 lda #$fb data address mark
 sta 0,x+
 bsr clsec zero out sector data field
 leax DD_GAP,x leave gap
 rts return

*
* clsec
*
* Zero 512 bytes of sector data.
*

clsec clra set count (256)
 pshs a
 clrb set d=0
clsec2 std 0,x++ zero 2 bytes
 dec 0,s dec the count
 bne clsec2
 puls a reset stack
 lda #$f7 set crc
 sta 0,x+
 rts return

*
* write track routines
*

ddwt
sdwt bsr tseek seek to track
 ldd dfd get file desc
 sys ind,w_work write track
 rts return

*
* tseek
*
* Seek to track in track.
*

tseek lda track get track
 lsla shift it
 ora sid2 set side select
 sta wsk2+2 save in call
 ldd dfd get file desc
 sys ind,wsk do seek
 rts return

 data

secmap fcb 1,5,2,6,3,7,4,8,9,13,10,14,11,15,12,16
dscmap fcb 1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 fcb 32,17,25,18,26,19,27,20,28,21,29,22,30,23,31,24
dscmp2 fcb 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
 fcb 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32

siztab fdb 616,1232,1232,2464 ss-sd,ds-sd,ss-dd,ds-dd
 fdb 24,48,48,64 default fdn block counts

dev fcc '/dev/fdc1',0
 rzb 32-(*-dev)
blkdev fcc '/dev/fd1',0
 rzb 32-(*-blkdev)

dden rzb 1 density flag
dsid rzb 1 side flag
sid2 rzb 1 side indicator
secstr rzb 2 sector pointer
*
w_work fcb write write track routine
w_addr fdb 0 buffer address
w_size fdb 0 buffer size

 lib DNT

*
*  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,0,0 disk type
 fdb SD_SIZ 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,0,0 disk type
 fdb DD_SIZ Additional space
*******************************************
* Following are the same as XX+
*******************************************
 fcc 'FD-DS   '
 fdb NUMCYLS Cylinders
 fdb 2 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 0,$11,0,0 disk type
 fdb SD_SIZ 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,0,0 disk type
 fdb DD_SIZ Additional space
*******************************************
* Devices with valid side bits
 fcc 'FD-DS+  '
 fdb NUMCYLS Cylinders
 fdb 2 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 0,$11,0,0 disk type
 fdb SD_SIZ 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,0,0 disk type
 fdb DD_SIZ Additional space
DNTend equ *
 end
