 opt pag,nol
 lib sysdef
 ttl UniFLEX Disk Formatter
 sttl 5" Mini Floppy
 opt lis
 pag

*
*  5" Diskette Parameters
*
NUMCYLS equ 40 Cylinders / Side
SD_SIZ equ 3125 Single Density Size (bytes)
SD_ST equ 5 Sectors / Track
SD_GAP equ 45 Inter-sector gap
SD_SSZ equ 588 Sector + Header size
DD_SIZ equ 6250 Double Density Size (bytes)
DD_ST equ 10 Sectors / Track
DD_GAP equ 40 Inter-sector gap
DD_SSZ equ 612 Sector + Header size

* UniFLEX Disk Format Program

 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
 lda dden double density format?
 anda #$0F High bits indicate track density
 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
 pshs u save sector map
 bsr ftrk setup track
 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 all finished?
 bne frmsd2
 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 N_ST+1 set counter
ftrk2 lda track get track
 sta 0,x set in sector
 lda sid2 set up side number
 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 diskindex
 ldb DNTtype+3,u
 lslb
 ldu #int_maps select disk interleave
 ldu b,u
frmdd3 pshs u save sec ptr
 bsr dftrk do track
 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 N_ST+1 set counter
dftrk2 lda track get track
 sta 0,x set in sector
 lda sid2 set up side
 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 N_ST+1 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 N_ST+1 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,2,3,4,5,6,7,8
 fcb 9,10,11,12,13,14,15,16
dscmap 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
dscmp2 fcb 01,05,02,06,03,07,04,08

int_maps
 fdb map_none
 fdb map_08
 fdb map_09
*
map_none fcb 01,02,03,04,05,06,07,08,09,10
map_08   fcb 01,05,02,06,03,07,04,08
map_09   fcb 01,06,02,07,03,08,04,09,05

siztab fdb NUMCYLS*1*SD_ST ss-sd
 fdb NUMCYLS*2*SD_ST ds-sd
 fdb NUMCYLS*1*DD_ST ss-dd
 fdb NUMCYLS*2*DD_ST dd-dd
 fdb 8,16,16,22 default fdn block counts

dev fcc '/dev/fdc2',0
 rzb 32-(*-dev)
blkdev fcc '/dev/fd2',0
 rzb 32-(*-blkdev)

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

 lib DNT

*
*  5" 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
 fcc 'FD-DS   '
 fdb NUMCYLS Cylinders
 fdb 2 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb 0,1,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,1,0,0 disk type
 fdb DD_SIZ Additional space
 fcc 'FD-SS-77'
 fdb 77  Cylinders
 fdb 1 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $80,$80,0,0 disk type
 fdb SD_SIZ Additional space
 fcc 'FD-SD-77'
 fdb 77 Cylinders
 fdb 1 Heads
 fdb DD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $81,$80,0,0 disk type
 fdb DD_SIZ Additional space
 fcc 'FD-DS-77'
 fdb 77 Cylinders
 fdb 2 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $80,$81,0,0 disk type
 fdb SD_SIZ Additional space
 fcc 'FD-DD-77'
 fdb 77 Cylinders
 fdb 2 Heads
 fdb DD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $81,$81,0,0 disk type
 fdb DD_SIZ Additional space
 fcc 'FD-SS-80'
 fdb NUMCYLS*2  Cylinders
 fdb 1 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $80,$80,0,0 disk type
 fdb SD_SIZ Additional space
 fcc 'FD-SD-80'
 fdb NUMCYLS*2 Cylinders
 fdb 1 Heads
 fdb DD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $81,$80,0,0 disk type
 fdb DD_SIZ Additional space
 fcc 'FD-DS-80'
 fdb NUMCYLS*2 Cylinders
 fdb 2 Heads
 fdb SD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $80,$81,0,0 disk type
 fdb SD_SIZ Additional space
 fcc 'FD-DD-80'
 fdb NUMCYLS*2 Cylinders
 fdb 2 Heads
 fdb DD_ST Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $81,$81,0,0 disk type
 fdb DD_SIZ Additional space
 fcc 'Unix    '
 fdb 77 Cylinders
 fdb 2 Heads
 fdb 9 Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $82,$81,0,0 disk type
 fdb DD_SIZ Additional space
 fcc 'Pegasus '
 fdb 40 Cylinders
 fdb 2 Heads
 fdb 8 Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $03,$01,0,1 disk type
 fdb DD_SIZ Additional space
 fcc 'Tower   ' NCR 1632
 fdb 80 Cylinders
 fdb 2 Heads
 fdb 8 Sectors/Track
 fdb 0,0 Reduced write/Precomp
 fcb $83,$81,0,1 disk type
 fdb DD_SIZ Additional space
DNTend equ *
 end
