LDOS 5.3.1 for the Model III - QFB/CMD Disassembled
Page Customization
Page Index
QFB/CMD
Other Navigation
Introduction/Summary
LDOS 5.3.1 QFB/CMD Disassembly - The Quick Format and Backup (Model III)
QFB/CMD, the LDOS Quick Format and Backup, makes a mirror image copy of a floppy disk in one pass: QFB :s :d (QUERY, ALL, V1, V2) (M-40-060, where DISKCOPY is the version 6 utility of the same kind). For each cylinder it formats the destination with the Write Track command, reads the source cylinder into memory, writes it and, with V1 (the default), reads it back and compares the sum of its bytes with the source's. With V2 the whole destination is read back once more at the end. Only the cylinders that hold data are read and written unless ALL is given; QUERY asks the three questions. The source must be a floppy (or a drive with its own driver, a MemDISK), the destination a floppy of the same size; its drive code table takes the source's density, sides and cylinders.
The file is a load module of 4121 bytes without a copyright record: seventeen load blocks for 5200H-5697H, 570CH-5CF0H and 5CF3H-6246H (4049 bytes) and the transfer address record for 5200H. One file serves the Model I and the Model III: the start-up tests the ROM and stores the Model I addresses of four system cells into the operands. Six format tables describe the tracks of 5 and 8 inch disks in single and double density, two of them with a closer interleave for the FAST speed. While QFB copies, the RST 38H vector at 4012H holds a RET, so the clock stops; the drive code tables are put back as they were at the end.
What QFB Does
| Step | What Happens |
|---|---|
| The start | The Model I operands, the copy of the drive code tables, the banner, the parameters by @PARAM and the drive digits of the command line (5200H, 6201H, 5577H). |
| The drives and questions | Source drive ? and Destination drive ? for a drive not given; with QUERY the three questions for ALL, V1 and V2 (5234H, 5282H, 559BH). |
| The source | The prompt to load the disks; the source must be a floppy that turns; its boot sector and allocation table give the directory cylinder, the cylinders and the sides; the memory test and the format table (52BDH, 5A04H, 5507H). |
| The destination | Not write protected, not a hard disk, the source's size; its drive code table takes the source's values (533AH, 535FH). |
| The copy | For each cylinder: format, read the source, write, verify; a destination with errors is dropped; SHIFT @ pauses, BREAK stops (53C4H, 5A33H, 60CFH, 5BA6H, 61C1H). |
| The end | The second pass with V2, the count of the disks made; ENTER copies again, R starts again with the questions, BREAK ends; the system is put back (5462H, 5484H, 5C37H). |
About This Page
The site has no Model I page of QFB/CMD, so this page is written from the bytes of the Model III file alone; the seven operands that the code changes on the Model I are named with both values on their rows. Every byte of the file is shown at its address. Found in the code: the memory test (5507H) takes the sectors of a track from byte +07H of the drive code table with the mask 0FH, so that a double density track of 18 sectors counts as 2 and an 8 inch one of 30 as 14; the test then asks for far less memory than the cylinder buffer from 6700H uses (for a 5 inch double density disk with two sides, 36 pages up to 8B00H). An error found by the second pass (V2) stops that pass for the disk but gives no message, does not drop the disk and does not keep it from the count of the disks made (5476H). A double density source with a destination whose byte +04H has bit 6 clear is accepted without its sides, cylinders and sectors being set (539AH); every floppy table of the Model III's SYS0/SYS has bit 6 set. The drive number given to the driver is the digit OR 07H, 37H for every drive (54F4H); the floppy driver selects by byte +04H and does not use it. The code is written for a list of destinations, but the command line and the question take one. A disk is refused when bit 4 of byte CDH of its allocation table is set, with the text Cannot duplicate disk with protected files. The count of the disks made is never cleared, and the letter s of disks stays once written. A source cylinder that cannot be read is read once more; a cylinder that fails its verify is written once more. Not used: the decimal input 5564H, the hex output 60BBH, the driver calls 5CA3H (write) and 5CB7H (verify), the text Source READ error - at 6015H and the 22 spaces at 5786H; 5691H and 5694H are written and never read. The note that the clock is no longer accurate is shown at every end, even when QFB ends at a question before the clock was stopped.
Memory Map
Load Blocks in File Order
The seventeen load blocks of the file: 4049 bytes. 5698H-570BH and 5CF1H-5CF2H are not in the file. The transfer address is 5200H. The file has no copyright record.
| Address | Contents |
|---|---|
| 5200H-52FFH, 5300H-53FFH, 5400H-54FFH, 5500H-55FFH | 256 bytes each: the start, the drives and questions, the source and destination, the copy loop, the memory test, the questions and the errors |
| 5600H-5697H | 152 bytes: the errors that end QFB, the parameter table, the defaults and the values |
| 570CH-580BH, 580CH-590BH, 590CH-5A0BH, 5A0CH-5B0BH, 5B0CH-5C0BH | 256 bytes each: the texts, the index pulse test, the format, the sector loop |
| 5C0CH-5CF0H | 229 bytes: the end, the driver calls and the digits |
| 5CF3H-5DF2H, 5DF3H-5EF2H, 5EF3H-5FF2H, 5FF3H-60F2H, 60F3H-61F2H | 256 bytes each: the six format tables, the texts of the copy, the source read and the sums |
| 61F3H-6246H | 84 bytes: the end of BREAK and the set-up for the model |
Sections of the Disassembly
| Address | Contents |
|---|---|
| 5200H | The Start: the Banner, the Parameters and the Drives |
| 5234H | Asking for the Drives |
| 5282H | The Questions of QUERY |
| 52BDH | Loading the Disks and the Source |
| 533AH | The Destination Drives |
| 53C4H | The Copy, Cylinder by Cylinder |
| 5462H | The Second Pass and the End |
| 54DAH | The Next Destination |
| 5507H | The Memory Test and the Format Table |
| 5564H | A Decimal Number Not Used |
| 5577H | Collecting the Drive Digits |
| 559BH | The Questions and the Answers |
| 55C2H | The Errors of a Step |
| 5618H | The Errors That End QFB |
| 562DH | The Parameter Table and the Values |
| 570CH | The Texts |
| 5A04H | The Index Pulse Test |
| 5A33H | Formatting a Cylinder |
| 5B57H | Is the Cylinder Copied? |
| 5C18H | The End of QFB |
| 5C7AH | The Calls of the Disk Driver |
| 5CF3H | The Format Table: 5 Inch Single Density |
| 5D34H | The Format Table: 5 Inch Double Density |
| 5D90H | The Format Table: 8 Inch Single Density |
| 5DD5H | The Format Table: 8 Inch Double Density |
| 5E55H | The Format Table: 5 Inch Double Density with FAST |
| 5EACH | The Format Table: 8 Inch Double Density with FAST |
| 5F24H | The Texts of the Copy |
| 60BBH | Two Hex Digits, Not Used |
| 60CFH | Reading the Source Cylinder |
| 615BH | A Drive Code Table and a Decimal Number |
| 61C1H | The Pause and BREAK |
| 6201H | The Set-Up for the Model and the Drive Code Tables |
Memory QFB/CMD Uses
| Address | Contents |
|---|---|
| 0033H, 0040H, 0049H | ROM: display the character in Register A, take a line at Register Pair HL of up to Register B characters (the CARRY FLAG after BREAK), wait for a key (the same in ROM 3.1 and ROM 1.3). |
| 0060H | ROM: the delay loop of Register Pair BC (JP 01FBH in ROM 3.1, other bytes in ROM 1.3). |
| 0125H | The ROM byte of the model test: 49H in ROM 3.1. |
| 3801H, 3840H, 3880H | The keyboard matrix: @ (row 0 bit 0), BREAK (row 6 bit 2) and the SHIFT keys (row 7 bits 1-0). |
| 4012H | The RST 38H vector: C9H while QFB copies, put back at the end. |
| 402DH | @EXIT, the end of QFB. |
| 428AH | @LOGOT: the errors that end QFB (447BH on the Model I). |
| 4411H | HIGH$, the end of the memory for the cylinder buffer (4049H on the Model I). |
| 442BH | SFLAG$: bit 3, FAST, chooses the double density tables (430FH on the Model I). |
| 4454H | @PARAM: QUERY, ALL, V1 and V2 (4476H on the Model I). |
| 4467H | @DSPLY: the texts. |
| 4700H-474FH | DCT$, the eight drive code tables: +00H the JP to the driver, +03H-+09H the flags, cylinders and sectors; copied to 569CH and put back. |
| 6300H-67FFH up to HIGH$ | The two copies of the sums, the boot sector and allocation table, the list of the identification bytes and the verify page, the cylinder buffer. |
Variables
The entry points of QFB/CMD, then the data of the file, the operands it changes, and the cells outside the file that it uses, by address.
Entry Points
| Address | Contents |
|---|---|
| 5200H | The start of QFB/CMD, the transfer address of the file. |
| 522EH | The restart R: the banner and the questions for the drives. |
| 52CFH | Copy again from the source's boot sector (ENTER at the end, the source error). |
| 54DAH | The next destination: Index Register IY at its drive code table and the NZ FLAG, or the Z FLAG. |
| 5507H | The memory test and the choice of the format table. |
| 5577H, 5578H | Collect the drive digits at Register Pair HL into Register Pair DE. |
| 559BH, 55B2H | Ask a question with Y or N; display a question and take a line. |
| 55C2H, 55EEH, 55F6H | The errors of the source read and of a destination; drop a destination. |
| 5618H, 561CH, 5620H, 5624H | The four errors that end QFB. |
| 565EH, 5669H | The defaults of the parameters; clear the drives. |
| 5A04H | The index pulse test of the drive at Index Register IY. |
| 5A33H | Format the cylinder at 569AH on the destination at Index Register IY. |
| 5B57H | Is the cylinder copied: the NZ FLAG when it is. |
| 5B6FH, 5B81H, 5B90H | Write, read, verify the cylinder. |
| 5BA6H, 5BF3H | The sector loop; one sector by the step at 5695H. |
| 5C18H, 5C1BH, 5C1EH, 5C37H | The ends of QFB. |
| 5C3DH | Put the RST 38H vector, the cursor and the drive code tables back. |
| 5C7AH | The calls of the driver: 5C7AH function 00H to 5CB7H function 0AH. |
| 5CCAH | Count an error at 5696H. |
| 5CD2H, 5CDFH | Two digits of Register A in Register C and Register B; write them over the cylinder of the text. |
| 60CFH | Read the source cylinder and keep its sum. |
| 60F1H, 6105H | Set up the buffer and the sum; add a sector to the sum. |
| 611BH, 6130H | Keep the sum; compare a sum with the kept ones. |
| 615BH | Index Register IY at the drive code table of drive Register A. |
| 616CH | Register Pair DE in decimal at Register Pair HL. |
| 61C1H | The pause and BREAK. |
| 6201H | The set-up for the model and the copy of the drive code tables. |
Data in the File
| Address Size | Contents |
|---|---|
| 562DH-5632H 6 bytes | DEFM "QUERY " 562DH-5632H: the name QUERY, padded to six characters with a space. |
| 5633H-5634H 2 bytes | DEFW 5682H 5633H-5634H: 5682H, the value of QUERY: with it, the questions are asked. |
| 5635H-563AH 6 bytes | DEFM "Q " 5635H-563AH: the name Q, the short form of QUERY, padded to six characters. |
| 563BH-563CH 2 bytes | DEFW 5682H 563BH-563CH: 5682H, the same value as QUERY, for the short form Q. |
| 563DH-5642H 6 bytes | DEFM "ALL " 563DH-5642H: the name ALL, padded to six characters: copy the cylinders that are not in use too. |
| 5643H-5644H 2 bytes | DEFW 567CH 5643H-5644H: 567CH, the value of ALL, two bytes that @PARAM stores. |
| 5645H-564AH 6 bytes | DEFM "A " 5645H-564AH: the name A, the short form of ALL, padded to six characters. |
| 564BH-564CH 2 bytes | DEFW 567CH 564BH-564CH: 567CH, the same value as ALL, for the short form A. |
| 564DH-5652H 6 bytes | DEFM "V1 " 564DH-5652H: the name V1, padded to six characters: verify each cylinder on the same pass. |
| 5653H-5654H 2 bytes | DEFW 567EH 5653H-5654H: 567EH, the value of V1, two bytes that @PARAM stores. |
| 5655H-565AH 6 bytes | DEFM "V2 " 5655H-565AH: the name V2, padded to six characters: verify the disk on a second pass. |
| 565BH-565CH 2 bytes | DEFW 5680H 565BH-565CH: 5680H, the value of V2, two bytes that @PARAM stores. |
| 565DH 1 byte | DEFB 00H 565DH: 00H, the end of the parameter table for @PARAM. |
| 5674H-5675H 2 bytes | DEFB 01H, 00H 5674H-5675H: the default of ALL for the restart R: 01H not given, 00H copy only the cylinders in use. |
| 5676H-5677H 2 bytes | DEFB 01H, FFH 5676H-5677H: the default of V1 for the restart R: 01H not given, FFH verify on the same pass. |
| 5678H-5679H 2 bytes | DEFB 01H, 00H 5678H-5679H: the default of V2 for the restart R: 01H not given, 00H no second pass. |
| 567AH-567BH 2 bytes | DEFB FFH, FFH 567AH-567BH: the default of QUERY for the restart R: FFFFH, the questions are asked. |
| 567CH-567DH 2 bytes | DEFB 01H, 00H 567CH-567DH: the value of ALL: 01H not given, 00H the default; 52B6H complements the high byte 567DH. |
| 567EH-567FH 2 bytes | DEFB 01H, FFH 567EH-567FH: the value of V1: 01H not given, FFH the default, verify after each write. |
| 5680H-5681H 2 bytes | DEFB 01H, 00H 5680H-5681H: the value of V2: 01H not given, 00H the default, no second pass. |
| 5682H-5683H 2 bytes | DEFB 00H x 2 5682H-5683H: the value of QUERY: 0000H unless QUERY or Q is given (or the restart R). |
| 5684H 1 byte | DEFB 00H 5684H: the source drive's digit, 30H-37H, from the command line or the question. |
| 5685H 1 byte | DEFB 00H 5685H: the destination drive's digit, 30H-37H. |
| 5686H 1 byte | DEFB 00H 5686H: 00H, the end of the destination digits; 54E5H and 55FEH index from it. |
| 5687H-5688H 2 bytes | DEFB 00H x 2 5687H-5688H: the copy of the destination digit and its end, made by 533AH; 00H when the destination is dropped. |
| 5689H-568AH 2 bytes | DEFB 00H x 2 5689H-568AH: the address of the source's drive code table, the first entry of the table of drives. |
| 568BH-568CH 2 bytes | DEFB 00H x 2 568BH-568CH: the address of the destination's drive code table, the second entry. |
| 568DH-568EH 2 bytes | DEFB 00H x 2 568DH-568EH: DCT$, 4700H, stored by 6201H: the first drive code table. |
| 568FH-5690H 2 bytes | DEFB 00H x 2 568FH-5690H: HIGH$, stored by 6201H, for the memory test 5525H. |
| 5691H 1 byte | DEFB 00H 5691H: the source's byte +03H, stored by 5304H; no instruction reads it. |
| 5692H-5693H 2 bytes | DEFB 00H x 2 5692H-5693H: the count of the disks made since QFB was started (5491H); it is never cleared. |
| 5694H 1 byte | DEFB 00H 5694H: written by 5498H and 55E8H; no instruction reads it. |
| 5695H 1 byte | DEFB 00H 5695H: the step of the sector loop 5BA6H: 00H write, 01H verify, FFH read. |
| 5696H 1 byte | DEFB 00H 5696H: the count of the errors of the current step, counted by 5CCAH. |
| 5697H 1 byte | DEFB 00H 5697H: the count of the writes of a cylinder after a verify error (5433H). |
| 570CH-571AH 15 bytes | DEFM "Parameter error" 570CH-571AH: the text of 5624H for a bad parameter or a bad drive on the command line. |
| 571BH 1 byte | DEFB 0DH 571BH: 0DH, the end of the text Parameter error. |
| 571CH-571DH 2 bytes | DEFB 1CH, 1FH 571CH-571DH: 1CH, the cursor to the top left, and 1FH, the screen cleared: the start of the banner (5208H, 522EH, 54C5H). |
| 571EH-574FH 50 bytes | DEFM "QFB - LDOS Quick Format and Backup - Version 5.3.1" 571EH-574FH: the name of the program, what it does and its version. |
| 5750H 1 byte | DEFB 0AH 5750H: 0AH, a new line: the copyright goes on the next line. |
| 5751H-5783H 51 bytes | DEFM "Copyright 1991 MISOSYS, Inc., All rights reserved." 5751H-5783H: the copyright line of the banner, with two spaces after the comma. |
| 5784H-5785H 2 bytes | DEFB 0AH, 0DH 5784H-5785H: 0AH, a new line, and 0DH, the end of the banner. |
| 5786H-579BH 22 bytes | DEFB 20H x 22 5786H-579BH: 22 spaces before the text of the memory test; no instruction points at 5786H, 552BH points past them at 579CH. |
| 579CH-57C3H 40 bytes | DEFM "Insufficient memory for specified drive!" 579CH-57C3H: the text of 552EH when HIGH$ is below the end of the cylinder buffer. |
| 57C4H 1 byte | DEFB 0DH 57C4H: 0DH, the end of the text Insufficient memory for specified drive!. |
| 57C5H-57D3H 15 bytes | DEFM "Source drive ? " 57C5H-57D3H: the question of 523DH when the command line gives no source drive. |
| 57D4H 1 byte | DEFB 03H 57D4H: 03H, the end of the question: the answer is typed after it. |
| 57D5H-57E8H 20 bytes | DEFM "Destination drive ? " 57D5H-57E8H: the question of 5269H when the command line gives no destination drive. |
| 57E9H 1 byte | DEFB 03H 57E9H: 03H, the end of the question: the answer is typed after it. |
| 57EAH-57FFH 22 bytes | DEFM "Source Disk not ready!" 57EAH-57FFH: the text of 52EEH: no index pulses, or the boot sector or the allocation table could not be read. |
| 5800H 1 byte | DEFB 0DH 5800H: 0DH, the end of the text Source Disk not ready!. |
| 5801H-5820H 32 bytes | DEFM "Load diskettes and press <ENTER>" 5801H-5820H: the prompt of 52BDH before the copy starts. |
| 5821H-5822H 2 bytes | DEFB 0AH, 0DH 5821H-5822H: 0AH, a new line, and 0DH, the end of the prompt. |
| 5823H-5845H 35 bytes | DEFM "This program requires floppy disks!" 5823H-5845H: the text of 5620H when the source or the destination is a hard disk. |
| 5846H 1 byte | DEFB 0DH 5846H: 0DH, the end of the text This program requires floppy disks!. |
| 5847H-5872H 44 bytes | DEFM "Source and destinations drives are the same!" 5847H-5872H: the text of 5254H when a destination is the source drive. |
| 5873H 1 byte | DEFB 0DH 5873H: 0DH, the end of the text Source and destinations drives are the same!. |
| 5874H-5897H 36 bytes | DEFM "Duplicate unallocated tracks? (Y/N) " 5874H-5897H: the question of ALL (528FH): Y copies every cylinder, N only those in use. |
| 5898H 1 byte | DEFB 03H 5898H: 03H, the end of the question: the answer is typed after it. |
| 5899H-58B3H 27 bytes | DEFM "Verify on same pass? (Y/N) " 5899H-58B3H: the question of V1 (529EH): Y reads each cylinder back after it is written. |
| 58B4H 1 byte | DEFB 03H 58B4H: 03H, the end of the question: the answer is typed after it. |
| 58B5H-58D1H 29 bytes | DEFM "Verify on second pass? (Y/N) " 58B5H-58D1H: the question of V2 (52ADH): Y reads the whole disk back after the copy. |
| 58D2H 1 byte | DEFB 03H 58D2H: 03H, the end of the question: the answer is typed after it. |
| 58D3H-58F3H 33 bytes | DEFM "Incorrect destination drive type!" 58D3H-58F3H: the text of 561CH when the destination is not of the source's size (5 or 8 inch). |
| 58F4H 1 byte | DEFB 0DH 58F4H: 0DH, the end of the text Incorrect destination drive type!. |
| 58F5H-5921H 45 bytes | DEFM "Destination drive has software write-protect!" 58F5H-5921H: the text of 5618H when bit 7 of byte +03H of the destination's drive code table is set. |
| 5922H 1 byte | DEFB 0DH 5922H: 0DH, the end of the text Destination drive has software write-protect!. |
| 5923H-5936H 20 bytes | DEFM "Invalid drive entry!" 5923H-5936H: the text of 527AH when the answer to Destination drive ? has a bad character. |
| 5937H 1 byte | DEFB 0DH 5937H: 0DH, the end of the text Invalid drive entry!. |
| 5938H-5956H 31 bytes | DEFM " =========> Bad disk in drive " 5938H-5956H: the text of 55F8H when a destination is dropped; 560BH adds the drive's digit. |
| 5957H 1 byte | DEFB 03H 5957H: 03H, the end of the text: the digit follows on the same line. |
| 5958H-5959H 2 bytes | DEFB 0AH, 0AH 5958H-5959H: two new lines before the text Duplication complete (54ADH). |
| 595AH-596EH 21 bytes | DEFM "Duplication complete " 595AH-596EH: the start of the text of the count of the disks made. |
| 596FH-5973H 5 bytes | DEFB 20H x 5 596FH-5973H: the five places of the count, written by 616CH with spaces for the leading zeros (54AAH, 5C30H). |
| 5974H-5978H 5 bytes | DEFM " disk" 5974H-5978H: a space and the word disk after the count. |
| 5979H-597AH 2 bytes | DEFB 20H x 2 5979H-597AH: two spaces: 54A3H writes the letter s at 5979H when more than one disk was made; it stays there. |
| 597BH-5981H 7 bytes | DEFM "created" 597BH-5981H: the word created, the end of the text of the count. |
| 5982H 1 byte | DEFB 0DH 5982H: 0DH, the end of the text of the count; @LOGOT shows it from 596FH at 5C34H. |
| 5983H 1 byte | DEFB 0AH 5983H: 0AH, a new line: the start of the text of 54B3H. |
| 5984H-59B7H 52 bytes | DEFM "Replace destination disk and press <ENTER> to repeat" 5984H-59B7H: the first line of 54B3H: ENTER makes another copy (54C1H). |
| 59B8H 1 byte | DEFB 0AH 59B8H: 0AH, a new line after the first line of the question of the end. |
| 59B9H-59DDH 37 bytes | DEFM " ..<R> to restart with new parameters" 59B9H-59DDH: the second line: R asks for the drives and the parameters again (54D0H). |
| 59DEH 1 byte | DEFB 0AH 59DEH: 0AH, a new line after the second line. |
| 59DFH-5A02H 36 bytes | DEFM " ...or....<BREAK> to exit program." 59DFH-5A02H: the third line: BREAK ends QFB (54BCH). |
| 5A03H 1 byte | DEFB 0DH 5A03H: 0DH, the end of the text of 54B3H, the question of the end. |
| 5CF3H 1 byte | DEFB 0AH 5CF3H: 0AH, 10 sectors a track: 5A3CH stores it at 5CF2H, the count of the repeat and of a side. |
| 5CF4H 1 byte | DEFB 08H 5CF4H: 08H, the step: the next cylinder starts 8 sector numbers further on in the list (5B4BH). |
| 5CF5H-5CFEH 10 bytes | DEFB 00H, 05H, 01H, 06H, 02H, 07H, 03H, 08H, 04H, 09H 5CF5H-5CFEH: the 10 sector numbers in their order on the track; 5AEEH takes one for each sector and goes on from there on the next side and cylinder. |
| 5CFFH-5D07H 9 bytes | DEFB F6H x 9 5CFFH-5D07H: 9 wrap bytes F6H, minus 10: a pointer that reaches one moves back by the sectors of a track (5AF3H). |
| 5D08H-5D09H 2 bytes | DEFB 0EH, FFH 5D08H-5D09H: 14 bytes FFH, the gap after the index pulse. |
| 5D0AH 1 byte | DEFB F1H 5D0AH: F1H, the start of the part built once for each of the 10 sectors (5A94H). |
| 5D0BH-5D0CH 2 bytes | DEFB 06H, 00H 5D0BH-5D0CH: 6 bytes 00H, the sync field before the identification address mark. |
| 5D0DH-5D0EH 2 bytes | DEFB 01H, FEH 5D0DH-5D0EH: FEH, the identification address mark of the sector. |
| 5D0FH 1 byte | DEFB F3H 5D0FH: F3H, the place of the identification bytes of the sector goes into the list at 6600H (5AA5H). |
| 5D10H-5D11H 2 bytes | DEFB 03H, 00H 5D10H-5D11H: three bytes 00H, the places of the cylinder, side and sector numbers that 5AD3H fills in. |
| 5D12H-5D13H 2 bytes | DEFB 01H, 01H 5D12H-5D13H: 01H, the length code of the sector: 256 bytes. |
| 5D14H-5D15H 2 bytes | DEFB 01H, F7H 5D14H-5D15H: F7H: the controller writes the two CRC bytes of the identification. |
| 5D16H-5D17H 2 bytes | DEFB 01H, FFH 5D16H-5D17H: 1 byte FFH, the gap between the identification and the data field. |
| 5D18H-5D19H 2 bytes | DEFB 0BH, FFH 5D18H-5D19H: 11 bytes FFH, the gap between the identification and the data field. |
| 5D1AH-5D1BH 2 bytes | DEFB 06H, 00H 5D1AH-5D1BH: 6 bytes 00H, the sync field before the data address mark. |
| 5D1CH-5D1DH 2 bytes | DEFB 01H, FBH 5D1CH-5D1DH: FBH, the data address mark that starts the data field of the sector. |
| 5D1EH-5D1FH 2 bytes | DEFB 00H, E5H 5D1EH-5D1FH: 256 bytes E5H, the data field of a single density sector. |
| 5D20H-5D21H 2 bytes | DEFB 01H, F7H 5D20H-5D21H: F7H: the controller writes the two CRC bytes of the data field. |
| 5D22H-5D23H 2 bytes | DEFB 01H, FFH 5D22H-5D23H: 1 byte FFH, the gap after the sector. |
| 5D24H-5D25H 2 bytes | DEFB 0DH, FFH 5D24H-5D25H: 13 bytes FFH, the gap after the sector. |
| 5D26H 1 byte | DEFB F2H 5D26H: F2H, the end of the part built for each sector (5A9BH). |
| 5D27H-5D28H 2 bytes | DEFB 47H, FFH 5D27H-5D28H: 71 bytes FFH, the gap to the end of the track. |
| 5D29H 1 byte | DEFB F4H 5D29H: F4H, the end of the track: 256 bytes FFH follow, the address after it goes to 5BCBH (5AADH). |
| 5D2AH-5D33H 10 bytes | DEFB 00H, 01H, 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H 5D2AH-5D33H: the order of the 10 sectors of a side for the read, the write and the verify (5BCDH); side 1 takes it again with 10 added. |
| 5D34H 1 byte | DEFB 12H 5D34H: 12H, 18 sectors a track: 5A3CH stores it at 5CF2H, the count of the repeat and of a side. |
| 5D35H 1 byte | DEFB 0FH 5D35H: 0FH, the step: the next cylinder starts 15 sector numbers further on in the list (5B4BH). |
| 5D36H-5D47H 18 bytes | DEFB 00H, 06H, 0CH, 01H, 07H, 0DH, 02H, 08H, 0EH, 03H, 09H, 0FH, 04H, 0AH, 10H, 05H, 0BH, 11H 5D36H-5D47H: the 18 sector numbers in their order on the track; 5AEEH takes one for each sector and goes on from there on the next side and cylinder. |
| 5D48H-5D57H 16 bytes | DEFB EEH x 16 5D48H-5D57H: 16 wrap bytes EEH, minus 18: a pointer that reaches one moves back by the sectors of a track (5AF3H). |
| 5D58H-5D59H 2 bytes | DEFB 20H, 4EH 5D58H-5D59H: 32 bytes 4EH, the gap after the index pulse. |
| 5D5AH 1 byte | DEFB F1H 5D5AH: F1H, the start of the part built once for each of the 18 sectors (5A94H). |
| 5D5BH-5D5CH 2 bytes | DEFB 0CH, 00H 5D5BH-5D5CH: 12 bytes 00H, the sync field before the identification address mark. |
| 5D5DH-5D5EH 2 bytes | DEFB 03H, F5H 5D5DH-5D5EH: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5D5FH-5D60H 2 bytes | DEFB 01H, FEH 5D5FH-5D60H: FEH, the identification address mark of the sector. |
| 5D61H 1 byte | DEFB F3H 5D61H: F3H, the place of the identification bytes of the sector goes into the list at 6600H (5AA5H). |
| 5D62H-5D63H 2 bytes | DEFB 03H, 00H 5D62H-5D63H: three bytes 00H, the places of the cylinder, side and sector numbers that 5AD3H fills in. |
| 5D64H-5D65H 2 bytes | DEFB 01H, 01H 5D64H-5D65H: 01H, the length code of the sector: 256 bytes. |
| 5D66H-5D67H 2 bytes | DEFB 01H, F7H 5D66H-5D67H: F7H: the controller writes the two CRC bytes of the identification. |
| 5D68H-5D69H 2 bytes | DEFB 16H, 4EH 5D68H-5D69H: 22 bytes 4EH, the gap between the identification and the data field. |
| 5D6AH-5D6BH 2 bytes | DEFB 0CH, 00H 5D6AH-5D6BH: 12 bytes 00H, the sync field before the data address mark. |
| 5D6CH-5D6DH 2 bytes | DEFB 03H, F5H 5D6CH-5D6DH: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5D6EH-5D6FH 2 bytes | DEFB 01H, FBH 5D6EH-5D6FH: FBH, the data address mark that starts the data field of the sector. |
| 5D70H-5D73H 4 bytes | DEFB F5H, 80H, 6DH, B6H 5D70H-5D73H: F5H, 128 pairs 6DH B6H: the 256 bytes of the data field, the fill of a double density sector. |
| 5D74H-5D75H 2 bytes | DEFB 01H, F7H 5D74H-5D75H: F7H: the controller writes the two CRC bytes of the data field. |
| 5D76H-5D77H 2 bytes | DEFB 01H, 4EH 5D76H-5D77H: 1 byte 4EH, the gap after the sector. |
| 5D78H-5D79H 2 bytes | DEFB 17H, 4EH 5D78H-5D79H: 23 bytes 4EH, the gap after the sector. |
| 5D7AH 1 byte | DEFB F2H 5D7AH: F2H, the end of the part built for each sector (5A9BH). |
| 5D7BH-5D7CH 2 bytes | DEFB B6H, 4EH 5D7BH-5D7CH: 182 bytes 4EH, the gap to the end of the track. |
| 5D7DH 1 byte | DEFB F4H 5D7DH: F4H, the end of the track: 256 bytes FFH follow, the address after it goes to 5BCBH (5AADH). |
| 5D7EH-5D8FH 18 bytes | DEFB 00H, 01H, 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH, 10H, 11H 5D7EH-5D8FH: the order of the 18 sectors of a side for the read, the write and the verify (5BCDH); side 1 takes it again with 18 added. |
| 5D90H 1 byte | DEFB 10H 5D90H: 10H, 16 sectors a track: 5A3CH stores it at 5CF2H, the count of the repeat and of a side. |
| 5D91H 1 byte | DEFB 02H 5D91H: 02H, the step: the next cylinder starts 2 sector numbers further on in the list (5B4BH). |
| 5D92H-5DA1H 16 bytes | DEFB 0AH, 05H, 00H, 0BH, 06H, 01H, 0CH, 07H, 02H, 0DH, 08H, 03H, 0EH, 09H, 04H, 0FH 5D92H-5DA1H: the 16 sector numbers in their order on the track; 5AEEH takes one for each sector and goes on from there on the next side and cylinder. |
| 5DA2H-5DA4H 3 bytes | DEFB F0H x 3 5DA2H-5DA4H: 3 wrap bytes F0H, minus 16: a pointer that reaches one moves back by the sectors of a track (5AF3H). |
| 5DA5H-5DA6H 2 bytes | DEFB 28H, FFH 5DA5H-5DA6H: 40 bytes FFH, the gap after the index pulse. |
| 5DA7H 1 byte | DEFB F1H 5DA7H: F1H, the start of the part built once for each of the 16 sectors (5A94H). |
| 5DA8H-5DA9H 2 bytes | DEFB 06H, 00H 5DA8H-5DA9H: 6 bytes 00H, the sync field before the identification address mark. |
| 5DAAH-5DABH 2 bytes | DEFB 01H, FEH 5DAAH-5DABH: FEH, the identification address mark of the sector. |
| 5DACH 1 byte | DEFB F3H 5DACH: F3H, the place of the identification bytes of the sector goes into the list at 6600H (5AA5H). |
| 5DADH-5DAEH 2 bytes | DEFB 03H, 00H 5DADH-5DAEH: three bytes 00H, the places of the cylinder, side and sector numbers that 5AD3H fills in. |
| 5DAFH-5DB0H 2 bytes | DEFB 01H, 01H 5DAFH-5DB0H: 01H, the length code of the sector: 256 bytes. |
| 5DB1H-5DB2H 2 bytes | DEFB 01H, F7H 5DB1H-5DB2H: F7H: the controller writes the two CRC bytes of the identification. |
| 5DB3H-5DB4H 2 bytes | DEFB 0BH, FFH 5DB3H-5DB4H: 11 bytes FFH, the gap between the identification and the data field. |
| 5DB5H-5DB6H 2 bytes | DEFB 06H, 00H 5DB5H-5DB6H: 6 bytes 00H, the sync field before the data address mark. |
| 5DB7H-5DB8H 2 bytes | DEFB 01H, FBH 5DB7H-5DB8H: FBH, the data address mark that starts the data field of the sector. |
| 5DB9H-5DBAH 2 bytes | DEFB 00H, E5H 5DB9H-5DBAH: 256 bytes E5H, the data field of a single density sector. |
| 5DBBH-5DBCH 2 bytes | DEFB 01H, F7H 5DBBH-5DBCH: F7H: the controller writes the two CRC bytes of the data field. |
| 5DBDH-5DBEH 2 bytes | DEFB 01H, FFH 5DBDH-5DBEH: 1 byte FFH, the gap after the sector. |
| 5DBFH-5DC0H 2 bytes | DEFB 14H, FFH 5DBFH-5DC0H: 20 bytes FFH, the gap after the sector. |
| 5DC1H 1 byte | DEFB F2H 5DC1H: F2H, the end of the part built for each sector (5A9BH). |
| 5DC2H-5DC3H 2 bytes | DEFB D0H, FFH 5DC2H-5DC3H: 208 bytes FFH, the gap to the end of the track. |
| 5DC4H 1 byte | DEFB F4H 5DC4H: F4H, the end of the track: 256 bytes FFH follow, the address after it goes to 5BCBH (5AADH). |
| 5DC5H-5DD4H 16 bytes | DEFB 0AH, 00H, 06H, 0CH, 02H, 08H, 0EH, 04H, 05H, 0BH, 01H, 07H, 0DH, 03H, 09H, 0FH 5DC5H-5DD4H: the order of the 16 sectors of a side for the read, the write and the verify (5BCDH); side 1 takes it again with 16 added. |
| 5DD5H 1 byte | DEFB 1EH 5DD5H: 1EH, 30 sectors a track: 5A3CH stores it at 5CF2H, the count of the repeat and of a side. |
| 5DD6H 1 byte | DEFB 14H 5DD6H: 14H, the step: the next cylinder starts 20 sector numbers further on in the list (5B4BH). |
| 5DD7H-5DF4H 30 bytes | DEFB 00H, 06H, 0CH, 12H, 18H, 01H, 07H, 0DH, 13H, 19H, 02H, 08H, 0EH, 14H, 1AH, 03H, 09H, 0FH, 15H, 1BH, 04H, 0AH, 10H, 16H, 1CH, 05H, 0BH, 11H, 17H, 1DH 5DD7H-5DF4H: the 30 sector numbers in their order on the track; 5AEEH takes one for each sector and goes on from there on the next side and cylinder. |
| 5DF5H-5E09H 21 bytes | DEFB E2H x 21 5DF5H-5E09H: 21 wrap bytes E2H, minus 30: a pointer that reaches one moves back by the sectors of a track (5AF3H). |
| 5E0AH-5E0BH 2 bytes | DEFB 14H, 4EH 5E0AH-5E0BH: 20 bytes 4EH, the gap after the index pulse. |
| 5E0CH 1 byte | DEFB F1H 5E0CH: F1H, the start of the part built once for each of the 30 sectors (5A94H). |
| 5E0DH-5E0EH 2 bytes | DEFB 0CH, 00H 5E0DH-5E0EH: 12 bytes 00H, the sync field before the identification address mark. |
| 5E0FH-5E10H 2 bytes | DEFB 03H, F5H 5E0FH-5E10H: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5E11H-5E12H 2 bytes | DEFB 01H, FEH 5E11H-5E12H: FEH, the identification address mark of the sector. |
| 5E13H 1 byte | DEFB F3H 5E13H: F3H, the place of the identification bytes of the sector goes into the list at 6600H (5AA5H). |
| 5E14H-5E15H 2 bytes | DEFB 03H, 00H 5E14H-5E15H: three bytes 00H, the places of the cylinder, side and sector numbers that 5AD3H fills in. |
| 5E16H-5E17H 2 bytes | DEFB 01H, 01H 5E16H-5E17H: 01H, the length code of the sector: 256 bytes. |
| 5E18H-5E19H 2 bytes | DEFB 01H, F7H 5E18H-5E19H: F7H: the controller writes the two CRC bytes of the identification. |
| 5E1AH-5E1BH 2 bytes | DEFB 16H, 4EH 5E1AH-5E1BH: 22 bytes 4EH, the gap between the identification and the data field. |
| 5E1CH-5E1DH 2 bytes | DEFB 0CH, 00H 5E1CH-5E1DH: 12 bytes 00H, the sync field before the data address mark. |
| 5E1EH-5E1FH 2 bytes | DEFB 03H, F5H 5E1EH-5E1FH: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5E20H-5E21H 2 bytes | DEFB 01H, FBH 5E20H-5E21H: FBH, the data address mark that starts the data field of the sector. |
| 5E22H-5E25H 4 bytes | DEFB F5H, 80H, 6DH, B6H 5E22H-5E25H: F5H, 128 pairs 6DH B6H: the 256 bytes of the data field, the fill of a double density sector. |
| 5E26H-5E27H 2 bytes | DEFB 01H, F7H 5E26H-5E27H: F7H: the controller writes the two CRC bytes of the data field. |
| 5E28H-5E29H 2 bytes | DEFB 01H, FFH 5E28H-5E29H: 1 byte FFH, the gap after the sector. |
| 5E2AH-5E2BH 2 bytes | DEFB 11H, 4EH 5E2AH-5E2BH: 17 bytes 4EH, the gap after the sector. |
| 5E2CH 1 byte | DEFB F2H 5E2CH: F2H, the end of the part built for each sector (5A9BH). |
| 5E2DH-5E2EH 2 bytes | DEFB 00H, 4EH 5E2DH-5E2EH: 256 bytes 4EH, the gap to the end of the track. |
| 5E2FH-5E30H 2 bytes | DEFB 3DH, 4EH 5E2FH-5E30H: 61 bytes 4EH, the gap to the end of the track. |
| 5E31H 1 byte | DEFB F4H 5E31H: F4H, the end of the track: 256 bytes FFH follow, the address after it goes to 5BCBH (5AADH). |
| 5E32H-5E4FH 30 bytes | DEFB 00H, 01H, 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH, 10H, 11H, 12H, 13H, 14H, 15H, 16H, 17H, 18H, 19H, 1AH, 1BH, 1CH, 1DH 5E32H-5E4FH: the order of the 30 sectors of a side for the read, the write and the verify (5BCDH); side 1 takes it again with 30 added. |
| 5E50H-5E54H 5 bytes | DEFB 00H x 5 5E50H-5E54H: 5 bytes 00H after the order of the sectors; no instruction reads them. |
| 5E55H 1 byte | DEFB 12H 5E55H: 12H, 18 sectors a track: 5A3CH stores it at 5CF2H, the count of the repeat and of a side. |
| 5E56H 1 byte | DEFB 0AH 5E56H: 0AH, the step: the next cylinder starts 10 sector numbers further on in the list (5B4BH). |
| 5E57H-5E68H 18 bytes | DEFB 00H, 09H, 01H, 0AH, 02H, 0BH, 03H, 0CH, 04H, 0DH, 05H, 0EH, 06H, 0FH, 07H, 10H, 08H, 11H 5E57H-5E68H: the 18 sector numbers in their order on the track; 5AEEH takes one for each sector and goes on from there on the next side and cylinder. |
| 5E69H-5E73H 11 bytes | DEFB EEH x 11 5E69H-5E73H: 11 wrap bytes EEH, minus 18: a pointer that reaches one moves back by the sectors of a track (5AF3H). |
| 5E74H-5E75H 2 bytes | DEFB 20H, 4EH 5E74H-5E75H: 32 bytes 4EH, the gap after the index pulse. |
| 5E76H 1 byte | DEFB F1H 5E76H: F1H, the start of the part built once for each of the 18 sectors (5A94H). |
| 5E77H-5E78H 2 bytes | DEFB 0CH, 00H 5E77H-5E78H: 12 bytes 00H, the sync field before the identification address mark. |
| 5E79H-5E7AH 2 bytes | DEFB 03H, F5H 5E79H-5E7AH: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5E7BH-5E7CH 2 bytes | DEFB 01H, FEH 5E7BH-5E7CH: FEH, the identification address mark of the sector. |
| 5E7DH 1 byte | DEFB F3H 5E7DH: F3H, the place of the identification bytes of the sector goes into the list at 6600H (5AA5H). |
| 5E7EH-5E7FH 2 bytes | DEFB 03H, 00H 5E7EH-5E7FH: three bytes 00H, the places of the cylinder, side and sector numbers that 5AD3H fills in. |
| 5E80H-5E81H 2 bytes | DEFB 01H, 01H 5E80H-5E81H: 01H, the length code of the sector: 256 bytes. |
| 5E82H-5E83H 2 bytes | DEFB 01H, F7H 5E82H-5E83H: F7H: the controller writes the two CRC bytes of the identification. |
| 5E84H-5E85H 2 bytes | DEFB 16H, 4EH 5E84H-5E85H: 22 bytes 4EH, the gap between the identification and the data field. |
| 5E86H-5E87H 2 bytes | DEFB 0CH, 00H 5E86H-5E87H: 12 bytes 00H, the sync field before the data address mark. |
| 5E88H-5E89H 2 bytes | DEFB 03H, F5H 5E88H-5E89H: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5E8AH-5E8BH 2 bytes | DEFB 01H, FBH 5E8AH-5E8BH: FBH, the data address mark that starts the data field of the sector. |
| 5E8CH-5E8FH 4 bytes | DEFB F5H, 80H, 6DH, B6H 5E8CH-5E8FH: F5H, 128 pairs 6DH B6H: the 256 bytes of the data field, the fill of a double density sector. |
| 5E90H-5E91H 2 bytes | DEFB 01H, F7H 5E90H-5E91H: F7H: the controller writes the two CRC bytes of the data field. |
| 5E92H-5E93H 2 bytes | DEFB 01H, 4EH 5E92H-5E93H: 1 byte 4EH, the gap after the sector. |
| 5E94H-5E95H 2 bytes | DEFB 17H, 4EH 5E94H-5E95H: 23 bytes 4EH, the gap after the sector. |
| 5E96H 1 byte | DEFB F2H 5E96H: F2H, the end of the part built for each sector (5A9BH). |
| 5E97H-5E98H 2 bytes | DEFB B6H, 4EH 5E97H-5E98H: 182 bytes 4EH, the gap to the end of the track. |
| 5E99H 1 byte | DEFB F4H 5E99H: F4H, the end of the track: 256 bytes FFH follow, the address after it goes to 5BCBH (5AADH). |
| 5E9AH-5EABH 18 bytes | DEFB 00H, 01H, 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH, 10H, 11H 5E9AH-5EABH: the order of the 18 sectors of a side for the read, the write and the verify (5BCDH); side 1 takes it again with 18 added. |
| 5EACH 1 byte | DEFB 1EH 5EACH: 1EH, 30 sectors a track: 5A3CH stores it at 5CF2H, the count of the repeat and of a side. |
| 5EADH 1 byte | DEFB 0CH 5EADH: 0CH, the step: the next cylinder starts 12 sector numbers further on in the list (5B4BH). |
| 5EAEH-5ECBH 30 bytes | DEFB 00H, 0AH, 14H, 01H, 0BH, 15H, 02H, 0CH, 16H, 03H, 0DH, 17H, 04H, 0EH, 18H, 05H, 0FH, 19H, 06H, 10H, 1AH, 07H, 11H, 1BH, 08H, 12H, 1CH, 09H, 13H, 1DH 5EAEH-5ECBH: the 30 sector numbers in their order on the track; 5AEEH takes one for each sector and goes on from there on the next side and cylinder. |
| 5ECCH-5ED8H 13 bytes | DEFB E2H x 13 5ECCH-5ED8H: 13 wrap bytes E2H, minus 30: a pointer that reaches one moves back by the sectors of a track (5AF3H). |
| 5ED9H-5EDAH 2 bytes | DEFB 14H, 4EH 5ED9H-5EDAH: 20 bytes 4EH, the gap after the index pulse. |
| 5EDBH 1 byte | DEFB F1H 5EDBH: F1H, the start of the part built once for each of the 30 sectors (5A94H). |
| 5EDCH-5EDDH 2 bytes | DEFB 0CH, 00H 5EDCH-5EDDH: 12 bytes 00H, the sync field before the identification address mark. |
| 5EDEH-5EDFH 2 bytes | DEFB 03H, F5H 5EDEH-5EDFH: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5EE0H-5EE1H 2 bytes | DEFB 01H, FEH 5EE0H-5EE1H: FEH, the identification address mark of the sector. |
| 5EE2H 1 byte | DEFB F3H 5EE2H: F3H, the place of the identification bytes of the sector goes into the list at 6600H (5AA5H). |
| 5EE3H-5EE4H 2 bytes | DEFB 03H, 00H 5EE3H-5EE4H: three bytes 00H, the places of the cylinder, side and sector numbers that 5AD3H fills in. |
| 5EE5H-5EE6H 2 bytes | DEFB 01H, 01H 5EE5H-5EE6H: 01H, the length code of the sector: 256 bytes. |
| 5EE7H-5EE8H 2 bytes | DEFB 01H, F7H 5EE7H-5EE8H: F7H: the controller writes the two CRC bytes of the identification. |
| 5EE9H-5EEAH 2 bytes | DEFB 16H, 4EH 5EE9H-5EEAH: 22 bytes 4EH, the gap between the identification and the data field. |
| 5EEBH-5EECH 2 bytes | DEFB 0CH, 00H 5EEBH-5EECH: 12 bytes 00H, the sync field before the data address mark. |
| 5EEDH-5EEEH 2 bytes | DEFB 03H, F5H 5EEDH-5EEEH: 3 bytes F5H: the controller writes A1H, the sync marks of double density, before the address mark. |
| 5EEFH-5EF0H 2 bytes | DEFB 01H, FBH 5EEFH-5EF0H: FBH, the data address mark that starts the data field of the sector. |
| 5EF1H-5EF4H 4 bytes | DEFB F5H, 80H, 6DH, B6H 5EF1H-5EF4H: F5H, 128 pairs 6DH B6H: the 256 bytes of the data field, the fill of a double density sector. |
| 5EF5H-5EF6H 2 bytes | DEFB 01H, F7H 5EF5H-5EF6H: F7H: the controller writes the two CRC bytes of the data field. |
| 5EF7H-5EF8H 2 bytes | DEFB 01H, FFH 5EF7H-5EF8H: 1 byte FFH, the gap after the sector. |
| 5EF9H-5EFAH 2 bytes | DEFB 11H, 4EH 5EF9H-5EFAH: 17 bytes 4EH, the gap after the sector. |
| 5EFBH 1 byte | DEFB F2H 5EFBH: F2H, the end of the part built for each sector (5A9BH). |
| 5EFCH-5EFDH 2 bytes | DEFB 00H, 4EH 5EFCH-5EFDH: 256 bytes 4EH, the gap to the end of the track. |
| 5EFEH-5EFFH 2 bytes | DEFB 3DH, 4EH 5EFEH-5EFFH: 61 bytes 4EH, the gap to the end of the track. |
| 5F00H 1 byte | DEFB F4H 5F00H: F4H, the end of the track: 256 bytes FFH follow, the address after it goes to 5BCBH (5AADH). |
| 5F01H-5F1EH 30 bytes | DEFB 00H, 01H, 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH, 10H, 11H, 12H, 13H, 14H, 15H, 16H, 17H, 18H, 19H, 1AH, 1BH, 1CH, 1DH 5F01H-5F1EH: the order of the 30 sectors of a side for the read, the write and the verify (5BCDH); side 1 takes it again with 30 added. |
| 5F1FH-5F23H 5 bytes | DEFB 00H x 5 5F1FH-5F23H: 5 bytes 00H after the order of the sectors; no instruction reads them. |
| 5F24H 1 byte | DEFB 1DH 5F24H: 1DH, the cursor to the start of the line, before the text of the format step (5ABDH). |
| 5F25H-5F3AH 22 bytes | DEFM "Formatting cylinder " 5F25H-5F3AH: the text of the format step; the cylinder is written over the last two spaces. |
| 5F3BH 1 byte | DEFB 03H 5F3BH: 03H, the end of the text: the cursor stays after it. |
| 5F3CH 1 byte | DEFB 1DH 5F3CH: 1DH, the cursor to the start of the line, before the text of the verify step (5B90H). |
| 5F3DH-5F52H 22 bytes | DEFM "Verifying cylinder " 5F3DH-5F52H: the text of the verify step, padded to the length of the others. |
| 5F53H 1 byte | DEFB 03H 5F53H: 03H, the end of the text: the cursor stays after it. |
| 5F54H 1 byte | DEFB 1DH 5F54H: 1DH, the cursor to the start of the line, before the text of the write step (5B73H). |
| 5F55H-5F6AH 22 bytes | DEFM "Writing cylinder " 5F55H-5F6AH: the text of the write step, padded to the length of the others. |
| 5F6BH 1 byte | DEFB 03H 5F6BH: 03H, the end of the text: the cursor stays after it. |
| 5F6CH 1 byte | DEFB 1DH 5F6CH: 1DH, the cursor to the start of the line, before the text of the read step (5B81H). |
| 5F6DH-5F82H 22 bytes | DEFM "Reading cylinder " 5F6DH-5F82H: the text of the read step of the source, padded to the length of the others. |
| 5F83H 1 byte | DEFB 03H 5F83H: 03H, the end of the text: the cursor stays after it. |
| 5F84H 1 byte | DEFB 1DH 5F84H: 1DH, the cursor to the start of the line, before the text of 53F6H. |
| 5F85H-5F9AH 22 bytes | DEFM "Disk not ready " 5F85H-5F9AH: the text of 53F6H when a destination gives no index pulses; Bad disk in drive follows. |
| 5F9BH 1 byte | DEFB 03H 5F9BH: 03H, the end of the text: the cursor stays after it. |
| 5F9CH 1 byte | DEFB 1DH 5F9CH: 1DH, the cursor to the start of the line, before the text of 61E6H. |
| 5F9DH-5FB2H 22 bytes | DEFM "BREAK pressed " 5F9DH-5FB2H: the text of 61E6H for each destination when BREAK stops the copy. |
| 5FB3H 1 byte | DEFB 03H 5FB3H: 03H, the end of the text: the cursor stays after it. |
| 5FB4H 1 byte | DEFB 0AH 5FB4H: 0AH, a new line before the prompt of 5C66H. |
| 5FB5H-5FDAH 38 bytes | DEFM "Load SYSTEM diskette and press <ENTER>" 5FB5H-5FDAH: the prompt at the end of QFB: only ENTER goes on (5C6FH). |
| 5FDBH 1 byte | DEFB 0DH 5FDBH: 0DH, the end of the prompt Load SYSTEM diskette. |
| 5FDCH 1 byte | DEFB 0AH 5FDCH: 0AH, a new line before the note of 5C73H. |
| 5FDDH-6003H 39 bytes | DEFM "Note: Realtime clock no longer accurate" 5FDDH-6003H: the note at the end of QFB: the clock stopped while the RST 38H vector was a RET. |
| 6004H 1 byte | DEFB 0DH 6004H: 0DH, the end of the note Realtime clock no longer accurate. |
| 6005H 1 byte | DEFB 0AH 6005H: 0AH, a new line before the text of 6155H. |
| 6006H-6013H 14 bytes | DEFM "MEMORY FAULT -" 6006H-6013H: the text of 6155H when the two copies of a sum differ; Program aborted! follows. |
| 6014H 1 byte | DEFB 03H 6014H: 03H, the end of the text: Program aborted! follows on the same line. |
| 6015H 1 byte | DEFB 0AH 6015H: 0AH, a new line before the text at 6016H, which no instruction points at. |
| 6016H-6028H 19 bytes | DEFM "Source READ error -" 6016H-6028H: a text that no instruction of QFB displays. |
| 6029H 1 byte | DEFB 03H 6029H: 03H, the end of the text Source READ error -. |
| 602AH-6045H 28 bytes | DEFM " =======> Source disk error" 602AH-6045H: the text of 55D5H when the source cylinder could not be read twice. |
| 6046H-6047H 2 bytes | DEFB 0AH, 0AH 6046H-6047H: two new lines before the question of the source error. |
| 6048H-607BH 52 bytes | DEFM "Press <ENTER> to restart program or <BREAK> to exit." 6048H-607BH: the question of 55DBH: ENTER copies again from the start, BREAK ends. |
| 607CH 1 byte | DEFB 0DH 607CH: 0DH, the end of the text of 55D5H, the source error. |
| 607DH-608DH 17 bytes | DEFM " Program aborted!" 607DH-608DH: the text of 5C1EH after an error that ends QFB. |
| 608EH 1 byte | DEFB 0DH 608EH: 0DH, the end of the text Program aborted!. |
| 608FH-60B9H 43 bytes | DEFM "Cannot duplicate disk with protected files." 608FH-60B9H: the text of 5C18H when bit 4 of byte CDH of the source's allocation table is set. |
| 60BAH 1 byte | DEFB 0DH 60BAH: 0DH, the end of the text Cannot duplicate disk with protected files.. |
| 61B7H-61C0H 10 bytes | DEFW 2710H, 03E8H, 0064H, 000AH, 0001H 61B7H-61C0H: the powers of ten of 616CH: 10000, 1000, 100, 10 and 1. |
Operands Changed While It Runs
| Address Size | Contents |
|---|---|
| 521FH 2 bytes | @PARAM: 4476H on the Model I (620BH). |
| 5532H 2 bytes | SFLAG$: 430FH on the Model I (6226H). |
| 5628H 2 bytes | @LOGOT: 447BH on the Model I (6217H). |
| 5A38H 2 bytes | The format table, from 5560H. |
| 5AD1H 2 bytes | The next sector number of the format, from 5A53H, 5AFEH and 5B52H. |
| 5B4CH 1 byte | The step of the sector numbers, from 5A4CH. |
| 5BCBH 2 bytes | The order of the sectors, from 5AADH. |
| 5BCFH 1 byte | The sectors of side 0, added for side 1 (5BC4H, 5BE9H). |
| 5BD8H 1 byte | The count of the sectors done (5BC1H, 5BDAH). |
| 5C1CH 2 bytes | @LOGOT: 447BH on the Model I (621AH). |
| 5C22H 2 bytes | @LOGOT: 447BH on the Model I (621DH). |
| 5C35H 2 bytes | @LOGOT: 447BH on the Model I (6220H). |
| 5C3EH 1 byte | The byte of the RST 38H vector at the start (6238H). |
| 5CBEH 1 byte | The drive number for the driver (54F6H, 60E1H). |
| 6230H 2 bytes | HIGH$: 4049H on the Model I (6211H). |
| 596FH-5973H, 5979H | The count of the disks and the letter s (54A3H, 616CH). |
Cells Outside the File That QFB/CMD Uses
| Address Size | Contents |
|---|---|
| 5698H-5699H 2 bytes | DEFS 2 5698H-5699H: not in the file. The Stack Pointer at the start (5200H), loaded again by 52CFH and 5336H. |
| 569AH 1 byte | DEFS 1 569AH: not in the file. The cylinder being copied (53C8H, 545CH). |
| 569BH 1 byte | DEFS 1 569BH: not in the file. The index of the current drive in the table of drives: 0 the source, 1 the destination. |
| 569CH-56EBH 80 bytes | DEFS 80 569CH-56EBH: not in the file. The copy of the eight drive code tables of DCT$ (6241H), put back by 5C3DH at the end. |
| 56ECH-570BH 32 bytes | DEFS 32 56ECH-570BH: not in the file. The buffer of the answers for the ROM's line input (55B6H): ten characters and ENTER at most. |
| 5CF1H 1 byte | DEFS 1 5CF1H: not in the file. The sectors of a cylinder (both sides), from 5517H and 5A47H; the loop 5BA6H ends after them. |
| 5CF2H 1 byte | DEFS 1 5CF2H: not in the file. The sectors of a track, from 550DH and 5A3CH: the repeat F1H and the change of side. |
| 6247H-62FFH 185 bytes | DEFS 185 6247H-62FFH: not in the file and not used by QFB. |
| 6300H-63FFH 256 bytes | DEFS 256 6300H-63FFH: not in the file. The first copy of the sums of the cylinders: two bytes for each, at 6300H plus two times the cylinder (611BH). |
| 6400H-64FFH 256 bytes | DEFS 256 6400H-64FFH: not in the file. The second copy of the sums, which 6130H compares with the first. |
| 6500H-65FFH 256 bytes | DEFS 256 6500H-65FFH: not in the file. The source's boot sector, then its allocation table: 65xxH the granules in use, 6560H up the lock out table, 65CCH-65CDH the cylinders and flags. |
| 6600H-66FFH 256 bytes | DEFS 256 6600H-66FFH: not in the file. The list of the places of the identification bytes during a format, the page each sector of a verify is read into. |
| 6700H-67FFH 256 bytes | DEFS 256 6700H-67FFH: not in the file. The first page of the cylinder buffer, which goes on up to HIGH$: the image of a track for the format, the sectors of the cylinder for the read and the write. |
Disassembly
5200H - The Start: the Banner, the Parameters and the Drives
LDOS Ready loads QFB/CMD at 5200H-6246H and jumps to 5200H, the transfer address, with Register Pair HL at the rest of the command line. The command is QFB :s :d (parameters) (M-40-060, version 5): the source and destination drives, and QUERY (Q), ALL (A), V1 and V2. 6201H fits the file to the Model I or the Model III and saves the drive code tables; the parameters in parentheses go to @PARAM, and the drive digits before them are collected at 5684H (the source) and 5685H (the destination). A drive that is not given is asked for.
5234H - Asking for the Drives
A drive missing from the command line is asked for: Source drive ? takes one character, Destination drive ? up to ten. The source must differ from every destination; a bad entry clears the digit and asks again. BREAK at a question ends QFB through 5C37H. The questions of QUERY follow.
5282H - The Questions of QUERY
With QUERY (or Q) the three questions are asked for each of ALL, V1 and V2 whose low byte is still 01H, the mark of a parameter not given on the command line; the answer (00H for N, FFH for Y) goes into its high byte. @PARAM stores FFFFH or 0000H for a parameter that is given, so that it is not asked. Then the ALL byte 567DH is complemented: from here on FFH means copy only the cylinders in use.
52BDH - Loading the Disks and the Source
After the prompt, ENTER starts the copy and BREAK ends QFB. The source drive must be a floppy (no hard disk, bit 3 of byte +03H of its drive code table) and must pass the index pulse test of 5A04H. Its boot sector gives the directory cylinder, and the allocation table there, read with the deleted data mark that a directory sector must have, gives the cylinders and the sides. A disk whose table has bit 4 of byte CDH set is refused. The answer ENTER of 54C1H and a source error (55EBH) come back to 52CFH.
533AH - The Destination Drives
Each destination digit is copied to 5687H and checked by 535FH: the drive must not be write protected or a hard disk, and must be of the same size as the source; its drive code table then takes the source's density, size, sides, cylinders and sectors. The tables of the drives go to 5689H (the source) and 568BH (the destination). The code is written for a list of destinations ended by 00H, but 5578H takes only one.
53C4H - The Copy, Cylinder by Cylinder
For each cylinder from 0 to the highest (byte +06H): every destination is formatted (5A33H; cylinder 0 only after the index pulse test of 5A04H), then the source cylinder is read into memory from 6700H (60CFH), then it is written to each destination (5B6FH) and, with V1, verified at once (5B90H); a verify error writes the cylinder once more. A destination with an error is dropped with the message Bad disk in drive (55F6H). The cylinders that are not in use are not read or written unless ALL was given. 4012H gets C9H, a RET for the RST 38H interrupt: the clock interrupt is off while QFB copies. SHIFT @ pauses, BREAK stops (61C1H).
5462H - The Second Pass and the End
With V2 each destination is read back from its highest cylinder down to cylinder 0, and the sums of the copied cylinders are compared (5B90H). An error of this pass stops the pass for that disk but gives no message and does not drop it. Then the destinations that are left are counted into 5692H, the disks made since QFB started, and the count is shown with Duplication complete. ENTER copies again to new disks with the same drives and parameters, R starts again with the questions, BREAK ends QFB.
54DAH - The Next Destination
569BH is the index of the current drive in the table at 5689H: 0 the source, 1 the destination. 54DAH steps to the next index whose digit in the copy at 5687H is not 00H (a dropped destination has 00H), puts the drive number into the driver call (5CBEH) and points Index Register IY at the drive's table, with the NZ FLAG. At index 2 it puts 0 back and returns with the Z FLAG.
5507H - The Memory Test and the Format Table
The cylinder buffer runs from 6700H, one page of 256 bytes for each sector of the cylinder, and HIGH$ must not be below its end plus two pages. The sectors are taken from byte +07H of the source's drive code table with the mask 0FH, which drops bit 4: a track of 18 sectors (11H) counts as two, one of 30 (1DH) as 14. The format table is chosen by bit 5 (8 inch) and bit 6 (double density) of byte +03H, and for double density by bit 3 of SFLAG$ (FAST), which gives the tables with the closer interleave.
5564H - A Decimal Number Not Used
5564H takes the decimal digits at Register Pair HL into Register E (the value times ten plus the digit, until a character that is not a digit). No instruction of QFB calls it.
5577H - Collecting the Drive Digits
5577H starts at Register Pair HL, 5578H at the character after it. Colons, spaces and other characters below the digit 0 are passed over; the digits 0-7 are stored at Register Pair DE until 5686H. The left parenthesis or ENTER ends the search with the Z FLAG; a character from 8 up gives the NZ FLAG, the error; when 5686H is reached the rest is not looked at.
559BH - The Questions and the Answers
559BH asks a question with Y or N for an answer: FFH for Y, 00H for N, any other answer asks again. 55B2H displays the question at Register Pair HL and takes a line of up to Register B characters at 56ECH by the ROM's line input; it returns with the CARRY FLAG for BREAK, or with the first character as a capital in Register A.
55C2H - The Errors of a Step
5696H counts the errors of the step just made (5CCAH). After the source read (55C2H) one more read of the cylinder is made; if that fails too, Source disk error is shown and ENTER starts the copy again from the source's boot sector (BREAK ends QFB). After a format, write or verify of a destination (55EEH), the destination is dropped: its digit in the copy at 5687H becomes 00H and Bad disk in drive is shown with the digit.
5618H - The Errors That End QFB
Four texts, displayed by @LOGOT before 5C37H puts the system back and ends QFB. The entries 561CH, 5620H and 5624H lie inside LD IX instructions: each DD byte makes the LD HL after it a part of an LD IX, which loads Index Register IX and changes nothing that counts.
562DH - The Parameter Table and the Values
The table of @PARAM in the form of LDOS 5: six characters of the name, padded with spaces, and the address of the value, ended by 00H. @PARAM stores FFFFH (or 0000H for =N) at the address of each parameter given. 565EH puts the defaults back for the restart R; 5669H clears the drives and the tables of drives. The values in the file are those of a first start: each parameter's low byte 01H means not given, the high byte is its default.
570CH - The Texts
The banner, the questions and the messages of QFB. A text ends with 0DH (a new line after it) or 03H (the cursor stays after it); 1CH puts the cursor at the top left of the screen and 1FH clears the screen from the cursor down. The count of the disks is written into the text at 596FH and the letter s at 5979H.
5A04H - The Index Pulse Test
A drive is ready when its index pulse (bit 1 of the controller's status) goes off, on and off again within 1000H status reads after a restore. A drive with its own driver (bit 4 of byte +04H, a MemDISK) is taken as ready at once. 5A21H counts Register Pair BC down; at 0000H it drops its return address and gives the NZ FLAG and Register A = 20H to the caller of 5A04H.
5A33H - Formatting a Cylinder
The format table (5A38H, chosen by 5507H) starts with the sectors of a track, the step of the sector numbers from one cylinder to the next, the sector numbers in the order on the track and the bytes that wrap their pointer back. The program after them builds the image of one track at 6700H: a count byte and a value give the value that many times (00H 256 times); F1H and F2H repeat what is between them once for each sector; F3H keeps the place of the sector's three identification bytes in the list at 6600H; F4H ends the track with 256 bytes FFH and leaves the order of the sectors for the read and the write; F5H with a count and two bytes gives the two bytes that many times (6DH B6H, the double density fill). Then each side is written with the Write Track command.
5B57H - Is the Cylinder Copied?
5B57H returns the Z FLAG when the cylinder at 569AH is not copied: when the source's allocation table (6500H) gives it the same bits in use (65xxH) as locked out (6560H + the cylinder). With ALL every cylinder but cylinder 0 is copied without the test. 5B6FH writes, 5B81H reads and 5B90H verifies a cylinder through 5BA6H, which goes through the sectors in the order the format table gives.
5C18H - The End of QFB
5C18H and 5C1BH display an error with @LOGOT, then Program aborted! and, when disks were made, their count. 5C37H puts the RST 38H vector back (and EI), turns the cursor on, puts the eight drive code tables back as they were at the start (each keeps the cylinder its head is on), asks for the system disk and ends through @EXIT. The note that the clock is no longer right is shown every time.
5C7AH - The Calls of the Disk Driver
Each entry loads Register B with a function of the driver and goes through 5CBCH: interrupts off, Register C the drive number (5CBEH), CALL 5CC8H, JP (IY), which jumps to the driver through byte +00H of the drive code table; Register Pair HL, Register Pair DE and Register Pair BC come back as they were. The functions of the Model III's floppy driver: 00H nothing, 01H select, 04H restore, 05H step in, 06H seek, 07H wait until not busy, 09H read, 0AH verify, 0CH and 0DH write, 0EH write with the deleted data mark, 0FH Write Track. 5CCAH counts an error, 5CD2H and 5CDFH show a cylinder as two digits.
5CF3H - The Format Table: 5 Inch Single Density
10 sectors a track, the sector numbers two apart on the track (5538H): the count of the sectors, the step from cylinder to cylinder, the sector numbers as they follow one another on the track, the wrap bytes, the program of the track and, after F4H, the order in which the sectors are read and written.
5D34H - The Format Table: 5 Inch Double Density
18 sectors a track, the sector numbers three apart (5556H): the count of the sectors, the step from cylinder to cylinder, the sector numbers as they follow one another on the track, the wrap bytes, the program of the track and, after F4H, the order in which the sectors are read and written.
5D90H - The Format Table: 8 Inch Single Density
16 sectors a track (553FH): the count of the sectors, the step from cylinder to cylinder, the sector numbers as they follow one another on the track, the wrap bytes, the program of the track and, after F4H, the order in which the sectors are read and written.
5DD5H - The Format Table: 8 Inch Double Density
30 sectors a track, the sector numbers five apart (5546H): the count of the sectors, the step from cylinder to cylinder, the sector numbers as they follow one another on the track, the wrap bytes, the program of the track and, after F4H, the order in which the sectors are read and written.
5E55H - The Format Table: 5 Inch Double Density with FAST
18 sectors a track, the sector numbers two apart, for the faster processor (555DH): the count of the sectors, the step from cylinder to cylinder, the sector numbers as they follow one another on the track, the wrap bytes, the program of the track and, after F4H, the order in which the sectors are read and written.
5EACH - The Format Table: 8 Inch Double Density with FAST
30 sectors a track, the sector numbers three apart (554DH): the count of the sectors, the step from cylinder to cylinder, the sector numbers as they follow one another on the track, the wrap bytes, the program of the track and, after F4H, the order in which the sectors are read and written.
5F24H - The Texts of the Copy
The texts of the steps start with 1DH, the cursor to the start of the line, so that each step writes over the last; they end with three spaces and 03H, and 5CDFH writes the cylinder over the last two spaces. The texts of the end follow.
60BBH - Two Hex Digits, Not Used
60BBH writes Register A as two hex digits at Register Pair HL and steps Register Pair HL past them; 60C4H writes the low digit alone. No instruction of QFB calls them.
60CFH - Reading the Source Cylinder
When a destination is left and the cylinder is copied, the cylinder is read from the source into memory from 6700H, a page for each sector, and the sum of its bytes is kept twice, at 6300H and 6400H plus two times the cylinder (611BH). 6130H compares a sum with the kept ones: the two copies must agree (else MEMORY FAULT), and a sum that differs counts as an error. 6105H adds a sector to the sum.
615BH - A Drive Code Table and a Decimal Number
615BH points Index Register IY at the drive code table of drive Register A: DCT$ plus ten times the drive. 616CH writes Register Pair DE as five decimal places at Register Pair HL, with spaces for the leading zeros, by the powers of ten at 61B7H.
61C1H - The Pause and BREAK
61C1H looks at the keyboard matrix between the cylinders. SHIFT and @ together (3880H, 3801H) wait for a key other than SHIFT @. BREAK (3840H bit 2) marks every destination as a bad disk, waits until BREAK is let go and goes to the count of the disks made (5484H): a disk stopped by BREAK is not counted.
6201H - The Set-Up for the Model and the Drive Code Tables
QFB is one file for the Model I and the Model III. The byte at ROM 0125H is 49H in the Model III's ROM; with any other byte the Model I addresses of @PARAM (4476H), HIGH$ (4049H), @LOGOT (447BH) and SFLAG$ (430FH) are stored into the operands. Then DCT$ (4700H on both), HIGH$ and the byte of the RST 38H vector (4012H) are kept, and the eight drive code tables are copied to 569CH, to be put back at the end (5C3DH).