--- DISK DUMP --- -- Version 2.15 -- By Bill Bolton Software Tools, P.O. Box 80, Newport Beach, NSW, 2106, AUSTRALIA Introduction ------------ This program is an improved disk dump utility for CP/M. Any CP/M file may be dumped to the console. In addition any sector or group of sectors may be dumped in the same format. The utility can be made to handle any CP/M 2.X disk system as outlined later. The program is referred to as DD6 when refering to the latest implementation or DDX when refering to all implementations including the latest one. --- OPERATION --- The program may be run either by typing DD6, or DD6 followed by the file name or track and sector. If DD6 is typed the program responds with a heading, followed by a '*' and waits for more user input. Operation in this mode is similar to other utilities such as PIP or DDT. The operation desired may then be typed in as follows: DD6 file.nam DD6 A:file.nam DD6 C:file.nam or may be typed separately as: DD6 *file.nam (the * is the program prompt) *B:file.nam The file is dumped by examining its directory entry to obtain block allocation, number of records and extent information. The file is then dumped on a block by block basis, this allows display of the track and sector numbers as a file is dumped. The last block of a file is only dumped up to the last sector actually used by the file. All sector dumps display hex addresses in the range 00 to 7F as a 2 digit hex number, except in the case of a COM file dump. When a COM file is being dumped, the first sector is assumed to start at 0100H and all subsequent addresses are incremented from this base address and displayed as a 4 digit hex number. A sector dump heading is displayed at the top of each sector dumped and indicates the drive selected, whether 1 or 2 sided, its physical sector size, the track number, logical sector number and a dump count: Drive A: 1S/2D/1024 - Track 2 Logical Sector 14 Dump Count 1 The dump count displays the running total of sectors dumped from a single command line. This is useful for locating a particular sector of a file or block. A modified version of the CP/M User's Group binary COMPARE utility, which indicates file differences with decimal sector numbers that are directly equivalent to DDX Dump Count numbers, is available from Software Tools. The program may also be used to dump disk sectors directly and dump any CP/M sector block (or group) - block size information is obtained from the CP/M 2.X DPB (Disk Parameter Block) of the drive concerned. The sectors containing the directory may dumped with a simple single command and a map of the block allocations may be likewise displayed. DD6 TRACK 3 SECTOR 7 DD6 TRACK 5 SECTOR 3 - 9 DD6 TRACK 6 (dumps all sectors on the track) DD6 GROUP 19 DD6 DIR DD6 MAP The words TRACK, SECTOR and GROUP may be abbreviated as follows: DD6 T 7 S 3-4 DD6 G 4 *TRACK 5 S 6 *SECTOR 2-9 T 14 DD6 B: TRACK 3 DD6 A: T 9 S 4-6 DD6 B: G 5 DD6 B:MAP Note that the format is quite free. Spaces are usually ignored. They are only required after the words TRACK, SECTOR and GROUP or T, S and G and after the word DD6. In previous versions of DDX the block or cluster was refered to as a "group" as this term is still used as a command to maintain compatibility with previous versions. Digital Research now use the term "block" instead of "group" and this file and most of the comments in the source file use the term "block". -- EDITING --- A limited editing feature is included in the dump utility to allow changing of data on disk. The edit works as follows - any single logical sector of any drive may be edited by requesting display of the sector followed by the word EDIT. DD6 D:TRACK 4 SECTOR 2 EDIT The requested sector will be displayed followed by an edit prompt: EDIT - Enter the address of the first byte to be changed. The program will respond by typing back the address entered and the present contents of that address. To change the contents, enter the new byte followed by a carriage return. The program will display the next address and its contents. To stop entering data type a period, the sector will then be redisplayed showing the changes. The edit feature works almost exactly like the 'S' command in DDT, typing only a carriage return omits entry. The change is not made permanent until it is written back onto the disk, you exit the edit mode by typing; WRITE (write the changed sector back onto disk) STOP (stop the edit without writing to disk) All edit entries must be made in hex. Entering non hex characters results in an error message. The permissable address range is from 00 to 7F, larger addresses give an error message. When entering a block of bytes the addresses are computed modulo 128, the next address after 7F is 00. The edit feature should be used with caution as it is possible to edit CP/M to "death" by changing a single byte. One occasionally valuable use is to restore files which have been accidentally erased. Erasing a file using the ERA command does not erase the data from the disk, but only writes an E5 into the first byte of its directory entry. To restore the file, display the directory using the DD6 DIR command. Find the sector containing the entry in question and display it using the EDIT feature. Change the byte preceeding the file name from E5 to 00 and write the sector back on disk. This will restore the file provided that you have not used any programs which write data to disk since erasing the file. *** BE WARNED *** If you have run a program that writes data to disk since erasing the file you may find that the erased file's allocated blocks have been used for another file and the integrity of the erased file therefore destroyed. --- CP/M 2.X --- This latest version of DDX benefits from running under CP/M 2.X. As the DPB location is now accessable via BIOS calls it is possible to extract nearly all the information needed to allow dynamic determination of a drives characteristics. There are only two hardware dependent subroutines, one is optional and simply sets up the sector display header to suit your requirements. As it is not possible to determine the actual density or number of sides directly from the DPB, as CP/M doesn't care about that information, you must write the code. The 1791 controller chip has this available as status inform ation and most other controller chips seem to have something similar. The other hardware dependent routine concerns the handling of Track 0. In all IBM compatible formats Track 0 is always single density 3740 format. You must be able to overide all dynamically set parameters of DD6 and force your disk controller to read Track 0 as single density, 26 x 128 byte sectors. The Morrow Disk Jockey 2D and Godbout Disk 1 do this automatically so it was simply a matter of feeding the correct sector numbers to the controller. Fortunately Track 0 is not involved in file or block dumps so it is easy to treat it as an exception and only one subroutine needs to be altered. SECTOR NUMBERING - Single density CP/M maintains a skew factor of 6 on 8" IBM 3741 compatible disks (i.e the standard implementation). This means that logical sector 1 on a track is physical sector 1 while logical sector 2 is physical sector 7 on that track etc. This is done to provide greatest internal efficency of operation for CP/M in accessing disks. CP/M sees each 128 byte sector on a single density disk as one logical record so there is a direct relationship between sector size and data block size. With double density disk recording systems there are several possible sizes for sectors. The IBM 2D standard allows for sector sizes of 256, 512 or 1024 bytes. Double density and Hard disk implementations which use physical sectors sizes that are multiples of 128 bytes have to DEBLOCK the physical sector into 128 byte logical sectors. The BIOS handles all blocking and deblocking, so that legal sector numbers for BIOS set sector calls are 1 to the maximum number of 128 byte sectors for the track size, the BIOS then does the deblocking and translation to physical sectors on the disk. The BIOS accesses all data bytes of a physical sector by reading them into a buffer in memory and then accessing the required 128 byte section of the buffer to give 128 byte logical sectors. BLOCK SIZE - Standard CP/M 1.4 is set up to recognise 243 blocks per disk. The block is the smallest amount of disk space which can be allocated and disk space is allows allocated in blocks. In a standard single density system on IBM 3741 compatible 8" disk the block size is 1K bytes or 8 sectors of 128 bytes each. Block sizes for double density and hard disks vary but are always a multiple of 1K bytes. The actual size is determined form the DPB. When using the DD6 GROUP N command a calculation of the sector numbers covered by any particular block is made and a look up of the XLT (sector translation tables) in the BIOS is used to take into account the skew factor in use on the specific CP/M implementation. The current source listing is for a Godbout "Disk 1" based CP/M 2.X system and a 24 x 80 video display. If you have a 16 x 64 video display you will need to remove some of the spaces inserted in the dump display by the PRTSEC routine. DD6 should be readily adaptable to other CP/M 2.X systems, including hard disk systems. As far as possible all values which might reasonably be expected to exceed 256 in any realisable disk system are manipulated as 16 bit values. Therefore the large sectors sizes, sector numbers and track numbers likely to be found on a hard disks should present no problem. The program does make a few assumptions about the way CP/M 2.X handles the disk parameter block allocation, it assumes that it is all done dynamically in the BIOS. As all the multiple density CP/M 2.X systems that I have come across manage to do this (some more elegently than others !) I think that it is a safe assumption. --- OTHER DETAILS --- As with other CP/M utilities a ^S 'freezes' the display and ^C returns to CP/M. Hitting the 'space bar' will abort the dump currently in progress and either exit or return to command level, depending on how you entered the utility. Dump cont ains many error and consistancy checks. The resulting messages are generally self explanatory. DD6 was assembled using the CP/M MAC assembler and uses a large library of macros called MACRO3.LIB which is available from Software Tools. (N.B. MACRO3.LIB is an revision of MACRO.LIB, as used by Sam Singer's single density version, with extensions to the CALLBIOS and DISKIO macros to handle CP/M 2.2, and several new macros added). This disk dumper is in a continuing state of development and refinement. There is now a version for the Morrow Designs Hard Disk controller with a DJ2D or a Godbout Disk 1 controller, called DDH. Many new features are planned and will be added in the towards the end of 1981. .