home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cbm
/
crossplatform
/
transfer
/
1541-dos
/
1541-dos.txt
< prev
next >
Wrap
Text File
|
1994-01-18
|
44KB
|
1,131 lines
======================================================================
iNSTRUCTIONS FOR THE 1541-DOS PACKAGE
(jANUARY 4, 1994 VERSION)
======================================================================
tHESE ARE THE INSTRUCTIONS ON HOW TO READ AND WRITE TO ms-dos FLOPPY
DISKS WITH A SLIGHTLY MODIFIED cOMMODORE 1541 OR oCEANIC oc-118/oc-118n
DISK DRIVE.
iNCLUDED IS INFORMATION ABOUT THE NECESSARY MODIFICATION OF THE 1541
DRIVE AND THE USAGE OF THE PROGRAMS IN THIS PACKAGE.
contents
--------
1) hARDWARE REQUIREMENTS
2) mfm MODIFICATION
2a) 1541 DISK DRIVE MODIFICATION
2b) 1541 DISK DRIVE MODIFICATION -- FIRST ALTERNATE
2c) 1541 DISK DRIVE MODIFICATION -- SECOND ALTERNATE
2d) oCEANIC oc-118/oc-118n DISK DRIVE MODIFICATION
3) pREPARING DISKS FOR DATA TRANSFER
4) tRANSFERRING FILES FROM ms-dos DISKS TO cbm DISKS
WITH "1541-READS-DOS"
5) tRANSFERRING FILES FROM cbm DISKS TO ms-dos DISKS
WITH "1541-WRITES-90K" AND "READ90K"
6) eRROR MESSAGES
7) cOMPATIBILITY
8) pOSSIBLE IMPROVEMENTS
9) dISCLAIMER
10) cONTACTING THE AUTHORS
appendix a: lISTING OF basic PROGRAM 1541-DOS.BOOT
appendix b: c-VERSION OF rEAD90K FOR uNIX
-----------------------------------------------------------------------
1) hardware requirements
yOU REQUIRE A c64 OR c128 (IN c64 MODE) WITH AT LEAST ONE 1541 OR
oc-118/oc-118n FLOPPY DISK DRIVE. tHE DRIVE MUST BE MODIFIED SLIGHTLY TO
ALLOW IT TO UTILIZE THE mfm METHOD OF STORING DATA USED ON ms-dos
COMPATIBLE DISKS. tHIS MODIFICATION DOES NOT AFFECT THE NORMAL OPERATION
OF THE DRIVE. iF YOU DON'T HAVE EXPERIENCE IN SOLDERING CIRCUIT BOARDS
THEN FIND SOMEONE WHO DOES; THE MODIFICATION IS SMALL, BUT TRICKY, AND
WILL VOID THE WARRANTY ON YOUR DISK DRIVE.
tHE 1541 CAN THEN READ SINGLE SIDED, DOUBLE DENSITY DISKS WRITTEN BY
ms-dos COMPUTERS WITH 5 1/4" INCH DISK DRIVES.
yOU NEED AN ms-dos COMPUTER WITH AT LEAST ONE 5 1/4" FLOPPY DRIVE AND
ONE OTHER WRITABLE DISK DEVICE (A FLOPPY, HARD OR ram DISK DRIVE) TO READ
FILES WRITTEN BY THE 1541.
-----------------------------------------------------------------------
2) mfm modification
warning: THE DISK DRIVE MOTHERBOARD CAN BE EASILY DAMAGED BY STATIC
ELECTRICITY. dON'T WORK ON THIS PROJECT WEARING SYNTHETIC CLOTHES AND
RUBBER SHOES ON A NYLON CARPET AND EXPECT YOUR DRIVE TO COME THROUGH
UNSCATHED! uSE OF A GROUNDED SOLDERING IRON IS RECOMMENDED, AS IS
MINIMIZING CONTACT WITH THE BOARD.
aS LONG AS YOU TAKE REASONABLE PRECAUTIONS, NO DAMAGE SHOULD OCCUR TO
YOUR DISK DRIVE BY FOLLOWING THESE INSTRUCTIONS. hOWEVER, DIFFERENCES
BETWEEN BOARD REVISIONS MAKE IT IMPOSSIBLE TO GUARANTEE THAT THE
MODIFICATIONS DESCRIBED HERE WILL WORK ON YOUR DISK DRIVE. cAVEAT
EMPTOR!
tHE CLOCK DIVISOR IS A 74ls193 HEXADECIMAL COUNTER IN THE 1541, AND
THE SIMILAR 74ls161 IN THE oCEANIC DRIVES. tHE cpu LOADS THE NUMBER TO
START COUNTING AT ON ITS INPUTS AND THE OVERFLOW FROM THE COUNTER IS
CHAINED TO THE NEXT PORTION OF THE CIRCUIT. oF THE 4 COUNTER INPUTS, THE
LOWER TWO ARE CONTROLLED BY THE cpu AND THE HIGHER 2 ARE TIED TO GROUND.
tHIS MEANS VALUES OF 0 THROUGH 3 ON THE COUNTER INPUTS REQUIRE 16 TO 13
COUNTS (RESPECTIVELY) BEFORE OVERFLOW, THUS DIVIDING THE INPUT BY THAT
AMOUNT. tHE RANGE OF CLOCK RATES THAT CAN BE GENERATED WITH THOSE
DIVISORS IS FROM 250 KhZ TO 307 KhZ.
mODIFYING THE 1541 TO READ mfm DISKS INVOLVES PLACING THE HIGHER TWO
BITS OF THE COUNTER UNDER cpu CONTROL. tHAT ALLOWS A FULL RANGE OF
DIVISORS FROM 1 THROUGH 16, AN EVEN GREATER RANGE THAN THE DIVIDE BY 8
REQUIRED FOR A 500 KhZ CLOCK. iN FACT, ONLY ONE ADDITIONAL COUNTER INPUT
NEEDS TO BE UNDER cpu CONTROL, BUT WHILE WE'RE IN THE DRIVE WITH A
SOLDERING IRON, WHY NOT CONNECT THE OTHER ONE TOO? iT MIGHT BE REQUIRED
TO READ OTHER DISK FORMATS IN THE FUTURE.
oNCE YOU'VE CHOSEN ONE OF THE MODIFICATION INSTRUCTIONS BELOW AND
COMPLETED IT, TAKE ONE LAST LOOK AT YOUR WORK. lOOK ESPECIALLY FOR
SOLDER BRIDGES AND WIRES TOUCHING ADJACENT PADS. nEXT, RE-ATTACH ANY
CONNECTORS, SCREW THE DRIVE TOGETHER AND PLUG IT IN. bEFORE ATTACHING IT
TO YOUR c64, TRY TURNING IT ON. iF YOU DON'T HEAR ANYTHING UNUSUAL AND
DON'T SMELL SMOKE, YOUR DRIVE HAS PASSED THE FIRST TEST! tURN THE DRIVE
OFF AND PLUG IT INTO YOUR COMPUTER. tURN THEM BOTH ON AND TRY LOADING A
PROGRAM FROM A NONCRITICAL 1541 DISK. iF IT READS FINE AND DOESN'T ERASE
THE DISK, THEN MOVE TO THE NEXT SECTION AND TRY READING AN ms-dos DISK.
iF IT DOESN'T WORK PROPERLY, OPEN THE DRIVE AGAIN AND COMPARE YOUR WORK
TO THE INSTRUCTIONS CAREFULLY.
2a) 1541 disk drive modification
tHIS SECTION DESCRIBES THE EASIEST MODIFICATION TO MAKE TO YOUR 1541,
AND HAS THE POTENTIAL OF WORKING WITH MORE DISK FORMATS THAN JUST ms-dos
mfm (USING FUTURE SOFTWARE). tHE DISADVANTAGE IS THAT PART OF THE
UNUSED i/o PORT a IS REQUIRED, WHICH MEANS THAT THE PORT CANNOT BE USED
WITH A FAST LOADING DEVICE THAT REQUIRES A PARALLEL CABLE CONNECTION TO
THE 1541 (STANDARD FAST LOADER CARTRIDGES WORK FINE). uSE ONE OF THE
ALTERNATE MODIFICATIONS IF YOU WANT TO USE SUCH A FAST LOADER.
tHE UNUSED i/o PORT AVAILABLE ON THE FIRST 6522 VERSATILE INTERFACE
ADAPTERS (via) CAN BE CONNECTED TO THE COUNTER'S EXTRA INPUTS (WHICH ARE
NORMALLY CONNECTED TO GROUND) AND USED TO EXTEND THE CLOCK FREQUENCY
RANGE. sINCE THE PORT IS ALSO AT GROUND POTENTIAL UPON RESET, THE CLOCK
CIRCUITRY IS NOT AFFECTED BY THE MODIFICATION.
rEFER TO THE FIGURE IN FILE 1541clk.gif WHILE MAKING THESE
MODIFICATIONS. uNPLUG YOUR 1541 AND REMOVE ITS COVER BY UNSCREWING THE
FOUR SCREWS ON THE BOTTOM OF THE CASE. lOCATE THE CONTROLLER pcb AND
UNPLUG THE TRANSFORMER CONNECTOR NEAR THE REGULATOR icS AND HEAT SINK.
rEMOVE THE SCREWS ATTACHING THE pcb TO THE CHASSIS, INCLUDING THE TWO
SCREWS ATTACHED TO THE REGULATOR HEAT SINK, AND TILT THE BOARD UP.
lOCATE ue6 (THE 74ls193 COUNTER ic) AND CUT THE TRACES GOING TO PINS 9
AND 10; MAKE SURE THE TWO PINS ARE NOT STILL CONNECTED TO EACH OTHER,
TOO. cAREFULLY SOLDER A SHORT WIRE TO PIN 9 AND ANOTHER ONE TO PIN 10.
lOCATE uc3 (6522 via) AND SOLDER THE OTHER END OF THE FIRST WIRE (FROM
ue6 PIN 9) TO uc3 PIN 3 (WHICH IS OTHERWISE UNCONNECTED). sOLDER THE
OTHER END OF THE SECOND WIRE (FROM ue6 PIN 10) TO uc3 PIN 2 (ALSO
OTHERWISE UNCONNECTED).
cURRENTLY, ONLY THE JUMPER TO ue6 PIN 9 IS REQUIRED TO READ ibm
DISKETTES. iF YOU WANT TO SAVE YOURSELF SOLDERING ONE JUMPER, YOU MAY
LEAVE ue6 PIN 10 CONNECTED TO GROUND. tHE JUMPER TO ue6 PIN 10 MAY BE
REQUIRED IN THE FUTURE TO READ OTHER NEW AND EXCITING DISK FORMATS.
2b) 1541 disk drive modification -- first alternate
uSE THE FOLLOWING MODIFICATION INSTRUCTIONS IF YOU WANT TO LEAVE THE
FIRST via'S UNUSED PORT a ALONE. yOU'LL NEED A 4.7 KILOHM RESISTOR TO
PERFORM THIS MODIFICATION (ALTHOUGH ANYTHING 3.3K TO 10K SHOULD ALSO
WORK).
bESIDES ALL OF PORT a, PIN ca1 OF THE FIRST via IS ALSO UNUSED IN A
STOCK 1541. uNFORTUNATELY, IT GOES HIGH (NOT TO GROUND) WHEN RESET AND
CAN'T BE DIRECTLY CONNECTED TO THE COUNTER'S INPUT FOR THE DRIVE TO BE
ABLE TO READ REGULAR 1541 DISKS AT POWER UP. iNSTEAD, AN UNUSED INVERTER
IS USED TO INVERT THE HIGH SIGNAL TO LOW, WHICH IS THEN CONNECTED TO THE
COUNTER.
uNPLUG YOUR 1541 AND REMOVE ITS COVER BY UNSCREWING THE FOUR SCREWS ON
THE BOTTOM OF THE CASE. lOCATE THE CONTROLLER pcb AND UNPLUG THE
TRANSFORMER CONNECTOR NEAR THE REGULATOR icS AND HEAT SINK. rEMOVE THE
SCREWS ATTACHING THE pcb TO THE CHASSIS, INCLUDING THE TWO SCREWS
ATTACHED TO THE REGULATOR HEAT SINK, AND TILT THE BOARD UP.
lOCATE ue6 (THE 74ls193 COUNTER ic) AND CUT THE TRACE GOING TO PIN 9;
MAKE SURE THE PIN 9 ISN'T STILL CONNECTED TO PIN 10. cAREFULLY SOLDER A
SHORT WIRE TO PIN 9. lOCATE ub1 (7406 OPEN-COLLECTOR HEX INVERTER) AND
VERIFY THAT PINS 5 AND 6 ARE UNCONNECTED. sOLDER THE OTHER END OF THE
WIRE AND ONE END OF THE RESISTOR TO PIN 6. tHE OTHER END OF THE
RESISTOR MUST BE SOLDERED TO PIN 14 (vCC). lOCATE uc3 (6522 via) AND
SOLDER A SHORT LENGTH OF WIRE BETWEEN PIN 39 (ca2) AND PIN 5 OF ub1.
2c) 1541 disk drive modification -- second alternate
iF YOU DON'T HAVE A RESISTOR HANDY, OR ARE MODIFYING A 1541 COMPATIBLE
DISK DRIVE THAT DOESN'T HAVE AN UNUSED PORT OR INVERTER (OR EVEN ONE
THAT DOES, LIKE THE oc-118), THEN YOU MAY BE FORCED TO USE THIS
ALTERNATE MODIFICATION. a SWITCH IS INSTALLED WHICH ALLOWS YOU TO CHOOSE
TO READ NORMAL 1541 DISKS WHEN DOWN OR mfm DISKS WHEN UP.
lOCATE ue6 (THE 74ls193 COUNTER ic) AND CUT THE TRACE GOING TO PIN 9;
MAKE SURE THE PIN 9 ISN'T STILL CONNECTED TO PIN 10. cAREFULLY SOLDER A
SHORT WIRE BETWEEN PIN 9 AND THE MIDDLE POSITION OF A spdt SWITCH.
cONNECT ONE REMAINING SWITCH CONTACT TO GROUND AND THE OTHER TO vCC (+5
v). tO USE REGULAR 1541 DISKS, SWITCH TO THE GROUND POSITION. tO USE
mfm DISKS, SWITCH TO THE +5 v POSITION.
2d) oceanic oc-118/oc-118n disk drive modification
tHE oc-118 AND oc-118n ARE THIRD PARTY 1541-COMPATIBLE DISK DRIVES.
tHEY APPEAR SIMILAR TO THE aMIGA EXTERNAL DISK DRIVES IN THAT THEY ARE
COMPACT AND HAVE AN EXTERNAL POWER SUPPLY. tHEIR CIRCUITRY IS SLIGHTLY
DIFFERENT FROM THAT OF THE 1541, AND THEY REQUIRE A DIFFERENT
MODIFICATION. tHIS DESCRIPTION IS EQUIVALENT TO THE FIRST ALTERNATE
1541 MODIFICATION ABOVE, SO YOU'LL NEED A 3.3K TO 10K KILOHM RESISTOR.
lOCATE u4 (74ls161 COUNTER ic) ON THE BOARD IN THE TOP RIGHT OF THE
DIAGRAM. tHERE MAY BE ANOTHER u4 ON A DIFFERENT BOARD, SO MAKE SURE THE
u4 YOU USE HAS 74ls161 WRITTEN ON IT. cUT THE TRACE BETWEEN PIN 6 OF u4
AND gnd AND SOLDER A SHORT WIRE TO PIN 6. lOCATE u15 (7406 OPEN-
COLLECTOR HEX INVERTER) AND SOLDER THE OTHER END OF THE WIRE AND ONE
END OF THE RESISTOR TO PIN 8 (WHICH SHOULD OTHERWISE BE UNCONNECTED).
cONNECT THE OTHER END OF THE RESISTOR TO PIN 14 (vCC). lOCATE u8 (6522
via) AND SOLDER A SHORT LENGTH OF WIRE BETWEEN PIN 39 (ca2) AND PIN 9 OF
u15.
u1,3,5 u2,4,6
____________ _____ u7,9 u8,10
!! \ =mmmmm=========__ / ! h#h h#h h
!! --------------------- ! ==============
!! SERVO CARD MOTHERBOARD ! mmh -- CONNECTORS
!! - - - - - - - - - - - - - - - -!================
!!_______________________w_w_w_w_w_w_w___! h#h h#h "
u1...9 u10...u18
oc-118, oc-118n - SIDE VIEW
-----------------------------------------------------------------------
3) preparing disks for data transfer
tHE 1541 DRIVE ONLY HAS A SINGLE HEAD TO READ SINGLE-SIDED DISKS. tHIS
MEANS YOU NEED DISKS FORMATTED WITH THE 180 kb ms-dos FORMAT (40 TRACKS
ON A SINGLE SIDE, 9 SECTORS PER TRACK WITH A SECTOR SIZE OF 512 BYTES).
sUCH DISKS CAN BE FORMATTED USING THE ms-dos format COMMAND ON DOUBLE
DENSITY DISKS WITH THE /1 COMMAND LINE OPTION. e.G.:
format /1 a:
iF YOU USE A HIGH DENSITY DISK DRIVE (1.2 mb) YOU WILL ALSO HAVE TO
USE THE /4 COMMAND LINE OPTION TO CREATE DOUBLE DENSITY FORMAT. e.G.:
format /1 /4 a:
nEWER VERSIONS OF ms-dos ALLOW THE /f SWITCH WHICH WILL WORK ON BOTH
KINDS OF DRIVES. e.G.:
format /f:180 a:
iF YOU USE OTHER PROGRAMS TO FORMAT DISKS INSTEAD OF THE ms-dos
format COMMAND, YOU MAY HAVE TO USE DIFFERENT PARAMETERS TO GENERATE DISKS
WITH EXACTLY THE DISK ORGANIZATION 1541-READS-DOS EXPECTS.
e.G. WITH THE PUBLIC-DOMAIN PROGRAM fdformat YOU HAVE TO USE
fdformat a: /f:180 /c:1 /d:64
tHESE ARE THE BOOT SECTOR PARAMETERS FOR A 1541-READS-DOS READABLE DISK:
bYTES PER SECTOR: 512
sECTORS PER cLUSTER: 1
rESERVED sECTORS AT BEGINNING: 1
fat cOPIES: 2
rOOT DIRECTORY ENTRIES: 64
tOTAL SECTORS ON DISK: 360
sECTORS PER fat: 2
sECTORS PER TRACK: 9
sIDES: 1
hIGH DENSITY DRIVES USE A NARROWER READ/WRITE HEAD THAN DOUBLE
DENSITY DRIVES AND THE 1541. tHEREFORE, YOU SHOULD NOT WRITE TO A DOUBLE
DENSITY DISK WITH A HIGH DENSITY DRIVE IF THE DISK HAS PREVIOUSLY BEEN
WRITTEN TO BY ONE OF THOSE DRIVES WITH ITS WIDER READ/WRITE HEAD.
-----------------------------------------------------------------------
4) transferring files from ms-dos disks to cbm disks with
"1541-READS-DOS"
yOU NEED THE PROGRAM 1541-READS-DOS TO READ FILES FROM ms-dos DISKS.
iF YOU HAVE NO OTHER WAY OF TRANSFERRING IT TO THE c64, YOU CAN TYPE IN
THE basic LISTING OF 1541-DOS.BOOT IN aPPENDIX a TO READ 1541-DOS.SFX
FOR THE FIRST TIME.
tHE PROGRAM 1541-READS-DOS COPIES FILES IN THE ROOT DIRECTORY OF A
180 kb ms-dos DISK TO A cbm DISK.
iT CAN BE LOADED AND STARTED LIKE A basic PROGRAM. tHE USER
INTERFACE IS DIALOGUE ORIENTED, SO YOU HAVE TO INPUT DATA WHEN ASKED
FOR IT. yOU CAN ACCEPT DEFAULT VALUES BY SIMPLY PRESSING THE
return-KEY.
aT THE BEGINNING IT WILL ASK FOR THE DEVICE NUMBER OF THE 1541 DRIVE
MODIFIED FOR mfm READING. tHIS IS THE DRIVE THE ms-dos SOURCE DISK
WILL BE READ FROM. nEXT YOU HAVE TO ENTER THE DEVICE NUMBER OF THE
DRIVE THE FILE SHALL BE COPIED TO. tHIS CAN BE ANY cOMMODORE COMPATIBLE
DISK DRIVE. yOU CAN ENTER EQUAL NUMBERS FOR BOTH DRIVES; THE PROGRAM
WILL THEN WORK WITH A SINGLE 1541 DISK DRIVE. hOWEVER, THE PROGRAM
WILL BE A BIT SLOWER AND YOU WILL HAVE TO SWAP DISKS QUITE
FREQUENTLY.
yOU MAY THEN LET THE PROGRAM START READING FORMAT AND DIRECTORY
INFORMATION FROM AN ms-dos DISK. oNLY THE ROOT DIRECTORY IS
SUPPORTED -- YOU CAN NOT COPY FROM SUBDIRECTORIES.
wITH EACH FILE YOU ARE GIVEN THE OPTION OF COPYING IT TO A cbm DISK. iF
YOU DECIDE TO COPY A FILE, YOU MUST ENTER A TEXT CONVERSION NUMBER.
iF YOU ENTER 0, THE FILE WILL BE COPIED WITHOUT CONVERSION. wITH NUMBER
1, YOU SELECT CONVERSION FROM ascii TO cbm CHARACTER SET (petscii);
NUMBER 2 STANDS FOR CONVERSION FROM ascii TO dATA bECKER c-EDITOR
FORMAT. tHE LATTER USES THE cbm CHARACTER SET EXTENDED BY CHARACTERS
NEEDED FOR THE PROGRAMMING LANGUAGE c.
cHARACTERS THAT DO NOT EXIST IN THE DESTINATION CHARACTER SET ARE
IGNORED. tAB CHARACTERS ARE CONVERTED TO SINGLE SPACES.
nOTE THAT UUENCODED FILES CAN CONTAIN CHARACTERS (BACKSLASH AND
UNDERSCORE) THAT DO NOT EXIST IN cbm CHARACTER SET.
iN DETAIL, CONVERSION IS DONE ACCORDING TO THE FOLLOWING TABLES:
ascii -> cbm
-------------------
0..7 -
8 32
9 -
10 13
11..31 -
32..64 32..64
65..90 193..218
91 91
92 -
93..94 93..94
95..96 -
97..122 65..90
123..255 -
ascii -> c-EDITOR
------------------------
0..7 -
8 32
9 -
10 13
11..31 -
32..64 32..64
65..90 193..218
91..95 91..95
96 -
97..122 65..90
123..126 219..222
127..255 -
tEXT CONVERSION CAN TAKE QUITE A WHILE, LEADING TO PAUSES DURING THE
COPY PROCESS.
aFTER SELECTING THE CONVERSION NUMBER YOU CAN SPECIFY THE DESTINATION
FILE TYPE. prg-, seq- AND usr-FILES CAN BE CREATED.
nEXT, THE NAME OF THE DESTINATION FILE HAS TO BE ENTERED. tHE DEFAULT
FILENAME IS THE ms-dos NAME WITH LOWER CASE LETTERS.
aFTER FILES HAVE BEEN SELECTED THE COPY PROCESS CAN BE STARTED. wITH
DIFFERENT SOURCE AND DESTINATION DISK DRIVES ALL FILES ARE COPIED
WITHOUT ANY FURTHER USER INTERACTION NECESSARY.
wHEN A SINGLE DRIVE IS USED, YOU HAVE TO SWAP DISKS FOR EVERY FILE.
lONG FILES REQUIRE ADDITIONAL SWAPPING.
aT THE END YOU CAN DECIDE TO START COPYING FROM ANOTHER ms-dos DISK.
oTHERWISE THE PROGRAM WILL BE TERMINATED BY ISSUING A RESET OF BOTH THE
c64 AND THE mfm- DISK DRIVE.
-----------------------------------------------------------------------
5) transferring files from cbm disks to ms-dos disks with
"1541-WRITES-90K" and "READ90K.COM"
a SPECIAL 90K-FORMAT IS USED FOR TRANSFERRING FILES TO ms-dos
COMPUTERS. tHIS IS NOT A REGULAR ms-dos FORMAT, ALTHOUGH IT USES
FORMATTED 180 kb ms-dos DISKS.
tHE PROGRAM 1541-WRITES-90K WRITES A FILE WITH A MAXIMUM LENGTH OF
91904 BYTES TO A DISK USING THE 90K-FORMAT. aLL PREVIOUS DATA ON THIS
DISK IS OVERWRITTEN. aS ONLY ONE FILE PER DISK CAN BE WRITTEN, YOU NEED
TO HAVE AS MANY FORMATTED DISKS AVAILABLE AS FILES YOU WANT TO COPY.
tHE PROGRAM READ90K.COM IS USED ON AN ms-dos COMPUTER TO READ FILES
FROM SUCH DISKS AND SAVE THEM AS REGULAR FILES ON ANOTHER DRIVE.
lIKE 1541-READS-DOS, THE PROGRAM 1541-WRITES-90K CAN BE LOADED AND
STARTED LIKE A basic PROGRAM. hOWEVER, YOU SHOULD KNOW THE FILENAME OF
THE PROGRAMS YOU WANT TO WRITE BEFOREHAND AS THERE IS NO OPTION TO
DISPLAY A DIRECTORY WHILE THE PROGRAM IS RUNNING.
tHE PROGRAM ALSO ASKS FOR THE DEVICE NUMBERS OF THE mfm- AND cbm-DISK
DRIVES. hERE, THE cbm-DRIVE CONTAINS THE SOURCE DISK AND THE mfm-DRIVE
CONTAINS THE DESTINATION DISK. yOU CAN WORK WITH A SINGLE DRIVE, BUT
COPYING LARGE FILES WILL BE MUCH SLOWER.
iF YOU DECIDE TO START COPYING YOU HAVE TO ENTER THE NAME OF THE cbm
FILE. tHE PROGRAM WILL THEN SEARCH FOR THE FILE ON THE SOURCE DISK. iF
THE FILE EXISTS, YOU CAN SELECT A CONVERSION NUMBER (ANALOGOUS TO
1541-READS-DOS) TO SPECIFY CONVERSION FROM cbm OR c-EDITOR CHARACTER SET
TO ms-dos ascii. cbm GRAPHIC CHARACTERS, THE LEFT ARROW AND THE POUND
SYMBOL WILL BE IGNORED.
iN DETAIL, CONVERSION IS DONE ACCORDING TO THE FOLLOWING TABLES:
cbm -> ms-dos
-----------------------------
0..12 -
13 13, 10
14..31 -
32..64 32..64
65..90 (+32) 97..122
91 91
92 -
93..94 93..94
95..96 -
97..122 (-32) 65..90
123..192 -
193..218 (-128) 65..90
219..255 -
c-editor -> ms-dos
-----------------------------
0..12 -
13 13, 10
14..31 -
32..64 32..64
65..90 (+32) 97..122
91..95 91..95
96 -
97..122 (-32) 65..90
123..192 -
193..218 (-128) 65..90
219..222 (-96) 123..126
223..255 -
iN CONTRAST TO 1541-READS-DOS, TEXT CONVERSION DOES NOT LEAD TO PAUSES,
AS IT IS PERFORMED BY THE PROGRAM "READ90K.COM" ON THE ms-dos MACHINE.
aFTER SELECTING THE CONVERSION NUMBER YOU HAVE TO ENTER THE ms-dos
FILENAME. tHE PROGRAM TRIES TO CREATE A REASONABLE FILENAME BY SEARCHING
FOR AN EXTENSION FROM THE RIGHT TO THE LEFT. sUPERFLUOUS DOTS ARE
CONVERTED TO UNDERSCORES, BLANKS ARE OMITTED. tHE FILENAME AND ITS
EXTENSION ARE TRUNCATED TO 8 AND 3 CHARACTERS. hOWEVER, YOU HAVE TO
REMOVE SPECIAL CHARACTERS LIKE ASTERISKS YOURSELF. yOU CAN CHANGE THE
SUGGESTED FILENAME, HOWEVER, LETTERS ARE ALWAYS STORED IN UPPER CASE AND
THE COMPLETE NAME IS TRUNCATED TO A MAXIMUM OF 12 CHARACTERS. iF YOU
ENTER AN INVALID ms-dos FILENAME YOU WILL HAVE TROUBLES COPYING THE FILE
WITH READ90K.COM.
aFTER YOU HAVE ENTERED A NON-BLANK ms-dos FILE NAME THE COPY PROCESS
BEGINS. cOPYING A LONG FILE WITH A SINGLE DRIVE MEANS YOU WILL HAVE
TO SWAP DISKS DURING THE OPERATION.
aT THE END YOU CAN DECIDE TO START COPYING TO ANOTHER ms-dos DISK IN
90K-FORMAT. oTHERWISE THE PROGRAM WILL BE TERMINATED BY ISSUING A RESET
OF BOTH THE c64 AND THE mfm DISK DRIVE.
nOW YOU MUST USE READ90K.COM TO GENERATE REGULAR ms-dos FILES FROM THE
90K-DISKS. yOU HAVE TO SPECIFY THE DRIVE THAT CONTAINS THE DISK AS A
PARAMETER. e.G.:
read90k a:
READS ALL FILES FROM THE DISK IN DRIVE a AND COPIES THEM TO THE CURRENT
DEVICE. iF YOU JUST WANT TO VIEW THE NAMES OF THE FILES ON THE DISK YOU
HAVE TO ADD THE LETTER d AS A SECOND PARAMETER. e.G.:
read90k a: d
eXECUTING READ90K.COM WITHOUT PARAMETERS WILL DISPLAY A SHORT HELP
MESSAGE.
sOURCE CODE FOR READ90K IS AVAILABLE (aPPENDIX b) FOR COMPILING ON
uNIX AND uNIX-LIKE MACHINES WITH A 5 1/4" DRIVE. tHE PROGRAM WILL
COMPILE USING GCC, AND LIKELY YOUR NATIVE CC AS WELL (USE THE COMMAND
"CC -O READ90K READ90K.C").
bEFORE USING THE PROGRAM, YOU MUST FIND THE DEVICE DRIVER WHICH
HANDLES SINGLE-SIDED OR DOUBLE-SIDED 40-TRACK DOUBLE-DENSITY FLOPPY
DISKS. pUT ANY FORMATTED FLOPPY DISK INTO THE DRIVE AND EXECUTE THE
COMMAND "WC -C /DEV/FLOPPYNAME" (WHERE FLOPPYNAME IS THE NAME OF THE
SPECIAL FILE FOR THE FLOPPY DEVICE DRIVER). iF IT COMPLETES WITHOUT
ERRORS AND THE SIZE GIVEN IS 184 320 (180K), YOU CAN USE READ90K WITH
THE COMMAND LINE "READ90K /DEV/FLOPPYNAME". iF THE SIZE IS 368 640, YOU
HAVE A 360 Kb SIZED DISK DRIVER AND MUST USE "READ90K 1 /DEV/FILENAME".
iF YOU DON'T GET EITHER SIZED IMAGE, YOU CANNOT ACCESS THE 90 Kb DISK.
aS AN EXAMPLE, THE lINUX os VER. 0.99 PATCHLEVEL 10 USES THE NAMES
/DEV/FD0 AND /DEV/FD0D360 FOR THE FLOPPY DEVICE DRIVER FOR THE FIRST
FLOPPY DRIVE. tHESE ARE BOTH 360 Kb DRIVERS WHICH REQUIRE USING THE "1"
OPTION ON THE READ90K COMMAND LINE (I.E. TO COPY A 1541-WRITTEN DISK,
USE THE COMMAND LINE "READ90K 1 /DEV/FD0").
-----------------------------------------------------------------------
6) error messages
dURING THE EXECUTION OF 1541-READS-DOS AND 1541-WRITES-90K SEVERAL
DISK ERRORS MAY OCCUR. aN ERROR ALWAYS LEADS TO A TERMINATION OF THE
COPY PROCESS.
iF AN ERROR OCCURS DURING A cbm DISK ACCESS, THE DRIVE'S ERROR CHANNEL
MESSAGE IS DISPLAYED.
dURING AN ms-dos DISK ACCESS ONE OF THE FOLLOWING ERROR MESSAGES CAN
APPEAR. (tHE PROBABLE REASON(S) FOR AN ERROR IS DESCRIBED HERE, BELOW
EACH MESSAGE.)
* cAN'T ACCESS mfm-DISK (DRIVE NOT READY)
tHERE IS EITHER NO DISK IN THE DRIVE, OR THE DRIVE DOOR IS OPEN, OR
THE DISK IS NOT A FORMATTED mfm-DISK.
tHE MESSAGE MIGHT ALSO APPEAR IF THE 1541 HAS NOT BEEN MODIFIED OR IF
THE MODIFICATION WAS NOT CORRECT.
* crc-ERROR IN SECTOR HEADER
tHE DISK IS OF BAD QUALITY OR IS NOT AN mfm-DISK.
* SECTOR HEADER NOT FOUND
tHE DISK IS OF BAD QUALITY OR IS NOT AN mfm-DISK. iT COULD ALSO
INDICATE CORRUPT DISK CONTROL INFORMATION.
* DATA SECTION NOT FOUND
tHE DISK IS OF BAD QUALITY.
* crc-ERROR IN DATA SECTION
tHE DISK IS OF BAD QUALITY. tHERE COULD ALSO BE A PROBLEM WITH THE
DRIVE.
iF THIS ERROR HAPPENS DURING WRITING DATA IT INDICATES A WRITE VERIFY
ERROR.
* WRITE PROTECT ON
aN ATTEMPT WAS MADE TO WRITE TO A WRITE PROTECTED DISK.
* DISK FULL
aN ATTEMPT WAS MADE TO WRITE MORE THAN 91904 BYTES TO A 90K-DISK.
* iLLEGAL mfm-DISK SIDENR. ( <> 0 )
tHE DISK CONTROL INFORMATION IS CORRUPT (OR THE DRIVE IS SPINNING
BACKWARDS...).
* uNSUPPORTED mfm-SECTOR SIZE ( <> 512 )
tHE INSERTED DISK IS NOT AN ms-dos DISK (E.G. IT COULD BE A cp/m
DISK).
* nOT (YET) SUPPORTED ms-dos FORMAT
tHE DISK HAS BEEN FORMATTED WITH WRONG COMMAND LINE OPTIONS, OR IT IS
NOT AN ms-dos DISK, OR THE DISK CONTROL INFORMATION IS CORRUPT.
tHE POSITIONS WHERE DISK ERRORS HAVE OCCURRED MAY BE INDICATED BY AN
mfm TRACK AND SECTOR NUMBER IN PARENTHESES.
tHE PROGRAMS RETRY READING AND WRITING TO BAD QUALITY DISKS SEVERAL
TIMES BEFORE DISPLAYING AN ERROR MESSAGE.
sOME DRIVES BEHAVE DIFFERENTLY AFTER THEY HAVE BEEN IN USE FOR A LONG
TIME. sO, AFTER AN ERROR, IT MIGHT BE WORTH TRYING AGAIN AFTER THE DRIVE
HAS BEEN SWITCHED OFF FOR QUITE A WHILE.
sOMETIMES IT TAKES A VERY LONG TIME TO DETECT AN ERROR. iN THAT CASE,
YOU COULD OPEN THE DRIVE DOOR TO INTERRUPT THE READING PROCESS.
nORMALLY THE READ/WRITE HEAD WILL NOT BUMP AGAINST ITS BOUNDARIES IF
THIS IS DONE DURING AN ms-dos DISK ACCESS.
-----------------------------------------------------------------------
7) compatibility
tHE c64 PROGRAMS HAVE BEEN TESTED IN THE FOLLOWING CONFIGURATIONS:
- A SINGLE MODIFIED 1541 DRIVE
- A SINGLE MODIFIED oc-118n DRIVE
- A MODIFIED 1541 AND A STOCK oc-118n
- A MODIFIED oc-118n AND A STOCK 1541
- A MODIFIED 1541 AND ramdos EMULATING A SECOND DISK DRIVE
tHEY SHOULD ALSO WORK WITH ANY OTHER cOMMODORE COMPATIBLE DISK DRIVE
USED AS THE SECOND DRIVE (THE ONE HOLDING THE cbm FORMAT DISK).
tHE MEMORY BETWEEN $c000 AND $cfff HAS INTENTIONALLY BEEN LEFT
BLANK. tHIS IS THE PLACE TO PUT UTILITY PROGRAMS LIKE THE ramdos
INTERFACE PAGE.
dISK SPEEDUP UTILITIES SHOULD WORK WELL WITH READING AND WRITING TO
cbm FORMAT DISKS. iF THEY SPEED UP SEQUENTIAL FILE ACCESS, COPYING
WILL BE MUCH FASTER.
wHILE READING AND WRITING TO ms-dos DISKS ALMOST ANY AVAILABLE ram
IN THE 1541 IS USED. tHEREFORE YOU MIGHT HAVE TROUBLES WITH UTILITIES
THAT RELY UPON THAT ram.
tHE PROGRAMS WILL RESET THE DISK DRIVE AFTER EACH COPY PASS IF A
SINGLE DISK DRIVE IS USED. tHIS WILL RESET DEVICE NUMBERS CHANGED BY
SOFTWARE TO THEIR ORIGINAL VALUES.
-----------------------------------------------------------------------
8) possible improvements
tHE PROGRAMS 1541-READS-DOS AND 1541-WRITES-90K ARE BOTH DIVIDED INTO
MACHINE LANGUAGE CODE EXECUTED IN THE MODIFIED 1541 DISK DRIVE AND A
COMPILED c-PROGRAM EXECUTED IN THE c64.
tHERE ARE SOME RESTRICTIONS DUE TO THE USE OF c AS THE PROGRAMMING
LANGUAGE. iF THE c64 PROGRAMS WOULD BE REWRITTEN IN ASSEMBLER MANY
IMPROVEMENTS COULD BE ACHIEVED.
* sMALLER PROGRAM SIZE
tHE READ AND WRITE PROGRAMS COULD BE COMBINED INTO ONE AND A BIGGER
COPY BUFFER COULD BE USED (CURRENT SIZE IS 12kb).
* hIGHER SPEED
tHE ROUTINES FOR TEXT CONVERSION ESPECIALLY COULD BE MUCH FASTER.
wITH FAST TRANSFER ROUTINES, ms-dos READING AND WRITING SPEED COULD
BE DOUBLED.
aS AN OPTION, cbm DISK READING AND WRITING COULD ALSO BE MADE 5 TIMES
FASTER QUITE EASILY.
* bETTER USER INTERFACE
a LESS MODAL USER INTERFACE, EITHER COMMAND LINE OR MENU ORIENTED,
COULD BE IMPLEMENTED.
* mORE FLEXIBILITY
1541-READS-DOS COULD HANDLE QUITE EASILY ALSO 160kb DISKS.
sUBDIRECTORIES COULD BE SUPPORTED.
* iMPROVEMENT OF LOW LEVEL ROUTINES
cURRENTLY, IT IS NOT POSSIBLE TO WRITE COMPLETE SECTORS DUE TO TOO
LITTLE MEMORY IN THE 1541. tHAT IS WHY THE 90K-FORMAT IS USED. bY
LETTING THE c64 DO SOME OF THE WORK CURRENTLY DONE BY THE 1541 IT COULD
BE POSSIBLE TO WRITE COMPLETE SECTORS.
tHE REGULAR ms-dos FORMAT COULD THEN BE USED FOR WRITING, TOO. cOMMANDS
TO DELETE AND RENAME FILES COULD BE ALSO IMPLEMENTED THEN.
iT WOULD BE POSSIBLE TO SUPPORT DOUBLE SIDED DISKS BY FLIPPING DISKS
OVER. a HARDWARE OR SOFTWARE SWITCH INSTALLED IN THE 1541 TO CHANGE THE
SPINNING DIRECTION WOULD PROBABLY BE NECESSARY.
-----------------------------------------------------------------------
9) disclaimer
aLTHOUGH THE DRIVE MODIFICATION AND PROGRAMS HAVE BEEN TESTED ON SEVERAL
DISK DRIVES AND COMPUTERS, THE AUTHORS CANNOT GUARANTEE THAT ANYONE ELSE
CAN PERFORM THIS UPGRADE WITHOUT DAMAGING HIS COMPUTER. wE THEREFORE
DISCLAIM ANY RESPONSIBILITY FOR ANY DAMAGE THAT MAY OCCUR AS RESULT OF
ATTEMPTING THIS UPGRADE OR USING THE ACCOMPANYING PROGRAMS. kEEP IN MIND
THAT THE MODIFICATION WILL ALSO VOID ANY WARRANTY ON YOUR DISK DRIVE.
-----------------------------------------------------------------------
10) contacting the authors
iF YOU HAVE COMMENTS OR BUG REPORTS OR IF YOU ARE INTERESTED IN
IMPROVING THE PROGRAMS FEEL FREE TO SEND EMAIL TO THE PROGRAMMER OF THE
c64 PROGRAMS,
rICHARD hABLE
rICHARD.hABLE@JK.UNI-LINZ.AC.AT
TO THE ORIGINAL DEVELOPER OF THE DRIVE MODIFICATION AND mfm READING
ROUTINE,
dANIEL fANDRICH
DAN@FCH.WIMSEY.BC.CA
OR cOMPUsERVE 72365,306
OR TO THE AUTHOR OF THE rEAD90K PROGRAMS,
mARKO mAKELA
mARKO.mAKELA@hELSINKI.FI
-------------------------------------------------------------------------
appendix a: listing of basic program 1541-dos.boot
tHIS basic PROGRAM ALLOWS YOU TO READ 1541-DOS.SFX FOR THE FIRST
TIME. iT HAS BEEN KEPT AS SMALL AS POSSIBLE, THEREFORE, THERE IS LITTLE
ERROR CHECKING. pLEASE READ THE FOLLOWING INSTRUCTIONS TO AVOID
INCORRECT RESULTS.
fORMAT AN ms-dos DISK FOR DATA TRANSFER, AS DESCRIBED IN 3).
cOPY THE FILE 1541-DOS.SFX TO THE FRESHLY FORMATTED ms-dos DISK.
tYPE IN THE basic PROGRAM 1541-DOS.BOOT, SAVE IT AND RUN IT ON A c64.
fIRST, YOU HAVE TO ENTER THE DEVICE NUMBER OF THE MODIFIED 1541. tHIS
DRIVE WILL BE USED FOR BOTH READING AND WRITING.
tHEN, YOU HAVE TO INSERT A CORRECTLY FORMATTED cbm DISK. nO DATA ON
THIS DISK WILL BE CHANGED. iT IS ONLY NECESSARY TO LET THE DRIVE FIND
CORRECT TRACK POSITIONS.
tHEN, YOU HAVE TO INSERT THE ms-dos DISK. tHE PROGRAM 1541-DOS.SFX
WILL BE READ INTO MEMORY. tHIS WILL TAKE QUITE A WHILE.
iF NO ERRORS OCCUR, YOU CAN INSERT A cbm DISK, TO WHICH THE
PROGRAM 1541-DOS.SFX WILL BE WRITTEN TO.
0 REM 1541-DOS.BOOT VER. 16.11.1993
1 REM READ 1541-DOS.INSTR !
2 :
10 POKE55,0:POKE56,48:CLR
100 INPUT"DEVICE NUMBER";V
150 INPUT"INSERT CORRECT CBM DISK <RETURN>";X$
160 OPEN1,V,15,"I":INPUT#1,A,B$,C,D:CLOSE1:IFA>=20THENSTOP
200 INPUT"INSERT MS-DOS SOURCE DISK <RETURN>";X$
210 OPEN1,V,15:GOSUB2000:CLOSE1
300 OPEN1,V,15:PRINT"READING"
310 T=1:S=1:M=12288:B=56
320 FORD=1TOB:GOSUB1000:M=M+512:S=S+1:IFS>9THENS=1:T=T+1
330 PRINT"#";:NEXTD:PRINT:PRINT#1,"UI";
400 INPUT"INSERT CBM DESTINATION DISK <RETURN>";X$
410 OPEN2,V,1,"1541-DOS.SFX":INPUT#1,A,B$,C,D:IFA>=20THENSTOP
420 FORI=0TOB*512-1:PRINT#2,CHR$(PEEK(12288+I));:NEXT:CLOSE2
430 CLOSE1:POKE56,160:CLR:END
999 :
1000 REM READ SECTOR T/S INTO M
1010 FORC=1TO15:FORP=0TO1
1020 PRINT#1,"M-W"CHR$(6)CHR$(4)CHR$(4)CHR$(P)CHR$(T)CHR$(0)CHR$(S);
1030 PRINT#1,"M-E"CHR$(3)CHR$(4);:PRINT#1,"M-R"CHR$(13)CHR$(4)CHR$(1);:GET#1,E$
1040 IFE$<>""THENIFP=0OR(E$<>CHR$(2))AND(E$<>CHR$(4))THENPRINT"READ ERROR":STOP
1050 IFE$<>""THENNEXTC:PRINT"READ ERROR":STOP
1060 FORI=0TO255STEP32:PRINT#1,"M-R"CHR$(I)CHR$(3)CHR$(32);
1070 FORJ=0TO31:GET#1,C$:POKEM+256*P+I+J,ASC(C$+CHR$(0)):NEXT:NEXT
1080 NEXTP:RETURN
2000 REM TRANSFER M.CODE
2010 FORI=0TO1023:READA:PRINT#1,"M-W"CHR$(IAND255)CHR$(4+I/256)CHR$(1)CHR$(A);
2020 H=H+A*(I+1):NEXT:IFH<>52477511THENSTOP
2030 RETURN
9999 :
10000 DATA76,75,4,76,14,4,0,18,0
10010 DATA1,2,0,0,0,32,0,193,173
10020 DATA1,24,72,41,252,9,2,141
10030 DATA1,24,173,12,24,72,41,241
10040 DATA9,12,141,12,24,169,76,141
10050 DATA0,4,169,75,141,1,4,174
10060 DATA7,4,232,134,8,169,224,133
10070 DATA1,165,1,48,252,141,13,4
10080 DATA104,141,12,24,104,141,1
10090 DATA24,96,160,33,185,42,2,153
10100 DATA213,2,136,16,247,173,0
10110 DATA28,41,159,141,0,28,162
10120 DATA6,189,248,7,157,209,1,202
10130 DATA208,247,160,146,165,16
10140 DATA72,165,17,72,169,117,133
10150 DATA16,169,55,133,17,134,23
10160 DATA189,7,4,32,187,7,32,218
10170 DATA7,153,70,1,200,165,84,153
10180 DATA70,1,200,232,224,4,144
10190 DATA232,169,0,32,187,7,32,187
10200 DATA7,165,17,32,218,7,153,70
10210 DATA1,200,165,84,153,70,1,165
10220 DATA16,200,192,158,144,237
10230 DATA104,133,17,104,133,16,169
10240 DATA78,32,218,7,153,70,1,165
10250 DATA84,153,71,1,160,0,152,141
10260 DATA127,7,162,141,189,69,1
10270 DATA192,80,144,3,169,137,202
10280 DATA133,22,189,70,1,72,32,125
10290 DATA7,153,70,1,104,232,200
10300 DATA224,159,144,237,208,4,192
10310 DATA80,144,231,173,127,7,24
10320 DATA105,3,141,127,7,169,255
10330 DATA153,70,1,200,192,140,144
10340 DATA200,141,229,1,169,13,141
10350 DATA34,6,169,0,141,47,6,32
10360 DATA76,5,169,67,141,34,6,169
10370 DATA54,141,47,6,169,208,160
10380 DATA200,174,6,4,208,12,169
10390 DATA112,133,16,169,55,133,17
10400 DATA169,153,160,0,141,130,6
10410 DATA140,131,6,162,144,169,255
10420 DATA157,70,1,138,56,233,20
10430 DATA170,176,244,162,202,154
10440 DATA169,203,141,5,24,169,180
10450 DATA133,82,160,0,169,48,133
10460 DATA24,184,80,254,44,1,28,184
10470 DATA80,254,173,1,28,184,162
10480 DATA80,201,85,240,36,80,254
10490 DATA173,1,28,184,162,100,201
10500 DATA170,240,89,136,208,222
10510 DATA198,24,208,218,162,1,76
10520 DATA68,7,80,254,44,1,28,184
10530 DATA56,76,25,6,169,85,80,254
10540 DATA237,1,28,240,247,201,13
10550 DATA240,233,144,13,80,254,44
10560 DATA1,28,162,120,233,51,240
10570 DATA116,208,175,80,254,44,1
10580 DATA28,184,162,40,201,3,240
10590 DATA14,80,254,44,1,28,184,162
10600 DATA0,201,1,240,90,208,149
10610 DATA80,254,173,1,28,233,74
10620 DATA240,79,208,138,169,170
10630 DATA80,254,237,1,28,240,247
10640 DATA201,25,240,168,144,13,80
10650 DATA254,44,1,28,162,140,233
10660 DATA102,240,51,208,215,80,254
10670 DATA44,1,28,184,162,60,201
10680 DATA6,240,15,80,254,44,1,28
10690 DATA184,162,20,201,1,240,25
10700 DATA76,86,5,80,254,173,1,28
10710 DATA233,148,240,13,208,242
10720 DATA152,56,233,3,168,176,235
10730 DATA76,120,5,232,80,254,173
10740 DATA1,28,253,70,1,208,13,232
10750 DATA80,254,173,1,28,253,70
10760 DATA1,240,234,208,0,56,138
10770 DATA170,233,20,176,251,224
10780 DATA6,144,211,224,19,240,12
10790 DATA198,82,240,3,76,80,5,162
10800 DATA3,76,68,7,96,140,131,6
10810 DATA80,254,44,1,28,184,169
10820 DATA153,136,240,34,80,254,44
10830 DATA1,28,184,141,130,6,76,79
10840 DATA6,80,254,173,1,28,184,133
10850 DATA83,188,70,1,80,254,173
10860 DATA1,28,184,133,84,200,208
10870 DATA153,80,254,173,1,28,184
10880 DATA153,0,3,80,254,173,1,28
10890 DATA184,153,129,3,200,80,254
10900 DATA173,1,28,184,153,202,1
10910 DATA192,129,80,254,173,1,28
10920 DATA184,72,144,217,44,5,24
10930 DATA48,5,162,4,76,68,7,138
10940 DATA162,255,56,233,20,232,176
10950 DATA251,138,73,7,133,26,10
10960 DATA101,26,141,127,7,169,0
10970 DATA133,23,141,107,7,160,129
10980 DATA224,4,104,176,3,173,75
10990 DATA2,133,22,176,6,144,10,104
11000 DATA32,83,7,185,202,1,32,83
11010 DATA7,136,185,129,3,32,83,7
11020 DATA185,0,3,32,83,7,152,208
11030 DATA230,165,84,32,83,7,165
11040 DATA83,32,83,7,174,6,4,240
11050 DATA7,169,0,141,203,1,162,0
11060 DATA160,0,185,203,1,157,0,3
11070 DATA32,187,7,185,129,3,157
11080 DATA1,3,32,187,7,200,232,232
11090 DATA208,233,174,6,4,208,9,173
11100 DATA75,2,141,2,7,76,68,7,173
11110 DATA75,2,32,187,7,173,1,4,32
11120 DATA187,7,165,16,5,17,170,240
11130 DATA2,162,5,160,33,185,213
11140 DATA2,153,42,2,136,16,247,138
11150 DATA76,105,249,166,22,72,133
11160 DATA22,138,32,125,7,166,23
11170 DATA133,23,240,23,138,32,150
11180 DATA7,162,0,134,23,240,0,153
11190 DATA129,3,162,7,208,3,153,203
11200 DATA1,142,107,7,104,133,22
11210 DATA96,24,144,254,70,22,106
11220 DATA70,22,106,70,22,106,70
11230 DATA22,106,70,22,106,70,22
11240 DATA106,70,22,106,96,41,170
11250 DATA105,42,41,212,105,20,41
11260 DATA232,105,8,74,74,74,74,133
11270 DATA26,165,23,41,170,105,42
11280 DATA41,212,105,20,41,232,105
11290 DATA8,41,240,5,26,96,72,133
11300 DATA26,56,38,26,240,21,38,16
11310 DATA38,17,144,246,165,16,73
11320 DATA33,133,16,165,17,73,16
11330 DATA133,17,24,144,231,104,96
11340 DATA56,42,8,176,6,36,23,48
11350 DATA2,56,36,24,38,84,38,83
11360 DATA40,8,102,23,40,38,84,38
11370 DATA83,10,208,230,165,83,96
11380 DATA68,137,68,137,85,84,144
-------------------------------------------------------------------------
appendix b: c-version of read90k for unix
iF YOU DON'T HAVE ms-dos INSTALLED ON YOUR pc, IT MIGHT BE POSSIBLE TO
USE THE FOLLOWING c-PROGRAM TO READ FILES FROM DISKS IN 90K-FORMAT.
#INCLUDE <STDIO.H>
#INCLUDE <STRING.H>
/************************************************************
* rEAD90K V0.1
*
* mARKO mDKELD
* mAIL: sILLITIE 10 a
* 01480 vANTAA
* fINLAND
* e-mAIL: mARKO.mAKELA@hELSINKI.fi
*
* vERSION HISTORY:
*
* vERSION dATE dESCRIPTION
* V0.1 jUNE 23RD, 1993 tHE FIRST VERSION FOR uNIX.
************************************************************/
/*******************
* tRANSLATION TABLE
*******************/
UNSIGNED CHAR tRANSLAtABLE[] =
{$7b}
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 00 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X0a, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 10 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X20, 0X21, 0X22, 0X23, 0X24, 0X25, 0X26, 0X27, /* 20 */
0X28, 0X29, 0X2a, 0X2b, 0X2c, 0X2d, 0X2e, 0X2f,
0X30, 0X31, 0X32, 0X33, 0X34, 0X35, 0X36, 0X37, /* 30 */
0X38, 0X39, 0X3a, 0X3b, 0X3c, 0X3d, 0X3e, 0X3f,
0X40, 0X61, 0X62, 0X63, 0X64, 0X65, 0X66, 0X67, /* 40 */
0X68, 0X69, 0X6a, 0X6b, 0X6c, 0X6d, 0X6e, 0X6f,
0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, /* 50 */
0X78, 0X79, 0X7a, 0X5b, 0X00, 0X5d, 0X5e, 0X00,
0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* 60 */
0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* 70 */
0X58, 0X59, 0X5a, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 80 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 90 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* a0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* b0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* c0 */
0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* d0 */
0X58, 0X59, 0X5a, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* e0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* f0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 00 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X0a, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 10 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X20, 0X21, 0X22, 0X23, 0X24, 0X25, 0X26, 0X27, /* 20 */
0X28, 0X29, 0X2a, 0X2b, 0X2c, 0X2d, 0X2e, 0X2f,
0X30, 0X31, 0X32, 0X33, 0X34, 0X35, 0X36, 0X37, /* 30 */
0X38, 0X39, 0X3a, 0X3b, 0X3c, 0X3d, 0X3e, 0X3f,
0X40, 0X61, 0X62, 0X63, 0X64, 0X65, 0X66, 0X67, /* 40 */
0X68, 0X69, 0X6a, 0X6b, 0X6c, 0X6d, 0X6e, 0X6f,
0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, /* 50 */
0X78, 0X79, 0X7a, 0X5b, 0X5c, 0X5d, 0X5e, 0X5f,
0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* 60 */
0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* 70 */
0X58, 0X59, 0X5a, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 80 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* 90 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* a0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* b0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X41, 0X42, 0X43, 0X44, 0X45, 0X46, 0X47, /* c0 */
0X48, 0X49, 0X4a, 0X4b, 0X4c, 0X4d, 0X4e, 0X4f,
0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, /* d0 */
0X58, 0X59, 0X5a, 0X7b, 0X7c, 0X7d, 0X7e, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* e0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, /* f0 */
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
{$7d};
/*********************
* fUNCTION PROTOTYPES
*********************/
#IFNDEF __stdc__
INT MAIN(); /* MAIN FUNCTION */
#ELSE
INT MAIN(INT ARGC, CHAR **ARGV);
#ENDIF
/***********
* fUNCTIONS
***********/
#IFDEF __stdc__
INT MAIN(INT ARGC, CHAR **ARGV)
#ELSE
INT
MAIN(ARGC,ARGV)
INT ARGC;
CHAR **ARGV;
#ENDIF
{$7b}
file *DISK, *OUTFILE;
UNSIGNED CHAR DIRBUF[256], DISKBUF[512], BYTE;
UNSIGNED UfILEcOUNTER, UcOUNTER, UsECTORcOUNTER, MODE = 1,
UtRANS1, UtRANS2;
UNSIGNED LONG LUfILElENGTH, LUfINALlENGTH;
FPRINTF(STDERR, "90 Kb DISK READER FOR uNIX V0.1\N");
IF (ARGC < 2 {$7c}{$7c} ARGC > 3)
{$7b}
uSAGE: FPRINTF (STDERR, "uSAGE: %S [D{$7c}1] DISK\N", *ARGV);
FPRINTF (STDERR, "oPTIONS: D TO DISPLAY THE DIRECTORY ONLY.\N");
FPRINTF (STDERR, " 1 TO EXTRACT SKIPPING THE SECOND SIDE.\N");
FPRINTF (STDERR, "DISK IS /DEV/FD0, FOR INSTANCE.\N");
RETURN (1);
{$7d}
IF (ARGC == 3 && ARGV[1][1])
GOTO uSAGE;
IF (ARGC == 3)
{$7b}
ARGV++;
IF (**ARGV == 'D')
MODE = 0;
ELSE IF (**ARGV == '1')
MODE = 2;
ELSE
GOTO uSAGE;
{$7d}
IF ((DISK = FOPEN(*++ARGV, "RB")) == null)
{$7b}
FPRINTF(STDERR, "oPENING THE DISK %S FAILED.\N", *ARGV);
RETURN(2);
{$7d}
/* READ DIRECTORY */
IF (512 > FREAD (DISKBUF, SIZEOF *DISKBUF, 512, DISK))
{$7b}
FPRINTF (STDERR, "eRROR READING DISK DIRECTORY.\N");
FCLOSE (DISK);
RETURN (3);
{$7d}
UsECTORcOUNTER = 1;
MEMCPY (DIRBUF, DISKBUF, 256);
/* START PROCESSING THE DIRECTORY */
FOR (UfILEcOUNTER = 0; UfILEcOUNTER < 256 && DIRBUF[UfILEcOUNTER];
UfILEcOUNTER += 16)
{$7b}
LUfILElENGTH = 1 + (UNSIGNED LONG)DIRBUF[UfILEcOUNTER + 13] +
((UNSIGNED LONG)DIRBUF[UfILEcOUNTER + 14] << 8) +
(((UNSIGNED LONG)DIRBUF[UfILEcOUNTER + 15] & 1) << 16);
IF (MODE)
FPRINTF (STDOUT, "cREATING {$60}%S', %LU BYTES -- ",
&DIRBUF[UfILEcOUNTER], LUfILElENGTH);
ELSE
FPRINTF (STDOUT, "{$60}%S', %LU BYTES\N", &DIRBUF[UfILEcOUNTER],
LUfILElENGTH);
IF (MODE)
{$7b}
IF (!(OUTFILE = FOPEN (&DIRBUF[UfILEcOUNTER], "WB")))
{$7b}
OUTfAIL: FPRINTF (STDERR, "fAILED IN CREATING THE FILE.\N");
FCLOSE (DISK);
RETURN (4);
{$7d}
LUfINALlENGTH = 0;
WHILE (LUfILElENGTH)
{$7b}
IF (512 > FREAD (DISKBUF, SIZEOF *DISKBUF, 512, DISK))
{$7b}
FPRINTF (STDERR, "eRROR READING THE DISK.\N");
FCLOSE (DISK);
FCLOSE (OUTFILE);
RETURN (3);
{$7d}
LUfILElENGTH -= (UcOUNTER = LUfILElENGTH > 256 ?
256 : LUfILElENGTH);
IF (DIRBUF[UfILEcOUNTER + 15] & 192) /* TRANSLATION */
{$7b}
MEMCPY (DISKBUF + 256, DISKBUF, 256);
FOR (UtRANS1 = UtRANS2 = 0; UtRANS1 < UcOUNTER; UtRANS1++)
IF (BYTE = tRANSLAtABLE[((DIRBUF[UfILEcOUNTER + 15] &
128) << 1) + DISKBUF[256 + UtRANS1]])
DISKBUF[UtRANS2++] = BYTE;
UcOUNTER = UtRANS2;
{$7d}
IF (UcOUNTER > FWRITE (DISKBUF, SIZEOF *DISKBUF,
UcOUNTER, OUTFILE))
{$7b}
FCLOSE (OUTFILE);
GOTO OUTfAIL;
{$7d}
LUfINALlENGTH += UcOUNTER;
IF (++UsECTORcOUNTER == 9)
{$7b}
IF (MODE == 2) /* OPTIONALLY SKIP THE SECOND SIDE */
FOR (UsECTORcOUNTER++; --UsECTORcOUNTER;
FREAD (DISKBUF, SIZEOF *DISKBUF, 512, DISK));
UsECTORcOUNTER = 0;
{$7d}
{$7d}
FCLOSE (OUTFILE);
FPRINTF (STDOUT, "%LU BYTES CONVERTED.\N", LUfINALlENGTH);
{$7d}
{$7d}
FCLOSE (DISK);
RETURN (0);
{$7d}