home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / HACK5B.SFX / hack5-5 < prev   
Encoding:
Text File  |  1990-02-12  |  28.3 KB  |  801 lines

  1.  
  2.    ─=─╔╥ ═=═╙─┼╓ ╞=├┬═─┼╓ ├=├╧╨┘ ╤=╤╒╔╘
  3.    ╘=╘╧╟╟╠┼ ╥=╥┼═╧╓┼ ╪=├┬═├╨┘ /=═┼╬╒ +-=╨╟
  4.  
  5. EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<DIRECTORY NOT LOADED>" WILL BE
  6. DISPLAYED RATHER THAN FILENAMES.  ╘HE MENU LOOKS AND OPERATES PRETTY MUCH AS
  7. IT DID IN THE LAST ISSUE OF ├= ╚ACKING.  ╘HE ONLY DIFFERENCES ARE THAT THE
  8. NUMBER OF BYTES FREE ON THE DRIVE ARE DISPLAYED (WHICH IS USEFUL TO KNOW WHEN
  9. WRITING FILES) AND THERE ARE SOME MORE COMMANDS.
  10.  
  11. ╘HE DIRECTORY ("─"), CHANGE MS-DOS DEVICE ("═"), CHANGE COMMODORE FILE DEVICE
  12. ("╞"), TOGGLE COLUMN CONTENTS ("╘"), COPY MS-DOS FILES TO CBM-DOS DISK ("├"),
  13. QUIT ("╤"), PAGING ("+" AND "-"), COLUMN CHANGE (╙╨┴├┼ OR ╥┼╘╒╥╬), AND THE
  14. CURSOR MOVEMENT COMMANDS ALL WORK THE SAME AS BEFORE.  ╘HEY ARE ALL STICKS TO
  15. USE TO FLOG THE BEAST INTO SUBMISSION.  ╘HE NEW COMMANDS ARE: "╥" (REMOVE ==
  16. DELETE), "/" (CHANGE MENU), AND "╪" (COPY ├┬═ FILES == "╪EROX").
  17.  
  18. ╘HE REMOVE COMMAND IS USED TO DELETE SELECTED FILES FROM THE ═╙-─╧╙ DISK.
  19. ┴FTER SELECTING THIS OPTION, YOU WILL GET AN ANNOYING "ARE YOU SURE" QUESTION
  20. AND THE THE SELECTED FILES WILL QUICKLY DISAPPEAR AND THE CHANGES WILL FINALLY
  21. BE WRITTEN TO DISK.  ─ELETING A BATCH OF ═╙-─╧╙ FILES IS MUCH QUICKER THAN
  22. DELETING ├OMMODORE-─╧╙ FILES SINCE ═╙-─╧╙ DISKS USE A ╞ILE ┴LLOCATION ╘ABLE
  23. RATHER THAN THE LINKED LIST OF BLOCKS ORGANIZATION THAT ├┬═ USES.  ╔N ORDER TO
  24. MAKE THE ┬┴╙╔├ PROGRAM EXECUTE QUICKER, AFTER DELETING, THE ORIGINAL ORDER OF
  25. THE FILENAMES IN THE DIRECTORY LISTING WILL BE CHANGED.  ┬E FOREWARNED THAT
  26. THE DELETE OPERATION IS NON-RECOVERABLE.
  27.  
  28. ╘HE CHANGE MENU COMMAND IS USED TO MOVE BACK AND FORTH BETWEEN THE ├OMMODORE-
  29. ─╧╙ AND ═╙-─╧╙ MENUS.
  30.  
  31. 2.2. ├╧══╧─╧╥┼-─╧╙ ═┼╬╒
  32.  
  33. ╘HE ├OMMODORE-─╧╙ MENU, WHICH DISPLAYS THE NAMES OF THE ├OMMODORE FILES
  34. SELECTED FOR VARIOUS OPERATIONS, LOOKS AND WORKS PRETTY MUCH THE SAME AS
  35. THE ═╙-─╧╙ MENU:
  36.  
  37.    ├┬═─╧╙  ═╙=10:1581  ├┬═=8  ╞╥┼┼=3211476
  38.  
  39.    ╬╒═  ╙  ╘╥╬  ╞╔╠┼╬┴═┼         ╘  ╠┼╬╟╘╚
  40.    ---  -  ---  ---------------- -  ------
  41.      1  *  ┬╔╬  ╠╥╥-128          ╨    9876
  42.      2     ┴╙├  ├╧═-╚┴├╦╔╬╟-005  ╙  175412
  43.  
  44.    ─=─╔╥ ═=═╙─┼╓ ╞=├┬═─┼╓ ├=├╧╨┘ ╤=╤╒╔╘
  45.    ╘=╘╧╟╟╠┼ ╥=╥┼═╧╓┼ ╪=├┬═├╨┘ /=═┼╬╒ +-=╨╟
  46.  
  47. ┘OU'LL NOTICE, HOWEVER, THAT THE FILETYPE FIELD ("╘" HERE) IS MOVED AND IS
  48. UNCHANGABLE.  ┴LSO, THE FILE LENGTHS ARE NOT EXACT; THEY ARE REPORTED AS THE
  49. BLOCK COUNT OF THE FILE MULTIPLIED BY 254.  ╘HIS MENU IS NOT MAINTAINED FOR
  50. FILES BEING COPIED TO THE ├┬═-─╧╙ DISK FROM AN ═╙-─╧╙ DISK.  ┘OU'LL
  51. HAVE TO RE-EXECUTE THE ─IRECTORY INSTRUCTION TO GET AN UPDATED LISTING.
  52.  
  53. ╘HE "─" (DIRECTORY) COMMAND HAS LOCAL EFFECT WHEN IN THIS MENU.  ╘HE
  54. ├OMMODORE-─╧╙ DIRECTORY WILL BE LOADED FROM THE CURRENT ├┬═ DEVICE NUMBER.
  55. ╬OTE THAT IN ORDER FOR THIS TO WORK, THE ├┬═ DEVICE MUST BE NUMBER EIGHT
  56. OR GREATER (A DISK DRIVE).  ╧RIGINALLY, THE SUBROUTINE FOR THIS COMMAND WAS
  57. WRITTEN USING ONLY ╟┼╘#'S FROM THE DISK AND WAS VERY SLOW.  ╔T WAS MODIFIED,
  58. HOWEVER, TO CALL A MACHINE LANGUAGE SUBROUTINE TO READ THE INFORMATION FOR
  59. A DIRECTORY ENTRY FROM THE DIRECTORY LISTING, AND HENCE THE SUBROUTINE NOW
  60. OPERATES AT A TOLERABLE SPEED.
  61.  
  62. ╘HE "├" (COPY) COMMAND ALSO HAS A DIFFERENT MEANING WHEN IN THIS MENU.  ╔T
  63. MEANS TO COPY THE SELECTED ├┬═ FILES TO THE ═╙-─╧╙ DISK.  ╙EE DETAILS BELOW.
  64.  
  65. ╘HE COPY ├┬═ FILES ("╪") COMMAND IS USED TO COPY THE FILES IN THE ├┬═-─╧╙ MENU
  66. TO ANOTHER ├┬═-─╧╙ DISK UNIT.  ╙ELECT THE FILES YOU WANT TO COPY AND THEN
  67. PRESS ╪.  ┘OU WILL THEN BE ASKED WHAT DEVICE NUMBER YOU WANT TO COPY THE FILES
  68. TO.  ╘HE DEVICE CAN BE ANOTHER DISK DRIVE OR ANY OTHER DEVICE (EXCEPT THE
  69. KEYBOARD).  ╒SING DEVICE NUMBER 0 DOES NOT MEAN THE "NULL" DEVICE AS IT DOES
  70. WITH COPYING ═╙-─╧╙ TO ├┬═.  ╔F YOU ARE COPYING TO A DISK DEVICE AND THE FILE
  71. ALREADY EXISTS, THEN YOU WILL BE ASKED IF YOU WISH TO OVERWRITE THE FILE.  ┘OU
  72. CANNOT COPY TO THE SAME DISK UNIT.  ┴LSO, ALL FILES ARE COPIED IN BINARY MODE
  73. (REGARDLESS OF WHAT TRANSLATION YOU HAVE SELECTED FOR A FILE).
  74.  
  75. ╘HE COPY ├┬═ FILES COMMAND WAS INCLUDED SINCE ALL OF THE LOW-LEVEL GEAR
  76. NEEDED TO IMPLEMENT IT (SPECIFICALLY "COMMIE╔N" AND "COMMIE╧UT" BELOW) WAS
  77. ALSO REQUIRED BY OTHER FUNCTIONS.  ╘HIS COMMAND CAN BE VERY CONVENIENT WHEN
  78. WORKING WITH ╥┴═─╧╙.  ╞OR EXAMPLE, IF YOU ONLY HAD A 1571 AS DEVICE 8 BUT YOU
  79. HAVE A ╥┴═ EXPANDER AND HAVE INSTALLED ╥┴═─╧╙ AS DEVICE 9, THEN YOU WOULD
  80. COPY ═╙-─╧╙ FILES TO ╥┴═─╧╙ USING THE ═╙-─╧╙ MENU, AND THEN YOU WOULD GO TO
  81. THE ├OMMODORE-─╧╙ MENU ("/"), READ THE DIRECTORY, SELECT ALL FILES, INSERT AN
  82. ├OMMODORE-─╧╙ DISKETTE INTO YOUR 1571, AND THEN USE "╪" TO COPY FROM THE
  83. ╥┴═─╧╙ DEVICE TO THE 1571.
  84.  
  85. ╘HE REMOVE COMMAND ("╥") DOES NOT WORK FOR THIS DIRECTORY.  ┘OU CAN ╙├╥┴╘├╚
  86. YOUR ├┬═-─╧╙ FILES YOUR DAMN SELF.
  87.  
  88. 2.3. ├╧╨┘ ├┬═-─╧╙ ╘╧ ═╙-─╧╙
  89.  
  90. ┬EFORE YOU CAN COPY SELECTED ├┬═-─╧╙ FILES TO AN ═╙-─╧╙ DISK, THE ═╙-─╧╙ DISK
  91. DIRECTORY MUST BE ALREADY LOADED (FROM THE ═╙-─╧╙ MENU).  ╘HIS IS REQUIRED
  92. SINCE THE DIRECTORY AND ╞┴╘ INFORMATION ARE KEPT IN MEMORY AT ALL TIMES DURING
  93. THE EXECUTION OF THIS PROGRAM.
  94.  
  95. ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
  96. FILE IS DISPLAYED AS IT IS BEING COPIED.  ╔F AN ERROR IS ENCOUNTERED ON EITHER
  97. THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
  98. AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS).  ╨LEASE
  99. NOTE THAT NOT A WHOLE LOT OF EFFORT WAS PUT INTO ERROR RECOVERY.
  100.  
  101. ╘O GENERATE AN ═╙-─╧╙ FILENAME FROM AN ├┬═-─╧╙ FILENAME, THE FOLLOWING
  102. ALGORITHM IS USED.  ╘HE FILENAME IS SEARCHED FROM RIGHT TO LEFT FOR THE LAST
  103. "." CHARACTER.  ╔F THERE IS NO "." CHARACTER, THEN THE ENTIRE FILENAME, UP TO
  104. 11 CHARACTERS, IS USED AS THE ═╙-─╧╙ FILENAME.  ├HARACTERS 9 TO 11 WILL BE
  105. USED AS THE EXTENSION.  ╔F THERE IS A "." CHARACTER, THE ALL CHARACTERS BEFORE
  106. IT, UP TO EIGHT, WILL BE USED AS THE ═╙-─╧╙ FILENAME AND ALL CHARACTERS AFTER
  107. THE FINAL ".", UP TO THREE, WILL BE USED AS THE ═╙-─╧╙ EXTENSION.
  108.  
  109. ╘HEN, THE NEWLY GENERATED ═╙-─╧╙ FILENAME IS SCANNED FOR ANY EXTRA "."
  110. CHARACTERS OR EMBEDDED SPACES.  ╔F ANY ARE FOUND, THEY ARE REPLACED BY THE
  111. UNDERSCORE CHARACTER ("_", WHICH IS THE BACKARROW CHARACTER ON A ├OMMODORE
  112. DISPLAY).  ╞INALLY, ALL TRAILING UNDERSCORES ARE REMOVED FROM THE END OF BOTH
  113. THE FILENAME AND EXTENSION PORTIONS OF THE ═╙-─╧╙ FILENAME.  ┴LSO, ALL
  114. CHARACTERS ARE CONVERTED TO LOWERCASE ╨┼╘╙├╔╔ (WHICH IS UPPERCASE ┴╙├╔╔) WHEN
  115. THEY ARE COPIED INTO THE ═╙-─╧╙ FILENAME.  ╬OTE THAT IF THE ├OMMODORE FILENAME
  116. IS NOT IN THE 8/3 FORMAT OF ═╙-─╧╙, THEN SOMETHING IN THE NAME MAY BE LOST.
  117. ╙OME EXAMPLES OF FILENAME CONVERSION FOLLOW:
  118.  
  119. ├┬═-─╧╙ ╞╔╠┼╬┴═┼       ═╙-─╧╙ ╞╔╠┼╬┴═┼
  120. ----------------       ---------------
  121. "LRR.BIN"              "LRR.BIN"
  122. "LRR.128.BIN"          "LRR_128.BIN"
  123. "HELLO THERE.TEXT"     "HELLO_TH.TEX"
  124. "LONG_FILENAME"        "LONG_FIL.ENA"
  125. "FILE 1..3.S__5"       "FILE_1.S"
  126.  
  127. ╔T WOULD HAVE BEEN TIME-CONSUMING TO HAVE THE PROGRAM SCAN THE ═╙-─╧╙
  128. DIRECTORY FOR A FILENAME ALREADY EXISTING ON THE DISK, SO ╠╥╥ WILL PUT
  129. MULTIPLE FILES ON A DISK WITH THE SAME FILENAME WITHOUT COMPLAINING.  ╘HIS
  130. ALSO GETS RID OF THE PROBLEM OF ASKING YOU IF YOU WANT TO OVERWRITE THE OLD
  131. FILE OR GENERATE A NEW NAME.  ╚OWEVER, IN ORDER TO RETRIEVE THE FILE FROM
  132. DISK ON AN ═╙-─╧╙ MACHINE, YOU WILL PROBABLY HAVE TO USE THE ╥┼╬┴═┼ COMMAND TO
  133. RENAME THE FIRST VERSIONS OF THE FILE ON THE DISK TO SOMETHING ELSE SO ═╙-─╧╙
  134. WILL SCAN FURTHER IN THE DIRECTORY FOR THE LAST VERSION OF THE FILE WITH THE
  135. SAME FILENAME.  ╘HERE IS NO RENAME COMMAND IN ╠╥╥ BECAUSE ╔ NEVER THOUGHT OF
  136. IT IN TIME.  ╔T WOULD HAVE BEEN FAIRLY EASY TO PUT IN.
  137.  
  138. ╘HE DATE GENERATED FOR A NEW ═╙-─╧╙ FILE WILL BE ALL ZEROS.  ╙OME SYSTEMS
  139. INTERPRET THIS AS 12:00 AM, 01-╩AN-80 AND OTHERS DON'T DISPLAY A DATE AT ALL
  140. FOR THIS VALUE.
  141.  
  142. ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
  143. NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
  144. THINGS BY LOOKING AT THE BLINKING LIGHTS AND LISTENING FOR CLICKS AND GRINDS.
  145.  
  146. ╙INCE THE ╞┴╘ AND DIRECTORY ARE MAINTAINED IN ╥┴═ DURING THE ENTIRE COPYING
  147. PROCESS AND ARE ONLY FLUSHED TO DISK AFTER THE ENTIRE BATCH OF FILES ARE
  148. COPIED, COPYING IS MADE MORE EFFICIENT, SINCE THERE WILL BE NO COSTLY SEEK
  149. BACK TO TRACK 0 AFTER WRITING EACH FILE (LIKE ═╙-─╧╙ DOES).  ╔F YOU HAVE A
  150. NUMBER OF SMALL FILES TO COPY, THEN THEY WILL BE KNOCKED OFF IN QUICK
  151. SUCCESSION, FASTER THAN MANY ═╙-─╧╙ MACHINES WILL COPY THEM.
  152.  
  153. ╘O SIMPLIFY THE IMPLEMENTATION, THE CURRENT TRACK OF DISK BLOCKS FOR WRITING
  154. IS NOT MAINTAINED LIKE IT IS FOR READING.  ┴LSO, A WRITING INTERLEAVE OF 1:1
  155. IS USED FOR A 1571, WHICH IS NOT OPTIMAL.  ╚OWEVER, SINCE WRITING IS SUCH A
  156. SLOW OPERATION ANYWAY, AND SINCE THE 1571 IS PARTICULARLY BAD BY INSISTING ON
  157. VERIFYING BLOCKS, NOT MUCH MORE OVERHEAD IS INTRODUCED THAN IS ALREADY
  158. PRESENT.
  159.  
  160. ┴N INTERESTING NOTE ABOUT WRITING ═╙-─╧╙ DISKS IS THAT YOU CAN TERMINATE ╠╥╥
  161. IN THE MIDDLE OF A COPY (WITH ╙╘╧╨+╥┼╙╘╧╥┼) OR IN THE MIDDLE OF COPYING A
  162. BATCH OF FILES, AND THE ═╙-─╧╙ DISK WILL REMAIN IN A PERFECTLY CONSISTENT
  163. STATE AFTERWARDS.  ╘HE STATE WILL BE AS IF NONE OF THE FILES WERE COPIED.  ╘HE
  164. REASON IS THAT THE CONTROL INFORMATION (THE ╞┴╘ AND DIRECTORY) IS MAINTAINED
  165. INTERNALLY AND IS FLUSHED ONLY AFTER COPYING IS ALL COMPLETED.  ┬UT DON'T
  166. TERMINATE ╠╥╥ WHILE IT IS FLUSHING THE CONTROL INFORMATION.
  167.  
  168. ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING TO 1571, 1581, AND ├═─ ╞─-4000
  169. DISK UNITS WITH ┴╙├ AND ┬╔╬ TRANSLATION MODES.  ┴LL FIGURES ARE IN BYTES/
  170. SECOND, WHICH INCLUDES BOTH READING THE BYTE FROM A ├= DISK AND WRITING IT TO
  171. THE ═╙-─╧╙ DISK.  ╘HE AVERAGE SPEED FOR EITHER THE READ OR WRITE OPERATION
  172. INDIVIDUALLY WILL BE TWICE THE SPEED GIVEN BELOW.  ╘HESE RESULTS WERE OBTAINED
  173. FROM COPYING A 156,273 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING ╔SSUE #4).
  174.  
  175.    ╞╥╧═   \ ╘╧: ╞─-BIN     ╞─-ASC     81-BIN     81-ASC     71-BIN     71-ASC
  176.    --------+    ------     ------     ------     ------     ------     ------
  177.    ╥┴═╠INK |     2,332      2,200      2,332      2,200      1,594      1,559
  178.    ╥┴═─╧╙  |     1,070      1,053      1,604      1,600      1,561      1,510
  179.    ╞─4000  |         -          -      1,645      1,597      1,499      1,464
  180.    ╩─1581  |     1,662      1,619          -          -      1,474      1,440
  181.    ╩─1571  |     1,050      1,024        953        933          -          -
  182.  
  183. ╘HESE FIGURES ARE FOR TRANSFER SPEED ONLY, NOT COUNTING THE COUPLE OF SECONDS
  184. OF OPENING FILES AND FLUSHING THE DIRECTORY.  ╬OTE THAT ALL MY PHYSICAL DRIVES
  185. ARE ╩IFFY─╧╙-IFIED, SO YOUR PERFORMANCE MAY BE SLOWER.  ╔ AM AT A LOSS TO
  186. EXPLAIN WHY AN ╞─-4000 IS SO MUCH SLOWER THAN A 1581 FOR COPYING FROM A
  187. ╥┴═─╧╙ FILE, BUT THE SAME SPEED OR BETTER FOR COPYING FROM ANYTHING ELSE.
  188.  
  189. ╙INCE ╔ DON'T HAVE ACCESS TO AN ACTUAL ═╙-─╧╙ MACHINE, ╔ HAVE NOT TESTED THE
  190. FILES WRITTEN ONTO AN ═╙-─╧╙ DISK BY ╠╥╥, EXCEPT BY READING THEM BACK WITH ╠╥╥
  191. AND ┬┬╥.  ╔ DO KNOW, HOWEVER, THAT EARLIER ENCARNATIONS OF THIS PROGRAM DID
  192. WORK FINE WITH ═╙-─╧╙ MACHINES.
  193.  
  194. 3. ═╙-─╧╙ ╥╧╧╘ ─╔╥┼├╘╧╥┘
  195.  
  196. ╔T WAS BROUGHT TO MY ATTENTION THAT ╔ MADE A MISTAKE IN THE PERVIOUS ARTICLE.
  197. ╔ WAS WRONG ABOUT THE OFFSET OF THE ATTRIBUTES FIELD IN A DIRECTORY ENTRY.
  198. ╘HE LAYOUT SHOULD HAVE BEEN AS FOLLOWS:
  199.  
  200.    ╧╞╞╙┼╘     ╠┼╬     ─┼╙├╥╔╨╘╔╧╬
  201.    ------     ---     -----------
  202.      0..7       8     ╞ILENAME
  203.     8..10       3     ┼XTENSION
  204.        11       1     ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
  205.    12..21      10     <UNUSED>
  206.    22..25       4     ─ATE
  207.    26..27       2     ╙TARTING ╞┴╘ ENTRY NUMBER
  208.    28..31       4     ╞ILE LENGTH IN BYTES
  209.  
  210. 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
  211.  
  212. ┴S WAS MENTIONED ABOVE, ╠ITTLE ╥ED ╥EADER IS SPLIT INTO TWO PIECES: A ┬┴╙╔├
  213. FRONT-END USER INTERFACE PROGRAM AND A PACKAGE OF MACHINE LANGUAGE SUBROUTINES
  214. FOR DISK ACCESSING.  ╘HE ┬┴╙╔├ PROGRAM HANDLES THE MENU, USER INTERACTION, AND
  215. MOST OF THE ═╙-─╧╙ DIRECTORY SEARCHING/MODIFYING.  ╘HE MACHINE LANGUAGE
  216. PACKAGE HANDLES THE HARDWARE INPUT/OUTPUT, ╞ILE ┴LLOCATION ╘ABLE AND FILE
  217. STRUCTURE MANIPULATIONS.
  218.  
  219. ╘HE FILE COPYING PACKAGE IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO
  220. MEMORY AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY.  ╘HE
  221. PACKAGE IS LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├
  222. PROGRAM, EVEN IF ╥┴═─╧╙ IS INSTALLED.
  223.  
  224. ╘HIS SECTION OF THE ARTICLE IS PRESENTED IN ITS ENTIRETY, INCLUDING ALL OF THE
  225. INFORMATION GIVEN LAST TIME.
  226.  
  227. 4.1. ╔╬╘┼╥╞┴├┼
  228.  
  229. ╘HE SUBROUTINE CALL INTERFACE TO THE FILE COPYING PACKAGE IS SUMMARIZED AS
  230. FOLLOWS:
  231.  
  232.    ┴──╥┼╙╙     ─┼╙├╥╔╨╘╔╧╬
  233.    -------     -----------
  234.    ╨╦          INIT╨ACKAGE SUBROUTINE
  235.    ╨╦+3        MS─IR    (LOAD ═╙-─╧╙ DIRECTORY/╞┴╘) SUBROUTINE
  236.    ╨╦+6        MS╥EAD   (COPY ═╙-─╧╙ TO ├┬═-─╧╙) SUBROUTINE
  237.    ╨╦+9        MS╫RITE  (COPY ├┬═-─╧╙ TO ═╙-─╧╙) SUBROUTINE
  238.    ╨╦+12       MS╞LUSH  SUBROUTINE
  239.    ╨╦+15       MS─ELETE SUBROUTINE
  240.    ╨╦+18       MS╞ORMAT SUBROUTINE [NOT IMPLEMENTED]
  241.    ╨╦+21       MS┬YTES╞REE SUBROUTINE
  242.    ╨╦+24       CBM├OPY  (COPY ├┬═-─╧╙ TO ├┬═-─╧╙) SUBROUTINE
  243.    ╨╦+27       CBM─IRENT (READ ├┬═-─╧╙ DIRECTORY ENTRY) SUBROUTINE
  244.  
  245. WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE ($8000).
  246.  
  247. ╘HE PARAMETER PASSING INTERFACE IS SUMMARIZED AS FOLLOWS:
  248.  
  249.    ┴──╥┼╙╙     ─┼╙├╥╔╨╘╔╧╬
  250.    -------     -----------
  251.    ╨╓          TWO-BYTE PACKAGE IDENTIFICATION NUMBER ($├┬, 132)
  252.    ╨╓+2        ERRNO : ERROR CODE RETURNED
  253.    ╨╓+3        ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
  254.    ╨╓+4        ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
  255.    ╨╓+5        TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
  256.    ╨╓+7        LOW AND MID BYTES OF FILE LENGTH FOR COPYING
  257.    ╨╓+9        POINTER TO ═╙-─╧╙ DIRECTORY ENTRY FOR WRITING
  258.    ╨╓+11       ├┬═-─╧╙ FILE BLOCK COUNT
  259.    ╨╓+13       ├┬═-─╧╙ FILE TYPE ("╙"=SEQ, "╨"=PRG, ETC.)
  260.    ╨╓+14       ├┬═-─╧╙ FILENAME LENGTH
  261.    ╨╓+15       ├┬═-─╧╙ FILENAME CHARACTERS (MAX 16 CHARS)
  262.  
  263. ╫HERE "╨╓" IS EQUAL TO ╨╦+30.  ┴DDITIONAL SUBROUTINE PARAMETERS ARE PASSED IN
  264. THE PROCESSOR REGISTERS.
  265.  
  266. ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
  267. THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
  268. PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
  269. HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
  270. RE-RUNS.  ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE OF
  271. 132.
  272.  
  273. 4.1.1. ╔╬╔╘_╨┴├╦┴╟┼ ╙╒┬╥╧╒╘╔╬┼
  274.  
  275. ╘HE "INIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
  276. INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
  277. DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE.  ╔T REQUIRES NO
  278. PARAMETERS.
  279.  
  280. 4.1.2. ═╙_─╔╥ ╙╒┬╥╧╒╘╔╬┼
  281.  
  282. ╘HE "MS─IR" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT ╙ECTOR
  283. PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT ═╙-─╧╙
  284. DEVICE NUMBER.  ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE SUBROUTINE
  285. RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND THE NUMBER
  286. OF DIRECTORY ENTRIES IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THEN THE
  287. SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE IN
  288. THE "ERRNO" INTERFACE VARIABLE.  ╘HE DIRECTORY ENTRY DATA IS IN THE DIRECTORY
  289. SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙ DISK.
  290.  
  291. 4.1.3. ═╙_╥┼┴─ ╙╒┬╥╧╒╘╔╬┼
  292.  
  293. ╘HE "MS╥EAD" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
  294. SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
  295. OPENED).  ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
  296. DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE.  ╘HE STARTING CLUSTER NUMBER
  297. OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
  298. THE ╨╓+5 AND ╨╓+7 INTERFACE WORDS.  ╘HE TRANSLATION MODE TO USE IS PASSED IN
  299. THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
  300. OUTPUT TO IS PASSED IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THE ROUTINE
  301. RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
  302. VARIABLE.  ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
  303.  
  304. ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
  305. BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
  306. THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
  307. TO GET THIS INFORMATION.  ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
  308. FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
  309. NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
  310.  
  311. 4.1.4. ═╙_╫╥╔╘┼ ╙╒┬╥╧╒╘╔╬┼
  312.  
  313. ╘HE "MS╫RITE" SUBROUTINE COPIES A SINGLE FILE FROM A SPECIFIED ├┬═-╦ERNAL
  314. LOGICAL FILE NUMBER TO A ═╙-─╧╙ FILE.  ╘HE ═╙-─╧╙ DEVICE NUMBER AND TYPE ARE
  315. SET ABOVE.  ┴ POINTER TO THE ═╙-─╧╙ DIRECTORY ENTRY IN THE BUFFER RETURNED BY
  316. THE "MS─IR" CALL MUST BE GIVEN IN INTERFACE WORD ╨╓+9 AND THE TRANSLATION MODE
  317. AND ├┬═ LFN ARE PASSED IN THE .┴ AND .╪ REGISTERS AS IN THE "MS╥EAD" ROUTINE.
  318. ┴N ERROR RETURN IS GIVEN IN THE USUAL WAY (.├╙, ERRNO).  ╧THERWISE, THERE ARE
  319. NO RETURN VALUES.
  320.  
  321. ╔T IS THE RESPONSIBILITY OF THE CALLING PROGRAM TO INITIALIZE THE ═╙-─╧╙
  322. DIRECTORY ENTRY TO ALL ZEROS AND THEN SET THE FILENAME AND SET THE STARTING
  323. CLUSTER POINTER TO $0╞╞╞.  ╘HIS ROUTINE WILL UPDATE THE STARTING CLUSTER AND
  324. FILE LENGTH FIELDS OF THE DIRECTORY ENTRY WHEN IT FINISHES.  ╘HE INTERNAL
  325. "DIRTY FLAGS" ARE MODIFIED SO THAT THE DIRECTORY AND ╞┴╘ WILL BE FLUSHED ON
  326. THE NEXT CALL TO "MS╞LUSH".
  327.  
  328. 4.1.5. ═╙_╞╠╒╙╚ ╙╒┬╥╧╒╘╔╬┼
  329.  
  330. ╘HE "MS╞LUSH" SUBROUTINE TAKES NO INPUT PARAMETERS OTHER THAN THE IMPLICIT
  331. MS─EVICE AND MS╘YPE.  ╔F "DIRTY" (MODIFIED), THE ╞┴╘ WILL BE WRITTEN TO THE
  332. ═╙-─╧╙ DISK, TO BOTH PHYSICAL REPLICAS OF THE DISK ╞┴╘.  ╘HEN, EACH DIRECTORY
  333. SECTOR THAT IS DIRTY WILL BE WRITTEN TO DISK.  ┴FTER FLUSHING, THE INTERNAL
  334. DIRTY FLAGS WILL BE CLEARED.  ┴N ERROR RETURN IS GIVEN IN THE USUAL WAY.
  335. ╘HERE ARE NO OTHER OUTPUT PARAMETERS.  ╔F YOU CALL THIS ROUTINE AND THERE ARE
  336. NO DIRTY FLAGS SET, THEN IT WILL RETURN IMMEDIATELY, WITHOUT ANY WRITING TO
  337. DISK.
  338.  
  339. 4.1.6. ═╙_─┼╠┼╘┼ ╙╒┬╥╧╒╘╔╬┼
  340.  
  341. ╘HE "MS─ELETE" SUBROUTINE WILL DEALLOCATE ALL ╞ILE ┴LLOCATION ╘ABLE ENTRIES
  342. (AND HENCE, DATA CLUSTERS) ALLOCATED TO A FILE AND MARK THE DIRECTORY ENTRY AS
  343. BEING DELETED (BY PUTTING AN $┼5 INTO THE FIRST CHARACTER OF THE FILENAME).
  344. ╘HE FILE IS SPECIFIED BY GIVING THE POINTER TO THE DIRECTORY ENTRY IN
  345. INTERFACE WORD AT ╨╓+9.  ┴FTER DEALLOCATING THE FILE DATA, THE INTERNAL
  346. "DIRTY" FLAG WILL BE SET FOR THE ╞┴╘ AND THE SECTOR THAT THE DIRECTORY ENTRY
  347. IS ON, BUT NOTHING WILL BE WRITTEN TO DISK.  ╘HERE IS NO ERROR RETURN FROM
  348. THIS ROUTINE.  ╔T IS THE RESPONSIBILITY OF THE CALLING ROUTINE TO EVENTUALLY
  349. CALL THE "MS╞LUSH" ROUTINE.
  350.  
  351. 4.1.7. ═╙_╞╧╥═┴╘ ╙╒┬╥╧╒╘╔╬┼
  352.  
  353. ╘HE "MS╞ORMAT" SUBROUTINE IS NOT IMPLEMENTED.  ╔T'S INTENDED FUNCTION WAS TO
  354. FORMAT THE ═╙-─╧╙ DISK AND GENERATE AND WRITE THE BOOT SECTOR, INITIAL ╞┴╘,
  355. AND INITIAL DIRECTORY ENTRY DATA.
  356.  
  357. 4.1.8. ═╙_┬┘╘┼╙_╞╥┼┼ ╙╒┬╥╧╒╘╔╬┼
  358.  
  359. ╘HE "MS┬YTES╞REE" SUBROUTINE WILL SCAN THE CURRENTLY LOADED ═╙-─╧╙ ╞ILE
  360. ┴LLOCATION ╘ABLE, COUNT THE NUMBER OF CLUSTERS FREE, AND RETURN THE NUMBER OF
  361. BYTES FREE FOR FILE STORAGE ON THE DISK.  ╘HERE ARE NO INPUT PARAMETERS AND
  362. THE BYTES FREE ARE RETURNED IN THE .┴┘╪ REGISTERS (.┴=LOW, .┘=MID, .╪=HIGH
  363. BYTE).  ╘HE SUBROUTINE HAS NO ERROR RETURNS AND DOES NOT CHECK IF AN ═╙-─╧╙
  364. DIRECTORY IS ACTUALLY LOADED.
  365.  
  366. 4.1.9. ├┬═_├╧╨┘ ╙╒┬╥╧╒╘╔╬┼
  367.  
  368. ╘HE "CBM├OPY" SUBROUTINE WILL COPY FROM AN INPUT ├┬═-╦ERNAL LOGICAL FILE
  369. NUMBER GIVEN IN THE .┴ REGISTER TO AN OUTPUT ├┬═-╦ERNAL LFN GIVEN IN THE .╪
  370. REGISTER, IN UP TO 1024 BYTE CHUNKS.  ╞ILE CONTENTS ARE COPIED EXACTLY (NO
  371. TRANSLATION).  ╘HIS ROUTINE DOES NOT CARE IF THE LFN'S ARE ON THE SAME DEVICE
  372. OR NOT, BUT THE INPUT DEVICE MUST BE A DISK UNIT (EITHER LOGICAL OR PHYSICAL).
  373. ┴N ERROR RETURN IS GIVEN IN THE USUAL WAY.
  374.  
  375. 4.1.10. ├┬═_─╔╥┼╬╘ ╙╒┬╥╧╒╘╔╬┼
  376.  
  377. ╘HE "CBM─IRENT" SUBROUTINE READS THE NEXT DIRECTORY ENTRY FROM THE ├┬═-╦ERNAL
  378. LFN GIVEN IN .┴ AND PUTS THE DATA INTO INTERFACE VARIABLES.  ╧F COURSE, THE
  379. LFN IS ASSUMED TO BE OPEN FOR READING A DIRECTORY ("$").  ╘HE BLOCK COUNT IS
  380. RETURNED IN THE WORD AT ╨╓+11, THE FIRST CHARACTER OF THE FILETYPE IS RETURNED
  381. AT ╨╓+13, THE NUMBER OF CHARACTERS IN THE FILENAME IS RETURNED IN ╨╓+14, AND
  382. THE FILENAME CHARACTERS ARE RETURNED IN BYTES ╨╓+15 TO ╨╓+30.  ┴N ERROR RETURN
  383. IS GIVEN IN THE USUAL WAY.
  384.  
  385. ╘HIS ROUTINE ASSUMES THAT THE FIRST TWO BYTES OF THE DIRECTORY FILE HAVE
  386. ALREADY BEEN READ.  ╘HE FIRST CALL TO THIS ROUTINE WILL RETURN THE NAME OF THE
  387. DISK.  ╘HE END OF A DIRECTORY IS SIGNALLED BY A FILENAME LENGTH OF ZERO.  ╔N
  388. THIS CASE, THE BLOCK COUNT RETURNED WILL BE THE NUMBER OF BLOCKS FREE ON THE
  389. DISK.
  390.  
  391. 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
  392.  
  393. ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING AND
  394. WRITING PACKAGE.  ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY
  395. THE % SYMBOL.  ╘HE % SIGN IS THERE TO ALLOW YOU TO EASILY EXTRACT THE
  396. ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE (AND ALL OF MY UGLY COMMENTS).
  397. ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS EXECUTE THE FOLLOWING COMMAND LINE
  398. (SUBSTITUTE FILENAMES AS APPROPRIATE):
  399.  
  400. GREP '^%' ╚ACK5 | SED 'S/^% //' | SED 'S/^%//' >LRR.S
  401.  
  402. % ; ╠ITTLE ╥ED ╥EADER/╫RITER UTILITY PACKAGE BY ├RAIG ┬RUCE, 31-╩AN-92
  403. % ; ╫RITTEN FOR ├= ╚ACKING ╬ET-═AGAZINE; FOR ├-128, 1571, 1581
  404. %
  405.  
  406. ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
  407. DIRECTIVES.  ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
  408.  
  409. % .ORG $8000
  410. % .OBJ "LRR.BIN"
  411. %
  412. % ;====JUMP TABLE AND PARAMETERS INTERFACE ====
  413. %
  414. % JMP INIT╨ACKAGE ;()
  415. % JMP MS─IR       ;( MS─EVICE, MS╘YPE ) : .┴┘=DIR┴DDR, .╪=DIRENT├OUNT
  416. % JMP MS╥EAD      ;( MS─EVICE, MS╘YPE, START├LUSTER, LEN═╠,.┴=TRANS,.╪=CBM╠FN )
  417. % JMP MS╫RITE     ;( MS─EVICE, MS╘YPE, WRITE─IRENT, .┴=TRANS, .╪=CBM╠FN )
  418. % JMP MS╞LUSH     ;( MS─EVICE, MS╘YPE )
  419. % JMP MS─ELETE    ;( WRITE─IRENT )
  420. % JMP MS╞ORMAT    ;( MS─EVICE, MS╘YPE )
  421. % JMP MS┬YTES╞REE ;( ) : .┴┘╪=BYTES╞REE
  422. % JMP CBM├OPY     ;( .┴=IN╠FN, .╪=OUT╠FN )
  423. % JMP CBM─IRENT   ;( .┴=LFN )
  424. %
  425. % .BYTE $CB,132   ;IDENTIFICATION (LOCATION PK+30)
  426.  
  427. ╘HESE INTERFACE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO
  428. MINIMIZE UNWANTED INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME,
  429. SUCH AS THE ╥┴═─╧╙ DEVICE DRIVER.
  430.  
  431. % ERRNO           .BUF 1
  432. % MS─EVICE        .BUF 1
  433. % MS╘YPE          .BUF 1    ;$00=1571, $FF=1581
  434. % START├LUSTER    .BUF 2
  435. % LEN═╠           .BUF 2    ;LENGTH MEDIUM AND LOW BYTES
  436. % WRITE─IRENT     .BUF 2    ;POINTER TO DIRENT
  437. % CDIR┬LOCKS      .BUF 2    ;CBM DIRENT BLOCKS
  438. % CDIR╘YPE        .BUF 1    ;CBM DIRENT FILETYPE
  439. % CDIR╞LEN        .BUF 1    ;CBM DIRENT FILENAME LENGTH
  440. % CDIR╬AME        .BUF 16   ;CBM DIRENT FILENAME
  441. %
  442.  
  443. ╘HIS COMMAND IS NOT CURRENTLY IMPLEMENTED.  ╔TS STUB APPEARS HERE.
  444.  
  445. % MS╞ORMAT = *
  446. %    BRK
  447. %
  448. % ;====GLOBAL DECLARAIONS====
  449. %
  450. % KERNEL╠ISTEN = $FFB1
  451. % KERNEL╙ECOND = $FF93
  452. % KERNEL╒NLSN  = $FFAE
  453. % KERNEL┴CPTR  = $FFA2
  454. % KERNEL├IOUT  = $FFA8
  455. % KERNEL╙PINP  = $FF47
  456. % KERNEL├HKIN  = $FFC6
  457. % KERNEL├HKOUT = $FFC9
  458. % KERNEL├LRCHN = $FFCC
  459. % KERNEL├HRIN  = $FFCF
  460. % KERNEL├HROUT = $FFD2
  461. %
  462. % ST = $90
  463. % CIA├LOCK = $DD00
  464. % CIA╞LAGS = $DC0D
  465. % CIA─ATA  = $DC0C
  466. %
  467.  
  468. ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR.  ╘HEY
  469. ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
  470.  
  471. % CLUSTER┬LOCK├OUNT .BUF 1        ;1 OR 2
  472. % FAT┬LOCKS         .BUF 1        ;UP TO 3
  473. % ROOT─IR┬LOCKS     .BUF 1        ;UP TO 8
  474. % ROOT─IR┼NTRIES    .BUF 1        ;UP TO 128
  475. % TOTAL╙ECTORS      .BUF 2        ;UP TO 1440
  476. % FIRST╞ILE┬LOCK    .BUF 1
  477. % FIRST╥OOT─IR┬LOCK .BUF 1
  478. % FILE├LUSTER├OUNT  .BUF 2
  479. % LAST╞AT┼NTRY      .BUF 2
  480. %
  481.  
  482. ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACK CACHE
  483. FOR READING.
  484.  
  485. % BUF├YLINDER     .BUF 1
  486. % BUF╙IDE         .BUF 1
  487.  
  488. ╘HESE "DIRTY" FLAGS RECORD WHAT HAS TO BE WRITTEN OUT FOR A FLUSH OPERATION.
  489.  
  490. % FAT─IRTY        .BUF 1
  491. % DIR─IRTY        .BUF 8  ;FLAG FOR EACH DIRECTORY BLOCK
  492. % FORMAT╨ARMS     .BUF 6
  493. %
  494.  
  495. ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS.  ╘HIS LEVEL INTERFACES WITH THE
  496. ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
  497.  
  498. % ;====HARDWARE LEVEL====
  499. %
  500.  
  501. ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
  502. BURST COMMAND BYTE.
  503.  
  504. % SEND╒0 = *  ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
  505. %    PHA
  506. %    LDA #0
  507. %    STA ST
  508. %    LDA MS─EVICE
  509. %    JSR KERNEL╠ISTEN
  510. %    LDA #$6F
  511. %    JSR KERNEL╙ECOND
  512. %    LDA #"U"
  513. %    JSR KERNEL├IOUT
  514. %    BIT ST
  515. %    BMI SEND╒0┼RROR
  516. %    LDA #"0"
  517. %    JSR KERNEL├IOUT
  518. %    PLA
  519. %    JSR KERNEL├IOUT
  520. %    BIT ST
  521. %    BMI SEND╒0┼RROR
  522. %    CLC
  523. %    RTS
  524. %
  525. %    SEND╒0┼RROR = *
  526. %    LDA #5
  527. %    STA ERRNO
  528. %    SEC
  529. %    RTS
  530. %
  531.  
  532. ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
  533. TRANSFER PROTOCOL.
  534.  
  535. % TOGGLE├LOCK = *
  536. %    LDA CIA├LOCK
  537. %    EOR #$10
  538. %    STA CIA├LOCK
  539. %    RTS
  540. %
  541.  
  542. ╫AIT FOR A BURST BYTE TO ARRIVE IN THE SERIAL DATA REGISTER OF ├╔┴#1 FROM THE
  543. FAST SERIAL BUS.
  544.  
  545. % SERIAL╫AIT = *
  546. %    LDA #$08
  547. % -  BIT CIA╞LAGS
  548. %    BEQ -
  549. %    RTS
  550. %
  551.  
  552. ╫AIT FOR AND GET A BURST BYTE FROM THE FAST SERIAL BUS, AND SEND THE "─ATA
  553. ┴CCEPTED" SIGNAL.
  554.  
  555. % GET┬URST┬YTE = *
  556. %    JSR SERIAL╫AIT
  557. %    LDX CIA─ATA
  558. %    JSR TOGGLE├LOCK
  559. %    TXA
  560. %    RTS
  561. %
  562.  
  563. ╙END THE BURST COMMANDS TO "LOG IN" THE ═╙-─╧╙ DISK AND SET THE ╥EAD SECTOR
  564. INTERLEAVE FACTOR.
  565.  
  566. % MOUNT─ISK = *  ;() : .├╙=ERR
  567. %    LDA #%00011010
  568. %    JSR SEND╒0
  569. %    BCC +
  570. %    RTS
  571. % +  JSR KERNEL╒NLSN
  572. %    BIT ST
  573. %    BMI SEND╒0┼RROR
  574. %    CLC
  575. %    JSR KERNEL╙PINP
  576. %    BIT CIA╞LAGS
  577. %    JSR TOGGLE├LOCK
  578. %    JSR GET┬URST┬YTE
  579. %    STA ERRNO
  580. %    AND #$0F
  581. %    CMP #2
  582. %    BCS MOUNT┼XIT
  583.  
  584. ╟RAB THE THROW-AWAY PARAMETERS FROM THE MOUNT OPERATION.
  585.  
  586. %    LDY #0
  587. % -  JSR GET┬URST┬YTE
  588. %    STA FORMAT╨ARMS,Y
  589. %    INY
  590. %    CPY #6
  591. %    BCC -
  592. %    CLC
  593.  
  594. ╙ET THE ╥EAD SECTOR INTERLEAVE TO 1 FOR A 1581 OR 4 FOR A 1571.
  595.  
  596. %    ;** SET INTERLEAVE
  597. %    LDA #%00001000
  598. %    JSR SEND╒0
  599. %    BCC +
  600. %    RTS
  601. % +  LDA #1            ;INTERLEAVE OF 1 FOR 1581
  602. %    BIT MS╘YPE
  603. %    BMI +
  604. %    LDA #4            ;INTERLEAVE OF 4 FOR 1571
  605. % +  JSR KERNEL├IOUT
  606. %    JSR KERNEL╒NLSN
  607. %    MOUNT┼XIT = *
  608. %    RTS
  609. %
  610.  
  611. ╥EAD ALL OF THE SECTORS OF A GIVEN TRACK INTO THE TRACK CACHE.
  612.  
  613. % BUFPTR = 2
  614. % SECNUM = 4
  615. %
  616. % READ╘RACK = *  ;( .┴=CYLINDER, .╪=SIDE ) : TRACKBUF, .├╙=ERR
  617. %    PHA
  618. %    TXA
  619.  
  620. ╟ET THE SIDE AND PUT IT INTO THE COMMAND BYTE.  ╥EMEMBER THAT WE HAVE TO FLIP
  621. THE SIDE BIT FOR A 1581.
  622.  
  623. %    AND #$01
  624. %    ASL
  625. %    ASL
  626. %    ASL
  627. %    ASL
  628. %    BIT MS╘YPE
  629. %    BPL +
  630. %    EOR #$10
  631. % +  JSR SEND╒0
  632. %    PLA
  633. %    BCC +
  634. %    RTS
  635. % +  JSR KERNEL├IOUT      ;CYLINDER NUMBER
  636. %    LDA #1               ;START SECTOR NUMBER
  637. %    JSR KERNEL├IOUT
  638. %    LDA #9               ;SECTOR COUNT
  639. %    JSR KERNEL├IOUT
  640. %    JSR KERNEL╒NLSN
  641.  
  642. ╨REPARE TO RECEIVE THE TRACK DATA.
  643.  
  644. %    SEI
  645. %    CLC
  646. %    JSR KERNEL╙PINP
  647. %    BIT CIA╞LAGS
  648. %    JSR TOGGLE├LOCK
  649. %    LDA #<TRACKBUF
  650. %    LDY #>TRACKBUF
  651. %    STA BUFPTR
  652. %    STY BUFPTR+1
  653.  
  654. ╟ET THE SECTOR DATA FOR EACH OF THE 9 SECTORS OF THE TRACK.
  655.  
  656. %    LDA #0
  657. %    STA SECNUM
  658. % -  BIT MS╘YPE
  659. %    BMI +
  660.  
  661. ╔F WE ARE DEALING WITH A 1571, WE HAVE TO SET THE BUFFER POINTER FOR THE NEXT
  662. SECTOR, TAKING INTO ACCOUNT THE SOFT INTERLEAVE OF 4.
  663.  
  664. %    JSR GET1571┬UF╨TR
  665. % +  JSR READ╙ECTOR
  666. %    BCS TRACK┼XIT
  667. %    INC SECNUM
  668. %    LDA SECNUM
  669. %    CMP #9
  670. %    BCC -
  671. %    CLC
  672. %    TRACK┼XIT = *
  673. %    CLI
  674. %    RTS
  675. %
  676.  
  677. ╟ET THE BUFFER POINTER FOR THE NEXT 1571 SECTOR.
  678.  
  679. % GET1571┬UF╨TR = *
  680. %    LDA #<TRACKBUF
  681. %    STA BUFPTR
  682. %    LDX SECNUM
  683. %    CLC
  684. %    LDA #>TRACKBUF
  685. %    ADC BUFPTR1571,X
  686. %    STA BUFPTR+1
  687. %    RTS
  688. %
  689. % BUFPTR1571 = *
  690. %    .BYTE 0,8,16,6,14,4,12,2,10
  691. %
  692.  
  693. ╥EAD AN INDIVIDUAL SECTOR INTO MEMORY AT THE SPECIFIED ADDRESS.
  694.  
  695. % READ╙ECTOR = *  ;( BUFPTR ) : .├╙=ERR
  696.  
  697. ╟ET AND CHECK THE BURST STATUS BYTE FOR ERRORS.
  698.  
  699. %    JSR GET┬URST┬YTE
  700. %    STA ERRNO
  701. %    AND #$0F
  702. %    CMP #2
  703. %    BCC +
  704. %    RTS
  705. % +  LDX #2
  706. %    LDY #0
  707. %
  708.  
  709. ╥ECEIVE THE 512 SECTOR DATA BYTES INTO MEMORY.
  710.  
  711. %    READ┬YTE = *
  712. %    LDA #$08
  713. % -  BIT CIA╞LAGS
  714. %    BEQ -
  715. %    LDA CIA├LOCK
  716. %    EOR #$10
  717. %    STA CIA├LOCK
  718. %    LDA CIA─ATA
  719. %    STA (BUFPTR),Y
  720. %    INY
  721. %    BNE READ┬YTE
  722. %    INC BUFPTR+1
  723. %    DEX
  724. %    BNE READ┬YTE
  725. %    RTS
  726. %
  727. % OLD├LOCK = 5
  728. %
  729.  
  730. ╫RITE AN INDIVIDUAL SECTOR TO DISK, FROM A SPECIFIED MEMORY ADDRESS.
  731.  
  732. % WRITE╙ECTOR = *  ;( BUFPTR, .┴=TRACK, .╪=SIDE, .┘=SECTOR ) : .├╙=ERR
  733. %    PHA
  734. %    STY SECNUM
  735.  
  736. ╟ET THE SIDE INTO THE BURST COMMAND BYTE
  737.  
  738. %    TXA
  739. %    AND #$01
  740. %    ASL
  741. %    ASL
  742. %    ASL
  743. %    ASL
  744. %    ORA #$02
  745. %    BIT MS╘YPE
  746. %    BPL +
  747. %    EOR #$10
  748. % +  JSR SEND╒0
  749. %    PLA
  750. %    BCC +
  751. %    RTS
  752.  
  753. ╙END REST OF PARAMETERS FOR BURST COMMAND.
  754.  
  755. % +  JSR KERNEL├IOUT      ;TRACK NUMBER
  756. %    LDA SECNUM           ;SECTOR NUMBER
  757. %    JSR KERNEL├IOUT
  758. %    LDA #1               ;SECTOR COUNT
  759. %    JSR KERNEL├IOUT
  760. %    JSR KERNEL╒NLSN
  761. %    SEI
  762. %    LDA #$40
  763. %    STA OLD├LOCK
  764. %    SEC
  765. %    JSR KERNEL╙PINP      ;SET FOR BURST OUTPUT
  766. %    SEI
  767. %    BIT CIA╞LAGS
  768. %    LDX #2
  769. %    LDY #0
  770. %
  771.  
  772. ╫RITE THE 512 BYTES FOR THE SECTOR.
  773.  
  774. %    WRITE┬YTE = *
  775. %    LDA CIA├LOCK
  776. %    CMP CIA├LOCK
  777. %    BNE WRITE┬YTE
  778. %    EOR OLD├LOCK
  779. %    AND #$40
  780. %    BEQ WRITE┬YTE
  781. %    LDA (BUFPTR),Y
  782. %    STA CIA─ATA
  783. %    LDA OLD├LOCK
  784. %    EOR #$40
  785. %    STA OLD├LOCK
  786. %    LDA #8
  787. % -  BIT CIA╞LAGS
  788. %    BEQ -
  789. %    INY
  790. %    BNE WRITE┬YTE
  791. %    INC BUFPTR+1
  792. %    DEX
  793. %    BNE WRITE┬YTE
  794. %
  795.  
  796. ╥EAD BACK THE BURST STATUS BYTE TO SEE IF ANYTHING WENT WRONG WITH THE WRITE.
  797.  
  798. %    CLC
  799. %    JSR KERNEL╙PINP
  800. %    BIT CIA╞LAGS
  801.