home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / HACK4-3OF5.SFX / hack4.3-5
Encoding:
Text File  |  1990-02-12  |  38.4 KB  |  781 lines

  1. MATCHES, A RASTER INTERRUPT IS GENERATED IF ENABLED. ╥ASTER REGISTER HAS ITS
  2. MOST SIGNIFICANT (9TH) BIT IN REGISTER 17 ($11).
  3.  
  4. ╘HE INTERRUPT REGISTER SHOWS THE STATUS OF THE FOUR SOURCES OF INTERRUPT.
  5. ┴ CORRESPONDING BIT WILL BE SET TO "1" WHEN AN INTERRUPT SOURCE HAS GENERATED
  6. AN INTERRUPT REQUEST. ╘O ENABLE AN INTERRUPT REQUEST TO SET THE /╔╥╤ OUTPUT
  7. TO ZERO, THE CORRESPONDING ENABLE BIT IN REGISTER 26 ($1A) MUST BE SET TO
  8. "1". ╘HE INTERRUPT LATCH MAY ONLY BE CLEARED BY WRITING A "1" TO THE
  9. DESIRED LATCH IN THE INTERRUPT REGISTER.
  10.  
  11. -----------------------------------------------------------------------------
  12. ╓╔├ REGISTER MAP (┬ASE ADDRESS $D000)
  13.  
  14. ┴DDRESS ─┬7   ─┬6   ─┬5   ─┬4   ─┬3   ─┬2   ─┬1   ─┬0   ─ESCRIPTION
  15. -------------------------------------------------------------------
  16. 00 $00  ═0╪7  ═0╪6  ═0╪5  ═0╪4  ═0╪3  ═0╪2  ═0╪1  ═0╪0  ═╧┬ 0 ╪-POSITION
  17. 01 $01  ═0┘7  ═0┘6  ═0┘5  ═0┘4  ═0┘3  ═0┘2  ═0┘1  ═0┘0  ═╧┬ 0 ┘-POSITION
  18. 02 $02  ═1╪7  ═1╪6  ═1╪5  ═1╪4  ═1╪3  ═1╪2  ═1╪1  ═1╪0  ═╧┬ 1 ╪-POSITION
  19. 03 $03  ═1┘7  ═1┘6  ═1┘5  ═1┘4  ═1┘3  ═1┘2  ═1┘1  ═1┘0  ═╧┬ 1 ┘-POSITION
  20. 04 $04  ═2╪7  ═2╪6  ═2╪5  ═2╪4  ═2╪3  ═2╪2  ═2╪1  ═2╪0  ═╧┬ 2 ╪-POSITION
  21. 05 $05  ═2┘7  ═2┘6  ═2┘5  ═2┘4  ═2┘3  ═2┘2  ═2┘1  ═2┘0  ═╧┬ 2 ┘-POSITION
  22. 06 $06  ═3╪7  ═3╪6  ═3╪5  ═3╪4  ═3╪3  ═3╪2  ═3╪1  ═3╪0  ═╧┬ 3 ╪-POSITION
  23. 07 $07  ═3┘7  ═3┘6  ═3┘5  ═3┘4  ═3┘3  ═3┘2  ═3┘1  ═3┘0  ═╧┬ 3 ┘-POSITION
  24. 08 $08  ═4╪7  ═4╪6  ═4╪5  ═4╪4  ═4╪3  ═4╪2  ═4╪1  ═4╪0  ═╧┬ 4 ╪-POSITION
  25. 09 $09  ═4┘7  ═4┘6  ═4┘5  ═4┘4  ═4┘3  ═4┘2  ═4┘1  ═4┘0  ═╧┬ 4 ┘-POSITION
  26. 10 $0A  ═5╪7  ═5╪6  ═5╪5  ═5╪4  ═5╪3  ═5╪2  ═5╪1  ═5╪0  ═╧┬ 5 ╪-POSITION
  27. 11 $0B  ═5┘7  ═5┘6  ═5┘5  ═5┘4  ═5┘3  ═5┘2  ═5┘1  ═5┘0  ═╧┬ 5 ┘-POSITION
  28. 12 $0C  ═6╪7  ═6╪6  ═6╪5  ═6╪4  ═6╪3  ═6╪2  ═6╪1  ═6╪0  ═╧┬ 6 ╪-POSITION
  29. 13 $0D  ═6┘7  ═6┘6  ═6┘5  ═6┘4  ═6┘3  ═6┘2  ═6┘1  ═6┘0  ═╧┬ 6 ┘-POSITION
  30. 14 $0E  ═7╪7  ═7╪6  ═7╪5  ═7╪4  ═7╪3  ═7╪2  ═7╪1  ═7╪0  ═╧┬ 7 ╪-POSITION
  31. 15 $0F  ═7┘7  ═7┘6  ═7┘5  ═7┘4  ═7┘3  ═7┘2  ═7┘1  ═7┘0  ═╧┬ 7 ┘-POSITION
  32. 16 $10  ═7╪8  ═6╪8  ═5╪8  ═4╪8  ═3╪8  ═2╪8  ═1╪8  ═0╪8  ═╙┬ OF ╪-POSITION
  33.  
  34. 17 $11  ╥├8   ┼├═   ┬══   ─┼╬   ╥╙┼╠  ┘2    ┘1    ┘0    (╙EE TEXT)
  35. 18 $12  ╥├7   ╥├6   ╥├5   ╥├4   ╥├3   ╥├2   ╥├1   ╥├0   ╥ASTER REGISTER
  36. 19 $13  ╠╨╪8  ╠╨╪7  ╠╨╪6  ╠╨╪5  ╠╨╪4  ╠╨╪3  ╠╨╪2  ╠╨╪1  ╠IGHT ╨EN ╪
  37. 20 $14  ╠╨┘7  ╠╨┘6  ╠╨┘5  ╠╨┘4  ╠╨┘3  ╠╨┘2  ╠╨┘1  ╠╨┘0  ╠IGHT ╨EN ┘
  38. 21 $15  ═7┼   ═6┼   ═5┼   ═4┼   ═3┼   ═2┼   ═1┼   ═0┼   ═╧┬ ┼NABLE
  39. 22 $16  -     -     ╥┼╙   ═├═   ├╙┼╠  ╪2    ╪1    ╪0    (╙EE TEXT)
  40. 23 $17  ═7┘┼  ═6┘┼  ═5┘┼  ═4┘┼  ═3┘┼  ═2┘┼  ═1┘┼  ═0┘┼  ═╧┬ ┘-EXPAND
  41. 24 $18  ╓═13  ╓═12  ╓═11  ╓═10  ├┬13  ├┬12  ├┬11  -     ═EMORY ╨OINTERS
  42. 25 $19  ╔╥╤   -     -     -     ╔╠╨   ╔══├  ╔═┬├  ╔╥╙╘  ╔NTERRUPT ╥EGISTER
  43. 26 $1A  -     -     -     -     ┼╠╨   ┼══├  ┼═┬├  ┼╥╙╘  ┼NABLE ╔NTERRUPT
  44. 27 $1B  ═7─╨  ═6─╨  ═5─╨  ═4─╨  ═3─╨  ═2─╨  ═1─╨  ═0─╨  ═╧┬-─┴╘┴ ╨RIORITY
  45. 28 $1C  ═7═├  ═6═├  ═5═├  ═4═├  ═3═├  ═2═├  ═1═├  ═0═├  ═╧┬ ═ULTICOLOR SELECT
  46. 29 $1D  ═7╪┼  ═6╪┼  ═5╪┼  ═4╪┼  ═3╪┼  ═2╪┼  ═1╪┼  ═0╪┼  ═╧┬ ╪-┼XPAND
  47. 30 $1E  ═7═   ═6═   ═5═   ═4═   ═3═   ═2═   ═1═   ═0═   ═╧┬-═╧┬  ├OLLISION
  48. 31 $1F  ═7─   ═6─   ═5─   ═4─   ═3─   ═2─   ═1─   ═0─   ═╧┬-─┴╘┴ ├OLLISION
  49.  
  50. 32 $20  -     -     -     -     ┼├3   ┼├2   ┼├1   ┼├0   ┼XTERIOR ├OLOR
  51. 33 $21  -     -     -     -     ┬0├3  ┬0├2  ┬0├1  ┬0├0  ┬ACKGROUND #0 ├OLOR
  52. 34 $22  -     -     -     -     ┬1├3  ┬1├2  ┬1├1  ┬1├0  ┬ACKGROUND #1 ├OLOR
  53. 35 $23  -     -     -     -     ┬2├3  ┬2├2  ┬2├1  ┬2├0  ┬ACKGROUND #2 ├OLOR
  54. 36 $24  -     -     -     -     ┬3├3  ┬3├2  ┬3├1  ┬3├0  ┬ACKGROUND #3 ├OLOR
  55. 37 $25  -     -     -     -     ══03  ══02  ══01  ══00  ═╧┬ ═ULTICOLOR #0
  56. 38 $26  -     -     -     -     ══13  ══12  ══11  ══10  ═╧┬ ═ULTICOLOR #1
  57.  
  58. 39 $27  -     -     -     -     ═0├3  ═0├2  ═0├1  ═0├0  ═╧┬ 0 ├OLOR
  59. 40 $28  -     -     -     -     ═1├3  ═1├2  ═1├1  ═1├0  ═╧┬ 1 ├OLOR
  60. 41 $29  -     -     -     -     ═2├3  ═2├2  ═2├1  ═2├0  ═╧┬ 2 ├OLOR
  61. 42 $2A  -     -     -     -     ═3├3  ═3├2  ═3├1  ═3├0  ═╧┬ 3 ├OLOR
  62. 43 $2B  -     -     -     -     ═4├3  ═4├2  ═4├1  ═4├0  ═╧┬ 4 ├OLOR
  63. 44 $2C  -     -     -     -     ═5├3  ═5├2  ═5├1  ═5├0  ═╧┬ 5 ├OLOR
  64. 45 $2D  -     -     -     -     ═6├3  ═6├2  ═6├1  ═6├0  ═╧┬ 6 ├OLOR
  65. 46 $2E  -     -     -     -     ═7├3  ═7├2  ═7├1  ═7├0  ═╧┬ 7 ├OLOR
  66.  
  67. ═N╪  = ═╧┬ N ╪ POSITION         ═N┘  = ═╧┬ N ┘ POSITION
  68. ╥├   = ╥ASTER COMPARE REGISTER  ┼├═  = ┼XTENDED COLOR MODE
  69. ═┬┬  = ┬IT MAP MODE             ─┼╬  = ─ISPLAY ENABLE
  70. ╥╙┼╠ = ╥OW SELECT               ┘    = ╙CREEN ┘ POSITION
  71. ╠╨╪  = ╠IGHT PEN ╪ POSITION     ╠╨┘  = ╠IGHT PEN ┘ POSITION
  72. ═N┼  = ═╧┬ N ┼NABLE             ╥┼╙  = ┴LWAYS SET TO ZERO!
  73. ═├═  = ═ULTICOLOR MODE          ├╙┼╠ = ├OLUMN SELECT
  74. ╪    = ╙CREEN ╪ POSITION        ═N┘┼ = ═╧┬ N ┘ EXPAND
  75. ╓═   = ╓IDEO MATRIX POINTER     ├┬   = ├HARACTER BASE POINTER
  76. ═N─╨ = ═╧┬ TO DATA PRIORITY     ═N═├ = ═╧┬ N MULTICOLOR SELECT
  77. ═N╪┼ = ═╧┬ N ╪ EXPAND
  78.  
  79. =============================================================================
  80. ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
  81.  
  82. BY ├RAIG ┬RUCE  <CSBRUCE@NEUMANN.UWATERLOO.CA>
  83.  
  84. 1. ╔╬╘╥╧─╒├╘╔╧╬
  85.  
  86. ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
  87. OF ═╙-─╧╙ DISKS.  ╘HE PROGRAM COPIES ONLY FROM DRIVE TO DRIVE WITHOUT
  88. BUFFERING FILE DATA INTERNALLY.  ╘HIS IS SIMPLER AND IMPOSES NO LIMITS ON THE
  89. SIZE OF THE FILES TRANSFERRED, ALTHOUGH IT REQUIRES THE USE OF TWO DISK DRIVES
  90. (OR A LOGICAL DRIVE).  ╘HE USER-INTERFACE CODE IS WRITTEN IN ┬┴╙╔├ AND
  91. PRESENTS A FULL-SCREEN FILE SELECTION MENU.  ╘HE GRUNT-WORK CODE IS WRITTEN IN
  92. ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM VELOSITY.
  93.  
  94. ╘HE ┬URST ├OMMAND ╔NSTRUCTION ╙ET OF THE 1571/81 IS USED TO READ THE ═╙-─╧╙
  95. DISK BLOCKS AND THE STANDARD KERNEL ROUTINES ARE USED FOR OUTPUTTING THE
  96. DATA.  (╔ AM AN OPERATING SYSTEMS SPECIALIST, SO ╔ CALL IT A KERN┼L!)  ╘HUS,
  97. THE ═╙-─╧╙ FILES MUST BE READ FROM A 1571 OR 1581 DISK DRIVE, BUT THE OUTPUT
  98. DEVICE MAY BE ANY DISK DRIVE TYPE, THE SCREEN OR A PRINTER, OR A VIRTUAL DRIVE
  99. TYPE SUCH AS ╥┴═╠INK, ╥┴═─RIVE, OR ╥┴═─╧╙ (FOR THE ╥┼╒).  ╔T IS INTERESTING TO
  100. NOTE THAT THE DATA CAN BE READ IN FROM AN ═╙-─╧╙ DISK FASTER THAN IT CAN BE
  101. WRITTEN OUT TO A 1571, 1581, OR EVEN A ╥┴═─╧╙ FILE.  ┴ ╥┴═╠INK CAN SWALLOW THE
  102. DATA ONLY SLIGHTLY FASTER THAN IT CAN BE READ.
  103.  
  104. ╠ITTLE ╥ED ╥EADER (╠╥╥) SUPPORTS DOUBLE DENSITY 3.5" DISKS FORMATTED WITH 80
  105. TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1581 AND 5.25" DOUBLE DENSITY
  106. DISKS FORMATTED WITH 40 TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1571.
  107. ┴ LIMIT OF 128 DIRECTORY ENTRIES AND 3 ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) SECTORS IS
  108. IMPOSED.  ╘HERE MUST BE 2 COPIES OF THE ╞┴╘ AND THE CLUSTER SIZE MAY BE 1 OR 2
  109. SECTORS.  ╘HE SECTOR SIZE MUST BE 512 BYTES.
  110.  
  111. ╧H, ABOUT THE NAME.  ╔T IS A PLAY ON THE NAME OF ANOTHER ═╙-─╧╙ FILE COPIER
  112. AVAILABLE FOR THE ├-128.  "╠ITTLE" MEANS THAT IT IS SMALLER IN SCOPE THAN THE
  113. OTHER PROGRAM, AND "╥ED" IS A DIFFERENT PRIMARY COLOR TO AVOID ANY LEGAL
  114. COMPLICATIONS.  ╔T IS ALSO THE NON-WHITE COLOR OF THE FLAG OF THE COUNTRY OF
  115. ORIGIN OF THIS PROGRAM (NO, ╔ AM NOT ╩APANESE).  ┴LSO, THIS PROGRAM IS ╨UBLIC
  116. ─OMAIN ╙OFTWARE, AS IS ALL SOFTWARE ╔ DEVELOP FOR 8-BIT ├OMMODORE ├OMPUTERS.
  117. ╞EEL FREE TO ┼-MAIL ME IF YOU HAVE QUESTIONS OR COMMENTS ABOUT THIS ARTICLE.
  118.  
  119. 2. ╒╙┼╥ ╟╒╔─┼
  120.  
  121. ╠╧┴─ AND ╥╒╬ THE "LRR.128" ┬┴╙╔├ PROGRAM FILE.  ╫HEN THE PROGRAM IS FIRST RUN,
  122. IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
  123. LANGUAGE PACKAGE FROM THE "CURRENT" ├OMMODORE ─╧╙ DRIVE (THE CURRENT DRIVE IS
  124. OBTAINED FROM ╨┼┼╦(186) - THE LAST DEVICE ACCESSED).  ╘HE BINARY PACKAGE IS
  125. LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
  126. PACKAGE ╔─ FIELD IS IN PLACE.
  127.  
  128. 2.1. ═┴╔╬ ╙├╥┼┼╬
  129.  
  130. ╘HE MAIN SCREEN OF THE PROGRAM IS THEN DISPLAYED.  ╘HE MAIN SCREEN OF THE
  131. PROGRAM WILL LOOK SOMETHING LIKE THIS:
  132.  
  133.    ═╙-─┼╓=9    ═╙-╘┘╨┼=1581    ├┬═-─┼╓=8
  134.  
  135.    ╬╒═  ╙  ╘╥╬  ╘┘╨  ╞╔╠┼╬┴═┼  ┼╪╘  ╠┼╬╟╘╚
  136.    ---  -  ---  ---  --------  ---  ------
  137.      1  *  ┴╙├  ╙┼╤  ╚┴├╦4     ╘╪╘  120732
  138.      2     ┬╔╬  ╨╥╟  ╥┴═─╧╙    ╙╞╪   34923
  139.  
  140.    ─=─╔╥┼├╘╧╥┘  ═=═╙-─┼╓  ╞=├┬═-─┼╓ ╤=╤╒╔╘
  141.    ╘=╘╧╟╟╠┼-├╧╠╒═╬, ├=├╧╨┘-╞╔╠┼╙, +/- ╨┴╟┼
  142.  
  143. EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<NO FILES>" WILL BE DISPLAYED
  144. RATHER THAN FILENAMES.  ╘HE "═╙-─┼╓" AND "═╙-╘┘╨┼" FIELDS GIVE THE DEVICE
  145. NUMBER AND TYPE OF THE DRIVE CONTAINING THE ═╙-─╧╙ DISK TO COPY FROM, AND THE
  146. "├┬═-─┼╓" GIVES THE DEVICE NUMBER OF THE DRIVE/VIRTUAL DRIVE/CHARACTER DEVICE
  147. TO COPY FILE DATA TO.
  148.  
  149. ╔NFORMATION ABOUT ALL ═╙-─╧╙ FILES IN THE ROOT DIRECTORY OF THE ═╙-─╧╙ DISK IS
  150. DISPLAYED IN COLUMNS BELOW THE DRIVE INFORMATION.  "╬╒═" GIVES THE NUMBER OF
  151. THE ═╙-─╧╙ FILE IN THE DIRECTORY LISTING, AND "╙" INDICATES WHETHER THE FILE
  152. IS "SELECTED" OR NOT.  ╔F THE FILE IS SELECTED, AN ASTERISK (*) IS DISPLAYED;
  153. OTHERWISE, A BLANK IS DISPLAYED.  ╫HEN YOU LATER ENTER ├OPY ═ODE, ONLY THE
  154. FILES THAT HAVE BEEN "SELECTED" ARE COPIED.
  155.  
  156. ╘HE "╘╥╬" FIELD INDICATES THE CHARACTER TRANSLATION SCHEME TO BE USED WHEN THE
  157. FILE IS COPIED.  ┴ VALUE OF "┬╔╬" (BINARY) MEANS NO TRANSLATION AND A VALUE OF
  158. "┴╙├" (ASCII) MEANS THE FILE CHARACTERS ARE TO BE TRANSLATED FROM ═╙-─╧╙ ┴╙├╔╔
  159. (OR "┴╙├╔╔-├R╠F") TO ╨┼╘╙├╔╔.  ╘HE "╘┘╨" FIELD INDICATES THE TYPE OF
  160. ├OMMODORE-─╧╙ FILE TO CREATE FOR WRITING THE ═╙-─╧╙ FILE CONTENTS INTO.  ╘HE
  161. POSSIBLE VALUES ARE "╙┼╤" (SEQUENTIAL) AND "╨╥╟" (PROGRAM).  ╘HE VALUES OF THE
  162. ╘╥╬ AND ╘┘╨ FILEDS ARE SET INDEPENDENTLY, SO YOU CAN COPY BINARY DATA TO ╙┼╤
  163. FILES AND ASCII DATA TO ╨╥╟ FILES IF YOU WISH.
  164.  
  165. ╘HE "╞╔╠┼╬┴═┼" AND "┼╪╘" FIELDS GIVE THE FILENAME AND EXTENSION TYPE OF THE
  166. ═╙-─╧╙ FILES AND "╠┼╬╟╘╚" GIVES THE EXACT LENGTH OF THE FILES IN BYTES.  ╬OTE
  167. THAT IF YOU PERFORM "┴╙├" TRANSLATION ON A FILE, ITS ╨┼╘╙├╔╔ VERSION WILL HAVE
  168. A SHORTER LENGTH.
  169.  
  170. 2.2. ╒╙┼╥ ├╧══┴╬─╙
  171.  
  172. ╘HE BOTTOM OF THE SCREEN GIVES THE COMMAND SUMMARY.  ┴FTER STARTING THE
  173. PROGRAM, YOU WILL WANT TO SETUP THE ═╙-─╧╙ AND ├┬═-─╧╙ DRIVES WITH THE "═" AND
  174. "╞" COMMANDS.  ╙IMPLY PRESS THE (LETTER) KEY CORRESPONDING TO THE COMMAND
  175. NAME TO ACTIVATE THE COMMAND.  ╨RESSING ═ WILL PROMPT YOU FOR THE ═╙-─╧╙ ─RIVE
  176. ╬UMBER AND THE ═╙-─╧╙ ─RIVE ╘YPE.  ╔N BOTH CASES, TYPE THE NUMBER AND PRESS
  177. ╥┼╘╒╥╬.  (╙ORRY FOR INSULTING ALL NON-NOVICES OUT THERE, BUT ╔ WANT TO BE
  178. COMPLETE).  ╘HE ═╙-─╧╙ DRIVE NUMBER CANNOT BE THE SAME AS THE ├┬═-─╧╙ DRIVE
  179. NUMBER (SINCE THE PROGRAM COPIES FROM DRIVE-TO-DRIVE WITHOUT INTERNAL
  180. BUFFERING).  ╞OR THE DRIVE TYPE, ENTER AN "8", "81", OR "1581" FOR A 1581
  181. DRIVE OR ANYTHING ELSE FOR A 1571 DRIVE.
  182.  
  183. ╨RESSING ╞ WILL PROMPT YOU FOR THE ├┬═-─╧╙ DEVICE NUMBER.  ┘OU MAY ENTER A
  184. NUMBER FROM 0 TO 30, EXCEPT THAT IT MUST NOT BE THE ═╙-─╧╙ DRIVE NUMBER.
  185. ┼NTER A "1" FOR ├ASSETTE ─RIVE (╟OD FORBID!), A "3" FOR THE SCREEN, A "4" FOR
  186. THE PRINTER (WITH AN AUTOMATIC SECONDARY ADDRESS OF 7 (LOWERCASE)), ANY NUMBER
  187. ABOVE 7 FOR A ├OMMODORE DISK DRIVE OR SPECIAL VIRTUAL DRIVE, OR A VALUE OF "0"
  188. FOR THE SPECIAL "NULL" DRIVE.  ┴ ├┬═-─┼╓ VALUE OF 0 WILL CASE THE PROGRAM TO
  189. READ ═╙-─╧╙ FILES AND DO NOTHING WITH THE OUTPUT.  ┘OU CAN USE THIS FEATURE TO
  190. CHECK OUT THE RAW READING SPEED OF THE PROGRAM.
  191.  
  192. ┴FTER SETTING UP THE DRIVES, PRESS ─ TO READ IN THE ROOT DIRECTORY OFF THE
  193. ═╙-─╧╙ DISK.  ╘HE DATA WILL COME BLAZING IN FROM THE DISK BUT ┬┴╙╔├ WILL TAKE
  194. ITS GOOD OLE TIME SIFTING THROUGH IT.  ╞ILENAMES ARE DISPLAYED ON THE SCREEN
  195. AS THEY ARE SCANNED IN.  ╘HE PROGRAM WILL (EVENTUALLY) RETURN TO THE MAIN
  196. SCREEN AND DISPLAY THE FORMATTED FILE INFORMATION.  ╧NE NOTE: THE PROCESS OF
  197. LOGGING IN A 1581 ═╙-─╧╙ DISK TAKES ABOUT 12 SECONDS (ON MY 1581, ANYWAY), SO
  198. BE PATIENT.  ┴N ═╙-─╧╙ DISK WILL HAVE TO BE "LOGGED IN" EVERY TIME YOU CHANGE
  199. ═╙-─╧╙ DISKS.  (─ISKS ARE LOGGED IN AUTOMATICALLY).
  200.  
  201. ┴ COUPLE OF NOTES ABOUT ACCESSING ═╙-─╧╙ DISKS: DON'T TRY TO ACCESS A DEVICE
  202. THAT IS NOT PRESENT BECAUSE THE MACHINE LANGUAGE ROUTINES CANNOT HANDLE THIS
  203. ERROR FOR SOME REASON AND WILL LOCK UP, REQUIRING A ╙╘╧╨+╥┼╙╘╧╥┼.  ┴LSO, MAKE
  204. SURE THAT AN ACTUAL ═╙-─╧╙ DISK IS LOADED INTO THE DRIVE.  ╔F YOU ACCIDENTALLY
  205. PLACE ├OMMODORE-─╧╙ DISK INTO THE ═╙-─╧╙ DRIVE, THE 1581 WILL REPORT AN
  206. INVALID BOOT PARAMETERS ERROR (#60), BUT A 1571 WILL LOCK UP (SINCE ╔ DON'T
  207. CHECK THE SECTOR SIZE AND MY BURST ROUTINES ARE EXPECTING 512 BYTES TO COME
  208. OUT OF A SECTOR WHEREAS ├OMMODORE DISKS HAVE ONLY 256 BYTES PER SECTOR).
  209.  
  210. ╬OW YOU ARE READY TO PICK WHAT FILES YOU WANT COPIED AND HOW YOU WANT THEM
  211. COPIED.  ┘OU WILL NOTICE THAT A "CURSOR" APPEARS IN THE "╙" COLUMN OF THE
  212. FIRST FILE.  ┘OU MAY MOVE THE CURSOR AROUND WITH THE CURSOR KEYS: ╒╨, ─╧╫╬,
  213. ╠┼╞╘, ╥╔╟╚╘, ╚╧═┼, AND ├╠╥.  ├╠╥ (╙╚╔╞╘-╚╧═┼) WILL MOVE THE CURSOR BACK TO THE
  214. FIRST FILE ON THE FIRST SCREEN.  ┘OU CAN MOVE THE CURSOR AMONG THE SELECT,
  215. TRANSLATION, AND FILE-TYPE COLUMNS OF ALL THE FILES.  ╨RESSING A ╙╨┴├┼ OR A
  216. ╥┼╘╒╥╬ WILL TOGGLE THE VALUE OF THE FIELD THAT THE CURSOR IS ON.  ╘O TOGGLE
  217. ALL OF THE VALUES OF THE "CURSOR" COLUMN (INCLUDING FILES ON ALL OTHER
  218. SCREENS), PRESS ╘.  ┘OU WILL NOTICE THAT MOVING THE CURSOR AROUND AND TOGGLING
  219. FIELDS IS A BIT SLUGGISH, ESPECIALLY IF YOU ARE IN ╙LOW MODE ON THE 40-COLUMN
  220. SCREEN.  ─ID ╔ MENTION THAT THIS PROGRAM WILL RUN ON EITHER THE 40 OR
  221. 80-COLUMN SCREEN?  ╘OGGLING AN ENTIRE COLUMN CAN TAKE A COUPLE OF SECONDS.
  222.  
  223. ╔F THERE ARE MORE THAN 18 ═╙-─╧╙ FILES, YOU CAN PRESS THE "+" AND "-" KEYS TO
  224. MOVE AMONG ALL OF THE SCREENS OF FILES.  ╘HE CURSOR MOVEMENT KEYS WILL WRAP
  225. AROUND ON THE CURRENT SCREEN.  "+" IS PAGE FORWARD, AND "-" IS PAGE BACKWARD.
  226. ╘HE SCREENS WRAP AROUND TOO.
  227.  
  228. ┴FTER YOU HAVE SELECTED ALL OF THE FILES YOU WANT TO COPY AND THEIR TRANSLATION
  229. AND FILE-TYPE FIELDS HAVE BEEN SET, PRESS THE ├ KEY TO GO INTO ├OPY ═ODE (NEXT
  230. SECTION).  ┴FTER COPYING, YOU ARE RETURNED TO THE MAIN SCREEN WITH ALL OF THE
  231. FIELD SETTINGS STILL INTACT.  ╘O EXIT FROM THE PROGRAM, PRESS ╤.
  232.  
  233. 2.3. ├╧╨┘ ═╧─┼
  234.  
  235. ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
  236. FILE IS DISPLAYED AS IT IS BEING COPIED.  ╔F AN ERROR IS ENCOUNTERED ON EITHER
  237. THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
  238. AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS).
  239.  
  240. ╘O GENERATE A ├┬═-─╧╙ FILENAME FROM AN ═╙-─╧╙ FILENAME, THE EIGHT FILENAME
  241. CHARACTERS ARE TAKEN (INCLUDING SPACES) AND A DOT (.) AND THE THREE CHARACTERS
  242. OF THE EXTENSION ARE APPENDED.  ╘HEN, ALL SPACES ARE REMOVED, AND IF THE NAME
  243. ENDS WITH A DOT (.) CHARACTER, THEN THAT DOT CHARACTER IS REMOVED AS WELL.  ╔
  244. THINK THIS IS FAIRLY REASONABLE.
  245.  
  246. ╔F THERE ALREADY IS A FILE WITH THE SAME FILENAME ON THE ├┬═-─╧╙ DISK, THEN
  247. YOU WILL BE PROMPTED IF YOU WANT TO OVERWRITE THE FILE OR NOT.  ┼NTERING AN
  248. "N" WILL ABORT THE COPYING OF THAT FILE AND GO ON TO THE NEXT FILE, AND
  249. ENTERING A "Y" (OR ANYTHING ELSE) WILL CAUSE THE ├┬═-─╧╙ FILE TO BE
  250. "SCRATCHED" AND THEN RE-WRITTEN.
  251.  
  252. ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
  253. NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
  254. THINGS BY LOOKING AT DAS BLINKIN LICHTES AND LISTENING FOR CLICKS AND GRINDS.
  255. ┘OU WILL PROBABLY BE SURPRISED BY THE ═╙-─╧╙ FILE READING SPEED (╔ MEAN IN A
  256. GOOD WAY).  ╘HE DISK DATA IS READ IN WHOLE TRACKS AND CACHED IN MEMORY AND THE
  257. DIRECTORY INFORMATION AND THE ╞┴╘ ARE RETAINED IN MEMORY AS WELL.  ╘HE RESULT
  258. IS THAT MINIMAL TIME IS SPENT READING DISK DATA, AND NO COSTLY SEEKS ARE
  259. REQUIRED FOR OPENING A NEW ═╙-─╧╙ FILE.  ┴ RESULT IS THAT SMALL FILES ARE
  260. COPIED ONE AFTER ANOTHER VERY QUICKLY.  ┘OU WILL HAVE TO WAIT, HOWEVER, ON THE
  261. RELATIVELY SLOW STANDARD KERNEL/├OMMODORE-─╧╙ FILE WRITING.
  262.  
  263. ┴ FEW CHANGES HAD TO BE MADE TO THE PROGRAM TO ACCOMODATE THE ╥┴═─╧╙ PROGRAM.
  264. ╥┴═─╧╙ USES MEMORY FROM $2300 TO $3╞╞╞ OF ╥┴═0, WHICH IS NOT REALLY A GOOD
  265. PLACE FOR A DEVICE DRIVER, AND IT USES SOME OF THE ZERO-PAGE LOCATIONS THAT ╔
  266. WANTED TO USE.  ┬UT, DIFFICULTIES WERE OVERCOME.  ╘HE IMPORTANCE OF ╥┴═─╧╙
  267. COMPATIBILITY IS THAT IF YOU ONLY HAVE ONE DISK DRIVE BUT YOU HAVE AN ╥┼╒, YOU
  268. CAN USE ╥┴═─╧╙ TO STORE THE ═╙-─╧╙ FILES TEMPORARILY.  ╔F YOU ONLY HAVE ONE
  269. DISK DRIVE AND NO ╥┼╒, YOU ARE ╙╧╠ (╧UT OF ╠UCK) UNLESS YOU CAN GET A
  270. ╥AM─ISK-TYPE PROGRAM FOR AN UNEXPANDED 128.  ╘HE ╥┴═─╧╙ PROGRAM IS AVAILABLE
  271. FROM ╞╘╨ SITE "CCOSUN.CALTECH.EDU" IN FILE "/PUB/RKNOP/UTIL128/RAMDOSII.SFX".
  272. ╧NE NOTE ╔ FOUND OUT ABOUT ╥┴═─╧╙: YOU CANNOT USE A
  273.  
  274. ─╧╨┼╬#1,(├╞$),╒(├─),╫
  275.  
  276. WITH IT LIKE YOU ARE SUPPOSED TO BE ABLE TO; YOU HAVE TO USE A
  277.  
  278. ─╧╨┼╬#1,(├╞$+",╫"),╒(├─)
  279.  
  280. ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING FROM 1571S AND 1581S WITH ┴╙├
  281. AND ┬╔╬ TRANSLATION MODES.  ┴LL FIGURES ARE IN BYTES/SECOND.  ╘HESE RESULTS
  282. WERE OBTAINED FROM COPYING A 127,280 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING
  283. ╔SSUE #3).
  284.  
  285.    ╞╥╧═  \ ╘╧: "NULL"     ╥┴═╠INK     ╥┴═─╧╙     ╩─1581     ╩─1571
  286.    -------+    ------     -------     ------     ------     ------
  287.    81-BIN ▄      5772        3441       2146        N/A        644
  288.    81-ASC ▄      5772        3434       2164        N/A        661
  289.    71-BIN ▄      4323        2991       1949       1821        N/A
  290.    71-ASC ▄      4323        2982       1962       1847        N/A
  291.  
  292. ╘HE "NULL" DEVICE IS THAT "0" ├┬═-─╧╙ DEVICE NUMBER, AND A COUPLE OF ENTRIES
  293. ARE "N/A" SINCE ╔ ONLY HAVE ONE 1571 AND ONE 1581.  ╬OTE THAT MY 71 AND 81 ARE
  294. ╩IFFY─╧╙-IFIED, SO THE PERFORMANCE OF A STOCK 71/81 WILL BE POORER.  ╩IFFY─╧╙
  295. GIVES ABOUT A 2X PERFORMANCE IMPROVEMENT FOR THE STANDARD FILE ACCESSING CALLS
  296. (OPEN, CLOSE, CHRIN, CHROUT).  ╥┴═─╧╙ DOESN'T SEEM TO BE AS SNAPPY AS YOU
  297. MIGHT THINK.
  298.  
  299. ╘HE "NULL" FIGURES ARE QUITE IMPRESSIVE, BUT THE RAW SECTOR READING SPEED
  300. WITHOUT THE OVERHEAD OF MUCKING AROUND WITH FILE ORGANIZATION IS 6700
  301. BYTES/SEC FOR A 1581 AND 4600 ┬/S FOR A 71.  ╘HE REASON THAT THE 1571 OPERATES
  302. SO QUICKLY IS THAT ╔ USE A SECTOR INTERLEAVE OF 4 (WHICH IS OPTIMAL) FOR
  303. READING THE TRACKS.  ╔ THINK THAT OTHER ═╙-─╧╙ FILE COPIER PROGRAM USES AN
  304. INTERLEAVE OF 1 (WHICH IS NOT OPTIMAL).  ╔ LOSE SOME OF THE RAW PERFORMANCE
  305. BECAUSE ╔ COPY THE FILE DATA INTERNALLY ONCE BEFORE OUTPUTTING IT (TO SIMPLIFY
  306. SOME OF THE CODE).
  307.  
  308. ╔N A COUPLE OF PLACES YOU WILL NOTICE THAT ┴╙├ TRANSLATION GIVES SLIGHTLY
  309. BETTER OR SLIGHTLY WORSE PERFORMANCE THAN ┬╔╬.  ╘HIS IS BECAUSE ALTHOUGH
  310. SLIGHTLY MORE WORK IS REQUIRED TO TRANSLATE THE CHARACTERS, SLIGHTLY FEWER
  311. CHARACTERS WILL HAVE TO BE WRITTEN TO THE ├┬═-─╧╙ FILE, SINCE ╨┼╘╙├╔╔ USES
  312. ONLY ├╥ WHERE ═╙-─╧╙ ┴╙├╔╔ USES ├╥ AND ╠╞ TO REPRESENT END-OF-LINE.
  313. ╘RANSLATION IS DONE BY USING A TABLE (THAT YOU CAN CHANGE IF YOU WISH).  ═ANY
  314. ENTRIES IN THIS TABLE CONTAIN A VALUE OF ZERO, WHICH MEANS THAT NO CHARACTER
  315. WILL BE OUTPUT ON TRANSLATION.  ═OST OF THE CONTROL CHARACTERS AND ALL OF THE
  316. CHARACTERS OF VALUE 128 (0X80) OR GREATER ARE THROWN AWAY ON BEING
  317. TRANSLATED.  ╘HE TABLE IS SET UP SO THAT ├╥ CHARACTERS ARE THROWN AWAY AND THE
  318. ╠╞ CHARACTER IS TRANSLATED TO A ├┬═-─╧╙ ├╥ CHARACTER.  ╘HUS, BOTH ═╙-─╧╙ ┴╙├╔╔
  319. FILES AND ╒╬╔╪ ┴╙├╔╔ FILES CAN BE TRANSLATED CORRECTLY.
  320.  
  321. 2. ┬╒╥╙╘ ├╧══┴╬─╙
  322.  
  323. ╘HREE BURST COMMANDS FROM THE 1571/81 DISK DRIVE ┬URST ├OMMAND ╔NSTRUCTION ╙ET
  324. ARE REQUIRED TO ALLOW THIS PROGRAM TO READ THE ═╙-─╧╙ DISKS: ╤UERY ─ISK
  325. ╞ORMAT, ╙ECTOR ╔NTERLEAVE, AND ╥EAD.  ╘HE GRUNGY DETAILS ABOUT ISSUING BURST
  326. COMMANDS AND BURST MODE HANDSHAKING ARE COVERED IN ├= ╚ACKING ╔SSUE #3.  ╘HE
  327. ╤UERY ─ISK ╞ORMAT COMMAND IS USED TO "LOG IN" THE ═╙-─╧╙ DISK.  ╘HE ╔NQUIRE
  328. ─ISK BURST COMMAND CANNOT BE USED WITH AN ═╙-─╧╙ DISK ON THE 1581 FOR SOME
  329. UNKNOWN REASON.  ╔ FOUND THIS OUT THE HARD WAY.  ╘HE ╤UERY ─ISK ╞ORMAT COMMAND
  330. HAS THE FOLLOWING FORMAT:
  331.  
  332.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  333.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  334.      0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  335.      1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  336.      2    ▄     ╞  ▄  ╪  ▄  ╪  ▄  ╙  ▄  1  ▄  0  ▄  1  ▄  ╬  ▄  10
  337.    -------+--------------------------------------------------+-------
  338.  
  339. WHERE THE ╞, ╙, AND ╬ BITS HAVE A VALUE OF 0 FOR OUR PURPOSES.  ┴ RESPONSE OF
  340. A BURST STATUS BYTE AND SIX OTHER THROW-AWAY BYTES IS GIVEN FROM THE DRIVE.
  341. ╘HIS COMMAND TAKES QUITE A LONG TIME TO EXECUTE ON MY 1581 BUT WORKS QUITE
  342. QUICKLY ON MY 1571.  ┘OU ONLY HAVE TO LOG IN A DISK WHENEVER YOU CHANGE
  343. DISKS.
  344.  
  345. ╘HE ╙ECTOR ╔NTERLEAVE COMMAND IS USED TO SET A SOFT INTERLEAVE FOR THE ╥EAD
  346. COMMAND.  ╔ USE AN INTERLEAVE OF 1 FOR THE 1581 AND AN INTERLEAVE OF 4 FOR THE
  347. 1571.  ╘HIS MEANS THAT THE ═╙-─╧╙ SECTORS WILL COME FROM 1571 TO THE COMPUTER
  348. IN THE FOLLOWING ORDER: 1, 5, 9, 4, 8, 3, 7, 2, 6 (THERE ARE 9 SECTORS PER
  349. TRACK ON AN ═╙-─╧╙ DISK (BOTH 3.5" AND 5.25"), NUMBERED FROM 1 TO 9).  ╠╥╥
  350. HANDLES THE DATA COMING IN IN THIS ORDER, AND IN STRAIGHT ORDER FROM THE
  351. 1581.  ╘HE ╙ECTOR ╔NTERLEAVE COMMAND HAS THE FOLLOWING FORMAT, WHERE THE ╫ AND
  352. ╬ BITS ARE 0 FOR US:
  353.  
  354.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  355.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  356.      0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  357.      1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  358.      2    ▄     ╫  ▄  ╪  ▄  ╪  ▄  0  ▄  1  ▄  0  ▄  0  ▄  ╬  ▄   8
  359.      3    ▄                   <INTERLEAVE>                   ▄ 1 OR 4
  360.    -------+--------------------------------------------------+-------
  361.  
  362. ╘HE ╥EAD COMMAND IS USED TO TRANSFER THE NINE SECTORS OF A TRACK TO THE
  363. COMPUTER IN THE ORDER SPECIFIED BY THE INTERLEAVE.  ╘HE FORMAT IS:
  364.  
  365.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ▄ ╓ALUE
  366.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  367.      0    ▄     0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  0  ▄  1  ▄  "╒"
  368.      1    ▄     0  ▄  0  ▄  1  ▄  1  ▄  0  ▄  0  ▄  0  ▄  0  ▄  "0"
  369.      2    ▄    ╘/╠ ▄  ┼  ▄ ┬/╪ ▄  ╙  ▄  0  ▄  0  ▄  0  ▄  ╬  ▄ 0 OR 16
  370.      3    ▄                      <TRACK>                     ▄  ???
  371.      4    ▄                      <SECTOR>                    ▄   1
  372.      5    ▄                <NUMBER OF SECTORS>               ▄   9
  373.    -------+--------------------------------------------------+-------
  374.  
  375. ╘HERE ARE A COUPLE OF DIFFERENCES BETWEEN THE 1571 AND 1581 VERSIONS OF THIS
  376. COMMAND.  ═OST IMPORTANT, THE ╙ BIT (╙IDE OF DISK TO USE) HAS THE OPPOSITE
  377. MEANING ON THE TWO DRIVES.  ╘HERE'S NO GOOD REASON THAT ╔ KNOW OF FOR THIS
  378. INCONSISTENCY.  ╘HIS IS THE REASON THAT ╠╥╥ NEEDS TO KNOW WHAT TYPE OF ═╙-─╧╙
  379. DRIVE IT IS DEALING WITH (PLUS INTERLEAVING).
  380.  
  381. ╘HE READ COMMAND RETURNS THE FOLLOWING DATA USING BURST MODE HANDSHAKING:
  382.  
  383.        +-------------------+
  384.      0 ▄ ┬URST ╙TATUS ┬YTE ▄
  385.        +-------------------+
  386.      1 ▄                   ▄
  387.    ... +  512 ─ATA ┬YTES   ▄
  388.    512 ▄                   ▄
  389.        +-------------------+
  390.  
  391. FOR EACH SECTOR TRANSFERRED.  ╔F THE ┬URST ╙TATUS ┬YTE INDICATES AN ERROR,
  392. THEN THE DATA IS NOT TRANSFERRED AND NONE OF THE FOLLOWING SECTORS ARE
  393. EITHER.  ╔F THE STATUS BYTE GIVES A "─ISK ├HANGED" ERROR, THEN YOU HAVE TO LOG
  394. IN THE DISK WITH THE ╤UERY ─ISK ╞ORMAT COMMAND BEFORE READ WILL WORK
  395. PROPERLY.  ╘HIS IS ACTUALLY A GOOD FEATURE SINCE IT LETS YOU KNOW ABOUT A DISK
  396. CHANGE SO YOU CAN UPDATE ANY DATA STRUCTURES YOU MAY HAVE.  ╠╥╥ SIMPLY RE-LOGS
  397. IN THE DISK WITHOUT UPDATING ANY DATA STRUCTURES AND RE-TRIES THE FAILED READ
  398. OPERATION.
  399.  
  400. 3. ═╙-─╧╙ ─╔╙╦ ╞╧╥═┴╘
  401.  
  402. ┴N ═╙-─╧╙ DISK IS SEPARATED INTO 4 DIFFERENT PARTS: THE ┬OOT ╙ECTOR, THE
  403. ╞┴╘(S), THE ╥OOT ─IRECTORY, AND THE ╞ILE ─ATA ╙ECTORS.  ╘HE LOGICAL SECTORS
  404. (BLOCKS) OF A DISK ARE NUMBERED FROM 0 TO SOME MAXIMUM NUMBER (1439 FOR A
  405. 3.5", 719 FOR A 5.25" ── DISK).  ╘HE PHYSICAL LAYOUT AND THE LOGICAL SECTOR
  406. NUMBERS TYPICALLY USED BY A 3.5" DISK ARE SHOWN HERE:
  407.  
  408.          +-------------------+
  409.        0 ▄    ┬OOT ╙ECTOR    ▄
  410.          +-------------------+
  411.     1..3 ▄    ╞┴╘ COPY #1    ▄
  412.          +-------------------+
  413.     4..6 ▄    ╞┴╘ COPY #2    ▄
  414.          +-------------------+
  415.    7..14 ▄  ╥OOT ─IRECTORY   ▄
  416.          +-------------------+
  417.       15 ▄                   ▄
  418.      ... ▄ ╞ILE ─ATA ╙ECTORS ▄
  419.     1439 ▄                   ▄
  420.          +-------------------+
  421.  
  422. 3.1. ╘╚┼ ┬╧╧╘ ╙┼├╘╧╥
  423.  
  424. ╘HE ┬OOT ╙ECTOR IS ALWAYS AT LOGICAL SECTOR NUMBER 0.  ╔T CONTAINS SOME
  425. IMPORTANT INFORMATION ABOUT THE FORMAT OF THE DISK AND IT ALSO CONTAINS CODE
  426. TO BOOT AN ═╙-─╧╙ MACHINE FROM.  ╫E AREN'T CONCERNED WITH THE BOOTSTRAPPING
  427. CODE, BUT THE IMPORTANT VALUES WE NEED TO OBTAIN FROM THE BOOT SECTOR ARE:
  428.  
  429.    ┴┬┬╥     ╧╞╞╙┼╘     1571     1581     ─┼╙├╥╔╨╘╔╧╬
  430.    ----     ------     ----     ----     -----------
  431.     ├╙        13          2        2     ├LUSTER SIZE IN SECTORS
  432.     ╬┬        14          1        1     ╬UMBER OF BOOT SECTORS
  433.     ╬╞        16          2        2     ╬UMBER OF ╞┴╘S
  434.     ╞╠        23          2        3     ╞┴╘ SIZE IN SECTORS
  435.     ─┼        17        112      112     ╬UMBER OF ROOT DIRECTORY ENTRIES
  436.     ╘╙       19,20      720     1440     ╘OTAL ╬UMBER OF SECTORS
  437.     ╬╙        24          9        9     ╬UMBER OF SECTORS PER TRACK
  438.     ╬╚        26          2        2     ╬UMBER OF SIDES
  439.  
  440. ╘HE 1571 AND 1581 COLUMNS GIVE THE TYPICAL VALUES OF THESE PARAMETERS FOR
  441. 5.25" AND 3.5" DISKS.  ╘HE ╧╞╞╙┼╘ IS THE ADDRESS OF THE PARAMETER WITHIN THE
  442. BOOT SECTOR.  ╘HE TOTAL NUMBER OF SECTORS IS GIVEN IN LOW-BYTE, HIGH-BYTE
  443. ORDER (SINCE THE 80X86 FAMILY IS LITTLE-ENDIAN LIKE THE 6502 FAMILY).  ╞ROM
  444. THE ABOVE PARAMETERS, WE CAN DERIVE THE FOLLOWING IMPORTANT PARAMETERS:
  445.  
  446.    ┴┬┬╥     ╞╧╥═╒╠┴       1571     1581     ─┼╙├╥╔╨╘╔╧╬
  447.    ----      -------      ----     ----     -----------
  448.     ╞1      ╬┬+╬╞*╞╠         5        7     ╞IRST ROOT DIRECTORY SECTOR
  449.     ╞╙     ╬┬+╬╞*╞╠+─┼      12       14     ╞IRST FILE DATA SECTOR NUMBER
  450.     ╬├     (╘╙-╞╙)/├╙      354      713     ╘OTAL NUMBER OF FILE CLUSTERS
  451.  
  452. ╠╥╥ IMPOSES A NUMBER OF LIMITS ON THESE PARAMETERS AND WILL ERROR-OUT IF YOU
  453. TRY TO USE A DISK THAT IS OUTSIDE OF ╠╥╥'S LIMITS.
  454.  
  455. 3.2. ├╚┼╫╔╬╟ ╘╚┼ ╞┴╘
  456.  
  457. ═╙-─╧╙ DISKS USE A DATA STRUCTURE CALLED A ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) TO
  458. RECORD WHICH CLUSTERS BELONG TO WHICH FILE IN WHAT ORDER AND WHICH BLOCKS ARE
  459. FREE.  ┴ CLUSTER IS A SET OF CONTIGUOUS SECTORS WHICH ARE ALLOCATED TO FILES
  460. AS A GROUP.  ╠╥╥ HANDLES CLUSTER SIZES OF 1 AND 2 SECTORS, GIVING A LOGICAL
  461. FILE BLOCK SIZE OF 512 OR 1024 BYTES.  ╘YPICALLY, A CLUSTER SIZE OF 2 SECTORS
  462. IS USED.
  463.  
  464. ╘HE ╞┴╘ IS AN ARRAY OF 12-BIT NUMBERS, WITH AN ENTRY CORRESPONDING TO EACH
  465. CLUSTER THAT CAN BE ALLOCATED TO FILES.  ╞┴╘ ENTRIES 0 AND 1 ARE RESERVED.  ╔F
  466. A ╞┴╘ ENTRY CONTAINS A VALUE OF $000, THEN THE CORRESPONDING CLUSTER IS FREE
  467. AND CAN BE ALLOCATED TO A FILE; OTHERWISE, THE CLUSTER IS ALLOCATED AND THE
  468. ╞┴╘ ENTRY CONTAINS THE NUMBER OF THE ╬┼╪╘ ╞┴╘ ENTRY THAT BELONGS TO THE FILE.
  469. ╘HUS, ═╙-─╧╙ FILES ARE STORED IN A SINGLY-LINKED LIST OF CLUSTERS LIKE
  470. ├OMMODORE-─╧╙ FILES ARE, EXCEPT THAT THE LINKS ARE NOT IN THE DATA SECTORS BUT
  471. RATHER ARE IN THE ╞┴╘.  ╘HE POINTER TO THE FIRST ╞┴╘ ENTRY FOR A FILE IS GIVEN
  472. IN THE FILE'S DIRECTORY ENTRY.
  473.  
  474. ┴ SPECIAL ╬╒╠╠/╬╔╠ POINTER VALUE OF $╞╞╞ IS USED TO INDICATE THE END OF THE
  475. CHAIN OF CLUSTERS ALLOCATED TO A FILE.  ╘HIS VALUE IS STORED IN THE ╞┴╘ ENTRY
  476. OF THE LAST CLUSTER ALLOCATED TO A FILE (OF COURSE).  ├ONSIDER THE FOLLOWING
  477. EXAMPLE ╞┴╘:
  478.  
  479.    ┼╬╘╥┘       ╓┴╠╒┼
  480.    -----       -----
  481.     $000        $╞╞╞
  482.     $001        $╞╞╞
  483.     $002   ▄----$003 <------─IRECTORY ┼NTRY
  484.     $003   +--> $005----+
  485.     $004        $000    ▄
  486.     $005        $╞╞╞ <--+
  487.  
  488. ┼NTRIES 0 AND 1 ARE INSIGNIFICANT SINCE THEY ARE RESERVED.  ╙AY THAT A FILE
  489. STARTS AT ╞┴╘ ENTRY #2.  ╘HEN, IT CONSISTS OF THE FOLLOWING CHAIN OF CLUSTERS:
  490. 2, 3, AND 5.  ├LUSTER #4 IS FREE.  ├LUSTERS CAN BE ALLOCATED TO A FILE IN
  491. RANDOM ORDER, BUT IF THEY ARE ALLOCATED CONTIGUOUSLY IN FORWARD ORDER, THEN
  492. THE FILE WILL BE ABLE TO BE READ FASTER.  ╘HE ╞┴╘ IS SUCH AN IMPORTANT DATA
  493. STRUCTURE THAT TYPICALLY TWO COPIES ARE KEPT ON THE DISK INCASE ONE OF THEM
  494. SHOULD BECOME CORRUPTED.
  495.  
  496. ╘HE ═╙-─╧╙ DESIGNERS WERE A LITTLE SNEAKY IN STORING THE 12-BIT ╞┴╘ ENTRIES -
  497. THEY USED ONLY 12 REAL BITS PER ENTRY.  ╔E., THEY STORE TWO ╞┴╘ ENTRIES IN
  498. THREE BYTES, WHERE THE TWO ENTRIES SHARE THE TWO NYBBLES OF THE MIDDLE BYTE.
  499. ╘HE FOLLOWING DIAGRAM SHOWS HOW THE NYBBLES 1 (HIGH), 2 (MID), AND 3 (LOW) ARE
  500. STORED INTO ╞┴╘ ENTRIES ┴ AND ┬:
  501.  
  502.      ┬┘╘┼:       0            1            2
  503.              +---+---+    +---+---+    +---+---+
  504.     ┼╬╘╥┘:   ▄ ┴ ▄ ┴ ▄    ▄ ┬ ▄ ┴ ▄    ▄ ┬ ▄ ┬ ▄
  505.    ╬┘┬┬╠┼:   ▄ 2 ▄ 3 ▄    ▄ 3 ▄ 1 ▄    ▄ 1 ▄ 2 ▄
  506.              +---+---+    +---+---+    +---+---+
  507.  
  508. ┴NYWAY, LET'S JUST SAY IT'S A BIT TRICKY TO EXTRACT THE 12-BIT VALUES FROM
  509. THIS COMPRESSED DATA STRUCTURE.  ╧N TOP OF THAT, ╔ DON'T THINK THERE IS ANY
  510. SAVING IN DISK SPACE RESULTING FROM COMPRESSING THIS STRUCTURE; THEY MIGHT AS
  511. WELL HAVE JUST USED A 16-BIT ╞┴╘ (LIKE THEY DO NOWADAYS ON LARGER DISKS).
  512.  
  513. 3.3. ╘╚┼ ╥╧╧╘ ─╔╥┼├╘╧╥┘
  514.  
  515. ╘HE ROOT DIRECTORY HAS A FIXED SIZE, ALTHOUGH ╔ DON'T THINK THAT
  516. SUBDIRECTORIES DO.  ╠╥╥ CANNOT ACCESS SUBDIRECTORIES.  ┼ACH 512-BYTE SECTOR OF
  517. THE ROOT DIRECTORY CONTAINS SIXTEEN 32-BYTE DIRECTORY ENTRIES.  ╧NE DIRECTORY
  518. ENTRY IS REQUIRED FOR EACH FILE STORED ON THE DISK.  ┴ DIRECTORY ENTRY HAS THE
  519. FOLLOWING STRUCTURE:
  520.  
  521.    ╧╞╞╙┼╘     ╠┼╬     ─┼╙├╥╔╨╘╔╧╬
  522.    ------     ---     -----------
  523.      0..7       8     ╞ILENAME
  524.     8..10       3     ┼XTENSION
  525.        11       1     <UNUSED?>
  526.        12       1     ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
  527.    13..21       9     <UNUSED>
  528.    22..25       4     ─ATE
  529.    26..27       2     ╙TARTING ╞┴╘ ENTRY NUMBER
  530.    28..31       4     ╞ILE LENGTH IN BYTES
  531.  
  532. ╘HE FILENAME AND EXTENSION ARE STORED WITH TRAILING PADDING SPACES.  ╔F A
  533. DIRECTORY ENTRY IS UNUSED OR DELETED, THEN THE FIRST CHARACTER OF THE FILENAME
  534. IS EITHER A $00 OR A $┼5 (229).  ╘HIS IS WHY YOU HAVE TO PROVIDE THE FIRST
  535. CHARACTER OF A FILENAME IF YOU ARE UNDELETING A FILE ON AN ═╙-─╧╙ MACHINE.
  536. ╬OTE THAT THERE IS ENOUGH UNUSED SPACE THAT ═ICROSOFT OR ╔┬═ COULD HAVE
  537. DITCHED THE ANNOYING 8+3 CHARACTER FILENAME FORMAT.
  538.  
  539. ╘HE ATTRIBUTES BITS TELL WHETHER THE DIRECTORY ENTRY IS FOR A REGULAR FILE, A
  540. SUBDIRECTORY, A DISK VOLUME NAME (IN WHICH CASE THERE IS NO FILE DATA), AND A
  541. COUPLE OF OTHER THINGS ╔ CAN'T REMEMBER.  ╔'M NOT SURE ABOUT THE EXACT
  542. POSITION OR FORMAT OF THE DATE, BUT ╠╥╥ DOESN'T USE IT ANYWAY.  ╘HE STARTING
  543. ╞┴╘ ENTRY NUMBER AND THE FILE LENGTH ARE STORED IN LOWER-BYTE-FIRST ORDER.
  544.  
  545. 3.4. ╘╚┼ ╞╔╠┼ ─┴╘┴ ╙╨┴├┼
  546.  
  547. ╘HE RAMAINDER OF THE DISK SPACE IS USED FOR STORING FILE DATA IN CLUSTERS OF 1
  548. OR 2 SECTORS EACH.  ╟IVEN A CLUSTER NUMBER (WHICH IS ALSO THE ╞┴╘ ENTRY
  549. NUMBER), THE FOLLOWING FORMULA IS USED TO CALCULATE THE STARTING LOGICAL
  550. SECTOR NUMBER OF THE CLUSTER:
  551.  
  552. (├LUSTER╬UMBER - 2) * ├LUSTER╙IZE╔N┬LOCKS + ╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER
  553.  
  554. WHERE "╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER" IS THE "╞╙" PARAMETER DERIVED
  555. EARLIER.  ╘HE FOLLOWING CONSECUTIVE LOGICAL SECTOR NUMBERS UP TO THE NUMBER OF
  556. SECTORS PER CLUSTER FORM THE REST OF THE CLUSTER.  ╬OTE THAT A SINGLE CLUSTER
  557. CAN SPAN SECTORS FROM ONE SIDE OF THE DISK TO ANOTHER OR FROM ONE TRACK TO
  558. ANOTHER.  ╫E PERFORM THE "(├LUSTER╬UMBER - 2)" PORTION OF THE CALCULATION
  559. SINCE THE FIRST TWO ╞┴╘ ENTRIES ARE RESERVED.
  560.  
  561. ╙INCE THE ╥EAD BURST COMMAND OF THE 1571/81 WANTS THE SIDE, TRACK, AND SECTOR
  562. NUMBER OF A SECTOR RATHER THAN ITS LOGICAL NUMBER, WE ALSO NEED FORMULAE FOR
  563. THESE CONVERSIONS:
  564.  
  565.    ╘RACK  = ╠OGICAL╙ECTOR╬UMBER / 18
  566.    ╙ECTOR = ╠OGICAL╙ECTOR╬UMBER % 9 + 1
  567.    ╙IDE   = (╠OGICAL╙ECTOR╬UMBER / 9) % 2
  568.  
  569. ╘HESE FORMULAE ARE MORE PROBLEMATIC THAN THE PREVIOUS ONE SINCE THEY REQUIRE
  570. DIVISION BY 9 AND 18.  ╠╥╥ USES THE METHOD OF REPEATED SUBTRACTION TO PERFROM
  571. THE NECESSARY DIVISION (ONLY ONE DIVISION IS NECESSARY).  ╘HE ABOVE FORMULAE
  572. IMPLY THAT SEQUENTIAL LOGICAL SECTORS ARE STORED ON THE TOP OF THE DISK
  573. FIRST AND THEN THE BOTTOM OF THE DISK OF THE SAME TRACK, AND THEN ON THE TOP
  574. OF THE NEXT TRACK, ETC.  ╘HIS IS A GOOD SECTOR NUMBERING SCHEME (UNLIKE THE
  575. ├┬═-─╧╙ SCHEME FOR 1571 SECTORS) SINCE IT IS FASTER TO SWITCH SIDES OF THE
  576. DISK THAN IT IS TO SWITCH TRACKS, SO YOU CAN READ THE DISK FASTER.
  577.  
  578. ╧H YEAH, THE WAY THAT YOU KNOW HOW MANY FILE DATA BYTES ARE IN THE LAST
  579. CLUSTER OF A FILE CHAIN (THE CLUSTER WITH THE ╬╒╠╠ ╞┴╘ ENTRY) IS TO TAKE THE
  580. FILE LENGTH FROM THE DIRECTORY ENTRY AND "MOD" (THE ├ LANGUAGE % OPERATOR) IT
  581. WITH THE CLUSTER SIZE.  ╧NE SPECIAL CASE IS IF THIS CALCULATION RESULTS IN A
  582. ZERO, THEN THE LAST CLUSTER IS COMPLETELY FULL (RATHER THAN COMPLETELY EMPTY
  583. AS THE CALCULATION WOULD SUGGEST).  ╘HIS CALCULATION IS EASILY DONE IN
  584. MACHINE LANGUAGE WITH AN ┴╬─ OPERATION SINCE THE CLUSTER SIZE IS ALWAYS A
  585. POWER OF TWO.
  586.  
  587. 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
  588.  
  589. ╘HIS SECTION DISCUSSES THE INTERFACE TO AND IMPLEMENTATION OF THE ═╙-─╧╙ FILE
  590. COPYING PACKAGE.  ╔T IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO MEMORY
  591. AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY.  ╘HE PACKAGE IS
  592. LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├ PROGRAM,
  593. EVEN IF ╥┴═─╧╙ IS INSTALLED.
  594.  
  595. 4.1. ╔╬╘┼╥╞┴├┼
  596.  
  597. ╘HE SUBROUTINE CALL AND PARAMETER PASSING INTERFACE TO THE FILE COPYING
  598. PACKAGE IS SUMMARIZED AS FOLLOWS:
  599.  
  600.    ┴──╥┼╙╙     ─┼╙├╥╔╨╘╔╧╬
  601.    -------     -----------
  602.    ╨╦          ╔NIT╨ACKAGE SUBROUTINE
  603.    ╨╦+3        ╠OAD─IRECTORY SUBROUTINE
  604.    ╨╦+6        ├OPY╞ILE SUBROUTINE
  605.    ╨╦+9        TWO-BYTE PACKAGE IDENTIFICATION NUMBER
  606.    ╨╦+15       ERRNO : ERROR CODE RETURNED
  607.    ╨╦+16       ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
  608.    ╨╦+17       ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
  609.    ╨╦+18       TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
  610.    ╨╦+20       LOW AND MID BYTES OF FILE LENGTH FOR COPYING
  611.  
  612. WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE.  ┴DDITIONAL SUBROUTINE
  613. PARAMETERS ARE PASSED IN THE PROCESSOR REGISTERS.
  614.  
  615. ╘HE "╔NIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
  616. INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
  617. DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE.  ╔T REQUIRES NO
  618. PARAMETERS.
  619.  
  620. ╘HE "╠OAD─IRECTORY" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT
  621. ╙ECTOR PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT
  622. ═╙-─╧╙ DEVICE NUMBER.  ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE
  623. SUBROUTINE RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND
  624. THE NUMBER OF DIRECTORY ENTRIES IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THEN
  625. THE SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE
  626. IN THE "ERRNO" INTERFACE VARIABLE.  ╘HE DIRECTORY ENTRY DATA IS IN THE
  627. DIRECTORY SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙
  628. DISK.
  629.  
  630. ╘HE "├OPY╞ILE" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
  631. SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
  632. OPENED).  ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
  633. DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE.  ╘HE STARTING CLUSTER NUMBER
  634. OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
  635. THE ╨╦+18 AND ╨╦+20 INTERFACE WORDS.  ╘HE TRANSLATION MODE TO USE IS PASSED IN
  636. THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
  637. OUTPUT TO IS PASSED IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THE ROUTINE
  638. RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
  639. VARIABLE.  ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
  640.  
  641. ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
  642. BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
  643. THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
  644. TO GET THIS INFORMATION.  ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
  645. FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
  646. NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
  647.  
  648. ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
  649. THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
  650. PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
  651. HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
  652. RE-RUNS.  ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE
  653. OF 131.
  654.  
  655. 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
  656.  
  657. ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING
  658. PACKAGE.  ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY A FEW
  659. SPECIAL CHARACTERS AND THE LINE NUMBER.  ╘HE SPECIAL CHARACTERS ARE THERE TO
  660. ALLOW YOU TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE
  661. (AND ALL OF MY UGLY COMMENTS).  ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS
  662. EXECUTE THE FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
  663.  
  664. GREP '^\.%...\!' ╚ACK4 ▄ SED 'S/^.%...\!..//' ▄ SED 'S/.%...\!//' >LRR.S
  665.  
  666. ┘OU'LL NOTICE THAT THE INITIAL COMMENT LINES HERE WERE AN AFTERTHOUGHT.
  667.  
  668. .%000!  ;╠ITTLE ╥ED ╥EADER ═╙-─╧╙ FILE COPIER PROGRAM
  669. .%000!  ;WRITTEN 92/10/03 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
  670. .%000!
  671.  
  672. ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
  673. DIRECTIVES.  ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
  674.  
  675. .%001!  .ORG $8000
  676. .%002!  .OBJ "@:LRR.BIN"
  677. .%003!
  678. .%004!  ;====JUMP TABLE AND PARAMETERS INTERFACE ====
  679. .%005!
  680. .%006!  JMP INIT╨ACKAGE
  681. .%007!  JMP LOAD─IRECTORY
  682. .%008!  JMP COPY╞ILE
  683. .%009!
  684. .%010!  .BYTE $CB,131   ;IDENTIFICATION
  685. .%011!  .BYTE 0,0,0,0
  686. .%012!
  687.  
  688. ╘HESE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO MINIMIZE UNWANTED
  689. INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME, SUCH AS THE ╥┴═─╧╙
  690. DEVICE DRIVER.
  691.  
  692. .%013!  ERRNO           .BUF 1    ;(LOCATION PK+15)
  693. .%014!  SOURCE─EVICE    .BUF 1
  694. .%015!  SOURCE╘YPE      .BUF 1    ;$00=1571, $FF=1581
  695. .%016!  START├LUSTER    .BUF 2
  696. .%017!  LEN═╠           .BUF 2    ;LENGTH MEDIUM AND LOW BYTES
  697. .%018!
  698. .%019!  ;====GLOBAL DECLARAIONS====
  699. .%020!
  700. .%021!  KERNEL╠ISTEN = $FFB1
  701. .%022!  KERNEL╙ECOND = $FF93
  702. .%023!  KERNEL╒NLSN  = $FFAE
  703. .%024!  KERNEL┴CPTR  = $FFA2
  704. .%025!  KERNEL├IOUT  = $FFA8
  705. .%026!  KERNEL╙PINP  = $FF47
  706. .%027!  KERNEL├HKOUT = $FFC9
  707. .%028!  KERNEL├LRCHN = $FFCC
  708. .%029!  KERNEL├HROUT = $FFD2
  709. .%030!
  710. .%031!  ST = $D0
  711. .%032!  CIA├LOCK = $DD00
  712. .%033!  CIA╞LAGS = $DC0D
  713. .%034!  CIA─ATA  = $DC0C
  714. .%035!
  715.  
  716. ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR.  ╘HEY
  717. ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
  718.  
  719. .%036!  CLUSTER┬LOCK├OUNT .BUF 1        ;1 OR 2
  720. .%037!  FAT┬LOCKS         .BUF 1        ;UP TO 3
  721. .%038!  ROOT─IR┬LOCKS     .BUF 1        ;UP TO 8
  722. .%039!  ROOT─IR┼NTRIES    .BUF 1        ;UP TO 128
  723. .%040!  TOTAL╙ECTORS      .BUF 2        ;UP TO 1440
  724. .%041!  FIRST╞ILE┬LOCK    .BUF 1
  725. .%042!  FIRST╥OOT─IR┬LOCK .BUF 1
  726. .%043!  FILE├LUSTER├OUNT  .BUF 2
  727. .%044!
  728.  
  729. ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACH CACHE.
  730.  
  731. .%045!  BUF├YLINDER     .BUF 1
  732. .%046!  BUF╙IDE         .BUF 1
  733. .%047!  FORMAT╨ARMS     .BUF 6
  734. .%048!
  735.  
  736. ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS.  ╘HIS LEVEL INTERFACES WITH THE
  737. ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
  738.  
  739. .%049!  ;====HARDWARE LEVEL====
  740. .%050!
  741.  
  742. ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
  743. BURST COMMAND BYTE.
  744.  
  745. .%051!  SEND╒0 = *  ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
  746. .%052!     PHA
  747. .%053!     LDA #0
  748. .%054!     STA ST
  749. .%055!     LDA SOURCE─EVICE
  750. .%056!     JSR KERNEL╠ISTEN
  751. .%057!     LDA #$6F
  752. .%058!     JSR KERNEL╙ECOND
  753. .%059!     LDA #"U"
  754. .%060!     JSR KERNEL├IOUT
  755. .%061!     BIT ST
  756. .%062!     BMI SEND╒0┼RROR
  757. .%063!     LDA #"0"
  758. .%064!     JSR KERNEL├IOUT
  759. .%065!     PLA
  760. .%066!     JSR KERNEL├IOUT
  761. .%067!     BIT ST
  762. .%068!     BMI SEND╒0┼RROR
  763. .%069!     CLC
  764. .%070!     RTS
  765. .%071!
  766. .%072!     SEND╒0┼RROR = *
  767. .%073!     LDA #5
  768. .%074!     STA ERRNO
  769. .%075!     SEC
  770. .%076!     RTS
  771. .%077!
  772.  
  773. ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
  774. TRANSFER PROTOCOL.
  775.  
  776. .%078!  TOGGLE├LOCK = *
  777. .%079!     LDA CIA├LOCK
  778. .%080!     EOR #$10
  779. .%081!     STA CIA├LOCK
  780. .%082!     RTS
  781.