home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / C64 / GFX / 64HDPRO.ARC / C64HDBIO.SRC < prev    next >
Text File  |  2000-06-30  |  17KB  |  657 lines

  1. ;BPUT"HARDISKBIOS.SRC
  2. ;RPUT"HARDISKBIOS.SRC
  3. ;
  4. ;+++++++++++++++++++++++++++++++++
  5. ;+ THE DRIVE COMMAND BLOCK (DCB) +
  6. ;+ IS USED TO PASS THE COMMAND,  +
  7. ;+ CYLINDER, SECTOR, HEAD, BLOCK +
  8. ;+ COUNT, AND STEP RATE TO THE   +
  9. ;+ CONTROLLER.  THE LAYOUT OF THE+
  10. ;+ DCB FOLLOWS:                  +
  11. ;+                               +
  12. ;+ BYTE        DESCRIPTION       +
  13. ;+  0    OPERATION CODE          +
  14. ;+  1   BITS 4,6,7 NOT USED, 0   +
  15. ;+      BIT 5 DRIVE NUMBER 0 OR 1+
  16. ;+      BITS 0-3 HEAD NUMBER     +
  17. ;+  2   BITS 6,7 CLINDER # MSB   +
  18. ;+      BIT 5 NOT USED 0         +
  19. ;+      BITS 0-4 SECTOR NUMBER   +
  20. ;+  3   CYLINDER NUMBER LSB      +
  21. ;+  4   BLOCK COUNT OR INTERLEAVE+
  22. ;+  5   BITS 6,7 USED FOR ERROR  +
  23. ;+      RECOVERY OPTIONS, BEST TO+
  24. ;+      TO KEEP THEM BOTH 0.     +
  25. ;+      BITS 3,4,5 NOT USED 0    +
  26. ;+      BITS 0-2 STEP RATE.  SEE +
  27. ;+      CONTROLLER DOC FOR VALUES+
  28. ;+                               +
  29. ;+ COMMAND CODES ARE AS FOLLOWS: +
  30. ;+                               +
  31. ;+ 00 - TEST DRIVE READY         +
  32. ;+ 01 - RECALIBRATE              +
  33. ;+ 03 - READ STATUS OF LAST OP   +
  34. ;+ 04 - FORMAT DRIVE             +
  35. ;+ 05 - VERIFY SECTORS           +
  36. ;+ 06 - FORMAT A TRACK           +
  37. ;+ 07 - FORMAT A BAD TRACK (FLAG)+
  38. ;+ 08 - READ SECTORS             +
  39. ;+ 0A - WRITE SECTORS            +
  40. ;+ 0B - SEEK                     +
  41. ;+ 0C - INITIALIZE DRIVE PARMS   +
  42. ;+ 0D - READ ECC BURST ERROR LEN +
  43. ;+ 0E - READ SECTOR BUFFER       +
  44. ;+ 0F - WRITE SECTOR BUFFER      +
  45. ;+ E0 - RUN SECTOR BUFFER DIAGS  +
  46. ;+ E3 - RUN DRIVE DIAGNOSTICS    +
  47. ;+ E4 - RUN CONTROLLER DIAGS     +
  48. ;+ E5 - READ LONG                +
  49. ;+ E6 - WRITE LONG               +
  50. ;+++++++++++++++++++++++++++++++++
  51. ;
  52. ;* = $7000
  53. ;+++++++++++++++++++++++++++++++++
  54. ;+ THIS CODE IS TARGETED FOR USE +
  55. ;+ WITH A HARD DISK DRIVE AND A  +
  56. ;+ WESTERN DIGITAL PC CONTOLLER  +
  57. ;+ CARD.                         +
  58. ;+++++++++++++++++++++++++++++++++
  59. ;
  60. ;+++++++++++++++++++++++++++++++++
  61. ;+          EQUATES              +
  62. ;+++++++++++++++++++++++++++++++++
  63. ;
  64. ;+++++++++++++++++++++++++++++++++
  65. ;+ THE FOLLOWING DEFINE THE WD   +
  66. ;+ CONTROLLER PORTS.  THERE ARE  +
  67. ;+ FOUR PORTS 0 THRU 3.  THE     +
  68. ;+ FUNCTION OF EACH IS:          +
  69. ;+ PORT0 - DATA IN AND OUT       +
  70. ;+ PORT1 - READ - STATUS         +
  71. ;+         WRITE - RESET CONTROL +
  72. ;+ PORT2 - READ - READ JUMPERS   +
  73. ;+ PORT2 - READ - READ JUMPERS   +
  74. ;+       - WRITE - PREPARE FOR   +
  75. ;+         CONTROLER COMMAND.    +
  76. ;+ PORT3 - READ - NO FUNCTION    +
  77. ;+         WRITE - SET DMA FLAGS +
  78. ;+         (SET TO 00, ALWAYS)   +
  79. ;+++++++++++++++++++++++++++++++++
  80. ;
  81. PORT0 = $DE20 ;USING I/O1 ADDRESS
  82. PORT1 = $DE21 ;RESET AND STATUS REG
  83. ;+ BIT DEFINITONS FOR READ PORT1 +
  84. ;
  85. ;+ BIT        DEFINITION         +
  86. ;+  7     UNDEFINED, IGNORE      +
  87. ;+  6     UNDEFINED, IGNORE      +
  88. ;+  5  IRQ - NOT USED ON C64     +
  89. ;+  4  DRQ - NOT USED ON C64     +
  90. ;+  3  BUSY BIT                  +
  91. ;+  2  C/D - COMMAND/DATA BIT    +
  92. ;+           0 - DATA            +
  93. ;+           1 - COMMAND         +
  94. ;+  1  I/O - DIRECTION OF DATA   +
  95. ;+           1 - INPUT TO HOST   +
  96. ;+           0 - OUTPUT FROM HOST+
  97. ;+  0  REQ - REQUEST BIT, MUST BE+
  98. ;+           1 FOR DATA TRANSFERS+
  99. ;
  100. PORT2 = $DE22 ;SET COMMAND MODE AND JUMPERS
  101. ;
  102. ;+  THERE ARE EIGHT JUMPERS WHICH+
  103. ;+  CAN BE READ FROM THIS PORT.  +
  104. ;+  DRIVE OPTIONS CAN BE MADE BY +
  105. ;+  DEFINING THESE BITS TO REPRE-+
  106. ;+  SENT A TABLE ENTRY, ETC.     +
  107. ;+                               +
  108. ;+  WRITING TO THIS PORT SETS THE+
  109. ;+  CONTORLER IN COMMAND MODE.   +
  110. ;
  111. PORT3 = $DE23 ;ENSURE ALLWAYS ZERO
  112. ;
  113. ZERO = 0
  114. TWO = 2
  115. ;
  116. ;+++++++++++++++++++++++++++++++++
  117. ;+      COMMAND EQUTATES         +
  118. ;+++++++++++++++++++++++++++++++++
  119. ;
  120. TDRCMD = $00 ;TEST DRIVE READY
  121. RCACMD = $01 ;RECALIBRATE COMMAND
  122. STCMD = $03 ;SENSE STATUS COMMAND
  123. FORCMD = $04 ;FORMAT DRIVE COMMAND
  124. VERCMD = $05 ;VERIFY SECTORS COMMAND
  125. RDCMD = $08 ;READ COMMAND
  126. FRTCMD = $06 ;FORMAT TRACK COMMAND
  127. FBTCMD = $07 ;FORMAT BAD TRACK COMMAND
  128. WRTCMD = $0A ;WRITE COMMAND
  129. SKCMD = $0B ;SEEK COMMAND
  130. PRMCMD = $0C ;SEND PARM COMMAND
  131. ECCCMD = $0D ;READ ECC BURST LENGTH COMMAND
  132. RSBCMD = $0E ;READ SECTOR BUFFER COMMAND
  133. WSBCMD = $0F ;WRITE SECTOR BUFFER COMMAND
  134. BDGCMD = $E0 ;BUFFER DIAG COMMAND
  135. DDGCMD = $E3 ;DRIVE DIAG COMMAND
  136. CDGCMD = $E4 ;CONTROLLER DIAG COMMAND
  137. RDLCMD = $E5 ;READ LONG COMMAND
  138. WRLCMD = $E6 ;WRITE LONG COMMAND
  139. ;
  140. RDCHK = $0B ;STATUS FOR OK READ
  141. WRTCHK = $09 ;STATUS FOR WRITE OK
  142. ;
  143. ;+++++++++++++++++++++++++++++++++
  144. ;+ VECTORS TO ROUTINES           +
  145. ;+++++++++++++++++++++++++++++++++
  146. ;
  147. * = $F72C
  148. READX JMP READ
  149. WRITEX JMP WRITE
  150. RESETX JMP RESET
  151. SETPRX JMP SETPRM
  152. RECALX JMP RECAL ;GO RECALIBRATE
  153. SEEKX JMP SEEK ;GO DO SEEK
  154. TDREDX JMP TDREDY ;TEST DRIVE READY
  155. ;SBDIAX JMP SBDIAG ;SECTOR BUFFER DIAGS
  156. ;DRDIAX JMP DRDIAG ;DRIVE DIAGS
  157. CTDIAX JMP CTDIAG ;CONTROLLER DIAG
  158. ;FORBTX JMP FORBTK ;FORMAT BAD TRACK
  159. ;FORTRX JMP FORTRK ;FORMAT TRACK
  160. ;FORMAX JMP FORMAT ;FORMAT DRIVE
  161. RETPRX JMP RETPRM ;RETURN DRIVE PARMS
  162. ;RDLONX JMP RDLONG ;READ LONG
  163. ;READSX JMP READSB ;READ SECTOR BUFFER
  164. ;WRLONX JMP WRLONG ;WRITE LONG
  165. ;WRTSBX JMP WRITSB ;WRITE SECTOR BUFFER
  166. VERIFX JMP VERIFY ;VERIFY SECTOR
  167. ;
  168. ;+++++++++++++++++++++++++++++++++
  169. ;+       SUBROUTINES             +
  170. ;+++++++++++++++++++++++++++++++++
  171. ;
  172. ;+++++++++++++++++++++++++++++++++
  173. ;+ READ BLOCKS                   +
  174. ;+ READ THE NUMBER OF BLOCKS IN  +
  175. ;+ THE DCB INTO THE BUFFER. THIS +
  176. ;+ ROUTINE HANDLES THE READ LONG +
  177. ;+ AND READ SECTOR BUFFER ALSO.  +
  178. ;+                               +
  179. ;+ INPUT: DCB                    +
  180. ;+ OUTPUT: DATA READ INTO BUFFER +
  181. ;+  REGS ALL DESTROYED.          +
  182. ;+++++++++++++++++++++++++++++++++
  183. ;
  184. READSB LDA #RSBCMD ;READ SECTOR BUFFER
  185.  .BYT $2C ;JUST A BIT
  186. RDLONG LDA #RDLCMD ;READ LONG DIAGNOSTIC
  187.  .BYT $2C ;AND A BIT
  188. READ = * ;READ BLOCKS
  189.  LDA #RDCMD ;GET COMMAND
  190.  JSR SETUP ;GO DO HOUSEKEEPING
  191.  BCC RCMDOK ;GO IF WELL
  192. ERJMP1 SEC
  193.  JMP TCOMP
  194. RCMDOK JSR RDREDY ;READY TO READ
  195.  BCS ERJMP1 ;GO IF BAD
  196.  LDY #ZERO
  197.  LDX #TWO ;# PAGES PER SECTOR
  198.  SEI ;DISABLE FOR A BIT
  199. RDLOOP LDA PORT0 ;READ A BYTE
  200.  STA (BUFPTR),Y ;PUT IN BUFFER
  201.  INY
  202.  BNE RDLOOP
  203.  INC BUFPTR+1 ;BUMP PAGE POINTER
  204.  DEX
  205.  BNE RDLOOP ;CONTINUE READING
  206.  LDA CMDBYT ;CHECK COMMAND
  207.  CMP #RDLCMD ;READ LONG?
  208.  BNE READON
  209.  JSR RDREDY ;CHECK IF READY TO READ
  210.  BCS ERJMP1
  211. RDLLUP LDA PORT0 ;GET ECC FOR LONG
  212.  STA (BUFPTR),Y
  213.  INC BUFPTR ;BUMP PTR
  214.  BNE RDLX1
  215.  INC BUFPTR+1
  216. RDLX1 INX
  217.  CPX #4
  218.  BNE RDLLUP
  219. READON DEC BLKCTR ;SEE IF MORE BLOCKS
  220.  BNE RCMDOK
  221.  CLI ;ENABLE
  222. ;
  223. TCOMP = * ;CHECK COMPLETION
  224.  LDA PORT1 ;OF OPERATION
  225.  AND #$0F ;CLEAR UNUSED
  226.  CMP #$0F ;WHAT WE WAITING FOR?
  227.  BEQ TCOMP1 ;GO FORWARD
  228.  DEC TIMER0 ;STEP DOWN ONE
  229.  BNE TCOMP ;GO IF NOT ZERO
  230.  DEC TIMER1 ;KNOCK OFF ANOTHER BIT
  231.  BNE TCOMP
  232.  DEC TIMER2 ;THIS IS THE BIG ONE
  233.  BNE TCOMP ;DON'T QUIT YET?
  234.  LDA #TIMOTU ;SET TIMEOUT STATUS
  235.  SEC
  236.  RTS ;GO BACK WITH ERROR
  237. ;
  238. TCOMP1 = * ;READ ERROR STATUS
  239.  LDA PORT0 ;CHECK FOR ERROR
  240.  AND #$02 ;BIT ON
  241.  BEQ TCOMP4
  242.  LDA CMDBYT ;CHECK IF THIS IS SENSE
  243.  CMP #STCMD ;IF SO FAIL SENSE
  244.  BEQ SFAIL
  245.  STA ERRCMD ;SAVE THE FAILING CMD
  246.  LDA #STCMD ;ISSUE SENSE COMMAND
  247.  STA CMDBYT ;PUT IN DCB
  248.  JSR SNDCMD ;
  249.  BCC TCOMP2 ;GO ON IF OK
  250. SFAIL LDA #SNFAIL ;SET SENSE FAILED
  251.  BNE RETERX
  252. RETERR LDA ERRCMD ;GET FAILING CMD
  253. RETERX SEC
  254.  RTS
  255. TCOMP2 JSR RDREDY ;SEE IF READY
  256.  BCS SFAIL
  257.  LDY #0
  258. TCOMP3 LDA PORT0 ;READ SENSE
  259.  STA SENSE,Y
  260.  INY
  261.  CPY #4 ;GOT IT ALL?
  262.  BNE TCOMP3
  263.  LDA SENSE ;CHECK SENSE
  264.  CMP #$98 ;CORRECTABLE ECC?
  265.  BNE TCOMPB
  266.  LDA #$0D ;READ THE ECC INFO
  267.  JSR SNDCMD
  268.  BCS SFAIL
  269.  JSR RDREDY
  270.  BCS SFAIL
  271.  LDA PORT0 ;GET ECC INFO
  272.  STA ECCINF
  273. TCOMPB JMP TCOMP ;TEST COMPLETION
  274. TCOMP4 LDA CMDBYT ;CHECK IF SENSE
  275.  CMP #STCMD
  276.  BEQ RETERR
  277.  CLC
  278.  RTS
  279. ;
  280. ;+++++++++++++++++++++++++++++++++
  281. ;+ THE WRITE ROUTINE SENDS THE   +
  282. ;+ NUMBER OF BLOCKS SPECIFIED IN +
  283. ;+ THE DCB TO THE DISK CONTROLER.+
  284. ;+ WRITE SECTOR BUFFER AND WRITE +
  285. ;+ LONG ARE BOTH HANDLED HERE.   +
  286. ;+                               +
  287. ;+ INPUT: DCB                    +
  288. ;+ OUTPUT: DATA WRITTEN          +
  289. ;+++++++++++++++++++++++++++++++++
  290. ;
  291. WRLONG LDA #WRLCMD ;WRITE LONG DIAGNOSTIC
  292.  .BYT $2C ;BIT  IT
  293. WRITSB LDA #WSBCMD ;WRITE SECTOR BUFFER
  294.  .BYT $2C ;BIT AGAIN
  295. WRITE = * ;WRITE BLOCKS
  296.  LDA #WRTCMD ;GET COMMAND
  297.  JSR SETUP ;GO DO HOUSEKEEPING
  298.  BCC WCMDOK ;GO IF WELL
  299. ERJMP2 JMP ERJMP1
  300. WCMDOK JSR WRREDY ;READY TO WRITE
  301.  BCS ERJMP2 ;GO IF BAD
  302.  LDY #ZERO
  303.  LDX #TWO ;# PAGES PER SECTOR
  304.  SEI ;DISABLE
  305. WRLOOP LDA (BUFPTR),Y ;GET A BYTE
  306.  STA PORT0 ;WRITE TO CONTROLLER
  307.  INY
  308.  BNE WRLOOP
  309.  INC BUFPTR+1 ;BUMP PAGE POINTER
  310.  DEX
  311.  BNE WRLOOP ;CONTINUE READING
  312.  LDA CMDBYT ;CHECK FOR WRITE LONG
  313.  CMP #WRLCMD
  314.  BNE WRON ;GO ON IF NOT
  315.  JSR WRREDY ;READY TO WRITE?
  316.  BCS ERJMP2
  317. WRLLUP LDA (BUFPTR),Y
  318.  STA PORT0
  319.  INC BUFPTR
  320.  BNE WRLX1
  321.  INC BUFPTR+1
  322. WRLX1 INX
  323.  CPX #4
  324.  BNE WRLLUP
  325. WRON DEC BLKCTR ;ANY MORE BLOCKS?
  326.  BNE WCMDOK ;YES THEN GETEM
  327.  CLI ;ENABLE
  328. JMP TCOMP ;GO CHECK FOR COMPLETION
  329. ;
  330. ;+++++++++++++++++++++++++++++++++
  331. ;+ MISCELLANEOUS COMMANDS        +
  332. ;+++++++++++++++++++++++++++++++++
  333. ;
  334. FORBTK LDA #FBTCMD ;FORMAT BAD TRACK
  335.  .BYT $2C ;BIT
  336. FORTRK LDA #FRTCMD ;FORMAT TRACK
  337.  .BYT $2C ;BIT
  338. FORMAT LDA #FORCMD ;FORMAT DRIVE
  339.  CPX #'6' ;CHECK CODE IN X
  340.  BNE NOFRMT ;BYPASS IF NOT
  341.  CPY #'4' ;AND CHECK Y
  342.  BNE NOFRMT ;BYPASS NOT 4
  343.  PHA
  344.  LDA SECADR ;CLEAR SECTOR NUMBER
  345.  AND #$C0 ;SAVE CYL MSB
  346.  STA SECADR
  347.  PLA
  348.  .BYT $2C ;BIT
  349. VERIFY LDA #VERCMD ;VERIFY
  350.  .BYT $2C ;BIT
  351. RECAL = * ;RECALIBRATE THE DRIVE
  352.  LDA #RCACMD ;GET COMMAND BYTE
  353.  .BYT $2C ;BIT
  354. SEEK LDA #SKCMD
  355.  .BYT $2C ;BIT
  356. TDREDY LDA #TDRCMD ;TEST DRIVE READY
  357.  .BYT $2C ;BIT
  358. SBDIAG LDA #BDGCMD ;SECTOR BUFFER DIAG
  359.  .BYT $2C ;BIT
  360. DRDIAG LDA #DDGCMD ;DRIVE DIAG
  361.  .BYT $2C ;BIT
  362. CTDIAG LDA #CDGCMD ;CONTOLLER DIAG
  363. CMDOUT STA CMDBYT ;PUT IN COMMAND
  364.  CMP #FORCMD ;IS IT FORMAT?
  365.  BNE CMDOU1
  366.  JSR PRIMEF ;PRIME THE TIMERF
  367.  JMP CMDOU3
  368. CMDOU1 CMP #DDGCMD ;DRIVE DIAG?
  369.  BNE CMDOU2
  370.  JSR PRIMEC ;PRIME TIMER FOR DIAG
  371.  JMP CMDOU3
  372. CMDOU2 JSR PRIMEN ;SET NORMAL TIMER
  373. CMDOU3 JSR SNDCMD ;SEND THE COMMAND
  374.  BCC CMDOU4 ;GO IF NO ERROR
  375. NOFRMT SEC ;ENSURE CARRY SET
  376.  RTS ;RETURN IF ERROR
  377. CMDOU4 JMP TCOMP ;GO TEST FOR COMPLETION
  378. ;+++++++++++++++++++++++++++++++++
  379. ;+ SETUP THE DCB, TIMERS, ETC.   +
  380. ;+ FOR THE READ AND WRITE        +
  381. ;+ ROUTINES.                     +
  382. ;+++++++++++++++++++++++++++++++++
  383. ;
  384. SETUP = * ;SET UP PARMS FOR READ AND WRITE
  385.  STA CMDBYT ;PUT COMMAND IN DCB
  386.  LDA BUFADR ;GET BUFFER ADDRESS
  387.  STA BUFPTR ;SET UP LOW MEMORY
  388.  LDA BUFADR+1
  389.  STA BUFPTR+1
  390.  LDA BLKCNT ;GET NUMBER OF BLOCKS
  391.  STA BLKCTR ;PUT IN WORK AREA
  392.  JSR DEFSET ;SET STEP RATE IN DCB
  393. SNDCMD = * ;SEND COMMAND
  394.  LDY #00 ;PRIME POINTER TO BEGIN
  395.  STA PORT2 ;SET COMMAND MODE
  396.  STY PORT3 ;ENSURE DMA STUFF OFF
  397.  JSR CMDRDY ;GO CHECK FOR READY
  398.  BCC SNDCOK ;GO IF WELL
  399.  LDA #SNDERR ;SET ERROR CODE
  400.  SEC
  401.  RTS
  402. SNDCOK = * ;READY TO SEND DCB NOW
  403.  LDA DCB,Y
  404.  STA PORT0
  405.  INY
  406.  CPY #6 ;ALL OF IT?
  407.  BNE SNDCOK
  408. CHKSOK CLC ;CLEAR CODE FOR NOW
  409.  RTS
  410. ;
  411. ;+ CHECK FOR READY TO READ OR WRITE
  412. CMDRDY LDA #$0D ;CODE FOR CMD READY
  413.  .BYT $2C
  414. RDREDY LDA #RDCHK ;GET CHECK BYTE
  415.  .BYT $2C ;ADD A BIT
  416. WRREDY LDA #WRTCHK ;GET CHECK BYTE
  417.  STA CHKBYT ;SAVE BYTE TO COMPARE
  418.  LDY #0 ;CLEAR COUNTERS
  419.  STY TIMER0
  420.  STY TIMER1
  421. WDLOOP LDA PORT1 ;GET STATUS BYTE
  422.  AND #$0F ;CLEAR GARBAGE
  423.  CMP CHKBYT ;IS WHAT WE WANT?
  424.  BEQ CHKSOK ;GO ON IF SO
  425.  DEC TIMER0 ;WAIT SOME
  426.  BNE WDLOOP
  427.  DEC TIMER1 ;AND SOME MORE DELAY
  428.  BNE WDLOOP
  429.  LDA #WATERR ;LOAD ERROR CODE
  430.  SEC ;SET ERROR
  431.  RTS ;RETURN WITH ERROR
  432. ;
  433. ;+++++++++++++++++++++++++++++++++
  434. ;+ GET THE DRIVE PARMS BY READ-  +
  435. ;+ ING SECTOR 0 AND EXTRACTING   +
  436. ;+ THE PARMS FROM A FORMATED     +
  437. ;+ DRIVE    INTO THE PARM TABLE  +
  438. ;+ OF DRIVE CHARACTERISTICS.     +
  439. ;+++++++++++++++++++++++++++++++++
  440. ;
  441. GETPRM = * ;SET UP PTR TO PARM TAB
  442.  LDA PTFORM
  443.  BNE DEFSET ;EXIT IF FORMATTING
  444.  LDA #1
  445.  STA BLKCNT
  446.  LDA HDNUM
  447.  AND #$20 ;CLEAR ALL BUT DRIVE
  448.  STA HDNUM
  449.  LDA #0 ;SEC 0, CYL 0 ALSO
  450.  STA CYLNUM
  451.  STA SECADR
  452.  JSR DEFSET ;DEFAULT STEP RATE
  453.  JSR TDREDY ;CHECK IF EXISTS
  454.  BCS DEXITT ;GO IF NOT HERE
  455.  LDA #RDCMD ;SET UP FOR READ
  456.  JSR SETUP ;GET READY TO READ
  457.  BCS DEFSET ;RETURN IF BAD
  458.  JSR RDREDY
  459.  BCS DEFSET
  460.  LDY #0 ;PRIME COUNTER
  461.  LDX HDNUM ;GET DRIVE TABLE OFFSET
  462.  LDA PORT0 ;CHECK IF FORMATED
  463.  CMP #'C' ;IS IT C?
  464.  BNE NOINIT
  465.  INY
  466.  LDA PORT0
  467.  CMP #'6' ;IS IT SIX
  468.  BNE NOINIT
  469.  INY
  470.  LDA PORT0
  471.  CMP #'4' ;IS IT FOUR FOR C64?
  472.  BNE NOINIT
  473. MVEPRM LDA PORT0
  474.  STA PT1,X
  475.  INX
  476.  INY
  477.  CPY #34 ;GOT EM ALL?
  478.  BNE MVEPRM
  479. NOINIT LDX #2 ;FLUSH THE REST
  480. NOINIL LDA PORT0
  481.  INY
  482.  BNE NOINIL
  483.  DEX
  484.  BNE NOINIL
  485.  JSR TCOMP ;CLEAR STATUS
  486. DEFSET = *
  487.  LDA HDNUM
  488. GETPRA = *
  489.  AND #$20 ;SEE IF 0 OR 1
  490.  TAX
  491. DZEROX = *
  492.  LDA PTSTEP,X ;GET STEP RATE
  493.  STA SRATE ;IN DCB
  494.  CLC
  495. DEXITT = * ;RETURN NO DRIVE
  496.  RTS ;RETURN OFFSET IN X
  497. ;
  498. ;+++++++++++++++++++++++++++++++++
  499. ;+ PERFORM THE RESET FUNCTION.   +
  500. ;+ FALL THRU AND SET DRIVE PARMS.+
  501. ;+++++++++++++++++++++++++++++++++
  502. ;
  503. RESET = * ;RESET THE CONTROLLER
  504.  STA PORT1 ;ISSUE RESET
  505.  LDY #0
  506.  LDX #0
  507. RESET1 DEY
  508.  BNE RESET1
  509. RESET2 DEX
  510.  BNE RESET2
  511.  LDA PORT1 ;CHECK IF RESET OK
  512.  AND #$3F ;MUST ALL BE OFF FOR OK
  513.  BEQ RESET3
  514.  LDA #$FE ;SET RESET ERROR
  515.  SEC
  516.  RTS
  517. RESET3 = * ;FALL THRU TO SET PARMS
  518. ;+++++++++++++++++++++++++++++++++
  519. ;+ SET DRIVE PARMS FROM TABLE    +
  520. ;+++++++++++++++++++++++++++++++++
  521. ;
  522. SETPRM = * ;SET DRIVE PARMS
  523.  LDA #ZERO ;SET DRIVE 0 PARMS
  524.  STA HDNUM ;DRIVE NUMBER IN DCB
  525.  JSR SETPR1 ;GO DOIT
  526.  LDA #$20 ;DRIVE 1 PARM
  527. SETPR1 STA HDNUM ;PUT IN DCB
  528.  JSR GETPRM ;GET PT POINTER
  529.  LDA #PRMCMD ;GET PARM COMMAND (0C)
  530.  STA CMDBYT ;PUT IN DCB
  531.  JSR SNDCMD ;GO SEND THE COMMAND
  532.  JSR WRREDY ;GO CHECK FOR READY
  533.  BCC SETPR2 ;IF NO ERROR GO
  534. NODRIV LDA #$FF
  535.  RTS
  536. SETPR2 LDY #8
  537.  JSR DEFSET ;SET POINTER TO TABLE
  538. SETPR3 LDA PT1,X ;SEND OUT THE PARMS
  539.  STA PORT0
  540.  INX
  541.  DEY
  542.  BNE SETPR3
  543.  JMP TCOMP ;RETURN THRU CHECKER
  544. ;
  545. ;+++++++++++++++++++++++++++++++++
  546. ;+ RETURN THE PARMS TO THE CALLER+
  547. ;+                               +
  548. ;+ INPUT:  A - DRIVE # (0 OR 1)  +
  549. ;+                               +
  550. ;+ OUTPUT: A - NUMBER OF HEADS   +
  551. ;+         X - MSB OF #CYLINDERS +
  552. ;+         Y - LSB OF #CYLINDERS +
  553. ;+++++++++++++++++++++++++++++++++
  554. ;
  555. RETPRM ASL A ;SHIFT DRIVE NUMBER
  556.  ASL A
  557.  ASL A
  558.  ASL A
  559.  ASL A ;TO BIT 5
  560.  JSR GETPRA ;GET PARMS
  561.  LDA PTHEAD,X ;GET NUMBER OF HEADS
  562.  PHA ;SAVE IT
  563.  LDA PTCYLS+1,X ;GET LSB OF CYLINDERS
  564.  TAY
  565.  LDA PTCYLS,X ;GET MSB OF CYLINDERS
  566.  TAX
  567.  PLA ;RESTORE NUMBER HEADS
  568.  RTS ;RETURN TO CALLER
  569. ;
  570. ;
  571. ;+++++++++++++++++++++++++++++++++
  572. ;+ PRIME THE COUNTDOWN TIMER     +
  573. ;+++++++++++++++++++++++++++++++++
  574. ;
  575. PRIMEN LDA 1 ;NORMAL TIMEOUT
  576.  BNE PRIMET
  577. PRIMEF LDA 255 ;FORMAT WAIT
  578.  BNE PRIMET
  579. PRIMEC LDA 10 ;DIAG TIME
  580. PRIMET STA TIMER2 ;TUCK AWAY
  581.  LDA #0 ;CLEAR THE OTHERS
  582.  STA TIMER0
  583.  STA TIMER1
  584.  RTS
  585. ;
  586. HDINIT LDY #58 ;INIT PTABS AND DCB
  587.  LDA #0 ;ZERO THE AREAS
  588. HDILUP STA PTFORM,Y
  589.  DEY
  590.  BPL HDILUP ;ZERO ALL
  591.  LDY #21 ;LENGTH OF DEFAULT PTAB
  592. HDPLUP LDA DEFPT,Y ;GET A BYTE
  593.  STA PT1,Y
  594.  STA PT2,Y
  595.  DEY
  596.  BPL HDPLUP ;MOVE ALL
  597.  RTS ;END INIT
  598. ;
  599. ;+-------------------------------+
  600. ;+ THE DRIVE PARAMETER TABLE IS  +
  601. ;+ FOLLOWS:                      +
  602. ;+                               +
  603. ;+ LENGTH    DESCRIPTION         +
  604. ;+  WORD  MAXIMUM NUMBER OF CYLS +
  605. ;+  BYTE  NUMBER OF HEADS        +
  606. ;+  WORD  CYL FOR START REDUCED  +
  607. ;+        WRITE CURRENT          +
  608. ;+  WORD  CYL FO RSTART PRCOMP   +
  609. ;+  BYTE  ECC LENGTH             +
  610. ;+  BYTE  STEP RATE              +
  611. ;+3 BYTES TOTAL NUMBER SECTORS   +
  612. ;+  BYTE  1ST BAD SECTOR SECTOR  +
  613. ;+  BYTE  1ST SAT SECTOR         +
  614. ;+  BYTE  1ST DIRECTORY SECTOR   +
  615. ;+  BYTE  1ST DATA SECTOR        +
  616. ;+  WORD  LAST SAT BYTE          +
  617. ;+  BYTE  LAST SAT BIT           +
  618. ;+  WORD  SECTORS PER CYLINDER   +
  619. ;+-------------------------------+
  620. ;+ THE TABLE WILL CONTAIN TWO    +
  621. ;+ ENTRIES WHICH WILL BE FILLED  +
  622. ;+ FROM SECTOR 0 OF THE DRIVE.   +
  623. ;+ CONTROLLER CARD.  THIS TABLE  +
  624. ;+ WILL HAVE DEFAULT PARMS IN    +
  625. ;+ CASE DRIVE ISN'T PROPERLY     +
  626. ;+ FORMATED.                     +
  627. ;+++++++++++++++++++++++++++++++++
  628. ;
  629. ;**** NOTE:  OBSERVE THE DBY  ****
  630. ;+ OPS.  THEY DEFINE TWO BYTES   +
  631. ;+ WITH THE MSB FIRST AND LSB    +
  632. ;+ LAST.  OPPOSITE OF THE WOR OP.+
  633. ;+ CARE SHOULD BE USED IF CONVERT+
  634. ;+ INT TO ANOTHER ASSEMBLER FOR- +
  635. ;+ MAT.                          +
  636. ;**********  ********* ***********
  637. ;
  638. ;+ DRIVE 0 PARM TABLE ENTRY      +
  639. DEFPT = * ;DEFAULT TABLE
  640. DFCYLS .DBY 306 ;306 CYLINDERS
  641. DFHEAD .BYT 2 ; 4 HEADS
  642. DFREDU .DBY 200 ;REDUCED WRITE CURRENT BEGIN
  643. DFPREC .DBY 200 ;START PRECOMP WRITE
  644. DFECCL .BYT 11 ;ECC LENGTH
  645. DFSTEP .BYT 5 ;STEP RATE
  646. DFTOTS .BYT 0,0,100 ;NUMBER SECTORS
  647. DFBADS .BYT 1 ;FIRST BAD SECTOR SECTOR
  648. DFFSAT .BYT 5 ;FIRST SAT SECTOR
  649. DFLSAT .BYT 6 ;LAST SAT SECTOR
  650. DFFDIR .BYT 7 ;FIRST DIRECTORY SECTOR
  651. DFFAVA .BYT 48 ;FIRST AVAILABLE SECTOR
  652. DFSBYT .DBY 50 ;LAST SAT BYTE
  653. DFSBIT .BYT 1 ;LAST SAT BIT
  654. DFSCYL .WOR 34 ;SECTORS PER CYLINDER
  655. ;TEN BYTE VOLUME LABEL AREA
  656. ;
  657. .END HARDISKZ.BIOS