home *** CD-ROM | disk | FTP | other *** search
- MATCHES, A RASTER INTERRUPT IS GENERATED IF ENABLED. ╥ASTER REGISTER HAS ITS
- MOST SIGNIFICANT (9TH) BIT IN REGISTER 17 ($11).
-
- ╘HE INTERRUPT REGISTER SHOWS THE STATUS OF THE FOUR SOURCES OF INTERRUPT.
- ┴ CORRESPONDING BIT WILL BE SET TO "1" WHEN AN INTERRUPT SOURCE HAS GENERATED
- AN INTERRUPT REQUEST. ╘O ENABLE AN INTERRUPT REQUEST TO SET THE /╔╥╤ OUTPUT
- TO ZERO, THE CORRESPONDING ENABLE BIT IN REGISTER 26 ($1A) MUST BE SET TO
- "1". ╘HE INTERRUPT LATCH MAY ONLY BE CLEARED BY WRITING A "1" TO THE
- DESIRED LATCH IN THE INTERRUPT REGISTER.
-
- -----------------------------------------------------------------------------
- ╓╔├ REGISTER MAP (┬ASE ADDRESS $D000)
-
- ┴DDRESS ─┬7 ─┬6 ─┬5 ─┬4 ─┬3 ─┬2 ─┬1 ─┬0 ─ESCRIPTION
- -------------------------------------------------------------------
- 00 $00 ═0╪7 ═0╪6 ═0╪5 ═0╪4 ═0╪3 ═0╪2 ═0╪1 ═0╪0 ═╧┬ 0 ╪-POSITION
- 01 $01 ═0┘7 ═0┘6 ═0┘5 ═0┘4 ═0┘3 ═0┘2 ═0┘1 ═0┘0 ═╧┬ 0 ┘-POSITION
- 02 $02 ═1╪7 ═1╪6 ═1╪5 ═1╪4 ═1╪3 ═1╪2 ═1╪1 ═1╪0 ═╧┬ 1 ╪-POSITION
- 03 $03 ═1┘7 ═1┘6 ═1┘5 ═1┘4 ═1┘3 ═1┘2 ═1┘1 ═1┘0 ═╧┬ 1 ┘-POSITION
- 04 $04 ═2╪7 ═2╪6 ═2╪5 ═2╪4 ═2╪3 ═2╪2 ═2╪1 ═2╪0 ═╧┬ 2 ╪-POSITION
- 05 $05 ═2┘7 ═2┘6 ═2┘5 ═2┘4 ═2┘3 ═2┘2 ═2┘1 ═2┘0 ═╧┬ 2 ┘-POSITION
- 06 $06 ═3╪7 ═3╪6 ═3╪5 ═3╪4 ═3╪3 ═3╪2 ═3╪1 ═3╪0 ═╧┬ 3 ╪-POSITION
- 07 $07 ═3┘7 ═3┘6 ═3┘5 ═3┘4 ═3┘3 ═3┘2 ═3┘1 ═3┘0 ═╧┬ 3 ┘-POSITION
- 08 $08 ═4╪7 ═4╪6 ═4╪5 ═4╪4 ═4╪3 ═4╪2 ═4╪1 ═4╪0 ═╧┬ 4 ╪-POSITION
- 09 $09 ═4┘7 ═4┘6 ═4┘5 ═4┘4 ═4┘3 ═4┘2 ═4┘1 ═4┘0 ═╧┬ 4 ┘-POSITION
- 10 $0A ═5╪7 ═5╪6 ═5╪5 ═5╪4 ═5╪3 ═5╪2 ═5╪1 ═5╪0 ═╧┬ 5 ╪-POSITION
- 11 $0B ═5┘7 ═5┘6 ═5┘5 ═5┘4 ═5┘3 ═5┘2 ═5┘1 ═5┘0 ═╧┬ 5 ┘-POSITION
- 12 $0C ═6╪7 ═6╪6 ═6╪5 ═6╪4 ═6╪3 ═6╪2 ═6╪1 ═6╪0 ═╧┬ 6 ╪-POSITION
- 13 $0D ═6┘7 ═6┘6 ═6┘5 ═6┘4 ═6┘3 ═6┘2 ═6┘1 ═6┘0 ═╧┬ 6 ┘-POSITION
- 14 $0E ═7╪7 ═7╪6 ═7╪5 ═7╪4 ═7╪3 ═7╪2 ═7╪1 ═7╪0 ═╧┬ 7 ╪-POSITION
- 15 $0F ═7┘7 ═7┘6 ═7┘5 ═7┘4 ═7┘3 ═7┘2 ═7┘1 ═7┘0 ═╧┬ 7 ┘-POSITION
- 16 $10 ═7╪8 ═6╪8 ═5╪8 ═4╪8 ═3╪8 ═2╪8 ═1╪8 ═0╪8 ═╙┬ OF ╪-POSITION
-
- 17 $11 ╥├8 ┼├═ ┬══ ─┼╬ ╥╙┼╠ ┘2 ┘1 ┘0 (╙EE TEXT)
- 18 $12 ╥├7 ╥├6 ╥├5 ╥├4 ╥├3 ╥├2 ╥├1 ╥├0 ╥ASTER REGISTER
- 19 $13 ╠╨╪8 ╠╨╪7 ╠╨╪6 ╠╨╪5 ╠╨╪4 ╠╨╪3 ╠╨╪2 ╠╨╪1 ╠IGHT ╨EN ╪
- 20 $14 ╠╨┘7 ╠╨┘6 ╠╨┘5 ╠╨┘4 ╠╨┘3 ╠╨┘2 ╠╨┘1 ╠╨┘0 ╠IGHT ╨EN ┘
- 21 $15 ═7┼ ═6┼ ═5┼ ═4┼ ═3┼ ═2┼ ═1┼ ═0┼ ═╧┬ ┼NABLE
- 22 $16 - - ╥┼╙ ═├═ ├╙┼╠ ╪2 ╪1 ╪0 (╙EE TEXT)
- 23 $17 ═7┘┼ ═6┘┼ ═5┘┼ ═4┘┼ ═3┘┼ ═2┘┼ ═1┘┼ ═0┘┼ ═╧┬ ┘-EXPAND
- 24 $18 ╓═13 ╓═12 ╓═11 ╓═10 ├┬13 ├┬12 ├┬11 - ═EMORY ╨OINTERS
- 25 $19 ╔╥╤ - - - ╔╠╨ ╔══├ ╔═┬├ ╔╥╙╘ ╔NTERRUPT ╥EGISTER
- 26 $1A - - - - ┼╠╨ ┼══├ ┼═┬├ ┼╥╙╘ ┼NABLE ╔NTERRUPT
- 27 $1B ═7─╨ ═6─╨ ═5─╨ ═4─╨ ═3─╨ ═2─╨ ═1─╨ ═0─╨ ═╧┬-─┴╘┴ ╨RIORITY
- 28 $1C ═7═├ ═6═├ ═5═├ ═4═├ ═3═├ ═2═├ ═1═├ ═0═├ ═╧┬ ═ULTICOLOR SELECT
- 29 $1D ═7╪┼ ═6╪┼ ═5╪┼ ═4╪┼ ═3╪┼ ═2╪┼ ═1╪┼ ═0╪┼ ═╧┬ ╪-┼XPAND
- 30 $1E ═7═ ═6═ ═5═ ═4═ ═3═ ═2═ ═1═ ═0═ ═╧┬-═╧┬ ├OLLISION
- 31 $1F ═7─ ═6─ ═5─ ═4─ ═3─ ═2─ ═1─ ═0─ ═╧┬-─┴╘┴ ├OLLISION
-
- 32 $20 - - - - ┼├3 ┼├2 ┼├1 ┼├0 ┼XTERIOR ├OLOR
- 33 $21 - - - - ┬0├3 ┬0├2 ┬0├1 ┬0├0 ┬ACKGROUND #0 ├OLOR
- 34 $22 - - - - ┬1├3 ┬1├2 ┬1├1 ┬1├0 ┬ACKGROUND #1 ├OLOR
- 35 $23 - - - - ┬2├3 ┬2├2 ┬2├1 ┬2├0 ┬ACKGROUND #2 ├OLOR
- 36 $24 - - - - ┬3├3 ┬3├2 ┬3├1 ┬3├0 ┬ACKGROUND #3 ├OLOR
- 37 $25 - - - - ══03 ══02 ══01 ══00 ═╧┬ ═ULTICOLOR #0
- 38 $26 - - - - ══13 ══12 ══11 ══10 ═╧┬ ═ULTICOLOR #1
-
- 39 $27 - - - - ═0├3 ═0├2 ═0├1 ═0├0 ═╧┬ 0 ├OLOR
- 40 $28 - - - - ═1├3 ═1├2 ═1├1 ═1├0 ═╧┬ 1 ├OLOR
- 41 $29 - - - - ═2├3 ═2├2 ═2├1 ═2├0 ═╧┬ 2 ├OLOR
- 42 $2A - - - - ═3├3 ═3├2 ═3├1 ═3├0 ═╧┬ 3 ├OLOR
- 43 $2B - - - - ═4├3 ═4├2 ═4├1 ═4├0 ═╧┬ 4 ├OLOR
- 44 $2C - - - - ═5├3 ═5├2 ═5├1 ═5├0 ═╧┬ 5 ├OLOR
- 45 $2D - - - - ═6├3 ═6├2 ═6├1 ═6├0 ═╧┬ 6 ├OLOR
- 46 $2E - - - - ═7├3 ═7├2 ═7├1 ═7├0 ═╧┬ 7 ├OLOR
-
- ═N╪ = ═╧┬ N ╪ POSITION ═N┘ = ═╧┬ N ┘ POSITION
- ╥├ = ╥ASTER COMPARE REGISTER ┼├═ = ┼XTENDED COLOR MODE
- ═┬┬ = ┬IT MAP MODE ─┼╬ = ─ISPLAY ENABLE
- ╥╙┼╠ = ╥OW SELECT ┘ = ╙CREEN ┘ POSITION
- ╠╨╪ = ╠IGHT PEN ╪ POSITION ╠╨┘ = ╠IGHT PEN ┘ POSITION
- ═N┼ = ═╧┬ N ┼NABLE ╥┼╙ = ┴LWAYS SET TO ZERO!
- ═├═ = ═ULTICOLOR MODE ├╙┼╠ = ├OLUMN SELECT
- ╪ = ╙CREEN ╪ POSITION ═N┘┼ = ═╧┬ N ┘ EXPAND
- ╓═ = ╓IDEO MATRIX POINTER ├┬ = ├HARACTER BASE POINTER
- ═N─╨ = ═╧┬ TO DATA PRIORITY ═N═├ = ═╧┬ N MULTICOLOR SELECT
- ═N╪┼ = ═╧┬ N ╪ EXPAND
-
- =============================================================================
- ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
-
- BY ├RAIG ┬RUCE <CSBRUCE@NEUMANN.UWATERLOO.CA>
-
- 1. ╔╬╘╥╧─╒├╘╔╧╬
-
- ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
- OF ═╙-─╧╙ DISKS. ╘HE PROGRAM COPIES ONLY FROM DRIVE TO DRIVE WITHOUT
- BUFFERING FILE DATA INTERNALLY. ╘HIS IS SIMPLER AND IMPOSES NO LIMITS ON THE
- SIZE OF THE FILES TRANSFERRED, ALTHOUGH IT REQUIRES THE USE OF TWO DISK DRIVES
- (OR A LOGICAL DRIVE). ╘HE USER-INTERFACE CODE IS WRITTEN IN ┬┴╙╔├ AND
- PRESENTS A FULL-SCREEN FILE SELECTION MENU. ╘HE GRUNT-WORK CODE IS WRITTEN IN
- ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM VELOSITY.
-
- ╘HE ┬URST ├OMMAND ╔NSTRUCTION ╙ET OF THE 1571/81 IS USED TO READ THE ═╙-─╧╙
- DISK BLOCKS AND THE STANDARD KERNEL ROUTINES ARE USED FOR OUTPUTTING THE
- DATA. (╔ AM AN OPERATING SYSTEMS SPECIALIST, SO ╔ CALL IT A KERN┼L!) ╘HUS,
- THE ═╙-─╧╙ FILES MUST BE READ FROM A 1571 OR 1581 DISK DRIVE, BUT THE OUTPUT
- DEVICE MAY BE ANY DISK DRIVE TYPE, THE SCREEN OR A PRINTER, OR A VIRTUAL DRIVE
- TYPE SUCH AS ╥┴═╠INK, ╥┴═─RIVE, OR ╥┴═─╧╙ (FOR THE ╥┼╒). ╔T IS INTERESTING TO
- NOTE THAT THE DATA CAN BE READ IN FROM AN ═╙-─╧╙ DISK FASTER THAN IT CAN BE
- WRITTEN OUT TO A 1571, 1581, OR EVEN A ╥┴═─╧╙ FILE. ┴ ╥┴═╠INK CAN SWALLOW THE
- DATA ONLY SLIGHTLY FASTER THAN IT CAN BE READ.
-
- ╠ITTLE ╥ED ╥EADER (╠╥╥) SUPPORTS DOUBLE DENSITY 3.5" DISKS FORMATTED WITH 80
- TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1581 AND 5.25" DOUBLE DENSITY
- DISKS FORMATTED WITH 40 TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1571.
- ┴ LIMIT OF 128 DIRECTORY ENTRIES AND 3 ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) SECTORS IS
- IMPOSED. ╘HERE MUST BE 2 COPIES OF THE ╞┴╘ AND THE CLUSTER SIZE MAY BE 1 OR 2
- SECTORS. ╘HE SECTOR SIZE MUST BE 512 BYTES.
-
- ╧H, ABOUT THE NAME. ╔T IS A PLAY ON THE NAME OF ANOTHER ═╙-─╧╙ FILE COPIER
- AVAILABLE FOR THE ├-128. "╠ITTLE" MEANS THAT IT IS SMALLER IN SCOPE THAN THE
- OTHER PROGRAM, AND "╥ED" IS A DIFFERENT PRIMARY COLOR TO AVOID ANY LEGAL
- COMPLICATIONS. ╔T IS ALSO THE NON-WHITE COLOR OF THE FLAG OF THE COUNTRY OF
- ORIGIN OF THIS PROGRAM (NO, ╔ AM NOT ╩APANESE). ┴LSO, THIS PROGRAM IS ╨UBLIC
- ─OMAIN ╙OFTWARE, AS IS ALL SOFTWARE ╔ DEVELOP FOR 8-BIT ├OMMODORE ├OMPUTERS.
- ╞EEL FREE TO ┼-MAIL ME IF YOU HAVE QUESTIONS OR COMMENTS ABOUT THIS ARTICLE.
-
- 2. ╒╙┼╥ ╟╒╔─┼
-
- ╠╧┴─ AND ╥╒╬ THE "LRR.128" ┬┴╙╔├ PROGRAM FILE. ╫HEN THE PROGRAM IS FIRST RUN,
- IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
- LANGUAGE PACKAGE FROM THE "CURRENT" ├OMMODORE ─╧╙ DRIVE (THE CURRENT DRIVE IS
- OBTAINED FROM ╨┼┼╦(186) - THE LAST DEVICE ACCESSED). ╘HE BINARY PACKAGE IS
- LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
- PACKAGE ╔─ FIELD IS IN PLACE.
-
- 2.1. ═┴╔╬ ╙├╥┼┼╬
-
- ╘HE MAIN SCREEN OF THE PROGRAM IS THEN DISPLAYED. ╘HE MAIN SCREEN OF THE
- PROGRAM WILL LOOK SOMETHING LIKE THIS:
-
- ═╙-─┼╓=9 ═╙-╘┘╨┼=1581 ├┬═-─┼╓=8
-
- ╬╒═ ╙ ╘╥╬ ╘┘╨ ╞╔╠┼╬┴═┼ ┼╪╘ ╠┼╬╟╘╚
- --- - --- --- -------- --- ------
- 1 * ┴╙├ ╙┼╤ ╚┴├╦4 ╘╪╘ 120732
- 2 ┬╔╬ ╨╥╟ ╥┴═─╧╙ ╙╞╪ 34923
-
- ─=─╔╥┼├╘╧╥┘ ═=═╙-─┼╓ ╞=├┬═-─┼╓ ╤=╤╒╔╘
- ╘=╘╧╟╟╠┼-├╧╠╒═╬, ├=├╧╨┘-╞╔╠┼╙, +/- ╨┴╟┼
-
- EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<NO FILES>" WILL BE DISPLAYED
- RATHER THAN FILENAMES. ╘HE "═╙-─┼╓" AND "═╙-╘┘╨┼" FIELDS GIVE THE DEVICE
- NUMBER AND TYPE OF THE DRIVE CONTAINING THE ═╙-─╧╙ DISK TO COPY FROM, AND THE
- "├┬═-─┼╓" GIVES THE DEVICE NUMBER OF THE DRIVE/VIRTUAL DRIVE/CHARACTER DEVICE
- TO COPY FILE DATA TO.
-
- ╔NFORMATION ABOUT ALL ═╙-─╧╙ FILES IN THE ROOT DIRECTORY OF THE ═╙-─╧╙ DISK IS
- DISPLAYED IN COLUMNS BELOW THE DRIVE INFORMATION. "╬╒═" GIVES THE NUMBER OF
- THE ═╙-─╧╙ FILE IN THE DIRECTORY LISTING, AND "╙" INDICATES WHETHER THE FILE
- IS "SELECTED" OR NOT. ╔F THE FILE IS SELECTED, AN ASTERISK (*) IS DISPLAYED;
- OTHERWISE, A BLANK IS DISPLAYED. ╫HEN YOU LATER ENTER ├OPY ═ODE, ONLY THE
- FILES THAT HAVE BEEN "SELECTED" ARE COPIED.
-
- ╘HE "╘╥╬" FIELD INDICATES THE CHARACTER TRANSLATION SCHEME TO BE USED WHEN THE
- FILE IS COPIED. ┴ VALUE OF "┬╔╬" (BINARY) MEANS NO TRANSLATION AND A VALUE OF
- "┴╙├" (ASCII) MEANS THE FILE CHARACTERS ARE TO BE TRANSLATED FROM ═╙-─╧╙ ┴╙├╔╔
- (OR "┴╙├╔╔-├R╠F") TO ╨┼╘╙├╔╔. ╘HE "╘┘╨" FIELD INDICATES THE TYPE OF
- ├OMMODORE-─╧╙ FILE TO CREATE FOR WRITING THE ═╙-─╧╙ FILE CONTENTS INTO. ╘HE
- POSSIBLE VALUES ARE "╙┼╤" (SEQUENTIAL) AND "╨╥╟" (PROGRAM). ╘HE VALUES OF THE
- ╘╥╬ AND ╘┘╨ FILEDS ARE SET INDEPENDENTLY, SO YOU CAN COPY BINARY DATA TO ╙┼╤
- FILES AND ASCII DATA TO ╨╥╟ FILES IF YOU WISH.
-
- ╘HE "╞╔╠┼╬┴═┼" AND "┼╪╘" FIELDS GIVE THE FILENAME AND EXTENSION TYPE OF THE
- ═╙-─╧╙ FILES AND "╠┼╬╟╘╚" GIVES THE EXACT LENGTH OF THE FILES IN BYTES. ╬OTE
- THAT IF YOU PERFORM "┴╙├" TRANSLATION ON A FILE, ITS ╨┼╘╙├╔╔ VERSION WILL HAVE
- A SHORTER LENGTH.
-
- 2.2. ╒╙┼╥ ├╧══┴╬─╙
-
- ╘HE BOTTOM OF THE SCREEN GIVES THE COMMAND SUMMARY. ┴FTER STARTING THE
- PROGRAM, YOU WILL WANT TO SETUP THE ═╙-─╧╙ AND ├┬═-─╧╙ DRIVES WITH THE "═" AND
- "╞" COMMANDS. ╙IMPLY PRESS THE (LETTER) KEY CORRESPONDING TO THE COMMAND
- NAME TO ACTIVATE THE COMMAND. ╨RESSING ═ WILL PROMPT YOU FOR THE ═╙-─╧╙ ─RIVE
- ╬UMBER AND THE ═╙-─╧╙ ─RIVE ╘YPE. ╔N BOTH CASES, TYPE THE NUMBER AND PRESS
- ╥┼╘╒╥╬. (╙ORRY FOR INSULTING ALL NON-NOVICES OUT THERE, BUT ╔ WANT TO BE
- COMPLETE). ╘HE ═╙-─╧╙ DRIVE NUMBER CANNOT BE THE SAME AS THE ├┬═-─╧╙ DRIVE
- NUMBER (SINCE THE PROGRAM COPIES FROM DRIVE-TO-DRIVE WITHOUT INTERNAL
- BUFFERING). ╞OR THE DRIVE TYPE, ENTER AN "8", "81", OR "1581" FOR A 1581
- DRIVE OR ANYTHING ELSE FOR A 1571 DRIVE.
-
- ╨RESSING ╞ WILL PROMPT YOU FOR THE ├┬═-─╧╙ DEVICE NUMBER. ┘OU MAY ENTER A
- NUMBER FROM 0 TO 30, EXCEPT THAT IT MUST NOT BE THE ═╙-─╧╙ DRIVE NUMBER.
- ┼NTER A "1" FOR ├ASSETTE ─RIVE (╟OD FORBID!), A "3" FOR THE SCREEN, A "4" FOR
- THE PRINTER (WITH AN AUTOMATIC SECONDARY ADDRESS OF 7 (LOWERCASE)), ANY NUMBER
- ABOVE 7 FOR A ├OMMODORE DISK DRIVE OR SPECIAL VIRTUAL DRIVE, OR A VALUE OF "0"
- FOR THE SPECIAL "NULL" DRIVE. ┴ ├┬═-─┼╓ VALUE OF 0 WILL CASE THE PROGRAM TO
- READ ═╙-─╧╙ FILES AND DO NOTHING WITH THE OUTPUT. ┘OU CAN USE THIS FEATURE TO
- CHECK OUT THE RAW READING SPEED OF THE PROGRAM.
-
- ┴FTER SETTING UP THE DRIVES, PRESS ─ TO READ IN THE ROOT DIRECTORY OFF THE
- ═╙-─╧╙ DISK. ╘HE DATA WILL COME BLAZING IN FROM THE DISK BUT ┬┴╙╔├ WILL TAKE
- ITS GOOD OLE TIME SIFTING THROUGH IT. ╞ILENAMES ARE DISPLAYED ON THE SCREEN
- AS THEY ARE SCANNED IN. ╘HE PROGRAM WILL (EVENTUALLY) RETURN TO THE MAIN
- SCREEN AND DISPLAY THE FORMATTED FILE INFORMATION. ╧NE NOTE: THE PROCESS OF
- LOGGING IN A 1581 ═╙-─╧╙ DISK TAKES ABOUT 12 SECONDS (ON MY 1581, ANYWAY), SO
- BE PATIENT. ┴N ═╙-─╧╙ DISK WILL HAVE TO BE "LOGGED IN" EVERY TIME YOU CHANGE
- ═╙-─╧╙ DISKS. (─ISKS ARE LOGGED IN AUTOMATICALLY).
-
- ┴ COUPLE OF NOTES ABOUT ACCESSING ═╙-─╧╙ DISKS: DON'T TRY TO ACCESS A DEVICE
- THAT IS NOT PRESENT BECAUSE THE MACHINE LANGUAGE ROUTINES CANNOT HANDLE THIS
- ERROR FOR SOME REASON AND WILL LOCK UP, REQUIRING A ╙╘╧╨+╥┼╙╘╧╥┼. ┴LSO, MAKE
- SURE THAT AN ACTUAL ═╙-─╧╙ DISK IS LOADED INTO THE DRIVE. ╔F YOU ACCIDENTALLY
- PLACE ├OMMODORE-─╧╙ DISK INTO THE ═╙-─╧╙ DRIVE, THE 1581 WILL REPORT AN
- INVALID BOOT PARAMETERS ERROR (#60), BUT A 1571 WILL LOCK UP (SINCE ╔ DON'T
- CHECK THE SECTOR SIZE AND MY BURST ROUTINES ARE EXPECTING 512 BYTES TO COME
- OUT OF A SECTOR WHEREAS ├OMMODORE DISKS HAVE ONLY 256 BYTES PER SECTOR).
-
- ╬OW YOU ARE READY TO PICK WHAT FILES YOU WANT COPIED AND HOW YOU WANT THEM
- COPIED. ┘OU WILL NOTICE THAT A "CURSOR" APPEARS IN THE "╙" COLUMN OF THE
- FIRST FILE. ┘OU MAY MOVE THE CURSOR AROUND WITH THE CURSOR KEYS: ╒╨, ─╧╫╬,
- ╠┼╞╘, ╥╔╟╚╘, ╚╧═┼, AND ├╠╥. ├╠╥ (╙╚╔╞╘-╚╧═┼) WILL MOVE THE CURSOR BACK TO THE
- FIRST FILE ON THE FIRST SCREEN. ┘OU CAN MOVE THE CURSOR AMONG THE SELECT,
- TRANSLATION, AND FILE-TYPE COLUMNS OF ALL THE FILES. ╨RESSING A ╙╨┴├┼ OR A
- ╥┼╘╒╥╬ WILL TOGGLE THE VALUE OF THE FIELD THAT THE CURSOR IS ON. ╘O TOGGLE
- ALL OF THE VALUES OF THE "CURSOR" COLUMN (INCLUDING FILES ON ALL OTHER
- SCREENS), PRESS ╘. ┘OU WILL NOTICE THAT MOVING THE CURSOR AROUND AND TOGGLING
- FIELDS IS A BIT SLUGGISH, ESPECIALLY IF YOU ARE IN ╙LOW MODE ON THE 40-COLUMN
- SCREEN. ─ID ╔ MENTION THAT THIS PROGRAM WILL RUN ON EITHER THE 40 OR
- 80-COLUMN SCREEN? ╘OGGLING AN ENTIRE COLUMN CAN TAKE A COUPLE OF SECONDS.
-
- ╔F THERE ARE MORE THAN 18 ═╙-─╧╙ FILES, YOU CAN PRESS THE "+" AND "-" KEYS TO
- MOVE AMONG ALL OF THE SCREENS OF FILES. ╘HE CURSOR MOVEMENT KEYS WILL WRAP
- AROUND ON THE CURRENT SCREEN. "+" IS PAGE FORWARD, AND "-" IS PAGE BACKWARD.
- ╘HE SCREENS WRAP AROUND TOO.
-
- ┴FTER YOU HAVE SELECTED ALL OF THE FILES YOU WANT TO COPY AND THEIR TRANSLATION
- AND FILE-TYPE FIELDS HAVE BEEN SET, PRESS THE ├ KEY TO GO INTO ├OPY ═ODE (NEXT
- SECTION). ┴FTER COPYING, YOU ARE RETURNED TO THE MAIN SCREEN WITH ALL OF THE
- FIELD SETTINGS STILL INTACT. ╘O EXIT FROM THE PROGRAM, PRESS ╤.
-
- 2.3. ├╧╨┘ ═╧─┼
-
- ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
- FILE IS DISPLAYED AS IT IS BEING COPIED. ╔F AN ERROR IS ENCOUNTERED ON EITHER
- THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
- AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS).
-
- ╘O GENERATE A ├┬═-─╧╙ FILENAME FROM AN ═╙-─╧╙ FILENAME, THE EIGHT FILENAME
- CHARACTERS ARE TAKEN (INCLUDING SPACES) AND A DOT (.) AND THE THREE CHARACTERS
- OF THE EXTENSION ARE APPENDED. ╘HEN, ALL SPACES ARE REMOVED, AND IF THE NAME
- ENDS WITH A DOT (.) CHARACTER, THEN THAT DOT CHARACTER IS REMOVED AS WELL. ╔
- THINK THIS IS FAIRLY REASONABLE.
-
- ╔F THERE ALREADY IS A FILE WITH THE SAME FILENAME ON THE ├┬═-─╧╙ DISK, THEN
- YOU WILL BE PROMPTED IF YOU WANT TO OVERWRITE THE FILE OR NOT. ┼NTERING AN
- "N" WILL ABORT THE COPYING OF THAT FILE AND GO ON TO THE NEXT FILE, AND
- ENTERING A "Y" (OR ANYTHING ELSE) WILL CAUSE THE ├┬═-─╧╙ FILE TO BE
- "SCRATCHED" AND THEN RE-WRITTEN.
-
- ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
- NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
- THINGS BY LOOKING AT DAS BLINKIN LICHTES AND LISTENING FOR CLICKS AND GRINDS.
- ┘OU WILL PROBABLY BE SURPRISED BY THE ═╙-─╧╙ FILE READING SPEED (╔ MEAN IN A
- GOOD WAY). ╘HE DISK DATA IS READ IN WHOLE TRACKS AND CACHED IN MEMORY AND THE
- DIRECTORY INFORMATION AND THE ╞┴╘ ARE RETAINED IN MEMORY AS WELL. ╘HE RESULT
- IS THAT MINIMAL TIME IS SPENT READING DISK DATA, AND NO COSTLY SEEKS ARE
- REQUIRED FOR OPENING A NEW ═╙-─╧╙ FILE. ┴ RESULT IS THAT SMALL FILES ARE
- COPIED ONE AFTER ANOTHER VERY QUICKLY. ┘OU WILL HAVE TO WAIT, HOWEVER, ON THE
- RELATIVELY SLOW STANDARD KERNEL/├OMMODORE-─╧╙ FILE WRITING.
-
- ┴ FEW CHANGES HAD TO BE MADE TO THE PROGRAM TO ACCOMODATE THE ╥┴═─╧╙ PROGRAM.
- ╥┴═─╧╙ USES MEMORY FROM $2300 TO $3╞╞╞ OF ╥┴═0, WHICH IS NOT REALLY A GOOD
- PLACE FOR A DEVICE DRIVER, AND IT USES SOME OF THE ZERO-PAGE LOCATIONS THAT ╔
- WANTED TO USE. ┬UT, DIFFICULTIES WERE OVERCOME. ╘HE IMPORTANCE OF ╥┴═─╧╙
- COMPATIBILITY IS THAT IF YOU ONLY HAVE ONE DISK DRIVE BUT YOU HAVE AN ╥┼╒, YOU
- CAN USE ╥┴═─╧╙ TO STORE THE ═╙-─╧╙ FILES TEMPORARILY. ╔F YOU ONLY HAVE ONE
- DISK DRIVE AND NO ╥┼╒, YOU ARE ╙╧╠ (╧UT OF ╠UCK) UNLESS YOU CAN GET A
- ╥AM─ISK-TYPE PROGRAM FOR AN UNEXPANDED 128. ╘HE ╥┴═─╧╙ PROGRAM IS AVAILABLE
- FROM ╞╘╨ SITE "CCOSUN.CALTECH.EDU" IN FILE "/PUB/RKNOP/UTIL128/RAMDOSII.SFX".
- ╧NE NOTE ╔ FOUND OUT ABOUT ╥┴═─╧╙: YOU CANNOT USE A
-
- ─╧╨┼╬#1,(├╞$),╒(├─),╫
-
- WITH IT LIKE YOU ARE SUPPOSED TO BE ABLE TO; YOU HAVE TO USE A
-
- ─╧╨┼╬#1,(├╞$+",╫"),╒(├─)
-
- ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING FROM 1571S AND 1581S WITH ┴╙├
- AND ┬╔╬ TRANSLATION MODES. ┴LL FIGURES ARE IN BYTES/SECOND. ╘HESE RESULTS
- WERE OBTAINED FROM COPYING A 127,280 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING
- ╔SSUE #3).
-
- ╞╥╧═ \ ╘╧: "NULL" ╥┴═╠INK ╥┴═─╧╙ ╩─1581 ╩─1571
- -------+ ------ ------- ------ ------ ------
- 81-BIN ▄ 5772 3441 2146 N/A 644
- 81-ASC ▄ 5772 3434 2164 N/A 661
- 71-BIN ▄ 4323 2991 1949 1821 N/A
- 71-ASC ▄ 4323 2982 1962 1847 N/A
-
- ╘HE "NULL" DEVICE IS THAT "0" ├┬═-─╧╙ DEVICE NUMBER, AND A COUPLE OF ENTRIES
- ARE "N/A" SINCE ╔ ONLY HAVE ONE 1571 AND ONE 1581. ╬OTE THAT MY 71 AND 81 ARE
- ╩IFFY─╧╙-IFIED, SO THE PERFORMANCE OF A STOCK 71/81 WILL BE POORER. ╩IFFY─╧╙
- GIVES ABOUT A 2X PERFORMANCE IMPROVEMENT FOR THE STANDARD FILE ACCESSING CALLS
- (OPEN, CLOSE, CHRIN, CHROUT). ╥┴═─╧╙ DOESN'T SEEM TO BE AS SNAPPY AS YOU
- MIGHT THINK.
-
- ╘HE "NULL" FIGURES ARE QUITE IMPRESSIVE, BUT THE RAW SECTOR READING SPEED
- WITHOUT THE OVERHEAD OF MUCKING AROUND WITH FILE ORGANIZATION IS 6700
- BYTES/SEC FOR A 1581 AND 4600 ┬/S FOR A 71. ╘HE REASON THAT THE 1571 OPERATES
- SO QUICKLY IS THAT ╔ USE A SECTOR INTERLEAVE OF 4 (WHICH IS OPTIMAL) FOR
- READING THE TRACKS. ╔ THINK THAT OTHER ═╙-─╧╙ FILE COPIER PROGRAM USES AN
- INTERLEAVE OF 1 (WHICH IS NOT OPTIMAL). ╔ LOSE SOME OF THE RAW PERFORMANCE
- BECAUSE ╔ COPY THE FILE DATA INTERNALLY ONCE BEFORE OUTPUTTING IT (TO SIMPLIFY
- SOME OF THE CODE).
-
- ╔N A COUPLE OF PLACES YOU WILL NOTICE THAT ┴╙├ TRANSLATION GIVES SLIGHTLY
- BETTER OR SLIGHTLY WORSE PERFORMANCE THAN ┬╔╬. ╘HIS IS BECAUSE ALTHOUGH
- SLIGHTLY MORE WORK IS REQUIRED TO TRANSLATE THE CHARACTERS, SLIGHTLY FEWER
- CHARACTERS WILL HAVE TO BE WRITTEN TO THE ├┬═-─╧╙ FILE, SINCE ╨┼╘╙├╔╔ USES
- ONLY ├╥ WHERE ═╙-─╧╙ ┴╙├╔╔ USES ├╥ AND ╠╞ TO REPRESENT END-OF-LINE.
- ╘RANSLATION IS DONE BY USING A TABLE (THAT YOU CAN CHANGE IF YOU WISH). ═ANY
- ENTRIES IN THIS TABLE CONTAIN A VALUE OF ZERO, WHICH MEANS THAT NO CHARACTER
- WILL BE OUTPUT ON TRANSLATION. ═OST OF THE CONTROL CHARACTERS AND ALL OF THE
- CHARACTERS OF VALUE 128 (0X80) OR GREATER ARE THROWN AWAY ON BEING
- TRANSLATED. ╘HE TABLE IS SET UP SO THAT ├╥ CHARACTERS ARE THROWN AWAY AND THE
- ╠╞ CHARACTER IS TRANSLATED TO A ├┬═-─╧╙ ├╥ CHARACTER. ╘HUS, BOTH ═╙-─╧╙ ┴╙├╔╔
- FILES AND ╒╬╔╪ ┴╙├╔╔ FILES CAN BE TRANSLATED CORRECTLY.
-
- 2. ┬╒╥╙╘ ├╧══┴╬─╙
-
- ╘HREE BURST COMMANDS FROM THE 1571/81 DISK DRIVE ┬URST ├OMMAND ╔NSTRUCTION ╙ET
- ARE REQUIRED TO ALLOW THIS PROGRAM TO READ THE ═╙-─╧╙ DISKS: ╤UERY ─ISK
- ╞ORMAT, ╙ECTOR ╔NTERLEAVE, AND ╥EAD. ╘HE GRUNGY DETAILS ABOUT ISSUING BURST
- COMMANDS AND BURST MODE HANDSHAKING ARE COVERED IN ├= ╚ACKING ╔SSUE #3. ╘HE
- ╤UERY ─ISK ╞ORMAT COMMAND IS USED TO "LOG IN" THE ═╙-─╧╙ DISK. ╘HE ╔NQUIRE
- ─ISK BURST COMMAND CANNOT BE USED WITH AN ═╙-─╧╙ DISK ON THE 1581 FOR SOME
- UNKNOWN REASON. ╔ FOUND THIS OUT THE HARD WAY. ╘HE ╤UERY ─ISK ╞ORMAT COMMAND
- HAS THE FOLLOWING FORMAT:
-
- ┬┘╘┼ \ BIT: 7 6 5 4 3 2 1 0 ▄ ╓ALUE
- -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
- 0 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ "╒"
- 1 ▄ 0 ▄ 0 ▄ 1 ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ "0"
- 2 ▄ ╞ ▄ ╪ ▄ ╪ ▄ ╙ ▄ 1 ▄ 0 ▄ 1 ▄ ╬ ▄ 10
- -------+--------------------------------------------------+-------
-
- WHERE THE ╞, ╙, AND ╬ BITS HAVE A VALUE OF 0 FOR OUR PURPOSES. ┴ RESPONSE OF
- A BURST STATUS BYTE AND SIX OTHER THROW-AWAY BYTES IS GIVEN FROM THE DRIVE.
- ╘HIS COMMAND TAKES QUITE A LONG TIME TO EXECUTE ON MY 1581 BUT WORKS QUITE
- QUICKLY ON MY 1571. ┘OU ONLY HAVE TO LOG IN A DISK WHENEVER YOU CHANGE
- DISKS.
-
- ╘HE ╙ECTOR ╔NTERLEAVE COMMAND IS USED TO SET A SOFT INTERLEAVE FOR THE ╥EAD
- COMMAND. ╔ USE AN INTERLEAVE OF 1 FOR THE 1581 AND AN INTERLEAVE OF 4 FOR THE
- 1571. ╘HIS MEANS THAT THE ═╙-─╧╙ SECTORS WILL COME FROM 1571 TO THE COMPUTER
- IN THE FOLLOWING ORDER: 1, 5, 9, 4, 8, 3, 7, 2, 6 (THERE ARE 9 SECTORS PER
- TRACK ON AN ═╙-─╧╙ DISK (BOTH 3.5" AND 5.25"), NUMBERED FROM 1 TO 9). ╠╥╥
- HANDLES THE DATA COMING IN IN THIS ORDER, AND IN STRAIGHT ORDER FROM THE
- 1581. ╘HE ╙ECTOR ╔NTERLEAVE COMMAND HAS THE FOLLOWING FORMAT, WHERE THE ╫ AND
- ╬ BITS ARE 0 FOR US:
-
- ┬┘╘┼ \ BIT: 7 6 5 4 3 2 1 0 ▄ ╓ALUE
- -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
- 0 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ "╒"
- 1 ▄ 0 ▄ 0 ▄ 1 ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ "0"
- 2 ▄ ╫ ▄ ╪ ▄ ╪ ▄ 0 ▄ 1 ▄ 0 ▄ 0 ▄ ╬ ▄ 8
- 3 ▄ <INTERLEAVE> ▄ 1 OR 4
- -------+--------------------------------------------------+-------
-
- ╘HE ╥EAD COMMAND IS USED TO TRANSFER THE NINE SECTORS OF A TRACK TO THE
- COMPUTER IN THE ORDER SPECIFIED BY THE INTERLEAVE. ╘HE FORMAT IS:
-
- ┬┘╘┼ \ BIT: 7 6 5 4 3 2 1 0 ▄ ╓ALUE
- -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
- 0 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ 0 ▄ 1 ▄ "╒"
- 1 ▄ 0 ▄ 0 ▄ 1 ▄ 1 ▄ 0 ▄ 0 ▄ 0 ▄ 0 ▄ "0"
- 2 ▄ ╘/╠ ▄ ┼ ▄ ┬/╪ ▄ ╙ ▄ 0 ▄ 0 ▄ 0 ▄ ╬ ▄ 0 OR 16
- 3 ▄ <TRACK> ▄ ???
- 4 ▄ <SECTOR> ▄ 1
- 5 ▄ <NUMBER OF SECTORS> ▄ 9
- -------+--------------------------------------------------+-------
-
- ╘HERE ARE A COUPLE OF DIFFERENCES BETWEEN THE 1571 AND 1581 VERSIONS OF THIS
- COMMAND. ═OST IMPORTANT, THE ╙ BIT (╙IDE OF DISK TO USE) HAS THE OPPOSITE
- MEANING ON THE TWO DRIVES. ╘HERE'S NO GOOD REASON THAT ╔ KNOW OF FOR THIS
- INCONSISTENCY. ╘HIS IS THE REASON THAT ╠╥╥ NEEDS TO KNOW WHAT TYPE OF ═╙-─╧╙
- DRIVE IT IS DEALING WITH (PLUS INTERLEAVING).
-
- ╘HE READ COMMAND RETURNS THE FOLLOWING DATA USING BURST MODE HANDSHAKING:
-
- +-------------------+
- 0 ▄ ┬URST ╙TATUS ┬YTE ▄
- +-------------------+
- 1 ▄ ▄
- ... + 512 ─ATA ┬YTES ▄
- 512 ▄ ▄
- +-------------------+
-
- FOR EACH SECTOR TRANSFERRED. ╔F THE ┬URST ╙TATUS ┬YTE INDICATES AN ERROR,
- THEN THE DATA IS NOT TRANSFERRED AND NONE OF THE FOLLOWING SECTORS ARE
- EITHER. ╔F THE STATUS BYTE GIVES A "─ISK ├HANGED" ERROR, THEN YOU HAVE TO LOG
- IN THE DISK WITH THE ╤UERY ─ISK ╞ORMAT COMMAND BEFORE READ WILL WORK
- PROPERLY. ╘HIS IS ACTUALLY A GOOD FEATURE SINCE IT LETS YOU KNOW ABOUT A DISK
- CHANGE SO YOU CAN UPDATE ANY DATA STRUCTURES YOU MAY HAVE. ╠╥╥ SIMPLY RE-LOGS
- IN THE DISK WITHOUT UPDATING ANY DATA STRUCTURES AND RE-TRIES THE FAILED READ
- OPERATION.
-
- 3. ═╙-─╧╙ ─╔╙╦ ╞╧╥═┴╘
-
- ┴N ═╙-─╧╙ DISK IS SEPARATED INTO 4 DIFFERENT PARTS: THE ┬OOT ╙ECTOR, THE
- ╞┴╘(S), THE ╥OOT ─IRECTORY, AND THE ╞ILE ─ATA ╙ECTORS. ╘HE LOGICAL SECTORS
- (BLOCKS) OF A DISK ARE NUMBERED FROM 0 TO SOME MAXIMUM NUMBER (1439 FOR A
- 3.5", 719 FOR A 5.25" ── DISK). ╘HE PHYSICAL LAYOUT AND THE LOGICAL SECTOR
- NUMBERS TYPICALLY USED BY A 3.5" DISK ARE SHOWN HERE:
-
- +-------------------+
- 0 ▄ ┬OOT ╙ECTOR ▄
- +-------------------+
- 1..3 ▄ ╞┴╘ COPY #1 ▄
- +-------------------+
- 4..6 ▄ ╞┴╘ COPY #2 ▄
- +-------------------+
- 7..14 ▄ ╥OOT ─IRECTORY ▄
- +-------------------+
- 15 ▄ ▄
- ... ▄ ╞ILE ─ATA ╙ECTORS ▄
- 1439 ▄ ▄
- +-------------------+
-
- 3.1. ╘╚┼ ┬╧╧╘ ╙┼├╘╧╥
-
- ╘HE ┬OOT ╙ECTOR IS ALWAYS AT LOGICAL SECTOR NUMBER 0. ╔T CONTAINS SOME
- IMPORTANT INFORMATION ABOUT THE FORMAT OF THE DISK AND IT ALSO CONTAINS CODE
- TO BOOT AN ═╙-─╧╙ MACHINE FROM. ╫E AREN'T CONCERNED WITH THE BOOTSTRAPPING
- CODE, BUT THE IMPORTANT VALUES WE NEED TO OBTAIN FROM THE BOOT SECTOR ARE:
-
- ┴┬┬╥ ╧╞╞╙┼╘ 1571 1581 ─┼╙├╥╔╨╘╔╧╬
- ---- ------ ---- ---- -----------
- ├╙ 13 2 2 ├LUSTER SIZE IN SECTORS
- ╬┬ 14 1 1 ╬UMBER OF BOOT SECTORS
- ╬╞ 16 2 2 ╬UMBER OF ╞┴╘S
- ╞╠ 23 2 3 ╞┴╘ SIZE IN SECTORS
- ─┼ 17 112 112 ╬UMBER OF ROOT DIRECTORY ENTRIES
- ╘╙ 19,20 720 1440 ╘OTAL ╬UMBER OF SECTORS
- ╬╙ 24 9 9 ╬UMBER OF SECTORS PER TRACK
- ╬╚ 26 2 2 ╬UMBER OF SIDES
-
- ╘HE 1571 AND 1581 COLUMNS GIVE THE TYPICAL VALUES OF THESE PARAMETERS FOR
- 5.25" AND 3.5" DISKS. ╘HE ╧╞╞╙┼╘ IS THE ADDRESS OF THE PARAMETER WITHIN THE
- BOOT SECTOR. ╘HE TOTAL NUMBER OF SECTORS IS GIVEN IN LOW-BYTE, HIGH-BYTE
- ORDER (SINCE THE 80X86 FAMILY IS LITTLE-ENDIAN LIKE THE 6502 FAMILY). ╞ROM
- THE ABOVE PARAMETERS, WE CAN DERIVE THE FOLLOWING IMPORTANT PARAMETERS:
-
- ┴┬┬╥ ╞╧╥═╒╠┴ 1571 1581 ─┼╙├╥╔╨╘╔╧╬
- ---- ------- ---- ---- -----------
- ╞1 ╬┬+╬╞*╞╠ 5 7 ╞IRST ROOT DIRECTORY SECTOR
- ╞╙ ╬┬+╬╞*╞╠+─┼ 12 14 ╞IRST FILE DATA SECTOR NUMBER
- ╬├ (╘╙-╞╙)/├╙ 354 713 ╘OTAL NUMBER OF FILE CLUSTERS
-
- ╠╥╥ IMPOSES A NUMBER OF LIMITS ON THESE PARAMETERS AND WILL ERROR-OUT IF YOU
- TRY TO USE A DISK THAT IS OUTSIDE OF ╠╥╥'S LIMITS.
-
- 3.2. ├╚┼╫╔╬╟ ╘╚┼ ╞┴╘
-
- ═╙-─╧╙ DISKS USE A DATA STRUCTURE CALLED A ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) TO
- RECORD WHICH CLUSTERS BELONG TO WHICH FILE IN WHAT ORDER AND WHICH BLOCKS ARE
- FREE. ┴ CLUSTER IS A SET OF CONTIGUOUS SECTORS WHICH ARE ALLOCATED TO FILES
- AS A GROUP. ╠╥╥ HANDLES CLUSTER SIZES OF 1 AND 2 SECTORS, GIVING A LOGICAL
- FILE BLOCK SIZE OF 512 OR 1024 BYTES. ╘YPICALLY, A CLUSTER SIZE OF 2 SECTORS
- IS USED.
-
- ╘HE ╞┴╘ IS AN ARRAY OF 12-BIT NUMBERS, WITH AN ENTRY CORRESPONDING TO EACH
- CLUSTER THAT CAN BE ALLOCATED TO FILES. ╞┴╘ ENTRIES 0 AND 1 ARE RESERVED. ╔F
- A ╞┴╘ ENTRY CONTAINS A VALUE OF $000, THEN THE CORRESPONDING CLUSTER IS FREE
- AND CAN BE ALLOCATED TO A FILE; OTHERWISE, THE CLUSTER IS ALLOCATED AND THE
- ╞┴╘ ENTRY CONTAINS THE NUMBER OF THE ╬┼╪╘ ╞┴╘ ENTRY THAT BELONGS TO THE FILE.
- ╘HUS, ═╙-─╧╙ FILES ARE STORED IN A SINGLY-LINKED LIST OF CLUSTERS LIKE
- ├OMMODORE-─╧╙ FILES ARE, EXCEPT THAT THE LINKS ARE NOT IN THE DATA SECTORS BUT
- RATHER ARE IN THE ╞┴╘. ╘HE POINTER TO THE FIRST ╞┴╘ ENTRY FOR A FILE IS GIVEN
- IN THE FILE'S DIRECTORY ENTRY.
-
- ┴ SPECIAL ╬╒╠╠/╬╔╠ POINTER VALUE OF $╞╞╞ IS USED TO INDICATE THE END OF THE
- CHAIN OF CLUSTERS ALLOCATED TO A FILE. ╘HIS VALUE IS STORED IN THE ╞┴╘ ENTRY
- OF THE LAST CLUSTER ALLOCATED TO A FILE (OF COURSE). ├ONSIDER THE FOLLOWING
- EXAMPLE ╞┴╘:
-
- ┼╬╘╥┘ ╓┴╠╒┼
- ----- -----
- $000 $╞╞╞
- $001 $╞╞╞
- $002 ▄----$003 <------─IRECTORY ┼NTRY
- $003 +--> $005----+
- $004 $000 ▄
- $005 $╞╞╞ <--+
-
- ┼NTRIES 0 AND 1 ARE INSIGNIFICANT SINCE THEY ARE RESERVED. ╙AY THAT A FILE
- STARTS AT ╞┴╘ ENTRY #2. ╘HEN, IT CONSISTS OF THE FOLLOWING CHAIN OF CLUSTERS:
- 2, 3, AND 5. ├LUSTER #4 IS FREE. ├LUSTERS CAN BE ALLOCATED TO A FILE IN
- RANDOM ORDER, BUT IF THEY ARE ALLOCATED CONTIGUOUSLY IN FORWARD ORDER, THEN
- THE FILE WILL BE ABLE TO BE READ FASTER. ╘HE ╞┴╘ IS SUCH AN IMPORTANT DATA
- STRUCTURE THAT TYPICALLY TWO COPIES ARE KEPT ON THE DISK INCASE ONE OF THEM
- SHOULD BECOME CORRUPTED.
-
- ╘HE ═╙-─╧╙ DESIGNERS WERE A LITTLE SNEAKY IN STORING THE 12-BIT ╞┴╘ ENTRIES -
- THEY USED ONLY 12 REAL BITS PER ENTRY. ╔E., THEY STORE TWO ╞┴╘ ENTRIES IN
- THREE BYTES, WHERE THE TWO ENTRIES SHARE THE TWO NYBBLES OF THE MIDDLE BYTE.
- ╘HE FOLLOWING DIAGRAM SHOWS HOW THE NYBBLES 1 (HIGH), 2 (MID), AND 3 (LOW) ARE
- STORED INTO ╞┴╘ ENTRIES ┴ AND ┬:
-
- ┬┘╘┼: 0 1 2
- +---+---+ +---+---+ +---+---+
- ┼╬╘╥┘: ▄ ┴ ▄ ┴ ▄ ▄ ┬ ▄ ┴ ▄ ▄ ┬ ▄ ┬ ▄
- ╬┘┬┬╠┼: ▄ 2 ▄ 3 ▄ ▄ 3 ▄ 1 ▄ ▄ 1 ▄ 2 ▄
- +---+---+ +---+---+ +---+---+
-
- ┴NYWAY, LET'S JUST SAY IT'S A BIT TRICKY TO EXTRACT THE 12-BIT VALUES FROM
- THIS COMPRESSED DATA STRUCTURE. ╧N TOP OF THAT, ╔ DON'T THINK THERE IS ANY
- SAVING IN DISK SPACE RESULTING FROM COMPRESSING THIS STRUCTURE; THEY MIGHT AS
- WELL HAVE JUST USED A 16-BIT ╞┴╘ (LIKE THEY DO NOWADAYS ON LARGER DISKS).
-
- 3.3. ╘╚┼ ╥╧╧╘ ─╔╥┼├╘╧╥┘
-
- ╘HE ROOT DIRECTORY HAS A FIXED SIZE, ALTHOUGH ╔ DON'T THINK THAT
- SUBDIRECTORIES DO. ╠╥╥ CANNOT ACCESS SUBDIRECTORIES. ┼ACH 512-BYTE SECTOR OF
- THE ROOT DIRECTORY CONTAINS SIXTEEN 32-BYTE DIRECTORY ENTRIES. ╧NE DIRECTORY
- ENTRY IS REQUIRED FOR EACH FILE STORED ON THE DISK. ┴ DIRECTORY ENTRY HAS THE
- FOLLOWING STRUCTURE:
-
- ╧╞╞╙┼╘ ╠┼╬ ─┼╙├╥╔╨╘╔╧╬
- ------ --- -----------
- 0..7 8 ╞ILENAME
- 8..10 3 ┼XTENSION
- 11 1 <UNUSED?>
- 12 1 ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
- 13..21 9 <UNUSED>
- 22..25 4 ─ATE
- 26..27 2 ╙TARTING ╞┴╘ ENTRY NUMBER
- 28..31 4 ╞ILE LENGTH IN BYTES
-
- ╘HE FILENAME AND EXTENSION ARE STORED WITH TRAILING PADDING SPACES. ╔F A
- DIRECTORY ENTRY IS UNUSED OR DELETED, THEN THE FIRST CHARACTER OF THE FILENAME
- IS EITHER A $00 OR A $┼5 (229). ╘HIS IS WHY YOU HAVE TO PROVIDE THE FIRST
- CHARACTER OF A FILENAME IF YOU ARE UNDELETING A FILE ON AN ═╙-─╧╙ MACHINE.
- ╬OTE THAT THERE IS ENOUGH UNUSED SPACE THAT ═ICROSOFT OR ╔┬═ COULD HAVE
- DITCHED THE ANNOYING 8+3 CHARACTER FILENAME FORMAT.
-
- ╘HE ATTRIBUTES BITS TELL WHETHER THE DIRECTORY ENTRY IS FOR A REGULAR FILE, A
- SUBDIRECTORY, A DISK VOLUME NAME (IN WHICH CASE THERE IS NO FILE DATA), AND A
- COUPLE OF OTHER THINGS ╔ CAN'T REMEMBER. ╔'M NOT SURE ABOUT THE EXACT
- POSITION OR FORMAT OF THE DATE, BUT ╠╥╥ DOESN'T USE IT ANYWAY. ╘HE STARTING
- ╞┴╘ ENTRY NUMBER AND THE FILE LENGTH ARE STORED IN LOWER-BYTE-FIRST ORDER.
-
- 3.4. ╘╚┼ ╞╔╠┼ ─┴╘┴ ╙╨┴├┼
-
- ╘HE RAMAINDER OF THE DISK SPACE IS USED FOR STORING FILE DATA IN CLUSTERS OF 1
- OR 2 SECTORS EACH. ╟IVEN A CLUSTER NUMBER (WHICH IS ALSO THE ╞┴╘ ENTRY
- NUMBER), THE FOLLOWING FORMULA IS USED TO CALCULATE THE STARTING LOGICAL
- SECTOR NUMBER OF THE CLUSTER:
-
- (├LUSTER╬UMBER - 2) * ├LUSTER╙IZE╔N┬LOCKS + ╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER
-
- WHERE "╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER" IS THE "╞╙" PARAMETER DERIVED
- EARLIER. ╘HE FOLLOWING CONSECUTIVE LOGICAL SECTOR NUMBERS UP TO THE NUMBER OF
- SECTORS PER CLUSTER FORM THE REST OF THE CLUSTER. ╬OTE THAT A SINGLE CLUSTER
- CAN SPAN SECTORS FROM ONE SIDE OF THE DISK TO ANOTHER OR FROM ONE TRACK TO
- ANOTHER. ╫E PERFORM THE "(├LUSTER╬UMBER - 2)" PORTION OF THE CALCULATION
- SINCE THE FIRST TWO ╞┴╘ ENTRIES ARE RESERVED.
-
- ╙INCE THE ╥EAD BURST COMMAND OF THE 1571/81 WANTS THE SIDE, TRACK, AND SECTOR
- NUMBER OF A SECTOR RATHER THAN ITS LOGICAL NUMBER, WE ALSO NEED FORMULAE FOR
- THESE CONVERSIONS:
-
- ╘RACK = ╠OGICAL╙ECTOR╬UMBER / 18
- ╙ECTOR = ╠OGICAL╙ECTOR╬UMBER % 9 + 1
- ╙IDE = (╠OGICAL╙ECTOR╬UMBER / 9) % 2
-
- ╘HESE FORMULAE ARE MORE PROBLEMATIC THAN THE PREVIOUS ONE SINCE THEY REQUIRE
- DIVISION BY 9 AND 18. ╠╥╥ USES THE METHOD OF REPEATED SUBTRACTION TO PERFROM
- THE NECESSARY DIVISION (ONLY ONE DIVISION IS NECESSARY). ╘HE ABOVE FORMULAE
- IMPLY THAT SEQUENTIAL LOGICAL SECTORS ARE STORED ON THE TOP OF THE DISK
- FIRST AND THEN THE BOTTOM OF THE DISK OF THE SAME TRACK, AND THEN ON THE TOP
- OF THE NEXT TRACK, ETC. ╘HIS IS A GOOD SECTOR NUMBERING SCHEME (UNLIKE THE
- ├┬═-─╧╙ SCHEME FOR 1571 SECTORS) SINCE IT IS FASTER TO SWITCH SIDES OF THE
- DISK THAN IT IS TO SWITCH TRACKS, SO YOU CAN READ THE DISK FASTER.
-
- ╧H YEAH, THE WAY THAT YOU KNOW HOW MANY FILE DATA BYTES ARE IN THE LAST
- CLUSTER OF A FILE CHAIN (THE CLUSTER WITH THE ╬╒╠╠ ╞┴╘ ENTRY) IS TO TAKE THE
- FILE LENGTH FROM THE DIRECTORY ENTRY AND "MOD" (THE ├ LANGUAGE % OPERATOR) IT
- WITH THE CLUSTER SIZE. ╧NE SPECIAL CASE IS IF THIS CALCULATION RESULTS IN A
- ZERO, THEN THE LAST CLUSTER IS COMPLETELY FULL (RATHER THAN COMPLETELY EMPTY
- AS THE CALCULATION WOULD SUGGEST). ╘HIS CALCULATION IS EASILY DONE IN
- MACHINE LANGUAGE WITH AN ┴╬─ OPERATION SINCE THE CLUSTER SIZE IS ALWAYS A
- POWER OF TWO.
-
- 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
-
- ╘HIS SECTION DISCUSSES THE INTERFACE TO AND IMPLEMENTATION OF THE ═╙-─╧╙ FILE
- COPYING PACKAGE. ╔T IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO MEMORY
- AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY. ╘HE PACKAGE IS
- LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├ PROGRAM,
- EVEN IF ╥┴═─╧╙ IS INSTALLED.
-
- 4.1. ╔╬╘┼╥╞┴├┼
-
- ╘HE SUBROUTINE CALL AND PARAMETER PASSING INTERFACE TO THE FILE COPYING
- PACKAGE IS SUMMARIZED AS FOLLOWS:
-
- ┴──╥┼╙╙ ─┼╙├╥╔╨╘╔╧╬
- ------- -----------
- ╨╦ ╔NIT╨ACKAGE SUBROUTINE
- ╨╦+3 ╠OAD─IRECTORY SUBROUTINE
- ╨╦+6 ├OPY╞ILE SUBROUTINE
- ╨╦+9 TWO-BYTE PACKAGE IDENTIFICATION NUMBER
- ╨╦+15 ERRNO : ERROR CODE RETURNED
- ╨╦+16 ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
- ╨╦+17 ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
- ╨╦+18 TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
- ╨╦+20 LOW AND MID BYTES OF FILE LENGTH FOR COPYING
-
- WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE. ┴DDITIONAL SUBROUTINE
- PARAMETERS ARE PASSED IN THE PROCESSOR REGISTERS.
-
- ╘HE "╔NIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
- INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
- DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE. ╔T REQUIRES NO
- PARAMETERS.
-
- ╘HE "╠OAD─IRECTORY" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT
- ╙ECTOR PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT
- ═╙-─╧╙ DEVICE NUMBER. ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE
- SUBROUTINE RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND
- THE NUMBER OF DIRECTORY ENTRIES IN THE .╪ REGISTER. ╔F AN ERROR OCCURS, THEN
- THE SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE
- IN THE "ERRNO" INTERFACE VARIABLE. ╘HE DIRECTORY ENTRY DATA IS IN THE
- DIRECTORY SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙
- DISK.
-
- ╘HE "├OPY╞ILE" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
- SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
- OPENED). ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
- DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE. ╘HE STARTING CLUSTER NUMBER
- OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
- THE ╨╦+18 AND ╨╦+20 INTERFACE WORDS. ╘HE TRANSLATION MODE TO USE IS PASSED IN
- THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
- OUTPUT TO IS PASSED IN THE .╪ REGISTER. ╔F AN ERROR OCCURS, THE ROUTINE
- RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
- VARIABLE. ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
-
- ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
- BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
- THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
- TO GET THIS INFORMATION. ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
- FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
- NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
-
- ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
- THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
- PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
- HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
- RE-RUNS. ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE
- OF 131.
-
- 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
-
- ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING
- PACKAGE. ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY A FEW
- SPECIAL CHARACTERS AND THE LINE NUMBER. ╘HE SPECIAL CHARACTERS ARE THERE TO
- ALLOW YOU TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE
- (AND ALL OF MY UGLY COMMENTS). ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS
- EXECUTE THE FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
-
- GREP '^\.%...\!' ╚ACK4 ▄ SED 'S/^.%...\!..//' ▄ SED 'S/.%...\!//' >LRR.S
-
- ┘OU'LL NOTICE THAT THE INITIAL COMMENT LINES HERE WERE AN AFTERTHOUGHT.
-
- .%000! ;╠ITTLE ╥ED ╥EADER ═╙-─╧╙ FILE COPIER PROGRAM
- .%000! ;WRITTEN 92/10/03 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
- .%000!
-
- ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
- DIRECTIVES. ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
-
- .%001! .ORG $8000
- .%002! .OBJ "@:LRR.BIN"
- .%003!
- .%004! ;====JUMP TABLE AND PARAMETERS INTERFACE ====
- .%005!
- .%006! JMP INIT╨ACKAGE
- .%007! JMP LOAD─IRECTORY
- .%008! JMP COPY╞ILE
- .%009!
- .%010! .BYTE $CB,131 ;IDENTIFICATION
- .%011! .BYTE 0,0,0,0
- .%012!
-
- ╘HESE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO MINIMIZE UNWANTED
- INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME, SUCH AS THE ╥┴═─╧╙
- DEVICE DRIVER.
-
- .%013! ERRNO .BUF 1 ;(LOCATION PK+15)
- .%014! SOURCE─EVICE .BUF 1
- .%015! SOURCE╘YPE .BUF 1 ;$00=1571, $FF=1581
- .%016! START├LUSTER .BUF 2
- .%017! LEN═╠ .BUF 2 ;LENGTH MEDIUM AND LOW BYTES
- .%018!
- .%019! ;====GLOBAL DECLARAIONS====
- .%020!
- .%021! KERNEL╠ISTEN = $FFB1
- .%022! KERNEL╙ECOND = $FF93
- .%023! KERNEL╒NLSN = $FFAE
- .%024! KERNEL┴CPTR = $FFA2
- .%025! KERNEL├IOUT = $FFA8
- .%026! KERNEL╙PINP = $FF47
- .%027! KERNEL├HKOUT = $FFC9
- .%028! KERNEL├LRCHN = $FFCC
- .%029! KERNEL├HROUT = $FFD2
- .%030!
- .%031! ST = $D0
- .%032! CIA├LOCK = $DD00
- .%033! CIA╞LAGS = $DC0D
- .%034! CIA─ATA = $DC0C
- .%035!
-
- ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR. ╘HEY
- ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
-
- .%036! CLUSTER┬LOCK├OUNT .BUF 1 ;1 OR 2
- .%037! FAT┬LOCKS .BUF 1 ;UP TO 3
- .%038! ROOT─IR┬LOCKS .BUF 1 ;UP TO 8
- .%039! ROOT─IR┼NTRIES .BUF 1 ;UP TO 128
- .%040! TOTAL╙ECTORS .BUF 2 ;UP TO 1440
- .%041! FIRST╞ILE┬LOCK .BUF 1
- .%042! FIRST╥OOT─IR┬LOCK .BUF 1
- .%043! FILE├LUSTER├OUNT .BUF 2
- .%044!
-
- ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACH CACHE.
-
- .%045! BUF├YLINDER .BUF 1
- .%046! BUF╙IDE .BUF 1
- .%047! FORMAT╨ARMS .BUF 6
- .%048!
-
- ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS. ╘HIS LEVEL INTERFACES WITH THE
- ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
-
- .%049! ;====HARDWARE LEVEL====
- .%050!
-
- ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
- BURST COMMAND BYTE.
-
- .%051! SEND╒0 = * ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
- .%052! PHA
- .%053! LDA #0
- .%054! STA ST
- .%055! LDA SOURCE─EVICE
- .%056! JSR KERNEL╠ISTEN
- .%057! LDA #$6F
- .%058! JSR KERNEL╙ECOND
- .%059! LDA #"U"
- .%060! JSR KERNEL├IOUT
- .%061! BIT ST
- .%062! BMI SEND╒0┼RROR
- .%063! LDA #"0"
- .%064! JSR KERNEL├IOUT
- .%065! PLA
- .%066! JSR KERNEL├IOUT
- .%067! BIT ST
- .%068! BMI SEND╒0┼RROR
- .%069! CLC
- .%070! RTS
- .%071!
- .%072! SEND╒0┼RROR = *
- .%073! LDA #5
- .%074! STA ERRNO
- .%075! SEC
- .%076! RTS
- .%077!
-
- ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
- TRANSFER PROTOCOL.
-
- .%078! TOGGLE├LOCK = *
- .%079! LDA CIA├LOCK
- .%080! EOR #$10
- .%081! STA CIA├LOCK
- .%082! RTS
-