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