home *** CD-ROM | disk | FTP | other *** search
/ 64'er 1994 September / 64er_Magazin_94-09_1994_Markt__Technik_de_Side_A.d64 / 1541-dos.doc < prev    next >
Text File  |  2022-10-26  |  44KB  |  1,131 lines

  1. ======================================================================
  2.                 iNSTRUCTIONS FOR THE 1541-DOS PACKAGE
  3.                       (jANUARY 4, 1994 VERSION)
  4. ======================================================================
  5.  
  6.   tHESE ARE THE INSTRUCTIONS ON HOW TO READ AND WRITE TO ms-dos FLOPPY
  7. DISKS WITH A SLIGHTLY MODIFIED cOMMODORE 1541 OR oCEANIC oc-118/oc-118n
  8. DISK DRIVE.
  9.  
  10.   iNCLUDED IS INFORMATION ABOUT THE NECESSARY MODIFICATION OF THE 1541
  11. DRIVE AND THE USAGE OF THE PROGRAMS IN THIS PACKAGE.
  12.  
  13.  
  14. contents
  15. --------
  16.  
  17. 1) hARDWARE REQUIREMENTS
  18. 2) mfm MODIFICATION
  19. 2a) 1541 DISK DRIVE MODIFICATION
  20. 2b) 1541 DISK DRIVE MODIFICATION -- FIRST ALTERNATE
  21. 2c) 1541 DISK DRIVE MODIFICATION -- SECOND ALTERNATE
  22. 2d) oCEANIC oc-118/oc-118n DISK DRIVE MODIFICATION
  23. 3) pREPARING DISKS FOR DATA TRANSFER
  24. 4) tRANSFERRING FILES FROM ms-dos DISKS TO cbm DISKS
  25.    WITH "1541-READS-DOS"
  26. 5) tRANSFERRING FILES FROM cbm DISKS TO ms-dos DISKS
  27.    WITH "1541-WRITES-90K" AND "READ90K"
  28. 6) eRROR MESSAGES
  29. 7) cOMPATIBILITY
  30. 8) pOSSIBLE IMPROVEMENTS
  31. 9) dISCLAIMER
  32. 10) cONTACTING THE AUTHORS
  33.  
  34. appendix a: lISTING OF basic PROGRAM 1541-DOS.BOOT
  35. appendix b: c-VERSION OF rEAD90K FOR uNIX
  36.  
  37. -----------------------------------------------------------------------
  38.  
  39. 1) hardware requirements
  40.  
  41.   yOU REQUIRE A c64 OR c128 (IN c64 MODE) WITH AT LEAST ONE 1541 OR
  42. oc-118/oc-118n FLOPPY DISK DRIVE. tHE DRIVE MUST BE MODIFIED SLIGHTLY TO
  43. ALLOW IT TO UTILIZE THE mfm METHOD OF STORING DATA USED ON ms-dos
  44. COMPATIBLE DISKS. tHIS MODIFICATION DOES NOT AFFECT THE NORMAL OPERATION
  45. OF THE DRIVE. iF YOU DON'T HAVE EXPERIENCE IN SOLDERING CIRCUIT BOARDS
  46. THEN FIND SOMEONE WHO DOES; THE MODIFICATION IS SMALL, BUT TRICKY, AND
  47. WILL VOID THE WARRANTY ON YOUR DISK DRIVE.
  48.  
  49.   tHE 1541 CAN THEN READ SINGLE SIDED, DOUBLE DENSITY DISKS WRITTEN BY
  50. ms-dos COMPUTERS WITH 5 1/4" INCH DISK DRIVES.
  51.  
  52.   yOU NEED AN ms-dos COMPUTER WITH AT LEAST ONE 5 1/4" FLOPPY DRIVE AND
  53. ONE OTHER WRITABLE DISK DEVICE (A FLOPPY, HARD OR ram DISK DRIVE) TO READ
  54. FILES WRITTEN BY THE 1541.
  55.  
  56. -----------------------------------------------------------------------
  57.  
  58. 2) mfm modification
  59.  
  60.   warning: THE DISK DRIVE MOTHERBOARD CAN BE EASILY DAMAGED BY STATIC
  61. ELECTRICITY. dON'T WORK ON THIS PROJECT WEARING SYNTHETIC CLOTHES AND
  62. RUBBER SHOES ON A NYLON CARPET AND EXPECT YOUR DRIVE TO COME THROUGH
  63. UNSCATHED!  uSE OF A GROUNDED SOLDERING IRON IS RECOMMENDED, AS IS
  64. MINIMIZING CONTACT WITH THE BOARD.
  65.  
  66.   aS LONG AS YOU TAKE REASONABLE PRECAUTIONS, NO DAMAGE SHOULD OCCUR TO
  67. YOUR DISK DRIVE BY FOLLOWING THESE INSTRUCTIONS. hOWEVER, DIFFERENCES
  68. BETWEEN BOARD REVISIONS MAKE IT IMPOSSIBLE TO GUARANTEE THAT THE
  69. MODIFICATIONS DESCRIBED HERE WILL WORK ON YOUR DISK DRIVE. cAVEAT
  70. EMPTOR!
  71.  
  72.   tHE CLOCK DIVISOR IS A 74ls193 HEXADECIMAL COUNTER IN THE 1541, AND
  73. THE SIMILAR 74ls161 IN THE oCEANIC DRIVES. tHE cpu LOADS THE NUMBER TO
  74. START COUNTING AT ON ITS INPUTS AND THE OVERFLOW FROM THE COUNTER IS
  75. CHAINED TO THE NEXT PORTION OF THE CIRCUIT. oF THE 4 COUNTER INPUTS, THE
  76. LOWER TWO ARE CONTROLLED BY THE cpu AND THE HIGHER 2 ARE TIED TO GROUND.
  77. tHIS MEANS VALUES OF 0 THROUGH 3 ON THE COUNTER INPUTS REQUIRE 16 TO 13
  78. COUNTS (RESPECTIVELY) BEFORE OVERFLOW, THUS DIVIDING THE INPUT BY THAT
  79. AMOUNT. tHE RANGE OF CLOCK RATES THAT CAN BE GENERATED WITH THOSE
  80. DIVISORS IS FROM 250 KhZ TO 307 KhZ.
  81.  
  82.   mODIFYING THE 1541 TO READ mfm DISKS INVOLVES PLACING THE HIGHER TWO
  83. BITS OF THE COUNTER UNDER cpu CONTROL. tHAT ALLOWS A FULL RANGE OF
  84. DIVISORS FROM 1 THROUGH 16, AN EVEN GREATER RANGE THAN THE DIVIDE BY 8
  85. REQUIRED FOR A 500 KhZ CLOCK. iN FACT, ONLY ONE ADDITIONAL COUNTER INPUT
  86. NEEDS TO BE UNDER cpu CONTROL, BUT WHILE WE'RE IN THE DRIVE WITH A
  87. SOLDERING IRON, WHY NOT CONNECT THE OTHER ONE TOO?  iT MIGHT BE REQUIRED
  88. TO READ OTHER DISK FORMATS IN THE FUTURE.
  89.  
  90.   oNCE YOU'VE CHOSEN ONE OF THE MODIFICATION INSTRUCTIONS BELOW AND
  91. COMPLETED IT, TAKE ONE LAST LOOK AT YOUR WORK. lOOK ESPECIALLY FOR
  92. SOLDER BRIDGES AND WIRES TOUCHING ADJACENT PADS. nEXT, RE-ATTACH ANY
  93. CONNECTORS, SCREW THE DRIVE TOGETHER AND PLUG IT IN. bEFORE ATTACHING IT
  94. TO YOUR c64, TRY TURNING IT ON. iF YOU DON'T HEAR ANYTHING UNUSUAL AND
  95. DON'T SMELL SMOKE, YOUR DRIVE HAS PASSED THE FIRST TEST! tURN THE DRIVE
  96. OFF AND PLUG IT INTO YOUR COMPUTER. tURN THEM BOTH ON AND TRY LOADING A
  97. PROGRAM FROM A NONCRITICAL 1541 DISK. iF IT READS FINE AND DOESN'T ERASE
  98. THE DISK, THEN MOVE TO THE NEXT SECTION AND TRY READING AN ms-dos DISK.
  99. iF IT DOESN'T WORK PROPERLY, OPEN THE DRIVE AGAIN AND COMPARE YOUR WORK
  100. TO THE INSTRUCTIONS CAREFULLY.
  101.  
  102. 2a) 1541 disk drive modification
  103.  
  104.   tHIS SECTION DESCRIBES THE EASIEST MODIFICATION TO MAKE TO YOUR 1541,
  105. AND HAS THE POTENTIAL OF WORKING WITH MORE DISK FORMATS THAN JUST ms-dos
  106. mfm (USING FUTURE SOFTWARE). tHE DISADVANTAGE IS THAT PART OF THE
  107. UNUSED i/o PORT a IS REQUIRED, WHICH MEANS THAT THE PORT CANNOT BE USED
  108. WITH A FAST LOADING DEVICE THAT REQUIRES A PARALLEL CABLE CONNECTION TO
  109. THE 1541 (STANDARD FAST LOADER CARTRIDGES WORK FINE). uSE ONE OF THE
  110. ALTERNATE MODIFICATIONS IF YOU WANT TO USE SUCH A FAST LOADER.
  111.  
  112.   tHE UNUSED i/o PORT AVAILABLE ON THE FIRST 6522 VERSATILE INTERFACE
  113. ADAPTERS (via) CAN BE CONNECTED TO THE COUNTER'S EXTRA INPUTS (WHICH ARE
  114. NORMALLY CONNECTED TO GROUND) AND USED TO EXTEND THE CLOCK FREQUENCY
  115. RANGE. sINCE THE PORT IS ALSO AT GROUND POTENTIAL UPON RESET, THE CLOCK
  116. CIRCUITRY IS NOT AFFECTED BY THE MODIFICATION.
  117.  
  118.   rEFER TO THE FIGURE IN FILE 1541clk.gif WHILE MAKING THESE
  119. MODIFICATIONS. uNPLUG YOUR 1541 AND REMOVE ITS COVER BY UNSCREWING THE
  120. FOUR SCREWS ON THE BOTTOM OF THE CASE. lOCATE THE CONTROLLER pcb AND
  121. UNPLUG THE TRANSFORMER CONNECTOR NEAR THE REGULATOR icS AND HEAT SINK.
  122. rEMOVE THE SCREWS ATTACHING THE pcb TO THE CHASSIS, INCLUDING THE TWO
  123. SCREWS ATTACHED TO THE REGULATOR HEAT SINK, AND TILT THE BOARD UP.
  124.  
  125.   lOCATE ue6 (THE 74ls193 COUNTER ic) AND CUT THE TRACES GOING TO PINS 9
  126. AND 10; MAKE SURE THE TWO PINS ARE NOT STILL CONNECTED TO EACH OTHER,
  127. TOO. cAREFULLY SOLDER A SHORT WIRE TO PIN 9 AND ANOTHER ONE TO PIN 10.
  128. lOCATE uc3 (6522 via) AND SOLDER THE OTHER END OF THE FIRST WIRE (FROM
  129. ue6 PIN 9) TO uc3 PIN 3 (WHICH IS OTHERWISE UNCONNECTED). sOLDER THE
  130. OTHER END OF THE SECOND WIRE (FROM ue6 PIN 10) TO uc3 PIN 2 (ALSO
  131. OTHERWISE UNCONNECTED).
  132.  
  133.   cURRENTLY, ONLY THE JUMPER TO ue6 PIN 9 IS REQUIRED TO READ ibm
  134. DISKETTES. iF YOU WANT TO SAVE YOURSELF SOLDERING ONE JUMPER, YOU MAY
  135. LEAVE ue6 PIN 10 CONNECTED TO GROUND. tHE JUMPER TO ue6 PIN 10 MAY BE
  136. REQUIRED IN THE FUTURE TO READ OTHER NEW AND EXCITING DISK FORMATS.
  137.  
  138. 2b) 1541 disk drive modification -- first alternate
  139.  
  140.   uSE THE FOLLOWING MODIFICATION INSTRUCTIONS IF YOU WANT TO LEAVE THE
  141. FIRST via'S UNUSED PORT a ALONE. yOU'LL NEED A 4.7 KILOHM RESISTOR TO
  142. PERFORM THIS MODIFICATION (ALTHOUGH ANYTHING 3.3K TO 10K SHOULD ALSO
  143. WORK).
  144.  
  145.   bESIDES ALL OF PORT a, PIN ca1 OF THE FIRST via IS ALSO UNUSED IN A
  146. STOCK 1541. uNFORTUNATELY, IT GOES HIGH (NOT TO GROUND) WHEN RESET AND
  147. CAN'T BE DIRECTLY CONNECTED TO THE COUNTER'S INPUT FOR THE DRIVE TO BE
  148. ABLE TO READ REGULAR 1541 DISKS AT POWER UP. iNSTEAD, AN UNUSED INVERTER
  149. IS USED TO INVERT THE HIGH SIGNAL TO LOW, WHICH IS THEN CONNECTED TO THE
  150. COUNTER.
  151.  
  152.   uNPLUG YOUR 1541 AND REMOVE ITS COVER BY UNSCREWING THE FOUR SCREWS ON
  153. THE BOTTOM OF THE CASE. lOCATE THE CONTROLLER pcb AND UNPLUG THE
  154. TRANSFORMER CONNECTOR NEAR THE REGULATOR icS AND HEAT SINK. rEMOVE THE
  155. SCREWS ATTACHING THE pcb TO THE CHASSIS, INCLUDING THE TWO SCREWS
  156. ATTACHED TO THE REGULATOR HEAT SINK, AND TILT THE BOARD UP.
  157.  
  158.   lOCATE ue6 (THE 74ls193 COUNTER ic) AND CUT THE TRACE GOING TO PIN 9;
  159. MAKE SURE THE PIN 9 ISN'T STILL CONNECTED TO PIN 10. cAREFULLY SOLDER A
  160. SHORT WIRE TO PIN 9. lOCATE ub1 (7406 OPEN-COLLECTOR HEX INVERTER) AND
  161. VERIFY THAT PINS 5 AND 6 ARE UNCONNECTED. sOLDER THE OTHER END OF THE
  162. WIRE AND ONE END OF THE RESISTOR TO PIN 6. tHE OTHER END OF THE
  163. RESISTOR MUST BE SOLDERED TO PIN 14 (vCC). lOCATE uc3 (6522 via) AND
  164. SOLDER A SHORT LENGTH OF WIRE BETWEEN PIN 39 (ca2) AND PIN 5 OF ub1.
  165.  
  166. 2c) 1541 disk drive modification -- second alternate
  167.  
  168.   iF YOU DON'T HAVE A RESISTOR HANDY, OR ARE MODIFYING A 1541 COMPATIBLE
  169. DISK DRIVE THAT DOESN'T HAVE AN UNUSED PORT OR INVERTER (OR EVEN ONE
  170. THAT DOES, LIKE THE oc-118), THEN YOU MAY BE FORCED TO USE THIS
  171. ALTERNATE MODIFICATION. a SWITCH IS INSTALLED WHICH ALLOWS YOU TO CHOOSE
  172. TO READ NORMAL 1541 DISKS WHEN DOWN OR mfm DISKS WHEN UP.
  173.  
  174.   lOCATE ue6 (THE 74ls193 COUNTER ic) AND CUT THE TRACE GOING TO PIN 9;
  175. MAKE SURE THE PIN 9 ISN'T STILL CONNECTED TO PIN 10. cAREFULLY SOLDER A
  176. SHORT WIRE BETWEEN PIN 9 AND THE MIDDLE POSITION OF A spdt SWITCH.
  177. cONNECT ONE REMAINING SWITCH CONTACT TO GROUND AND THE OTHER TO vCC (+5
  178. v). tO USE REGULAR 1541 DISKS, SWITCH TO THE GROUND POSITION. tO USE
  179. mfm DISKS, SWITCH TO THE +5 v POSITION.
  180.  
  181. 2d) oceanic oc-118/oc-118n disk drive modification
  182.  
  183.   tHE oc-118 AND oc-118n ARE THIRD PARTY 1541-COMPATIBLE DISK DRIVES.
  184. tHEY APPEAR SIMILAR TO THE aMIGA EXTERNAL DISK DRIVES IN THAT THEY ARE
  185. COMPACT AND HAVE AN EXTERNAL POWER SUPPLY. tHEIR CIRCUITRY IS SLIGHTLY
  186. DIFFERENT FROM THAT OF THE 1541, AND THEY REQUIRE A DIFFERENT
  187. MODIFICATION. tHIS DESCRIPTION IS EQUIVALENT TO THE FIRST ALTERNATE
  188. 1541 MODIFICATION ABOVE, SO YOU'LL NEED A 3.3K TO 10K KILOHM RESISTOR.
  189.  
  190.   lOCATE u4 (74ls161 COUNTER ic) ON THE BOARD IN THE TOP RIGHT OF THE
  191. DIAGRAM. tHERE MAY BE ANOTHER u4 ON A DIFFERENT BOARD, SO MAKE SURE THE
  192. u4 YOU USE HAS 74ls161 WRITTEN ON IT. cUT THE TRACE BETWEEN PIN 6 OF u4
  193. AND gnd AND SOLDER A SHORT WIRE TO PIN 6. lOCATE u15 (7406 OPEN-
  194. COLLECTOR HEX INVERTER) AND SOLDER THE OTHER END OF THE WIRE AND ONE
  195. END OF THE RESISTOR TO PIN 8 (WHICH SHOULD OTHERWISE BE UNCONNECTED).
  196. cONNECT THE OTHER END OF THE RESISTOR TO PIN 14 (vCC). lOCATE u8 (6522
  197. via) AND SOLDER A SHORT LENGTH OF WIRE BETWEEN PIN 39 (ca2) AND PIN 9 OF
  198. u15.
  199.  
  200.                                               u1,3,5  u2,4,6
  201.     ____________                       _____   u7,9   u8,10
  202.    !!           \   =mmmmm=========__ /     !   h#h    h#h  h
  203.    !!            ---------------------      !  ==============
  204.    !!    SERVO CARD          MOTHERBOARD    !            mmh -- CONNECTORS
  205.    !!  - - - - - - -       - - - - - - - - -!================
  206.    !!_______________________w_w_w_w_w_w_w___!   h#h   h#h  "
  207.  
  208.                                u1...9            u10...u18
  209.  
  210.                     oc-118, oc-118n - SIDE VIEW
  211.  
  212. -----------------------------------------------------------------------
  213.  
  214. 3) preparing disks for data transfer
  215.  
  216.   tHE 1541 DRIVE ONLY HAS A SINGLE HEAD TO READ SINGLE-SIDED DISKS. tHIS
  217. MEANS YOU NEED DISKS FORMATTED WITH THE 180 kb ms-dos FORMAT (40 TRACKS
  218. ON A SINGLE SIDE, 9 SECTORS PER TRACK WITH A SECTOR SIZE OF 512 BYTES).
  219. sUCH DISKS CAN BE FORMATTED USING THE ms-dos format COMMAND ON DOUBLE
  220. DENSITY DISKS WITH THE /1 COMMAND LINE OPTION. e.G.:
  221.  
  222.     format /1 a:
  223.  
  224.   iF YOU USE A HIGH DENSITY DISK DRIVE (1.2 mb) YOU WILL ALSO HAVE TO
  225. USE THE /4 COMMAND LINE OPTION TO CREATE DOUBLE DENSITY FORMAT. e.G.:
  226.  
  227.     format /1 /4 a:
  228.  
  229.   nEWER VERSIONS OF ms-dos ALLOW THE /f SWITCH WHICH WILL WORK ON BOTH
  230. KINDS OF DRIVES. e.G.:
  231.  
  232.     format /f:180 a:
  233.  
  234.   iF YOU USE OTHER PROGRAMS TO FORMAT DISKS INSTEAD OF THE ms-dos
  235. format COMMAND, YOU MAY HAVE TO USE DIFFERENT PARAMETERS TO GENERATE DISKS
  236. WITH EXACTLY THE DISK ORGANIZATION 1541-READS-DOS EXPECTS.
  237.   e.G. WITH THE PUBLIC-DOMAIN PROGRAM fdformat YOU HAVE TO USE
  238.  
  239.     fdformat a: /f:180 /c:1 /d:64
  240.  
  241.  
  242.   tHESE ARE THE BOOT SECTOR PARAMETERS FOR A 1541-READS-DOS READABLE DISK:
  243.  
  244.                  bYTES PER SECTOR: 512
  245.               sECTORS PER cLUSTER: 1
  246.     rESERVED sECTORS AT BEGINNING: 1
  247.                        fat cOPIES: 2
  248.            rOOT DIRECTORY ENTRIES: 64
  249.             tOTAL SECTORS ON DISK: 360
  250.                   sECTORS PER fat: 2
  251.                 sECTORS PER TRACK: 9
  252.                             sIDES: 1
  253.  
  254.  
  255.  
  256.   hIGH DENSITY DRIVES USE A NARROWER READ/WRITE HEAD THAN DOUBLE
  257. DENSITY DRIVES AND THE 1541. tHEREFORE, YOU SHOULD NOT WRITE TO A DOUBLE
  258. DENSITY DISK WITH A HIGH DENSITY DRIVE IF THE DISK HAS PREVIOUSLY BEEN
  259. WRITTEN TO BY ONE OF THOSE DRIVES WITH ITS WIDER READ/WRITE HEAD.
  260.  
  261. -----------------------------------------------------------------------
  262.  
  263. 4) transferring files from ms-dos disks to cbm disks with
  264.    "1541-READS-DOS"
  265.  
  266.   yOU NEED THE PROGRAM 1541-READS-DOS TO READ FILES FROM ms-dos DISKS.
  267. iF YOU HAVE NO OTHER WAY OF TRANSFERRING IT TO THE c64, YOU CAN TYPE IN
  268. THE basic LISTING OF 1541-DOS.BOOT IN aPPENDIX a TO READ 1541-DOS.SFX
  269. FOR THE FIRST TIME.
  270.  
  271.   tHE PROGRAM 1541-READS-DOS COPIES FILES IN THE ROOT DIRECTORY OF A
  272. 180 kb ms-dos DISK TO A cbm DISK.
  273.  
  274.   iT CAN BE LOADED AND STARTED LIKE A basic PROGRAM. tHE USER
  275. INTERFACE IS DIALOGUE ORIENTED, SO YOU HAVE TO INPUT DATA WHEN ASKED
  276. FOR IT. yOU CAN ACCEPT DEFAULT VALUES BY SIMPLY PRESSING THE
  277. return-KEY.
  278.  
  279.   aT THE BEGINNING IT WILL ASK FOR THE DEVICE NUMBER OF THE 1541 DRIVE
  280. MODIFIED FOR mfm READING. tHIS IS THE DRIVE THE ms-dos SOURCE DISK
  281. WILL BE READ FROM. nEXT YOU HAVE TO ENTER THE DEVICE NUMBER OF THE
  282. DRIVE THE FILE SHALL BE COPIED TO. tHIS CAN BE ANY cOMMODORE COMPATIBLE
  283. DISK DRIVE. yOU CAN ENTER EQUAL NUMBERS FOR BOTH DRIVES; THE PROGRAM
  284. WILL THEN WORK WITH A SINGLE 1541 DISK DRIVE. hOWEVER, THE PROGRAM
  285. WILL BE A BIT SLOWER AND YOU WILL HAVE TO SWAP DISKS QUITE
  286. FREQUENTLY.
  287.  
  288.   yOU MAY THEN LET THE PROGRAM START READING FORMAT AND DIRECTORY
  289. INFORMATION FROM AN ms-dos DISK. oNLY THE ROOT DIRECTORY IS
  290. SUPPORTED -- YOU CAN NOT COPY FROM SUBDIRECTORIES.
  291.  
  292.   wITH EACH FILE YOU ARE GIVEN THE OPTION OF COPYING IT TO A cbm DISK. iF
  293. YOU DECIDE TO COPY A FILE, YOU MUST ENTER A TEXT CONVERSION NUMBER.
  294. iF YOU ENTER 0, THE FILE WILL BE COPIED WITHOUT CONVERSION. wITH NUMBER
  295. 1, YOU SELECT CONVERSION FROM ascii TO cbm CHARACTER SET (petscii);
  296. NUMBER 2 STANDS FOR CONVERSION FROM ascii TO dATA bECKER c-EDITOR
  297. FORMAT. tHE LATTER USES THE cbm CHARACTER SET EXTENDED BY CHARACTERS
  298. NEEDED FOR THE PROGRAMMING LANGUAGE c.
  299.  
  300.   cHARACTERS THAT DO NOT EXIST IN THE DESTINATION CHARACTER SET ARE
  301. IGNORED. tAB CHARACTERS ARE CONVERTED TO SINGLE SPACES.
  302.   nOTE THAT UUENCODED FILES CAN CONTAIN CHARACTERS (BACKSLASH AND
  303. UNDERSCORE) THAT DO NOT EXIST IN cbm CHARACTER SET.
  304.  
  305.   iN DETAIL, CONVERSION IS DONE ACCORDING TO THE FOLLOWING TABLES:
  306.  
  307.     ascii     ->    cbm
  308.     -------------------
  309.     0..7            -
  310.     8               32
  311.     9               -
  312.     10              13
  313.     11..31          -
  314.     32..64          32..64
  315.     65..90          193..218
  316.     91              91
  317.     92              -
  318.     93..94          93..94
  319.     95..96          -
  320.     97..122         65..90
  321.     123..255        -
  322.  
  323.     ascii     ->    c-EDITOR
  324.     ------------------------
  325.     0..7            -
  326.     8               32
  327.     9               -
  328.     10              13
  329.     11..31          -
  330.     32..64          32..64
  331.     65..90          193..218
  332.     91..95          91..95
  333.     96              -
  334.     97..122         65..90
  335.     123..126        219..222
  336.     127..255        -
  337.  
  338.   tEXT CONVERSION CAN TAKE QUITE A WHILE, LEADING TO PAUSES DURING THE
  339. COPY PROCESS.
  340.  
  341.   aFTER SELECTING THE CONVERSION NUMBER YOU CAN SPECIFY THE DESTINATION
  342. FILE TYPE. prg-, seq- AND usr-FILES CAN BE CREATED.
  343.  
  344.   nEXT, THE NAME OF THE DESTINATION FILE HAS TO BE ENTERED. tHE DEFAULT
  345. FILENAME IS THE ms-dos NAME WITH LOWER CASE LETTERS.
  346.  
  347.   aFTER FILES HAVE BEEN SELECTED THE COPY PROCESS CAN BE STARTED. wITH
  348. DIFFERENT SOURCE AND DESTINATION DISK DRIVES ALL FILES ARE COPIED
  349. WITHOUT ANY FURTHER USER INTERACTION NECESSARY.
  350.  
  351.   wHEN A SINGLE DRIVE IS USED, YOU HAVE TO SWAP DISKS FOR EVERY FILE.
  352. lONG FILES REQUIRE ADDITIONAL SWAPPING.
  353.  
  354.   aT THE END YOU CAN DECIDE TO START COPYING FROM ANOTHER ms-dos DISK.
  355. oTHERWISE THE PROGRAM WILL BE TERMINATED BY ISSUING A RESET OF BOTH THE
  356. c64 AND THE mfm- DISK DRIVE.
  357.  
  358. -----------------------------------------------------------------------
  359.  
  360. 5) transferring files from cbm disks to ms-dos disks with
  361.    "1541-WRITES-90K" and "READ90K.COM"
  362.  
  363.   a SPECIAL 90K-FORMAT IS USED FOR TRANSFERRING FILES TO ms-dos
  364. COMPUTERS. tHIS IS NOT A REGULAR ms-dos FORMAT, ALTHOUGH IT USES
  365. FORMATTED 180 kb ms-dos DISKS.
  366.  
  367.   tHE PROGRAM 1541-WRITES-90K WRITES A FILE WITH A MAXIMUM LENGTH OF
  368. 91904 BYTES TO A DISK USING THE 90K-FORMAT. aLL PREVIOUS DATA ON THIS
  369. DISK IS OVERWRITTEN. aS ONLY ONE FILE PER DISK CAN BE WRITTEN, YOU NEED
  370. TO HAVE AS MANY FORMATTED DISKS AVAILABLE AS FILES YOU WANT TO COPY.
  371.  
  372.   tHE PROGRAM READ90K.COM IS USED ON AN ms-dos COMPUTER TO READ FILES
  373. FROM SUCH DISKS AND SAVE THEM AS REGULAR FILES ON ANOTHER DRIVE.
  374.  
  375.   lIKE 1541-READS-DOS, THE PROGRAM 1541-WRITES-90K CAN BE LOADED AND
  376. STARTED LIKE A basic PROGRAM. hOWEVER, YOU SHOULD KNOW THE FILENAME OF
  377. THE PROGRAMS YOU WANT TO WRITE BEFOREHAND AS THERE IS NO OPTION TO
  378. DISPLAY A DIRECTORY WHILE THE PROGRAM IS RUNNING.
  379.  
  380.   tHE PROGRAM ALSO ASKS FOR THE DEVICE NUMBERS OF THE mfm- AND cbm-DISK
  381. DRIVES. hERE, THE cbm-DRIVE CONTAINS THE SOURCE DISK AND THE mfm-DRIVE
  382. CONTAINS THE DESTINATION DISK. yOU CAN WORK WITH A SINGLE DRIVE, BUT
  383. COPYING LARGE FILES WILL BE MUCH SLOWER.
  384.  
  385.   iF YOU DECIDE TO START COPYING YOU HAVE TO ENTER THE NAME OF THE cbm
  386. FILE. tHE PROGRAM WILL THEN SEARCH FOR THE FILE ON THE SOURCE DISK. iF
  387. THE FILE EXISTS, YOU CAN SELECT A CONVERSION NUMBER (ANALOGOUS TO
  388. 1541-READS-DOS) TO SPECIFY CONVERSION FROM cbm OR c-EDITOR CHARACTER SET
  389. TO ms-dos ascii. cbm GRAPHIC CHARACTERS, THE LEFT ARROW AND THE POUND
  390. SYMBOL WILL BE IGNORED.
  391.  
  392.   iN DETAIL, CONVERSION IS DONE ACCORDING TO THE FOLLOWING TABLES:
  393.  
  394.     cbm          ->        ms-dos
  395.     -----------------------------
  396.     0..12                  -
  397.     13                     13, 10
  398.     14..31                 -
  399.     32..64                 32..64
  400.     65..90      (+32)      97..122
  401.     91                     91
  402.     92                     -
  403.     93..94                 93..94
  404.     95..96                 -
  405.     97..122     (-32)      65..90
  406.     123..192               -
  407.     193..218    (-128)     65..90
  408.     219..255               -
  409.  
  410.     c-editor     ->        ms-dos
  411.     -----------------------------
  412.     0..12                  -
  413.     13                     13, 10
  414.     14..31                 -
  415.     32..64                 32..64
  416.     65..90      (+32)      97..122
  417.     91..95                 91..95
  418.     96                     -
  419.     97..122     (-32)      65..90
  420.     123..192               -
  421.     193..218    (-128)     65..90
  422.     219..222    (-96)      123..126
  423.     223..255               -
  424.  
  425.   iN CONTRAST TO 1541-READS-DOS, TEXT CONVERSION DOES NOT LEAD TO PAUSES,
  426. AS IT IS PERFORMED BY THE PROGRAM "READ90K.COM" ON THE ms-dos MACHINE.
  427.  
  428.   aFTER SELECTING THE CONVERSION NUMBER YOU HAVE TO ENTER THE ms-dos
  429. FILENAME. tHE PROGRAM TRIES TO CREATE A REASONABLE FILENAME BY SEARCHING
  430. FOR AN EXTENSION FROM THE RIGHT TO THE LEFT. sUPERFLUOUS DOTS ARE
  431. CONVERTED TO UNDERSCORES, BLANKS ARE OMITTED. tHE FILENAME AND ITS
  432. EXTENSION ARE TRUNCATED TO 8 AND 3 CHARACTERS. hOWEVER, YOU HAVE TO
  433. REMOVE SPECIAL CHARACTERS LIKE ASTERISKS YOURSELF. yOU CAN CHANGE THE
  434. SUGGESTED FILENAME, HOWEVER, LETTERS ARE ALWAYS STORED IN UPPER CASE AND
  435. THE COMPLETE NAME IS TRUNCATED TO A MAXIMUM OF 12 CHARACTERS. iF YOU
  436. ENTER AN INVALID ms-dos FILENAME YOU WILL HAVE TROUBLES COPYING THE FILE
  437. WITH READ90K.COM.
  438.  
  439.   aFTER YOU HAVE ENTERED A NON-BLANK ms-dos FILE NAME THE COPY PROCESS
  440. BEGINS. cOPYING A LONG FILE WITH A SINGLE DRIVE MEANS YOU WILL HAVE
  441. TO SWAP DISKS DURING THE OPERATION.
  442.  
  443.   aT THE END YOU CAN DECIDE TO START COPYING TO ANOTHER ms-dos DISK IN
  444. 90K-FORMAT. oTHERWISE THE PROGRAM WILL BE TERMINATED BY ISSUING A RESET
  445. OF BOTH THE c64 AND THE mfm DISK DRIVE.
  446.  
  447.  
  448.   nOW YOU MUST USE READ90K.COM TO GENERATE REGULAR ms-dos FILES FROM THE
  449. 90K-DISKS. yOU HAVE TO SPECIFY THE DRIVE THAT CONTAINS THE DISK AS A
  450. PARAMETER. e.G.:
  451.  
  452.     read90k a:
  453.  
  454. READS ALL FILES FROM THE DISK IN DRIVE a AND COPIES THEM TO THE CURRENT
  455. DEVICE. iF YOU JUST WANT TO VIEW THE NAMES OF THE FILES ON THE DISK YOU
  456. HAVE TO ADD THE LETTER d AS A SECOND PARAMETER. e.G.:
  457.  
  458.     read90k a: d
  459.  
  460.   eXECUTING READ90K.COM WITHOUT PARAMETERS WILL DISPLAY A SHORT HELP
  461. MESSAGE.
  462.  
  463.   sOURCE CODE FOR READ90K IS AVAILABLE (aPPENDIX b) FOR COMPILING ON
  464. uNIX AND uNIX-LIKE MACHINES WITH A 5 1/4" DRIVE. tHE PROGRAM WILL
  465. COMPILE USING GCC, AND LIKELY YOUR NATIVE CC AS WELL (USE THE COMMAND
  466. "CC -O READ90K READ90K.C").
  467.  
  468.   bEFORE USING THE PROGRAM, YOU MUST FIND THE DEVICE DRIVER WHICH
  469. HANDLES SINGLE-SIDED OR DOUBLE-SIDED 40-TRACK DOUBLE-DENSITY FLOPPY
  470. DISKS. pUT ANY FORMATTED FLOPPY DISK INTO THE DRIVE AND EXECUTE THE
  471. COMMAND "WC -C /DEV/FLOPPYNAME" (WHERE FLOPPYNAME IS THE NAME OF THE
  472. SPECIAL FILE FOR THE FLOPPY DEVICE DRIVER). iF IT COMPLETES WITHOUT
  473. ERRORS AND THE SIZE GIVEN IS 184 320 (180K), YOU CAN USE READ90K WITH
  474. THE COMMAND LINE "READ90K /DEV/FLOPPYNAME". iF THE SIZE IS 368 640, YOU
  475. HAVE A 360 Kb SIZED DISK DRIVER AND MUST USE "READ90K 1 /DEV/FILENAME".
  476. iF YOU DON'T GET EITHER SIZED IMAGE, YOU CANNOT ACCESS THE 90 Kb DISK.
  477.  
  478.   aS AN EXAMPLE, THE lINUX os VER. 0.99 PATCHLEVEL 10 USES THE NAMES
  479. /DEV/FD0 AND /DEV/FD0D360 FOR THE FLOPPY DEVICE DRIVER FOR THE FIRST
  480. FLOPPY DRIVE. tHESE ARE BOTH 360 Kb DRIVERS WHICH REQUIRE USING THE "1"
  481. OPTION ON THE READ90K COMMAND LINE (I.E. TO COPY A 1541-WRITTEN DISK,
  482. USE THE COMMAND LINE "READ90K 1 /DEV/FD0").
  483.  
  484. -----------------------------------------------------------------------
  485.  
  486. 6) error messages
  487.  
  488.   dURING THE EXECUTION OF 1541-READS-DOS AND 1541-WRITES-90K SEVERAL
  489. DISK ERRORS MAY OCCUR. aN ERROR ALWAYS LEADS TO A TERMINATION OF THE
  490. COPY PROCESS.
  491.  
  492.   iF AN ERROR OCCURS DURING A cbm DISK ACCESS, THE DRIVE'S ERROR CHANNEL
  493. MESSAGE IS DISPLAYED.
  494.  
  495.   dURING AN ms-dos DISK ACCESS ONE OF THE FOLLOWING ERROR MESSAGES CAN
  496. APPEAR. (tHE PROBABLE REASON(S) FOR AN ERROR IS DESCRIBED HERE, BELOW
  497. EACH MESSAGE.)
  498.  
  499.  
  500. * cAN'T ACCESS mfm-DISK (DRIVE NOT READY)
  501.  
  502.   tHERE IS EITHER NO DISK IN THE DRIVE, OR THE DRIVE DOOR IS OPEN, OR
  503. THE DISK IS NOT A FORMATTED mfm-DISK.
  504.   tHE MESSAGE MIGHT ALSO APPEAR IF THE 1541 HAS NOT BEEN MODIFIED OR IF
  505. THE MODIFICATION WAS NOT CORRECT.
  506.  
  507. * crc-ERROR IN SECTOR HEADER
  508.  
  509.   tHE DISK IS OF BAD QUALITY OR IS NOT AN mfm-DISK.
  510.  
  511. * SECTOR HEADER NOT FOUND
  512.  
  513.   tHE DISK IS OF BAD QUALITY OR IS NOT AN mfm-DISK. iT COULD ALSO
  514. INDICATE CORRUPT DISK CONTROL INFORMATION.
  515.  
  516. * DATA SECTION NOT FOUND
  517.  
  518.   tHE DISK IS OF BAD QUALITY.
  519.  
  520. * crc-ERROR IN DATA SECTION
  521.  
  522.   tHE DISK IS OF BAD QUALITY. tHERE COULD ALSO BE A PROBLEM WITH THE
  523. DRIVE.
  524.  
  525.   iF THIS ERROR HAPPENS DURING WRITING DATA IT INDICATES A WRITE VERIFY
  526. ERROR.
  527.  
  528. * WRITE PROTECT ON
  529.  
  530.   aN ATTEMPT WAS MADE TO WRITE TO A WRITE PROTECTED DISK.
  531.  
  532. * DISK FULL
  533.  
  534.   aN ATTEMPT WAS MADE TO WRITE MORE THAN 91904 BYTES TO A 90K-DISK.
  535.  
  536. * iLLEGAL mfm-DISK SIDENR. ( <> 0 )
  537.  
  538.   tHE DISK CONTROL INFORMATION IS CORRUPT (OR THE DRIVE IS SPINNING
  539. BACKWARDS...).
  540.  
  541. * uNSUPPORTED mfm-SECTOR SIZE ( <> 512 )
  542.  
  543.   tHE INSERTED DISK IS NOT AN ms-dos DISK (E.G. IT COULD BE A cp/m
  544. DISK).
  545.  
  546. * nOT (YET) SUPPORTED ms-dos FORMAT
  547.  
  548.   tHE DISK HAS BEEN FORMATTED WITH WRONG COMMAND LINE OPTIONS, OR IT IS
  549. NOT AN ms-dos DISK, OR THE DISK CONTROL INFORMATION IS CORRUPT.
  550.  
  551.   tHE POSITIONS WHERE DISK ERRORS HAVE OCCURRED MAY BE INDICATED BY AN
  552. mfm TRACK AND SECTOR NUMBER IN PARENTHESES.
  553.  
  554.   tHE PROGRAMS RETRY READING AND WRITING TO BAD QUALITY DISKS SEVERAL
  555. TIMES BEFORE DISPLAYING AN ERROR MESSAGE.
  556.  
  557.   sOME DRIVES BEHAVE DIFFERENTLY AFTER THEY HAVE BEEN IN USE FOR A LONG
  558. TIME. sO, AFTER AN ERROR, IT MIGHT BE WORTH TRYING AGAIN AFTER THE DRIVE
  559. HAS BEEN SWITCHED OFF FOR QUITE A WHILE.
  560.  
  561.   sOMETIMES IT TAKES A VERY LONG TIME TO DETECT AN ERROR. iN THAT CASE,
  562. YOU COULD OPEN THE DRIVE DOOR TO INTERRUPT THE READING PROCESS.
  563. nORMALLY THE READ/WRITE HEAD WILL NOT BUMP AGAINST ITS BOUNDARIES IF
  564. THIS IS DONE DURING AN ms-dos DISK ACCESS.
  565.  
  566. -----------------------------------------------------------------------
  567.  
  568. 7) compatibility
  569.  
  570.   tHE c64 PROGRAMS HAVE BEEN TESTED IN THE FOLLOWING CONFIGURATIONS:
  571.  
  572.     - A SINGLE MODIFIED 1541 DRIVE
  573.     - A SINGLE MODIFIED oc-118n DRIVE
  574.     - A MODIFIED 1541 AND A STOCK oc-118n
  575.     - A MODIFIED oc-118n AND A STOCK 1541
  576.     - A MODIFIED 1541 AND ramdos EMULATING A SECOND DISK DRIVE
  577.  
  578.   tHEY SHOULD ALSO WORK WITH ANY OTHER cOMMODORE COMPATIBLE DISK DRIVE
  579. USED AS THE SECOND DRIVE (THE ONE HOLDING THE cbm FORMAT DISK).
  580.  
  581.   tHE MEMORY BETWEEN $c000 AND $cfff HAS INTENTIONALLY BEEN LEFT
  582. BLANK. tHIS IS THE PLACE TO PUT UTILITY PROGRAMS LIKE THE ramdos
  583. INTERFACE PAGE.
  584.  
  585.   dISK SPEEDUP UTILITIES SHOULD WORK WELL WITH READING AND WRITING TO
  586. cbm FORMAT DISKS. iF THEY SPEED UP SEQUENTIAL FILE ACCESS, COPYING
  587. WILL BE MUCH FASTER.
  588.  
  589.   wHILE READING AND WRITING TO ms-dos DISKS ALMOST ANY AVAILABLE ram
  590. IN THE 1541 IS USED. tHEREFORE YOU MIGHT HAVE TROUBLES WITH UTILITIES
  591. THAT RELY UPON THAT ram.
  592.  
  593.   tHE PROGRAMS WILL RESET THE DISK DRIVE AFTER EACH COPY PASS IF A
  594. SINGLE DISK DRIVE IS USED. tHIS WILL RESET DEVICE NUMBERS CHANGED BY
  595. SOFTWARE TO THEIR ORIGINAL VALUES.
  596.  
  597. -----------------------------------------------------------------------
  598.  
  599. 8) possible improvements
  600.  
  601.   tHE PROGRAMS 1541-READS-DOS AND 1541-WRITES-90K ARE BOTH DIVIDED INTO
  602. MACHINE LANGUAGE CODE EXECUTED IN THE MODIFIED 1541 DISK DRIVE AND A
  603. COMPILED c-PROGRAM EXECUTED IN THE c64.
  604.  
  605.   tHERE ARE SOME RESTRICTIONS DUE TO THE USE OF c AS THE PROGRAMMING
  606. LANGUAGE. iF THE c64 PROGRAMS WOULD BE REWRITTEN IN ASSEMBLER MANY
  607. IMPROVEMENTS COULD BE ACHIEVED.
  608.  
  609. * sMALLER PROGRAM SIZE
  610.  
  611.   tHE READ AND WRITE PROGRAMS COULD BE COMBINED INTO ONE AND A BIGGER
  612. COPY BUFFER COULD BE USED (CURRENT SIZE IS 12kb).
  613.  
  614. * hIGHER SPEED
  615.  
  616.   tHE ROUTINES FOR TEXT CONVERSION ESPECIALLY COULD BE MUCH FASTER.
  617.  
  618.   wITH FAST TRANSFER ROUTINES, ms-dos READING AND WRITING SPEED COULD
  619. BE DOUBLED.
  620.   aS AN OPTION, cbm DISK READING AND WRITING COULD ALSO BE MADE 5 TIMES
  621. FASTER QUITE EASILY.
  622.  
  623. * bETTER USER INTERFACE
  624.  
  625.   a LESS MODAL USER INTERFACE, EITHER COMMAND LINE OR MENU ORIENTED,
  626. COULD BE IMPLEMENTED.
  627.  
  628. * mORE FLEXIBILITY
  629.  
  630.   1541-READS-DOS COULD HANDLE QUITE EASILY ALSO 160kb DISKS.
  631.   sUBDIRECTORIES COULD BE SUPPORTED.
  632.  
  633. * iMPROVEMENT OF LOW LEVEL ROUTINES
  634.  
  635.   cURRENTLY, IT IS NOT POSSIBLE TO WRITE COMPLETE SECTORS DUE TO TOO
  636. LITTLE MEMORY IN THE 1541. tHAT IS WHY THE 90K-FORMAT IS USED. bY
  637. LETTING THE c64 DO SOME OF THE WORK CURRENTLY DONE BY THE 1541 IT COULD
  638. BE POSSIBLE TO WRITE COMPLETE SECTORS.
  639.  
  640.   tHE REGULAR ms-dos FORMAT COULD THEN BE USED FOR WRITING, TOO. cOMMANDS
  641. TO DELETE AND RENAME FILES COULD BE ALSO IMPLEMENTED THEN.
  642.  
  643.   iT WOULD BE POSSIBLE TO SUPPORT DOUBLE SIDED DISKS BY FLIPPING DISKS
  644. OVER. a HARDWARE OR SOFTWARE SWITCH INSTALLED IN THE 1541 TO CHANGE THE
  645. SPINNING DIRECTION WOULD PROBABLY BE NECESSARY.
  646.  
  647. -----------------------------------------------------------------------
  648.  
  649. 9) disclaimer
  650.  
  651.   aLTHOUGH THE DRIVE MODIFICATION AND PROGRAMS HAVE BEEN TESTED ON SEVERAL
  652. DISK DRIVES AND COMPUTERS, THE AUTHORS CANNOT GUARANTEE THAT ANYONE ELSE
  653. CAN PERFORM THIS UPGRADE WITHOUT DAMAGING HIS COMPUTER. wE THEREFORE
  654. DISCLAIM ANY RESPONSIBILITY FOR ANY DAMAGE THAT MAY OCCUR AS RESULT OF
  655. ATTEMPTING THIS UPGRADE OR USING THE ACCOMPANYING PROGRAMS. kEEP IN MIND
  656. THAT THE MODIFICATION WILL ALSO VOID ANY WARRANTY ON YOUR DISK DRIVE.
  657.  
  658.  
  659. -----------------------------------------------------------------------
  660.  
  661. 10) contacting the authors
  662.  
  663.   iF YOU HAVE COMMENTS OR BUG REPORTS OR IF YOU ARE INTERESTED IN
  664. IMPROVING THE PROGRAMS FEEL FREE TO SEND EMAIL TO THE PROGRAMMER OF THE
  665. c64 PROGRAMS,
  666.  
  667. rICHARD hABLE
  668. rICHARD.hABLE@JK.UNI-LINZ.AC.AT
  669.  
  670. TO THE ORIGINAL DEVELOPER OF THE DRIVE MODIFICATION AND mfm READING
  671. ROUTINE,
  672.  
  673. dANIEL fANDRICH
  674. DAN@FCH.WIMSEY.BC.CA
  675. OR cOMPUsERVE 72365,306
  676.  
  677. OR TO THE AUTHOR OF THE rEAD90K PROGRAMS,
  678.  
  679. mARKO mAKELA
  680. mARKO.mAKELA@hELSINKI.FI
  681.  
  682.  
  683. -------------------------------------------------------------------------
  684.  
  685. appendix a: listing of basic program 1541-dos.boot
  686.  
  687.   tHIS basic PROGRAM ALLOWS YOU TO READ 1541-DOS.SFX FOR THE FIRST
  688. TIME. iT HAS BEEN KEPT AS SMALL AS POSSIBLE, THEREFORE, THERE IS LITTLE
  689. ERROR CHECKING. pLEASE READ THE FOLLOWING INSTRUCTIONS TO AVOID
  690. INCORRECT RESULTS.
  691.  
  692.   fORMAT AN ms-dos DISK FOR DATA TRANSFER, AS DESCRIBED IN 3).
  693.   cOPY THE FILE 1541-DOS.SFX TO THE FRESHLY FORMATTED ms-dos DISK. 
  694.    
  695.   tYPE IN THE basic PROGRAM 1541-DOS.BOOT, SAVE IT AND RUN IT ON A c64.
  696.   fIRST, YOU HAVE TO ENTER THE DEVICE NUMBER OF THE MODIFIED 1541. tHIS
  697. DRIVE WILL BE USED FOR BOTH READING AND WRITING.
  698.   tHEN, YOU HAVE TO INSERT A CORRECTLY FORMATTED cbm DISK. nO DATA ON
  699. THIS DISK WILL BE CHANGED. iT IS ONLY NECESSARY TO LET THE DRIVE FIND
  700. CORRECT TRACK POSITIONS.
  701.   tHEN, YOU HAVE TO INSERT THE ms-dos DISK. tHE PROGRAM 1541-DOS.SFX
  702. WILL BE READ INTO MEMORY. tHIS WILL TAKE QUITE A WHILE.
  703.   iF NO ERRORS OCCUR, YOU CAN INSERT A cbm DISK, TO WHICH THE
  704. PROGRAM 1541-DOS.SFX WILL BE WRITTEN TO.
  705.  
  706.  
  707. 0 REM 1541-DOS.BOOT  VER. 16.11.1993
  708. 1 REM READ 1541-DOS.INSTR !
  709. 2 :
  710. 10 POKE55,0:POKE56,48:CLR
  711. 100 INPUT"DEVICE NUMBER";V
  712. 150 INPUT"INSERT CORRECT CBM DISK <RETURN>";X$
  713. 160 OPEN1,V,15,"I":INPUT#1,A,B$,C,D:CLOSE1:IFA>=20THENSTOP
  714. 200 INPUT"INSERT MS-DOS SOURCE DISK <RETURN>";X$
  715. 210 OPEN1,V,15:GOSUB2000:CLOSE1
  716. 300 OPEN1,V,15:PRINT"READING"
  717. 310 T=1:S=1:M=12288:B=56
  718. 320 FORD=1TOB:GOSUB1000:M=M+512:S=S+1:IFS>9THENS=1:T=T+1
  719. 330 PRINT"#";:NEXTD:PRINT:PRINT#1,"UI";
  720. 400 INPUT"INSERT CBM DESTINATION DISK <RETURN>";X$
  721. 410 OPEN2,V,1,"1541-DOS.SFX":INPUT#1,A,B$,C,D:IFA>=20THENSTOP
  722. 420 FORI=0TOB*512-1:PRINT#2,CHR$(PEEK(12288+I));:NEXT:CLOSE2
  723. 430 CLOSE1:POKE56,160:CLR:END
  724. 999 :
  725. 1000 REM READ SECTOR T/S INTO M
  726. 1010 FORC=1TO15:FORP=0TO1
  727. 1020 PRINT#1,"M-W"CHR$(6)CHR$(4)CHR$(4)CHR$(P)CHR$(T)CHR$(0)CHR$(S);
  728. 1030 PRINT#1,"M-E"CHR$(3)CHR$(4);:PRINT#1,"M-R"CHR$(13)CHR$(4)CHR$(1);:GET#1,E$
  729. 1040 IFE$<>""THENIFP=0OR(E$<>CHR$(2))AND(E$<>CHR$(4))THENPRINT"READ ERROR":STOP
  730. 1050 IFE$<>""THENNEXTC:PRINT"READ ERROR":STOP
  731. 1060 FORI=0TO255STEP32:PRINT#1,"M-R"CHR$(I)CHR$(3)CHR$(32);
  732. 1070 FORJ=0TO31:GET#1,C$:POKEM+256*P+I+J,ASC(C$+CHR$(0)):NEXT:NEXT
  733. 1080 NEXTP:RETURN
  734. 2000 REM TRANSFER M.CODE
  735. 2010 FORI=0TO1023:READA:PRINT#1,"M-W"CHR$(IAND255)CHR$(4+I/256)CHR$(1)CHR$(A);
  736. 2020 H=H+A*(I+1):NEXT:IFH<>52477511THENSTOP
  737. 2030 RETURN
  738. 9999 :
  739. 10000 DATA76,75,4,76,14,4,0,18,0
  740. 10010 DATA1,2,0,0,0,32,0,193,173
  741. 10020 DATA1,24,72,41,252,9,2,141
  742. 10030 DATA1,24,173,12,24,72,41,241
  743. 10040 DATA9,12,141,12,24,169,76,141
  744. 10050 DATA0,4,169,75,141,1,4,174
  745. 10060 DATA7,4,232,134,8,169,224,133
  746. 10070 DATA1,165,1,48,252,141,13,4
  747. 10080 DATA104,141,12,24,104,141,1
  748. 10090 DATA24,96,160,33,185,42,2,153
  749. 10100 DATA213,2,136,16,247,173,0
  750. 10110 DATA28,41,159,141,0,28,162
  751. 10120 DATA6,189,248,7,157,209,1,202
  752. 10130 DATA208,247,160,146,165,16
  753. 10140 DATA72,165,17,72,169,117,133
  754. 10150 DATA16,169,55,133,17,134,23
  755. 10160 DATA189,7,4,32,187,7,32,218
  756. 10170 DATA7,153,70,1,200,165,84,153
  757. 10180 DATA70,1,200,232,224,4,144
  758. 10190 DATA232,169,0,32,187,7,32,187
  759. 10200 DATA7,165,17,32,218,7,153,70
  760. 10210 DATA1,200,165,84,153,70,1,165
  761. 10220 DATA16,200,192,158,144,237
  762. 10230 DATA104,133,17,104,133,16,169
  763. 10240 DATA78,32,218,7,153,70,1,165
  764. 10250 DATA84,153,71,1,160,0,152,141
  765. 10260 DATA127,7,162,141,189,69,1
  766. 10270 DATA192,80,144,3,169,137,202
  767. 10280 DATA133,22,189,70,1,72,32,125
  768. 10290 DATA7,153,70,1,104,232,200
  769. 10300 DATA224,159,144,237,208,4,192
  770. 10310 DATA80,144,231,173,127,7,24
  771. 10320 DATA105,3,141,127,7,169,255
  772. 10330 DATA153,70,1,200,192,140,144
  773. 10340 DATA200,141,229,1,169,13,141
  774. 10350 DATA34,6,169,0,141,47,6,32
  775. 10360 DATA76,5,169,67,141,34,6,169
  776. 10370 DATA54,141,47,6,169,208,160
  777. 10380 DATA200,174,6,4,208,12,169
  778. 10390 DATA112,133,16,169,55,133,17
  779. 10400 DATA169,153,160,0,141,130,6
  780. 10410 DATA140,131,6,162,144,169,255
  781. 10420 DATA157,70,1,138,56,233,20
  782. 10430 DATA170,176,244,162,202,154
  783. 10440 DATA169,203,141,5,24,169,180
  784. 10450 DATA133,82,160,0,169,48,133
  785. 10460 DATA24,184,80,254,44,1,28,184
  786. 10470 DATA80,254,173,1,28,184,162
  787. 10480 DATA80,201,85,240,36,80,254
  788. 10490 DATA173,1,28,184,162,100,201
  789. 10500 DATA170,240,89,136,208,222
  790. 10510 DATA198,24,208,218,162,1,76
  791. 10520 DATA68,7,80,254,44,1,28,184
  792. 10530 DATA56,76,25,6,169,85,80,254
  793. 10540 DATA237,1,28,240,247,201,13
  794. 10550 DATA240,233,144,13,80,254,44
  795. 10560 DATA1,28,162,120,233,51,240
  796. 10570 DATA116,208,175,80,254,44,1
  797. 10580 DATA28,184,162,40,201,3,240
  798. 10590 DATA14,80,254,44,1,28,184,162
  799. 10600 DATA0,201,1,240,90,208,149
  800. 10610 DATA80,254,173,1,28,233,74
  801. 10620 DATA240,79,208,138,169,170
  802. 10630 DATA80,254,237,1,28,240,247
  803. 10640 DATA201,25,240,168,144,13,80
  804. 10650 DATA254,44,1,28,162,140,233
  805. 10660 DATA102,240,51,208,215,80,254
  806. 10670 DATA44,1,28,184,162,60,201
  807. 10680 DATA6,240,15,80,254,44,1,28
  808. 10690 DATA184,162,20,201,1,240,25
  809. 10700 DATA76,86,5,80,254,173,1,28
  810. 10710 DATA233,148,240,13,208,242
  811. 10720 DATA152,56,233,3,168,176,235
  812. 10730 DATA76,120,5,232,80,254,173
  813. 10740 DATA1,28,253,70,1,208,13,232
  814. 10750 DATA80,254,173,1,28,253,70
  815. 10760 DATA1,240,234,208,0,56,138
  816. 10770 DATA170,233,20,176,251,224
  817. 10780 DATA6,144,211,224,19,240,12
  818. 10790 DATA198,82,240,3,76,80,5,162
  819. 10800 DATA3,76,68,7,96,140,131,6
  820. 10810 DATA80,254,44,1,28,184,169
  821. 10820 DATA153,136,240,34,80,254,44
  822. 10830 DATA1,28,184,141,130,6,76,79
  823. 10840 DATA6,80,254,173,1,28,184,133
  824. 10850 DATA83,188,70,1,80,254,173
  825. 10860 DATA1,28,184,133,84,200,208
  826. 10870 DATA153,80,254,173,1,28,184
  827. 10880 DATA153,0,3,80,254,173,1,28
  828. 10890 DATA184,153,129,3,200,80,254
  829. 10900 DATA173,1,28,184,153,202,1
  830. 10910 DATA192,129,80,254,173,1,28
  831. 10920 DATA184,72,144,217,44,5,24
  832. 10930 DATA48,5,162,4,76,68,7,138
  833. 10940 DATA162,255,56,233,20,232,176
  834. 10950 DATA251,138,73,7,133,26,10
  835. 10960 DATA101,26,141,127,7,169,0
  836. 10970 DATA133,23,141,107,7,160,129
  837. 10980 DATA224,4,104,176,3,173,75
  838. 10990 DATA2,133,22,176,6,144,10,104
  839. 11000 DATA32,83,7,185,202,1,32,83
  840. 11010 DATA7,136,185,129,3,32,83,7
  841. 11020 DATA185,0,3,32,83,7,152,208
  842. 11030 DATA230,165,84,32,83,7,165
  843. 11040 DATA83,32,83,7,174,6,4,240
  844. 11050 DATA7,169,0,141,203,1,162,0
  845. 11060 DATA160,0,185,203,1,157,0,3
  846. 11070 DATA32,187,7,185,129,3,157
  847. 11080 DATA1,3,32,187,7,200,232,232
  848. 11090 DATA208,233,174,6,4,208,9,173
  849. 11100 DATA75,2,141,2,7,76,68,7,173
  850. 11110 DATA75,2,32,187,7,173,1,4,32
  851. 11120 DATA187,7,165,16,5,17,170,240
  852. 11130 DATA2,162,5,160,33,185,213
  853. 11140 DATA2,153,42,2,136,16,247,138
  854. 11150 DATA76,105,249,166,22,72,133
  855. 11160 DATA22,138,32,125,7,166,23
  856. 11170 DATA133,23,240,23,138,32,150
  857. 11180 DATA7,162,0,134,23,240,0,153
  858. 11190 DATA129,3,162,7,208,3,153,203
  859. 11200 DATA1,142,107,7,104,133,22
  860. 11210 DATA96,24,144,254,70,22,106
  861. 11220 DATA70,22,106,70,22,106,70
  862. 11230 DATA22,106,70,22,106,70,22
  863. 11240 DATA106,70,22,106,96,41,170
  864. 11250 DATA105,42,41,212,105,20,41
  865. 11260 DATA232,105,8,74,74,74,74,133
  866. 11270 DATA26,165,23,41,170,105,42
  867. 11280 DATA41,212,105,20,41,232,105
  868. 11290 DATA8,41,240,5,26,96,72,133
  869. 11300 DATA26,56,38,26,240,21,38,16
  870. 11310 DATA38,17,144,246,165,16,73
  871. 11320 DATA33,133,16,165,17,73,16
  872. 11330 DATA133,17,24,144,231,104,96
  873. 11340 DATA56,42,8,176,6,36,23,48
  874. 11350 DATA2,56,36,24,38,84,38,83
  875. 11360 DATA40,8,102,23,40,38,84,38
  876. 11370 DATA83,10,208,230,165,83,96
  877. 11380 DATA68,137,68,137,85,84,144
  878.  
  879. -------------------------------------------------------------------------
  880.  
  881. appendix b: c-version of read90k for unix
  882.  
  883.   iF YOU DON'T HAVE ms-dos INSTALLED ON YOUR pc, IT MIGHT BE POSSIBLE TO
  884. USE THE FOLLOWING c-PROGRAM TO READ FILES FROM DISKS IN 90K-FORMAT.
  885.  
  886.  
  887. #INCLUDE <STDIO.H>
  888. #INCLUDE <STRING.H>
  889.  
  890. /************************************************************
  891. * rEAD90K V0.1
  892. *
  893. * mARKO mDKELD
  894. * mAIL:     sILLITIE 10 a
  895. *           01480 vANTAA
  896. *           fINLAND
  897. * e-mAIL:   mARKO.mAKELA@hELSINKI.fi
  898. *
  899. * vERSION HISTORY:
  900. *
  901. * vERSION   dATE                dESCRIPTION
  902. * V0.1      jUNE  23RD, 1993    tHE FIRST VERSION FOR uNIX.
  903. ************************************************************/
  904.  
  905. /*******************
  906. * tRANSLATION TABLE
  907. *******************/
  908.  
  909. UNSIGNED CHAR tRANSLAtABLE[] =
  910. {$7b}
  911.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 00 */
  912.     0X00, 0X00, 0X00, 0X00, 0X00, 0X0a, 0X00, 0X00,
  913.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 10 */
  914.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  915.     0X20, 0X21, 0X22, 0X23, 0X24, 0X25, 0X26, 0X27, /* 20 */
  916.     0X28, 0X29, 0X2a, 0X2b, 0X2c, 0X2d, 0X2e, 0X2f,
  917.     0X30, 0X31, 0X32, 0X33, 0X34, 0X35, 0X36, 0X37, /* 30 */
  918.     0X38, 0X39, 0X3a, 0X3b, 0X3c, 0X3d, 0X3e, 0X3f,
  919.     0X40, 0X61, 0X62, 0X63, 0X64, 0X65, 0X66, 0X67, /* 40 */
  920.     0X68, 0X69, 0X6a, 0X6b, 0X6c, 0X6d, 0X6e, 0X6f,
  921.     0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, /* 50 */
  922.     0X78, 0X79, 0X7a, 0X5b, 0X00, 0X5d, 0X5e, 0X00,
  923.     0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* 60 */
  924.     0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
  925.     0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* 70 */
  926.     0X58, 0X59, 0X5a, 0X00, 0X00, 0X00, 0X00, 0X00,
  927.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 80 */
  928.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  929.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 90 */
  930.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  931.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* a0 */
  932.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  933.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* b0 */
  934.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  935.     0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* c0 */
  936.     0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
  937.     0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* d0 */
  938.     0X58, 0X59, 0X5a, 0X00, 0X00, 0X00, 0X00, 0X00,
  939.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* e0 */
  940.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  941.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* f0 */
  942.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  943.  
  944.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 00 */
  945.     0X00, 0X00, 0X00, 0X00, 0X00, 0X0a, 0X00, 0X00,
  946.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 10 */
  947.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  948.     0X20, 0X21, 0X22, 0X23, 0X24, 0X25, 0X26, 0X27, /* 20 */
  949.     0X28, 0X29, 0X2a, 0X2b, 0X2c, 0X2d, 0X2e, 0X2f,
  950.     0X30, 0X31, 0X32, 0X33, 0X34, 0X35, 0X36, 0X37, /* 30 */
  951.     0X38, 0X39, 0X3a, 0X3b, 0X3c, 0X3d, 0X3e, 0X3f,
  952.     0X40, 0X61, 0X62, 0X63, 0X64, 0X65, 0X66, 0X67, /* 40 */
  953.     0X68, 0X69, 0X6a, 0X6b, 0X6c, 0X6d, 0X6e, 0X6f,
  954.     0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, /* 50 */
  955.     0X78, 0X79, 0X7a, 0X5b, 0X5c, 0X5d, 0X5e, 0X5f,
  956.     0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* 60 */
  957.     0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
  958.     0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* 70 */
  959.     0X58, 0X59, 0X5a, 0X00, 0X00, 0X00, 0X00, 0X00,
  960.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 80 */
  961.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  962.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 90 */
  963.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  964.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* a0 */
  965.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  966.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* b0 */
  967.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  968.     0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* c0 */
  969.     0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
  970.     0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* d0 */
  971.     0X58, 0X59, 0X5a, 0X7b, 0X7c, 0X7d, 0X7e, 0X00,
  972.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* e0 */
  973.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
  974.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* f0 */
  975.     0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
  976. {$7d};
  977.  
  978. /*********************
  979. * fUNCTION PROTOTYPES
  980. *********************/
  981.  
  982. #IFNDEF __stdc__
  983. INT MAIN();             /* MAIN FUNCTION */
  984. #ELSE
  985. INT MAIN(INT ARGC, CHAR **ARGV);
  986. #ENDIF
  987.  
  988. /***********
  989. * fUNCTIONS
  990. ***********/
  991.  
  992. #IFDEF __stdc__
  993. INT MAIN(INT ARGC, CHAR **ARGV)
  994. #ELSE
  995. INT
  996. MAIN(ARGC,ARGV)
  997.     INT ARGC;
  998.     CHAR **ARGV;
  999. #ENDIF
  1000. {$7b}
  1001.     file *DISK, *OUTFILE;
  1002.     UNSIGNED CHAR DIRBUF[256], DISKBUF[512], BYTE;
  1003.     UNSIGNED UfILEcOUNTER, UcOUNTER, UsECTORcOUNTER, MODE = 1,
  1004.              UtRANS1, UtRANS2;
  1005.     UNSIGNED LONG LUfILElENGTH, LUfINALlENGTH;
  1006.  
  1007.     FPRINTF(STDERR, "90 Kb DISK READER FOR uNIX V0.1\N");
  1008.  
  1009.     IF (ARGC < 2 {$7c}{$7c} ARGC > 3)
  1010.     {$7b}
  1011. uSAGE:  FPRINTF (STDERR, "uSAGE: %S [D{$7c}1] DISK\N", *ARGV);
  1012.         FPRINTF (STDERR, "oPTIONS: D TO DISPLAY THE DIRECTORY ONLY.\N");
  1013.         FPRINTF (STDERR, "         1 TO EXTRACT SKIPPING THE SECOND SIDE.\N");
  1014.         FPRINTF (STDERR, "DISK IS /DEV/FD0, FOR INSTANCE.\N");
  1015.         RETURN (1);
  1016.     {$7d}
  1017.  
  1018.     IF (ARGC == 3 && ARGV[1][1])
  1019.         GOTO uSAGE;
  1020.  
  1021.     IF (ARGC == 3)
  1022.     {$7b}
  1023.         ARGV++;
  1024.  
  1025.         IF (**ARGV == 'D')
  1026.             MODE = 0;
  1027.         ELSE IF (**ARGV == '1')
  1028.             MODE = 2;
  1029.         ELSE
  1030.             GOTO uSAGE;
  1031.     {$7d}
  1032.  
  1033.     IF ((DISK = FOPEN(*++ARGV, "RB")) == null)
  1034.     {$7b}
  1035.         FPRINTF(STDERR, "oPENING THE DISK %S FAILED.\N", *ARGV);
  1036.         RETURN(2);
  1037.     {$7d}
  1038.  
  1039.     /* READ DIRECTORY */
  1040.  
  1041.     IF (512 > FREAD (DISKBUF, SIZEOF *DISKBUF, 512, DISK))
  1042.     {$7b}
  1043.         FPRINTF (STDERR, "eRROR READING DISK DIRECTORY.\N");
  1044.         FCLOSE (DISK);
  1045.         RETURN (3);
  1046.     {$7d}
  1047.  
  1048.     UsECTORcOUNTER = 1;
  1049.  
  1050.     MEMCPY (DIRBUF, DISKBUF, 256);
  1051.  
  1052.     /* START PROCESSING THE DIRECTORY */
  1053.  
  1054.     FOR (UfILEcOUNTER = 0; UfILEcOUNTER < 256 && DIRBUF[UfILEcOUNTER];
  1055.             UfILEcOUNTER += 16)
  1056.     {$7b}
  1057.         LUfILElENGTH = 1 + (UNSIGNED LONG)DIRBUF[UfILEcOUNTER + 13] +
  1058.                 ((UNSIGNED LONG)DIRBUF[UfILEcOUNTER + 14] << 8) +
  1059.                 (((UNSIGNED LONG)DIRBUF[UfILEcOUNTER + 15] & 1) << 16);
  1060.  
  1061.         IF (MODE)
  1062.             FPRINTF (STDOUT, "cREATING {$60}%S', %LU BYTES -- ",
  1063.                     &DIRBUF[UfILEcOUNTER], LUfILElENGTH);
  1064.         ELSE
  1065.             FPRINTF (STDOUT, "{$60}%S', %LU BYTES\N", &DIRBUF[UfILEcOUNTER],
  1066.                     LUfILElENGTH);
  1067.  
  1068.         IF (MODE)
  1069.         {$7b}
  1070.             IF (!(OUTFILE = FOPEN (&DIRBUF[UfILEcOUNTER], "WB")))
  1071.             {$7b}
  1072. OUTfAIL:        FPRINTF (STDERR, "fAILED IN CREATING THE FILE.\N");
  1073.                 FCLOSE (DISK);
  1074.                 RETURN (4);
  1075.             {$7d}
  1076.  
  1077.             LUfINALlENGTH = 0;
  1078.  
  1079.             WHILE (LUfILElENGTH)
  1080.             {$7b}
  1081.                 IF (512 > FREAD (DISKBUF, SIZEOF *DISKBUF, 512, DISK))
  1082.                 {$7b}
  1083.                     FPRINTF (STDERR, "eRROR READING THE DISK.\N");
  1084.                     FCLOSE (DISK);
  1085.                     FCLOSE (OUTFILE);
  1086.                     RETURN (3);
  1087.                 {$7d}
  1088.  
  1089.                 LUfILElENGTH -= (UcOUNTER = LUfILElENGTH > 256 ?
  1090.                         256 : LUfILElENGTH);
  1091.  
  1092.                 IF (DIRBUF[UfILEcOUNTER + 15] & 192) /* TRANSLATION */
  1093.                 {$7b}
  1094.                     MEMCPY (DISKBUF + 256, DISKBUF, 256);
  1095.  
  1096.                     FOR (UtRANS1 = UtRANS2 = 0; UtRANS1 < UcOUNTER; UtRANS1++)
  1097.                         IF (BYTE = tRANSLAtABLE[((DIRBUF[UfILEcOUNTER + 15] &
  1098.                                 128) << 1) + DISKBUF[256 + UtRANS1]])
  1099.                             DISKBUF[UtRANS2++] = BYTE;
  1100.  
  1101.                     UcOUNTER = UtRANS2;
  1102.                 {$7d}
  1103.  
  1104.                 IF (UcOUNTER > FWRITE (DISKBUF, SIZEOF *DISKBUF,
  1105.                         UcOUNTER, OUTFILE))
  1106.                 {$7b}
  1107.                     FCLOSE (OUTFILE);
  1108.                     GOTO OUTfAIL;
  1109.                 {$7d}
  1110.  
  1111.                 LUfINALlENGTH += UcOUNTER;
  1112.  
  1113.                 IF (++UsECTORcOUNTER == 9)
  1114.                 {$7b}
  1115.                     IF (MODE == 2)      /* OPTIONALLY SKIP THE SECOND SIDE */
  1116.                         FOR (UsECTORcOUNTER++; --UsECTORcOUNTER;
  1117.                                 FREAD (DISKBUF, SIZEOF *DISKBUF, 512, DISK));
  1118.  
  1119.                     UsECTORcOUNTER = 0;
  1120.                 {$7d}
  1121.             {$7d}
  1122.  
  1123.             FCLOSE (OUTFILE);
  1124.             FPRINTF (STDOUT, "%LU BYTES CONVERTED.\N", LUfINALlENGTH);
  1125.         {$7d}
  1126.     {$7d}
  1127.  
  1128.     FCLOSE (DISK);
  1129.     RETURN (0);
  1130. {$7d}
  1131.