*---------------------------------
* DOS 3.3 DISASSEMBLY $BD00-BEAE
* BOB SANDER-CEDERLOF 3-3-81
*---------------------------------
CURRENT.TRACK .EQ $478
DRIVE.1.TRACK .EQ $478 THRU 47F (INDEX BY SLOT)
DRIVE.2.TRACK .EQ $4F8 THRU 4FF (INDEX BY SLOT)
SEARCH.COUNT .EQ $4F8
RETRY.COUNT .EQ $578
SLOT .EQ $5F8
SEEK.COUNT .EQ $6F8
*---------------------------------
PHASE.OFF .EQ $C080
PHASE.ON .EQ $C081
MOTOR.OFF .EQ $C088
MOTOR.ON .EQ $C089
ENABLE.DRIVE.1 .EQ $C08A
ENABLE.DRIVE.2 .EQ $C08B
Q6L .EQ $C08C
Q6H .EQ $C08D
Q7L .EQ $C08E
Q7H .EQ $C08F
*---------------------------------
SECTOR .EQ $2D
TRACK .EQ $2A
VOLUME .EQ $2F
DRIVE.NO .EQ $35
TMP_TRACK .EQ $44
PRE_LENGTH .EQ $45
DCT.PNTR .EQ $3C,3D
BUF.PNTR .EQ $3E,3F
MOTOR.TIME .EQ $46,47
IOB.PNTR .EQ $48,49
*---------------------------------

*---------------------------------
ERR.WRITE.PROTECT .EQ $10
ERR.WRONG.VOLUME .EQ $20
ERR.BAD.DRIVE .EQ $40
*---------------------------------

*---------------------------------
FORMAT
*---------------------------------
LDY #$03
LDA (IOB.PTR),Y
STA $41
LDA #$AA
STA BUF.PNTR
*---------------------------------
* clear buffers (255 + 86bytes) to all zeros
*---------------------------------
LDY #$56       ; nibblized sector is 86 + 256 bytes
LDA #$00       ; sector data defaults to 0x0 (0x96 nibblized)
* start at track 0
STA TMP_TRACK  ; start up track zero
FORMAT.1       ; first 86 bytes
STA BUF_BBFF,Y ; initialize data buffer to all zeros
DEY
BNE FORMAT.1
FORMAT.2       ; now other 256 bytes to zero
STA BUF_BB00,Y
DEY
BNE FORMAT.2

LDA #$50
JSR SETUP.TRACK
LDA #$28       ; default to 40 0xffs preamble
STA PRE_LENGTH
FORMAT.NEXT.TRACK
LDA TMP_TRACK
JSR SEEK.TRACK
JSR FORMAT.TRACk
LDA #$08
BCS FORMAT.ERR ; format error if carry set, branch to report and exit
*
* verify that we can read sector 0
*
LDA #$30       ; now read back track
STA RETRY.COUNT ; initialize retry count to 48
FORMAT.RETRY
DEC RETRY.COUNT
BEQ FORMAT.ERR ; too many errors, exit
JSR READ.ADDRESS    ; read next sector address
BCS FORMAT.RETRY ; error, try again
LDA SECTOR     ;
BNE FORMAT.RETRY ; not sector 0, try again
JSR READ.SECTOR ; read data
BCS FORMAT.RETRY ; bad read, retry
INC TMP_TRACK  ; good read - go to next track
LDA TMP_TRACK
CMP #$23       ; track 35 is last track
BCC FORMAT.NEXT.TRACK
CLC ; done - indicate success
BCC FORMAT.DONE
*
* format failure
*
FORMAT.ERR
LDY #$0D
STA ($48),Y
SEC
FORMAT.DONE
LDA $C088,X turn off drive
RTS
*
* FORMAT'S and VERIFY'S SINGLE TRACK
*
FORMAT.TRACK
LDA #$00
STA BUF.PTR.L  ; save current sector
LDY #$80       ; 128 byte preamble, first sector
BNE FORMAT.TRK.1
FORMAT.NXT
LDY PRE_LENGTH ; usual preamble for sectors 1-15
FORMAT.TRK.1
JSR WRITE.ADDRESS   ; write sector address
BCS FORMAT.RET ; if error, return err
JSR WRITE.DATA ; write sector data
BCS FORMAT.RET ; if error, return err
INC BUF.PTR.L  ; next sector
LDA BUF.PTR.L
CMP #$10 ; 16 sectors
BCC FORMAT.NXT

* initialize sector valid map
LDY #$0F
STY BUF.PTR.L
LDA #$30
STA RETRY.COUNT
FORMAT.STO.NXT
STA SECTORMAP,Y
DEY
BPL FORMAT.STO.NXT

*
* after writing all sectors, delay depending upon preamble length
*
LDY PRE_LENGTH
* each loop time is 50 cycles (microseconds)
* so this delay varies from
* 50 * 40 = 2000 micro sec or 2 milliseconds
* 50 * 5 = 250 micro sec or .25 milliseconds
* depending upon preamble length
* one complete rotation is 200 milliseconds
* one byte time is 32 microseconds
* 250/32 = 7.8 byte times
* 2000/32 = 62.5 byte times
*
FORMAT.DELAY
JSR FORMAT.RET ;delay    12
JSR FORMAT.RET ;delay    12
JSR FORMAT.RET ;delay    12  
PHA      ;3  
PLA      ;4
NOP      ;2
DEY      ;2
BNE FORMAT.DELAY    ;3/2

*
* read next sector - should be sector zero
* verify track - adjusting preamble size if we cant fit track
*
JSR READ.ADDRESS         ; read next sector we encounter
BCS FORMAT.VFY.RA        ; error, try again
LDA SECTOR          ; what sector did we read?
BEQ FORMAT.VFY.RA.1 ; branch if sector zero to read data
*
* if first sector read and is not sector zero, reduce preamble, and try again
*
LDA #$10
CMP PRE_LENGTH      ; preamble size >16?
LDA PRE_LENGTH      ;
SBC #$01            ; reduce preamble length by 1 or 2 depending on current size
STA PRE_LENGTH      ; save new preamble length
CMP #$05            ; preamble too small, disk is too fast, report error
BCS FORMAT.VFY.FAIL ; rewrite track after waiting for last sector to go by
SEC            ; disk is spinning too fast
RTS            ; return with error
*
* read all sectors
*
FORMAT.VFY.RA
JSR READ.ADDRESS
BCS FORMAT.VFY.RA.ERR    ; error, retry
FORMAT.VFY.RA.1
JSR READ.SECTOR          ; read sector data
BCC FORMAT.GOODREAD ; good read
*
* address read error
*
FORMAT.VFY.RA.ERR
DEC RETRY.COUNT          ; retry
BNE FORMAT.VFY.RA        ; unless exceeded retry count
*
* error, try writing track again at same location
* in order to locate,
* try read address field of last sector, 255 times
* before returning
*
FORMAT.VFY.FAIL
JSR READ.ADDRESS         ; try again
BCS FORMAT.VFY.FAIL.1    ; branch, error
LDA SECTOR          ; good read
CMP #$0F            ; sector 15?
BNE FORMAT.VFY.FAIL.1    ; no, keep looking

JSR READ.SECTOR          ; yes read data
BCC FORMAT.TRACK         ; good read, start over on this track
* decrement retry count
FORMAT.VFY.FAIL.1
DEC RETRY.COUNT
BNE FORMAT.VFY.FAIL
SEC            ; error, exhausted retrys
FORMAT.RET
RTS
*
* good read - update sector map
*
FORMAT.GOODREAD
LDY SECTOR
LDA SECTORMAP,Y
BMI FORMAT.VFY.RA.2 ; we read this sector already - try again
LDA #$FF            ; indicate good sector in sectormap
STA SECTORMAP,Y
*
*
*
DEC BUF.PTR.L       ; count down number of sectors read
BPL FORMAT.VFY.RA        ; if all not read, continue

LDA TMP_TRACK       ; only adjust preamble if currently track zero
BNE FORMAT.XX.3
*
* reduce preamble length by 2, if greater than 16, and moving off of track 0
* tracks 1-35 have preamble 2 bytes smaller than track 0
*
LDA PRE_LENGTH
CMP #$10
BCC FORMAT.RET      ; return success
DEC PRE_LENGTH ; reduce preamble length by 2 for tracks 1-35
DEC PRE_LENGTH
FORMAT.XX.3
CLC            ; no error, return success
RTS

     .ORG BFA8
SECTORMAP: .db  16

.BS $BFB8-*

PHYSICAL.SECTOR.VECTOR

.HS 000D0B09070503010E0C0A080604020F