home *** CD-ROM | disk | FTP | other *** search
- ;bput"format.src"
- ;rput"format.src"
- ;+++++++++++++++++++++++++++++++++
- ;+ initialize the hard disk +
- ;+ +
- ;+ interfaces with the bios for +
- ;+ hard drive.... +
- ;+++++++++++++++++++++++++++++++++
- ;
- read = $7000 ;equates for bios
- write = read+3
- reset = read+6
- setprm = read+9
- recal = read+12
- seek = read+15
- tdredy = read+18 ;test drive ready
- sbdiag = read+21 ;sector buf diag
- drdiag = read+24 ;drive diags
- ctdiag = read+27 ;controller diags
- fbadtk = read+30 ;format bad trk
- fmttrk = read+33 ;format track
- fmtdrv = read+36 ;format drive
- retprm = read+39 ;return parms
- ;input - a = drive number
- ;output - a = # heads
- ; x = msb #cyls
- ; y = lsb #cyls
- rdlong = read+42
- readsb = read+45
- wrlong = read+48
- writsb = read+51
- verify = read+54
- dcbptr = read+57 ;pointer to dcb
- * = $6000
- start = * ;begin format
- lda #0 ;clear the buffers
- tay
- clearbadsector sta badsectors,y
- sta badsectors+256,y
- sta badsectors+512,y
- sta badsectors+768,y
- sta rdbuf,y
- sta rdbuf+256,y
- sta wrtbuf,y
- sta wrtbuf+256,y
- iny
- bne clearbadsector
- lda #4 ;2 times # sectors for bad sectors
- sta badsectorctr
- lda #<headingmsg ;clear screen,etc
- jsr writeoutamsg
- lda dcbptr
- sta ptr1
- sta ptrx
- sta dcbptrforget
- lda dcbptr+1
- sta ptr2 ;address the dcb
- sta ptrx+1
- sta dcbptrforget+1
- lda #0 ;set up for drive 0
- jsr putdcbdrive ;set up drive 0
- jsr reset
- bcc resetisok ;go if no error
- lda #<reseterrormsg ;issue msg
- jsr writeoutamsg
- brk
- resetisok lda #0 ;restore drive 0
- jsr putdcbdrive
- jsr putdcbmsbsectr ;set sector
- jsr putdcbcyllsb ;and cyl
- lda #11 ;interleave, test shows 11 good
- jsr putdcbnumsecs
- lda #<buffer
- jsr putdcblobufptr
- lda #>buffer
- jsr putdcbhibufptr
- jsr retprm ;get the parms
- dey ;back down cylinders by 1
- bne savetheparms
- dex
- savetheparms stx cylmsb
- stx numcylinders ;save
- sty numcylinders+1
- sta numberofheads
- sty cyllsb
- lda #16 ;set sector number to max
- sta sector
- jsr cylinder2sectr ;convert
- ldx secnum ;move and prime
- lda secnum+1 ;for sector to sat
- ldy secnum+2 ;conversion
- stx totalsectors
- sta totalsectors+1
- sty totalsectors+2
- jsr sector2sat ;go convert
- lda satsec ;save for later
- sta lastsatsector
- lda satbyt
- sta lastsatbyte
- lda satbyt+1
- sta lastsatbyte+1
- lda satbit
- sta lastsatbit
- checklowlevel lda #<lowlevelmsg ;ask about lolevel
- jsr writeoutamsg
- lowlevelanswer jsr $ffe4
- jsr $ffd2
- cmp #'n' ;no low level
- beq setupcounters
- cmp #'y' ;do it?
- bne lowlevelanswer
- jsr fmtdrv ;low level it
- bcc setupcounters
- lda #<lowlevelerrmsg ;error msg
- jsr writeoutamsg
- brk
- setupcounters = *
- lda #0
- sta cylindercountr ;clear counters
- sta cylindercountr+1
- sta headcounter
- sta sectorcounter
- ldx #0
- fillbuffer txa
- sta wrtbuf,x
- sta wrtbuf+256,x
- inx
- bne fillbuffer
- lda #147
- jsr $ffd2
- lda #<intensivemsg ;what kind?
- jsr writeoutamsg
- intenseanswer jsr $ffe4 ;get answer
- cmp #'n' ;not intensive
- beq notintensive
- cmp #'y' ;yes?
- bne intenseanswer
- ldx #0
- .byt $2c
- notintensive ldx #$ff
- stx intensiveflag ;set mode flag
- jsr $ffd2
- formatdrive lda #5 ;clear retry counter
- sta wrtretrycountr
- sta rdretrycounter
- lda cylindercountr+1
- jsr hextoascii ;make printable
- sta $041e
- stx $041f
- lda cylindercountr
- jsr hextoascii
- sta $0420
- stx $0421
- lda #32
- sta $0422
- lda headcounter
- jsr hextoascii
- sta $0423
- stx $0424
- lda #32
- sta $0425
- lda sectorcounter
- jsr hextoascii
- sta $0426
- stx $0427
- jsr setupdcb ;set up dcb
- lda intensiveflag ;check for intense format
- bne bypasswrite ;bypass write
- lda #<wrtbuf
- jsr putdcblobufptr
- lda #>wrtbuf
- jsr putdcbhibufptr
- writeasector jsr write ;go write a block
- bcc bypasswrite
- jsr readthesense ;retrieve sense
- jsr writeoutsense
- jsr resetforretry ; set up for retry
- dec wrtretrycountr
- bne writeasector
- lda #<writeerrormsg ;write error
- jsr writeoutamsg
- jsr markbadsector ;mark as bad
- jmp ontonextsector ;go to next sector
- bypasswrite lda #<rdbuf
- jsr putdcblobufptr
- lda #>rdbuf
- jsr putdcbhibufptr
- readasector jsr read
- bcc isitintensive
- jsr readthesense ;retrieve sense
- jsr writeoutsense
- lda #<rderrormsg ;read error
- readretry pha ;save msg number
- jsr resetforretry ;set up for retry
- pla ;retrieve msg number
- dec rdretrycounter ;check for max num
- bne readasector
- jsr writeoutamsg
- jsr markbadsector
- jmp ontonextsector
- isitintensive lda intensiveflag ;check for instense
- bne ontonextsector ;bypass compare
- ldy #0 ;set up for compare
- comparesectors lda wrtbuf,y
- cmp rdbuf,y
- bne badcompare
- lda wrtbuf+256,y
- cmp rdbuf+256,y
- beq comparenext
- badcompare lda #<compareerrmsg
- bne readretry
- comparenext iny
- bne comparesectors
- ontonextsector ldx sectorcounter ;check sector
- inx
- cpx #17
- bne bumpthehead
- ldx #0
- bumpthehead stx sectorcounter ;save sector
- bne gotnewaddress ;go on if below
- ldx headcounter ;bump to next head
- inx
- cpx numberofheads ;at max?
- bne saveheadcount
- ldx #0
- saveheadcount stx headcounter
- bne gotnewaddress
- lda $dc0b ;get hrs stop clock
- lda $dc09 ;get seconds
- jsr hextoascii
- sta $410
- stx $411
- lda #':'
- sta $412
- lda $dc08
- jsr hextoascii
- stx $0413
- sta $0414
- lda $dc0f
- and #$7f
- sta $dc0f
- lda #$00
- ldx #4
- settimetozero sta $dc08,x
- dex
- bpl settimetozero
- ldx cylindercountr ;check for end
- cpx numcylinders
- bne bumpcylinderlo
- ldx cylindercountr+1
- cpx numcylinders+1
- beq endofformat
- bumpcylinderlo inc cylindercountr ;bump by one
- beq bumpcylinderhi
- gotnewaddress jmp formatdrive
- bumpcylinderhi inc cylindercountr+1
- jmp formatdrive
- endofformat lda #<endofjobmsg
- jsr writeoutamsg
- brk
- ;
- ;+++++++++++++++++++++++++++++++++
- ;+ set dcb field +
- ;+ +
- ;+ input - a = byte to put +
- ;+ x = offset in dcb +
- ;+++++++++++++++++++++++++++++++++
- ;
- putdcbcommand ldx #0 ;offset 0
- .byt $2c ;bit
- putdcbhead = * ;same as put drive
- putdcbdrive ldx #1 ;offset 1
- .byt $2c ;bit
- putdcbmsbsectr ldx #2 ;offset 2
- .byt $2c ;bit
- putdcbcyllsb ldx #3 ;offset 3
- .byt $2c ;bit
- putdcbnumsecs ldx #4 ;offset 4
- .byt $2c ;bit
- putdcbstep ldx #5 ;offset 5
- .byt $2c ;bit
- putdcblobufptr ldx #6 ;offset 6
- .byt $2c ;bit
- putdcbhibufptr ldx #7 ;offset 7
- putdcb sta putdcb,x
- ptr1 = putdcb+1
- ptr2 = putdcb+2
- rts ; short and sweet??
- ;
- readthesense ldy #12 ;offset to sense
- sta errorcode ;save error code
- ldx #0
- getallthesense lda getallthesense,y
- ptrx = getallthesense+1
- sta currentsense,x ;put in buffer
- inx
- iny
- cpx #4
- bne getallthesense
- rts
- ;
- getdcbcommand ldy #0
- .byt $2c
- getdcbhead ldy #1
- .byt $2c
- getdcbsector ldy #2
- .byt $2c
- getdcbcyllsb ldy #3
- ;
- getdcbinfo lda getdcbinfo,y ;y has offset
- dcbptrforget = getdcbinfo+1
- rts
- ;
- ;
- writeouthex pha
- and #$f0 ;high nyble first
- lsr a
- lsr a
- lsr a
- lsr a
- jsr isitathruf
- pla
- and #$0f
- isitathruf cmp #$0a
- bcc addasciizero
- adc #6 ;add seven
- addasciizero adc #$30
- jmp $ffd2
- hextoascii pha
- and #$0f ;get low nyble
- jsr biggerthan9
- tax
- pla
- and #$f0 ;now hi nyble
- lsr a
- lsr a
- lsr a
- lsr a
- biggerthan9 cmp #$0a
- bcc addazero
- sbc #9
- rts
- adc #6 ;add seven
- addazero adc #$30
- rts
- ;
- writeoutsense ldy #0
- writeallsense lda errorcode,y ;get errorcode and sense
- jsr writeouthex ;write it
- lda #32
- jsr $ffd2
- iny
- cpy #5 ;got em all?
- bne writeallsense
- lda #13
- jmp $ffd2
- ;
- writeoutamsg tax ;get index into table
- lda mtab,x
- sta mptr
- lda mtab+1,x
- sta mptr+1
- ldy #0
- writemsgloop lda writemsgloop,y
- mptr = writemsgloop+1
- beq endofmessage
- jsr $ffd2
- iny
- bne writemsgloop
- endofmessage rts
- ;
- resetforretry jsr reset
- setupdcb lda headcounter ;set head number
- jsr putdcbhead ;put head # in dcb
- lda cylindercountr+1 ;get cyl #hi
- asl a ;move to high bits
- asl a
- asl a
- asl a
- asl a
- asl a
- ora sectorcounter
- jsr putdcbmsbsectr ;msb cyl and sector
- lda cylindercountr ;lsb cyl
- jsr putdcbcyllsb
- lda #1 ;set num blocks
- jmp putdcbnumsecs
- ;
- markbadsector jsr getdcbhead
- and #$0f ;clear drive number
- jsr putbadsector
- jsr getdcbsector
- jsr putbadsector
- jsr getdcbcyllsb
- jsr putbadsector
- rts
- putbadsector sta badsectors
- inc putbadsector+1
- bne putbadsecend
- inc putbadsector+2
- dec badsectorctr ;back off used space
- bne putbadsecend
- lda #<toomanybad ;too many bad sectors
- jsr writeoutamsg
- pla ;terminate now!
- pla ;by pulling off the return
- pla ;twice
- pla
- putbadsecend rts
- ;
- .lib c2sec14.src
- ;
- ;+++ message table +++
- mtab = *
- headingmsg = *-mtab
- .wor header
- reseterrormsg = *-mtab
- .wor resete ;error on reset
- toomanybad = *-mtab
- .wor toomanybadmsg
- lowlevelmsg = *-mtab
- .wor lowlvl
- lowlevelerrmsg = *-mtab
- .wor lowerr ;error on low level
- writeerrormsg = *-mtab
- .wor wrterr ;write error
- rderrormsg = *-mtab
- .wor reader ;read error
- endofjobmsg = *-mtab
- .wor finish ;end of job msg
- compareerrmsg = *-mtab
- .wor comerr ;compare error msg
- intensivemsg = *-mtab
- .wor howmsg ;what kind of format
- numcylsmsg = *-mtab
- .wor inputnumcyls ;total number of cyls msg
- numheadsmsg = *-mtab
- .wor inputnumheads
- reducedwrtmsg = *-mtab
- .wor inputreduced
- precompmsg = *-mtab
- .wor inputprecomp
- burstlenmsg = *-mtab
- .wor inputburstlen
- stepratemsg = *-mtab
- .wor inputsteprate
- ;
- header .byt 147,'hard disk formater',13,13,0
- resete .byt 13,'e r r o r on reset command',13,0
- lowlvl .byt 13,'do low level format? '
- .byt '(y or n)',13,0
- lowerr .byt 13,'e r r o r on low level',13,0
- wrterr .byt 13,'write error',13,0
- toomanybadmsg .byt 13,'too many bad sectors '
- .byt 'format terminated!!!',13,0
- reader .byt 13,'read error',13,0
- finish .byt 13,'end of format',13,0
- comerr .byt 13,'block compare error',13,0
- howmsg .byt 13,13,'do intensive format?'
- .byt ' <y or n> ',0
- inputnumcyls .byt 13,'enter total number of'
- .byt ' cylinders ',0
- inputnumheads .byt 13,'enter number of heads ',0
- inputprecomp .byt 13,'cylinder number '
- .byt 'for start precomp ',0
- inputreduced .byt 13,'cylinder number '
- .byt 'for reduced write current ',0
- inputburstlen .byt 13,'max correctable error '
- .byt 'burst length (5 - 11) ',0
- inputsteprate .byt 13,'step rate ',0
- intensiveflag .byt 0 ;intense flag
- headcounter .byt 0 ;count up head
- cylindercountr .wor 0 ;count up cylinders
- sectorcounter .byt 0 ;sector counter
- rdretrycounter .byt 0
- wrtretrycountr .byt 0
- badsectorctr .byt 0 ;counter for sectors sector
- errorcode .byt 0
- currentsense .byt 0,0,0,0
- ;+ storage area
- buffer .wor 0
- .byt 'calculated values'
- totalsectors .byt 0,0,0 ;total sectors
- lastsatsector .byt 0 ;last sat sector number
- lastsatbyte .wor 0 ;byte offset of last sat byte
- lastsatbit .byt 0 ;bit of last byte
- sectorpercyl .wor 0 ;number sectors/cyl
- numberofheads .byt 0 ;number heads
- numcylinders .wor 0 ;number cylinders
- * = buffer+512
- rdbuf = *
- * = rdbuf+512
- wrtbuf = *
- * = wrtbuf+512
- badsectors = *
- * = badsectors+1024
- .end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-