home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / documents / projects / drives / 64hdproj.sfx / format.src < prev    next >
Encoding:
Text File  |  1990-02-12  |  10.4 KB  |  497 lines

  1. ;bput"format.src"
  2. ;rput"format.src"
  3. ;+++++++++++++++++++++++++++++++++
  4. ;+  initialize the hard disk     +
  5. ;+                               +
  6. ;+ interfaces with the bios for  +
  7. ;+ hard drive....                +
  8. ;+++++++++++++++++++++++++++++++++
  9. ;
  10. read = $7000 ;equates for bios
  11. write = read+3
  12. reset = read+6
  13. setprm = read+9
  14. recal = read+12
  15. seek = read+15
  16. tdredy = read+18 ;test drive ready
  17. sbdiag = read+21 ;sector buf diag
  18. drdiag = read+24 ;drive diags
  19. ctdiag = read+27 ;controller diags
  20. fbadtk = read+30 ;format bad trk
  21. fmttrk = read+33 ;format track
  22. fmtdrv = read+36 ;format drive
  23. retprm = read+39 ;return parms
  24.  ;input - a = drive number
  25.  ;output - a = # heads
  26.  ;         x = msb #cyls
  27.  ;         y = lsb #cyls
  28. rdlong = read+42
  29. readsb = read+45
  30. wrlong = read+48
  31. writsb = read+51
  32. verify = read+54
  33. dcbptr = read+57 ;pointer to dcb
  34. * = $6000
  35. start = * ;begin format
  36.  lda #0 ;clear the buffers
  37.  tay
  38. clearbadsector sta badsectors,y
  39.  sta badsectors+256,y
  40.  sta badsectors+512,y
  41.  sta badsectors+768,y
  42.  sta rdbuf,y
  43.  sta rdbuf+256,y
  44.  sta wrtbuf,y
  45.  sta wrtbuf+256,y
  46.  iny
  47.  bne clearbadsector
  48.  lda #4 ;2 times # sectors for bad sectors
  49.  sta badsectorctr
  50.  lda #<headingmsg ;clear screen,etc
  51.  jsr writeoutamsg
  52.  lda dcbptr
  53.  sta ptr1
  54.  sta ptrx
  55.  sta dcbptrforget
  56.  lda dcbptr+1
  57.  sta ptr2 ;address the dcb
  58.  sta ptrx+1
  59.  sta dcbptrforget+1
  60.  lda #0 ;set up for drive 0
  61.  jsr putdcbdrive ;set up drive 0
  62.  jsr reset
  63.  bcc resetisok ;go if no error
  64.  lda #<reseterrormsg ;issue msg
  65.  jsr writeoutamsg
  66.  brk
  67. resetisok lda #0 ;restore drive 0
  68.  jsr putdcbdrive
  69.  jsr putdcbmsbsectr ;set sector
  70.  jsr putdcbcyllsb ;and cyl
  71.  lda #11 ;interleave, test shows 11 good
  72.  jsr putdcbnumsecs
  73.  lda #<buffer
  74.  jsr putdcblobufptr
  75.  lda #>buffer
  76.  jsr putdcbhibufptr
  77.  jsr retprm ;get the parms
  78.  dey ;back down cylinders by 1
  79.  bne savetheparms
  80.  dex
  81. savetheparms stx cylmsb
  82.  stx numcylinders ;save
  83.  sty numcylinders+1
  84.  sta numberofheads
  85.  sty cyllsb
  86.  lda #16 ;set sector number to max
  87.  sta sector
  88.  jsr cylinder2sectr ;convert
  89.  ldx secnum ;move and prime
  90.  lda secnum+1 ;for sector to sat
  91.  ldy secnum+2 ;conversion
  92.  stx totalsectors
  93.  sta totalsectors+1
  94.  sty totalsectors+2
  95.  jsr sector2sat ;go convert
  96.  lda satsec ;save for later
  97.  sta lastsatsector
  98.  lda satbyt
  99.  sta lastsatbyte
  100.  lda satbyt+1
  101.  sta lastsatbyte+1
  102.  lda satbit
  103.  sta lastsatbit
  104. checklowlevel lda #<lowlevelmsg ;ask about lolevel
  105.  jsr writeoutamsg
  106. lowlevelanswer jsr $ffe4
  107.  jsr $ffd2
  108.  cmp #'n' ;no low level
  109.  beq setupcounters
  110.  cmp #'y' ;do it?
  111.  bne lowlevelanswer
  112.  jsr fmtdrv ;low level it
  113.  bcc setupcounters
  114.  lda #<lowlevelerrmsg ;error msg
  115.  jsr writeoutamsg
  116.  brk
  117. setupcounters = *
  118.  lda #0
  119.  sta cylindercountr ;clear counters
  120.  sta cylindercountr+1
  121.  sta headcounter
  122.  sta sectorcounter
  123.  ldx #0
  124. fillbuffer txa
  125.  sta wrtbuf,x
  126.  sta wrtbuf+256,x
  127.  inx
  128.  bne fillbuffer
  129.  lda #147
  130.  jsr $ffd2
  131.  lda #<intensivemsg ;what kind?
  132.  jsr writeoutamsg
  133. intenseanswer jsr $ffe4 ;get answer
  134.  cmp #'n' ;not intensive
  135.  beq notintensive
  136.  cmp #'y' ;yes?
  137.  bne intenseanswer
  138.  ldx #0
  139.  .byt $2c
  140. notintensive ldx #$ff
  141.  stx intensiveflag ;set mode flag
  142.  jsr $ffd2
  143. formatdrive lda #5 ;clear retry counter
  144.  sta wrtretrycountr
  145.  sta rdretrycounter
  146.  lda cylindercountr+1
  147.  jsr hextoascii ;make printable
  148.  sta $041e
  149.  stx $041f
  150.  lda cylindercountr
  151.  jsr hextoascii
  152.  sta $0420
  153.  stx $0421
  154.  lda #32
  155.  sta $0422
  156.  lda headcounter
  157.  jsr hextoascii
  158.  sta $0423
  159.  stx $0424
  160.  lda #32
  161.  sta $0425
  162.  lda sectorcounter
  163.  jsr hextoascii
  164.  sta $0426
  165.  stx $0427
  166.  jsr setupdcb ;set up dcb
  167.  lda intensiveflag ;check for intense format
  168.  bne bypasswrite ;bypass write
  169.  lda #<wrtbuf
  170.  jsr putdcblobufptr
  171.  lda #>wrtbuf
  172.  jsr putdcbhibufptr
  173. writeasector jsr write ;go write a block
  174.  bcc bypasswrite
  175.  jsr readthesense ;retrieve sense
  176.  jsr writeoutsense
  177.  jsr resetforretry ; set up for retry
  178.  dec wrtretrycountr
  179.  bne writeasector
  180.  lda #<writeerrormsg ;write error
  181.  jsr writeoutamsg
  182.  jsr markbadsector ;mark as bad
  183.  jmp ontonextsector ;go to next sector
  184. bypasswrite lda #<rdbuf
  185.  jsr putdcblobufptr
  186.  lda #>rdbuf
  187.  jsr putdcbhibufptr
  188. readasector jsr read
  189.  bcc isitintensive
  190.  jsr readthesense ;retrieve sense
  191.  jsr writeoutsense
  192.  lda #<rderrormsg ;read error
  193. readretry pha ;save msg number
  194.  jsr resetforretry ;set up for retry
  195.  pla ;retrieve msg number
  196.  dec rdretrycounter ;check for max num
  197.  bne readasector
  198.  jsr writeoutamsg
  199.  jsr markbadsector
  200.  jmp ontonextsector
  201. isitintensive lda intensiveflag ;check for instense
  202.  bne ontonextsector ;bypass compare
  203.  ldy #0 ;set up for compare
  204. comparesectors lda wrtbuf,y
  205.  cmp rdbuf,y
  206.  bne badcompare
  207.  lda wrtbuf+256,y
  208.  cmp rdbuf+256,y
  209.  beq comparenext
  210. badcompare lda #<compareerrmsg
  211.  bne readretry
  212. comparenext iny
  213.  bne comparesectors
  214. ontonextsector ldx sectorcounter ;check sector
  215.  inx
  216.  cpx #17
  217.  bne bumpthehead
  218.  ldx #0
  219. bumpthehead stx sectorcounter ;save sector
  220.  bne gotnewaddress ;go on if below
  221.  ldx headcounter ;bump to next head
  222.  inx
  223.  cpx numberofheads ;at max?
  224.  bne saveheadcount
  225.  ldx #0
  226. saveheadcount stx headcounter
  227.  bne gotnewaddress
  228.  lda $dc0b ;get hrs stop clock
  229.  lda $dc09 ;get seconds
  230.  jsr hextoascii
  231.  sta $410
  232.  stx $411
  233.  lda #':'
  234.  sta $412
  235.  lda $dc08
  236.  jsr hextoascii
  237.  stx $0413
  238.  sta $0414
  239.  lda $dc0f
  240.  and #$7f
  241.  sta $dc0f
  242.  lda #$00
  243.  ldx #4
  244. settimetozero sta $dc08,x
  245.  dex
  246.  bpl settimetozero
  247.  ldx cylindercountr ;check for end
  248.  cpx numcylinders
  249.  bne bumpcylinderlo
  250.  ldx cylindercountr+1
  251.  cpx numcylinders+1
  252.  beq endofformat
  253. bumpcylinderlo inc cylindercountr ;bump by one
  254.  beq bumpcylinderhi
  255. gotnewaddress jmp formatdrive
  256. bumpcylinderhi inc cylindercountr+1
  257.  jmp formatdrive
  258. endofformat lda #<endofjobmsg
  259.  jsr writeoutamsg
  260.  brk
  261. ;
  262. ;+++++++++++++++++++++++++++++++++
  263. ;+     set dcb field             +
  264. ;+                               +
  265. ;+ input  - a = byte to put      +
  266. ;+          x = offset in dcb    +
  267. ;+++++++++++++++++++++++++++++++++
  268. ;
  269. putdcbcommand ldx #0 ;offset 0
  270.  .byt $2c ;bit
  271. putdcbhead = * ;same as put drive
  272. putdcbdrive ldx #1 ;offset 1
  273.  .byt $2c ;bit
  274. putdcbmsbsectr ldx #2 ;offset 2
  275.  .byt $2c ;bit
  276. putdcbcyllsb ldx #3 ;offset 3
  277.  .byt $2c ;bit
  278. putdcbnumsecs ldx #4 ;offset 4
  279.  .byt $2c ;bit
  280. putdcbstep ldx #5 ;offset 5
  281.  .byt $2c ;bit
  282. putdcblobufptr ldx #6 ;offset 6
  283.  .byt $2c ;bit
  284. putdcbhibufptr ldx #7 ;offset 7
  285. putdcb sta putdcb,x
  286. ptr1 = putdcb+1
  287. ptr2 = putdcb+2
  288.  rts ; short and sweet??
  289. ;
  290. readthesense ldy #12 ;offset to sense
  291.  sta errorcode ;save error code
  292.  ldx #0
  293. getallthesense lda getallthesense,y
  294. ptrx = getallthesense+1
  295.  sta currentsense,x ;put in buffer
  296.  inx
  297.  iny
  298.  cpx #4
  299.  bne getallthesense
  300.  rts
  301. ;
  302. getdcbcommand ldy #0
  303.  .byt $2c
  304. getdcbhead ldy #1
  305.  .byt $2c
  306. getdcbsector ldy #2
  307.  .byt $2c
  308. getdcbcyllsb ldy #3
  309. ;
  310. getdcbinfo lda getdcbinfo,y ;y has offset
  311. dcbptrforget = getdcbinfo+1
  312.  rts
  313. ;
  314. ;
  315. writeouthex pha
  316.  and #$f0 ;high nyble first
  317.  lsr a
  318.  lsr a
  319.  lsr a
  320.  lsr a
  321.  jsr isitathruf
  322.  pla
  323.  and #$0f
  324. isitathruf cmp #$0a
  325.  bcc addasciizero
  326.  adc #6 ;add seven
  327. addasciizero adc #$30
  328.  jmp $ffd2
  329. hextoascii pha
  330.  and #$0f ;get low nyble
  331.  jsr biggerthan9
  332.  tax
  333.  pla
  334.  and #$f0 ;now hi nyble
  335.  lsr a
  336.  lsr a
  337.  lsr a
  338.  lsr a
  339. biggerthan9 cmp #$0a
  340.  bcc addazero
  341.  sbc #9
  342.  rts
  343.  adc #6 ;add seven
  344. addazero adc #$30
  345.  rts
  346. ;
  347. writeoutsense ldy #0
  348. writeallsense lda errorcode,y ;get errorcode and sense
  349.  jsr writeouthex ;write it
  350.  lda #32
  351.  jsr $ffd2
  352.  iny
  353.  cpy #5 ;got em all?
  354.  bne writeallsense
  355.  lda #13
  356.  jmp $ffd2
  357. ;
  358. writeoutamsg tax ;get index into table
  359.  lda mtab,x
  360.  sta mptr
  361.  lda mtab+1,x
  362.  sta mptr+1
  363.  ldy #0
  364. writemsgloop lda writemsgloop,y
  365. mptr = writemsgloop+1
  366.  beq endofmessage
  367.  jsr $ffd2
  368.  iny
  369.  bne writemsgloop
  370. endofmessage rts
  371. ;
  372. resetforretry jsr reset
  373. setupdcb lda headcounter ;set head number
  374.  jsr putdcbhead ;put head # in dcb
  375.  lda cylindercountr+1 ;get cyl #hi
  376.  asl a ;move to high bits
  377.  asl a
  378.  asl a
  379.  asl a
  380.  asl a
  381.  asl a
  382.  ora sectorcounter
  383.  jsr putdcbmsbsectr ;msb cyl and sector
  384.  lda cylindercountr ;lsb cyl
  385.  jsr putdcbcyllsb
  386.  lda #1 ;set num blocks
  387.  jmp putdcbnumsecs
  388. ;
  389. markbadsector jsr getdcbhead
  390.  and #$0f ;clear drive number
  391.  jsr putbadsector
  392.  jsr getdcbsector
  393.  jsr putbadsector
  394.  jsr getdcbcyllsb
  395.  jsr putbadsector
  396.  rts
  397. putbadsector sta badsectors
  398.  inc putbadsector+1
  399.  bne putbadsecend
  400.  inc putbadsector+2
  401.  dec badsectorctr ;back off used space
  402.  bne putbadsecend
  403.  lda #<toomanybad ;too many bad sectors
  404.  jsr writeoutamsg
  405.  pla ;terminate now!
  406.  pla ;by pulling off the return
  407.  pla ;twice
  408.  pla
  409. putbadsecend rts
  410. ;
  411. .lib c2sec14.src
  412. ;
  413. ;+++ message table +++
  414. mtab = *
  415. headingmsg = *-mtab
  416.  .wor header
  417. reseterrormsg = *-mtab
  418.  .wor resete ;error on reset
  419. toomanybad = *-mtab
  420.  .wor toomanybadmsg
  421. lowlevelmsg = *-mtab
  422.  .wor lowlvl
  423. lowlevelerrmsg = *-mtab
  424.  .wor lowerr ;error on low level
  425. writeerrormsg = *-mtab
  426.  .wor wrterr ;write error
  427. rderrormsg = *-mtab
  428.  .wor reader ;read error
  429. endofjobmsg = *-mtab
  430.  .wor finish ;end of job msg
  431. compareerrmsg = *-mtab
  432.  .wor comerr ;compare error msg
  433. intensivemsg = *-mtab
  434.  .wor howmsg ;what kind of format
  435. numcylsmsg = *-mtab
  436.  .wor inputnumcyls ;total number of cyls msg
  437. numheadsmsg = *-mtab
  438.  .wor inputnumheads
  439. reducedwrtmsg = *-mtab
  440.  .wor inputreduced
  441. precompmsg = *-mtab
  442.  .wor inputprecomp
  443. burstlenmsg = *-mtab
  444.  .wor inputburstlen
  445. stepratemsg = *-mtab
  446.  .wor inputsteprate
  447. ;
  448. header .byt 147,'hard disk formater',13,13,0
  449. resete .byt 13,'e r r o r on reset command',13,0
  450. lowlvl .byt 13,'do low level format? '
  451.  .byt '(y or n)',13,0
  452. lowerr .byt 13,'e r r o r on low level',13,0
  453. wrterr .byt 13,'write error',13,0
  454. toomanybadmsg .byt 13,'too many bad sectors '
  455.  .byt 'format terminated!!!',13,0
  456. reader .byt 13,'read error',13,0
  457. finish .byt 13,'end of format',13,0
  458. comerr .byt 13,'block compare error',13,0
  459. howmsg .byt 13,13,'do intensive format?'
  460.  .byt ' <y or n> ',0
  461. inputnumcyls .byt 13,'enter total number of'
  462.  .byt ' cylinders ',0
  463. inputnumheads .byt 13,'enter number of heads ',0
  464. inputprecomp .byt 13,'cylinder number '
  465.  .byt 'for start precomp ',0
  466. inputreduced .byt 13,'cylinder number '
  467.  .byt 'for reduced write current ',0
  468. inputburstlen .byt 13,'max correctable error '
  469.  .byt 'burst length (5 - 11) ',0
  470. inputsteprate .byt 13,'step rate ',0
  471. intensiveflag .byt 0 ;intense flag
  472. headcounter .byt 0 ;count up head
  473. cylindercountr .wor 0 ;count up cylinders
  474. sectorcounter .byt 0 ;sector counter
  475. rdretrycounter .byt 0
  476. wrtretrycountr .byt 0
  477. badsectorctr .byt 0 ;counter for sectors sector
  478. errorcode .byt 0
  479. currentsense .byt 0,0,0,0
  480. ;+ storage area
  481. buffer .wor 0
  482.  .byt 'calculated values'
  483. totalsectors .byt 0,0,0 ;total sectors
  484. lastsatsector .byt 0 ;last sat sector number
  485. lastsatbyte .wor 0 ;byte offset of last sat byte
  486. lastsatbit .byt 0 ;bit of last byte
  487. sectorpercyl .wor 0 ;number sectors/cyl
  488. numberofheads .byt 0 ;number heads
  489. numcylinders .wor 0 ;number cylinders
  490. * = buffer+512
  491. rdbuf = *
  492. * = rdbuf+512
  493. wrtbuf = *
  494. * = wrtbuf+512
  495. badsectors = *
  496. * = badsectors+1024
  497. .end
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.