mirror of
https://github.com/aaru-dps/docs.git
synced 2025-12-16 19:24:38 +00:00
690 lines
38 KiB
Plaintext
690 lines
38 KiB
Plaintext
|
|
|
|||
|
|
*** D2M (Electronic form of a CMD FD2000 1.56 Mb floppy disk)
|
|||
|
|
*** DNP (Electronic form of a CMD hard Disk Native Partition)
|
|||
|
|
*** Document revision: 1.3
|
|||
|
|
*** Last updated: Nov 27, 2005
|
|||
|
|
*** Compiler/Editor: Peter Schepers
|
|||
|
|
*** Contributors/sources: Torsten Hinrichs (sample files),
|
|||
|
|
Malte Munde (sample files),
|
|||
|
|
Wolfgang Moser,
|
|||
|
|
Roberto Muscedere,
|
|||
|
|
Bo Zimmerman (sample DNP files)
|
|||
|
|
|
|||
|
|
Much of the information contained in this document has been gathered by
|
|||
|
|
dissecting FD2000 floppy images (in D2M format) and DNP hard disk images,
|
|||
|
|
comparing them, and arriving at some well-educated conclusions. Comparisons
|
|||
|
|
to some other disk types (D81, D64) have helped immeasurably. Therefore,
|
|||
|
|
some of the information presented here might not be accurate or complete.
|
|||
|
|
|
|||
|
|
CMD devices are incredibly compatible. The FD2000 is is backwards
|
|||
|
|
compatible to the Commodore 1581 floppy, contains the JiffyDos fastloader,
|
|||
|
|
and even supports the GEOS OS. Inserting a native-formatted FD2000 floppy
|
|||
|
|
keeps the drive in its native mode support, but inserting a 1581-formatted
|
|||
|
|
disk will put the drive into "1581 compatible" mode. It even supports
|
|||
|
|
"emulated" partitions of 1541, 1571 and 1581 disks on native-formatted
|
|||
|
|
disks.
|
|||
|
|
|
|||
|
|
The D2M image is considered a "container" image as it contains other
|
|||
|
|
image types like D64, D71, D81 and native partitions as well. The container
|
|||
|
|
nature makes supporting D2M more difficult than other image types.
|
|||
|
|
|
|||
|
|
The extension DNP was arrived at after discussions between Bo Zimmerman
|
|||
|
|
and this document author. It stands for CM(D) (N)ative (P)artition.
|
|||
|
|
Unfortunately we could not assign it CMD as that would conflict with the
|
|||
|
|
Windows OS CMD interpeter batch files.
|
|||
|
|
|
|||
|
|
There are several different ways to view the layout of FD2000 floppies.
|
|||
|
|
At the controller level, the disk has 81 tracks (physically numbered 0 to
|
|||
|
|
80), 10 sectors-per-track, 2 disk sides with 1024 bytes per sector. In
|
|||
|
|
Commodore logical terms, it has 81 tracks (1 to 81 logical), 80
|
|||
|
|
sectors-per-track with 256 bytes per sector, totalling 6480 sectors total.
|
|||
|
|
This makes the disk 1.56Mb in size. The last track (81, image offset
|
|||
|
|
$190000) is reserved and should not be used for data storage. This makes
|
|||
|
|
the file size 1658880 without error bytes attached, or 1665360 bytes with
|
|||
|
|
error bytes attached.
|
|||
|
|
|
|||
|
|
Seeing as the disk is 6480 sectors large, we need 6480 error bytes
|
|||
|
|
attached to the end of the image for an extended image type. About the only
|
|||
|
|
use for the error bytes is when emulating 1541 or 1571 drive types, and a
|
|||
|
|
bad sector for copy protection is needed. The job codes these error bytes
|
|||
|
|
represent only really apply the 1541 and 1571 drives.
|
|||
|
|
|
|||
|
|
While it may seem logical to interact with the disk with 81 tracks, it
|
|||
|
|
fails in practice and the reason is simple. Internally, all track & sector
|
|||
|
|
links in the native and emulated partitions (not system) refer to the disk
|
|||
|
|
as a 256 sector/track so you must work with the disk this way. This means
|
|||
|
|
the FD2000 image actually has 26 tracks, 25 for the image and a partial
|
|||
|
|
track 26 (80 sectors only) for the system partition. Coding a proper
|
|||
|
|
support structure for one CMD device image like D2M means that it would
|
|||
|
|
also be easy to make it work for any other image like DNP (except for the
|
|||
|
|
lack of a system partition).
|
|||
|
|
|
|||
|
|
So, what does it mean when track 2 sector 233 ($02/$E9) is accessed? To
|
|||
|
|
answer this, we need to convert the track and sector numbers into
|
|||
|
|
HEXADECIMAL, because calculating the resulting offset location become very
|
|||
|
|
simple. Taking the example above (track 2 sector 233), convert them to HEX
|
|||
|
|
numbers...
|
|||
|
|
|
|||
|
|
track 2 -> $02
|
|||
|
|
sector 233 -> $E9
|
|||
|
|
|
|||
|
|
subtract 1 from the track value (because all track references are from 1,
|
|||
|
|
not zero), attach the sector value to the end, and then attach a $00 to the
|
|||
|
|
end...
|
|||
|
|
|
|||
|
|
($track-1):$sector:$00 or $01E900.
|
|||
|
|
|
|||
|
|
This is the offset value into the existing partition to access track 1
|
|||
|
|
sector 233.
|
|||
|
|
|
|||
|
|
Additionally, each partition internally always starts from track 1. How
|
|||
|
|
is this possible? Well, the system partition table specifies what offset a
|
|||
|
|
partition starts at (in system blocks), and once inside the partition, all
|
|||
|
|
track references now start at 1. This means *you* must keep track of the
|
|||
|
|
offset where each partition exists once you are inside. As a bonus, this
|
|||
|
|
also means that moving a partition from one disk to another should be very
|
|||
|
|
simple because all the track/sector references and chains are "relative"
|
|||
|
|
and do not have to be adjusted.
|
|||
|
|
|
|||
|
|
CMD devices like the FD2000 floppy and CMD hard disks contain a "system
|
|||
|
|
partition" (described later) which stores up to 31 user-created partitions
|
|||
|
|
(also called segments), with the types defined below. One of the partitions
|
|||
|
|
will be set as the default so that when the disk is inserted in the floppy,
|
|||
|
|
the default partition will be entered automatically. The first entry is
|
|||
|
|
always set as the "system" entry.
|
|||
|
|
|
|||
|
|
There are several different types of partitions, which are...
|
|||
|
|
|
|||
|
|
Type Description Size
|
|||
|
|
---- --------------------------- -----------------------------------
|
|||
|
|
00 No partition 0
|
|||
|
|
01 Native partition variable (min 256 512-byte blocks)
|
|||
|
|
02 Emulated 1541 drive (D64) 342 512-byte blocks (684 sectors)
|
|||
|
|
03 Emulated 1571 drive (D71) 684 512-byte blocks (1368 sectors)
|
|||
|
|
04 Emulated 1581 drive (D81) 1600 512-byte blocks (3200 sectors)
|
|||
|
|
255 System partition (track 81)
|
|||
|
|
|
|||
|
|
The emulated drive partitions are a direct sector copy of the disk type.
|
|||
|
|
This means the track/sector references are just as a normal disk would be,
|
|||
|
|
even though the FD2000 doesn't normally do things this way. If you were to
|
|||
|
|
sector-by-sector copy the data out from this emulated partition to a new
|
|||
|
|
file, you would have a D64 (or D71/D81) image file in all respects.
|
|||
|
|
|
|||
|
|
There are two things to watch out for if you intend to copy the data from
|
|||
|
|
emulated partitions out to a real disk. Both the 1541 and the 1571 contain
|
|||
|
|
extra "filler" sectors on the end. The 1541 contains one, and the 1571
|
|||
|
|
contains two. A partial explanation for this behaviour is that the FD2000
|
|||
|
|
system partition works with 512-byte blocks, meaning all partitions must be
|
|||
|
|
even numbers (in 256-byte blocks). Therefore the 1541 size is incremented
|
|||
|
|
to the next logical size (684) to make is an even value. The 1571 is simply
|
|||
|
|
a doubling of the 1541 size, even though this means it now contains *two*
|
|||
|
|
extra filler sectors (which are now completely unnecessary).
|
|||
|
|
|
|||
|
|
For more information on the layout of 1541 (D64), 1571 (D71), 1581 (D81),
|
|||
|
|
GEOS, REL or any of the specific file types on the disks, see the
|
|||
|
|
appropriate documentation which should be included with this one.
|
|||
|
|
|
|||
|
|
It is the native partition type which is the most powerful to use because
|
|||
|
|
it is capable of so much, being a greatly improved disk format over the
|
|||
|
|
D64.
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
The System Partition (D2M/D4M images only)
|
|||
|
|
------------------------------------------
|
|||
|
|
|
|||
|
|
Every CMD storage device contains a system partition, but not all the
|
|||
|
|
images do. The D2M and D4M images do contain the system partition, but the
|
|||
|
|
DNP image does not as it is only a copy of the native partition portion
|
|||
|
|
from a CMD hard disk. Therefore this section only refers to the floppy
|
|||
|
|
(D2M) images.
|
|||
|
|
|
|||
|
|
The system partition exists at track 26 (offset $190000), and is broken
|
|||
|
|
up into several different areas. With only 80 sectors on this track
|
|||
|
|
(instead of the normal 256), there is potentially a lot of information.
|
|||
|
|
However, only sector 5 and 8-11 seem to be used.
|
|||
|
|
|
|||
|
|
The system partition contains no BAM map. In order to add new partitions,
|
|||
|
|
a pseudo-map would need to be built based on the existing partition entries
|
|||
|
|
starting positions and sizes to know where there is empty space on the disk
|
|||
|
|
for more partitions.
|
|||
|
|
|
|||
|
|
Sector 5 (offset $190500) holds the DevBlock, the "device information
|
|||
|
|
block". Most of the information here is unknown, but it likely contains
|
|||
|
|
information about the device itself, and possibly which partition is set as
|
|||
|
|
the default. This block should be duplicated as-is when generating a D2M
|
|||
|
|
image file as it does not appear to change across any of the images that
|
|||
|
|
have been seen.
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
190500: 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190510: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190520: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190530: FF FF FF FF FF FF FF FF 00 00 FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190540: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190550: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190560: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190570: 00 0C FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190580: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190590: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1905A0: FF FF FF FF FF FF FF FF 00 80 FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1905B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1905C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1905D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1905E0: 00 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1905F0: 43 4D 44 20 46 44 20 53 45 52 49 45 53 20 20 20 CMD<4D>FD<46>SERIES<45><53><EFBFBD>
|
|||
|
|
|
|||
|
|
Byte:$00-EF: unknown
|
|||
|
|
F0-FF: Disk identifier string (in ASCII, padded with $20)
|
|||
|
|
|
|||
|
|
|
|||
|
|
Sectors 8-11 (offset $190800-190BFF) hold the system partition directory
|
|||
|
|
containing information for as many as 31 separate partitions. The example
|
|||
|
|
below shows the 4 allowed partition types along with the required "SYSTEM"
|
|||
|
|
entry. All partition entries are 32 bytes long but the first two bytes are
|
|||
|
|
not used for the entry.
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
190800: 01 01 FF 00 00 53 59 53 54 45 4D A0 A0 A0 A0 A0 <20><><EFBFBD><EFBFBD><EFBFBD>SYSTEM<45><4D><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190810: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190820: 00 00 04 00 00 31 35 38 31 2F 50 41 52 54 49 54 <20><><EFBFBD><EFBFBD><EFBFBD>1581/PARTIT
|
|||
|
|
190830: 49 4F 4E A0 A0 00 00 00 00 00 00 00 00 00 06 40 ION<4F><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@
|
|||
|
|
190840: 00 00 03 00 00 31 35 37 31 50 41 52 54 49 54 49 <20><><EFBFBD><EFBFBD><EFBFBD>1571PARTITI
|
|||
|
|
190850: 4F 4E A0 A0 A0 00 06 40 00 00 00 00 00 00 02 AC ON<4F><4E><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190860: 00 00 02 00 00 31 35 34 31 50 41 52 54 49 54 49 <20><><EFBFBD><EFBFBD><EFBFBD>1541PARTITI
|
|||
|
|
190870: 4F 4E A0 A0 A0 00 08 EC 00 00 00 00 00 00 01 56 ON<4F><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V
|
|||
|
|
190880: 00 00 01 00 00 4E 41 54 49 56 2D 50 41 52 54 49 <20><><EFBFBD><EFBFBD><EFBFBD>NATIV-PARTI
|
|||
|
|
190890: 54 49 4F 4E A0 00 0A 42 00 00 00 00 00 00 02 00 TION<4F><4E><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1908A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1908B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1908C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1908D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1908E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1908F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190900: 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190920: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190930: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190950: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190960: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190970: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190980: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1909A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1909B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1909C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1909D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1909E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
1909F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A00: 01 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190A90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190AA0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190AB0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190AC0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190AD0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190AE0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190AF0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B00: 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190B90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190BA0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190BB0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190BC0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190BD0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190BE0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190BF0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Notice that the chain links are 1/1, 1/2, 1/3, and ends with a $00/$FF.
|
|||
|
|
What is happening here is the drive is using 26/5 as the start of the
|
|||
|
|
system partition, which now make 26/5 appear as logical 1/0. This is an
|
|||
|
|
example of partitions starting at track 1 internally even though they
|
|||
|
|
physically reside elsewhere. Therefore, even though the system partition
|
|||
|
|
starts at 26/5, this is actually logical track/sector 1/0 and you need to
|
|||
|
|
keep track of the starting offset of this partition so that accesses still
|
|||
|
|
start as 26/5.
|
|||
|
|
|
|||
|
|
The first entry is the root name. This entry must exist first...
|
|||
|
|
|
|||
|
|
190800: 01 01 FF 00 00 53 59 53 54 45 4D A0 A0 A0 A0 A0 <20><><EFBFBD><EFBFBD><EFBFBD>SYSTEM<45><4D><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
190810: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Byte:$00-01: track/sector reference to next partition block
|
|||
|
|
02: Partition type (255=system partition)
|
|||
|
|
03-04: unknown, set to $00
|
|||
|
|
05-14: root name (16 characters, padded with $A0)
|
|||
|
|
15-1F: set to $00
|
|||
|
|
|
|||
|
|
The next entry is the first partition...
|
|||
|
|
|
|||
|
|
190820: 00 00 04 00 00 31 35 38 31 2F 50 41 52 54 49 54 <20><><EFBFBD><EFBFBD><EFBFBD>1581/PARTIT
|
|||
|
|
190830: 49 4F 4E A0 A0 00 00 00 00 00 00 00 00 00 06 40 ION<4F><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@
|
|||
|
|
|
|||
|
|
Byte:$00-01: not used
|
|||
|
|
02: Partition type
|
|||
|
|
00 - No partition
|
|||
|
|
01 - Native FD2000 partition
|
|||
|
|
02 - Emulated 1541 disk (D64)
|
|||
|
|
03 - Emulated 1571 disk (D71)
|
|||
|
|
04 - Emulated 1581 disk (D81)
|
|||
|
|
03-04: unknown, set to $00
|
|||
|
|
05-14: Partition name (16 bytes, padded with $A0)
|
|||
|
|
15: unknown, set to $00
|
|||
|
|
16-17: Starting offset to partition, in hi/lo format (note that
|
|||
|
|
these blocks are 512-byte blocks)
|
|||
|
|
18-1D: unknown, set to $00
|
|||
|
|
1E-1F: Partition size, in hi/lo format (note that these blocks
|
|||
|
|
are again 512-bytes in size)
|
|||
|
|
|
|||
|
|
*Note: the "partition size" and "starting offset" values are some other
|
|||
|
|
examples of the oddities of the FD2000 layout. They are counted in 512-byte
|
|||
|
|
sectors, not the standard 256-byte sectors of other Commodore disks. What
|
|||
|
|
this means is you must double the value to get the actual size in 256-byte
|
|||
|
|
sectors.
|
|||
|
|
|
|||
|
|
In the case of emulated drive partitions, the size is already known, as
|
|||
|
|
it is a sector-for-sector duplicate of the emulated disk. An emulated 1541
|
|||
|
|
disk will have one extra sector at the end of the image because it is an
|
|||
|
|
odd size (683) and the size must always be even, being multiples of 512
|
|||
|
|
bytes.
|
|||
|
|
|
|||
|
|
The third partition example from above ("1571PARTITION") shows a block
|
|||
|
|
offset of $0640 and a block size of $02AC. Since these are in 512-byte
|
|||
|
|
blocks, we need to double them to get the real 256-byte sector values
|
|||
|
|
($0C80 and $0558). This means that this partition starts at file offset
|
|||
|
|
$0C8000, and is $0558 (or 1368) sectors large. The file offset number must
|
|||
|
|
be remembered as all references within the partition must be added to the
|
|||
|
|
above offset value to get the real offset into the D2M image.
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Native Partitions (D2M and DNP images)
|
|||
|
|
--------------------------------------
|
|||
|
|
|
|||
|
|
All partitions inside of a D2M image must start on a 512 byte boundary,
|
|||
|
|
and end on one as well. The minimum size for a native partition is 256
|
|||
|
|
system blocks (or 512 sectors in 256-byte sectors). Part of the reason for
|
|||
|
|
the minimum size is the number of blocks that the BAM and other areas
|
|||
|
|
allocate (35 blocks) even before you get a chance to do anything.
|
|||
|
|
|
|||
|
|
Keep in mind that a DNP image does not contain a system partition but is
|
|||
|
|
only the native partition from a CMD hard disk. It is therefore not
|
|||
|
|
considered a "container" image type. The maximum track size for DNP is 255.
|
|||
|
|
This puts the upper limit on this image at 16,711,680 bytes. To determine
|
|||
|
|
the track size of a DNP image, simply divide the image size by 65536. If
|
|||
|
|
there is any remainder, this means there is a partial track stored at the
|
|||
|
|
top so increment the track size by one.
|
|||
|
|
|
|||
|
|
The first sector ($01/$00) of a native partition is reserved for the C128
|
|||
|
|
boot block. CMD designed the drive this way, allocating the first sector
|
|||
|
|
automatically, so the partition HEX dump will start at the next sector,
|
|||
|
|
$01/$01.
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
0000: 01 24 48 00 53 55 42 44 49 52 31 38 A0 A0 A0 A0 <20>$H<>SUBDIR18<31><38><EFBFBD><EFBFBD>
|
|||
|
|
0010: A0 A0 A0 A0 A0 A0 54 49 A0 31 48 A0 A0 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TI<54>1H<31><48><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0020: 01 23 01 01 01 22 02 00 00 00 00 00 00 00 00 00 <20>#<23><><EFBFBD>"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
00A0: 00 00 00 00 00 00 00 00 00 00 00 01 25 47 45 4F <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%GEO
|
|||
|
|
00B0: 53 20 66 6F 72 6D 61 74 20 56 31 2E 31 00 00 00 S<>format<61>V1.1<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
00D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
00E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
00F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Byte:$00-01: Track/sector reference to root directory block of this
|
|||
|
|
partition ($01/$24).
|
|||
|
|
02: Disk format type ("H")
|
|||
|
|
03: unknown, set to $00
|
|||
|
|
04-15: Disk name (16 characters, padded with $A0)
|
|||
|
|
16-17: Disk ID's ("TI")
|
|||
|
|
18: Set to $A0
|
|||
|
|
19: DOS Version ("1")
|
|||
|
|
1A: Disk format type ("H")
|
|||
|
|
1B-1C: Set to $A0
|
|||
|
|
1D-1F: unknown, set to $00
|
|||
|
|
20-21: Track/Sector pointer to present directory header block
|
|||
|
|
22-23: Track/Sector pointer to parent directory header block
|
|||
|
|
(set to $00/$00 when at the top of the directory)
|
|||
|
|
24-25: Track/Sector pointer to dir entry in previous directory
|
|||
|
|
(set to $00/$00 when at the top of the directory)
|
|||
|
|
26: Index pointer to dir entry in parent directory (set to
|
|||
|
|
$00 if at the top of the directory)
|
|||
|
|
27-AA: unknown, set to $00
|
|||
|
|
AB-AC: GEOS border sector
|
|||
|
|
AD-BC: GEOS format string (GEOS format Vx.x)
|
|||
|
|
BD-FF: Unknown, set to 00
|
|||
|
|
|
|||
|
|
The references at $20 through $26 take a little more explanation. The
|
|||
|
|
track/sector link at $20-$21 points to the header of the present directory.
|
|||
|
|
This way when you are in the directory listing, you know where the header
|
|||
|
|
block is, and it can be accessed to find out how to go back one level, or
|
|||
|
|
change the header name, etc.
|
|||
|
|
|
|||
|
|
The t/s link at $22-23 points back to the immediately previous directory
|
|||
|
|
(parent entry), allowing you to go backwards up the directory tree one step
|
|||
|
|
at a time. Note that there is no value for a jump back to the top level
|
|||
|
|
directory. This value is known only when you enter the partition.
|
|||
|
|
|
|||
|
|
The t/s link at $24-25 points to the sector where the entry for the
|
|||
|
|
present directory name exists (one level up), and the value at $26 is the
|
|||
|
|
real index into this sector pointing directly at the name. This entry is
|
|||
|
|
important because if you add extra entries to a directory, forcing the
|
|||
|
|
addition of another sector, the parent entry must be updated with a new
|
|||
|
|
block count. The reference at $24-26 tells you exactly where the parent
|
|||
|
|
entry is.
|
|||
|
|
|
|||
|
|
If the directory header contains the GEOS format signature at offset $AD,
|
|||
|
|
then the directory is ready for GEOS use. See the GEOS.TXT document for
|
|||
|
|
more explanation of GEOS features. It is not known if children
|
|||
|
|
subdirectories under a parent which is GEOS formatted must also be GEOS
|
|||
|
|
format. However, each directory, regardless of where it is, uses it's own
|
|||
|
|
GEOS border sector if it is formatted for GEOS.
|
|||
|
|
|
|||
|
|
|
|||
|
|
The BAM map for a native partition starts at track 1 sector 2 and extends
|
|||
|
|
up to sector 33. Why is it 32 sectors long? A native partition supports up
|
|||
|
|
to 255 tracks (at 256 sectors per track). Doing the math, this makes the
|
|||
|
|
BAM table 8160 bytes long, or approximately 32 sectors. A native partition
|
|||
|
|
inside of a D2M image can only go up to track 25 of 255 due to the physical
|
|||
|
|
size limits of the D2M, so most of the table is unused and filled with
|
|||
|
|
$FF's. However, a DNP image can use up to 255 tracks, so the entire BAM
|
|||
|
|
will be used.
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
000200: 00 00 48 B7 4A 4F C0 00 19 00 00 00 00 00 00 00 <20><>H<EFBFBD>JO<4A><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000220: 00 00 00 00 0F FF FF FF 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0002A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0002B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0002C0: 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD>
|
|||
|
|
0002D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0002E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0002F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
..
|
|||
|
|
000500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000510: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000520: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000530: 00 00 00 00 00 00 00 07 FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000540: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000550: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Byte:$00-01: unknown, set to $00
|
|||
|
|
02: Disk format type ("H")
|
|||
|
|
03 1's complement of format type ("H" EOR $FF)
|
|||
|
|
04-05: Disk ID's ("JO")
|
|||
|
|
06: unknown (seems to be the same value from the 1581 image,
|
|||
|
|
I/O byte)
|
|||
|
|
bit 7 set - Verify on
|
|||
|
|
bit 7 clear - Verify off
|
|||
|
|
bit 6 set - Check header CRC
|
|||
|
|
bit 6 clear - Don't check header CRC
|
|||
|
|
07: unknown, set to $00
|
|||
|
|
08: Last available track # in partition ($19=#25)
|
|||
|
|
09-1F: unknown, set to $00
|
|||
|
|
20-FF: BAM for tracks 1-7
|
|||
|
|
|
|||
|
|
|
|||
|
|
BAM block Covers tracks
|
|||
|
|
------------ ------------------------------
|
|||
|
|
1 (#01/#02) 01-07 (starts at offset $20)
|
|||
|
|
2 (#01/#03) 08-15 (starts at offset $00)
|
|||
|
|
3 (#01/#04) 16-23 ''
|
|||
|
|
4 (#01/#05) 24-31 ''
|
|||
|
|
... ...
|
|||
|
|
30 (#01/#31) 232-239 ''
|
|||
|
|
31 (#01/#32) 240-247 ''
|
|||
|
|
32 (#01/#33) 248-255 ''
|
|||
|
|
|
|||
|
|
Track Offset Range
|
|||
|
|
----- --------------
|
|||
|
|
01 $000220-00023F
|
|||
|
|
02 $000240-00025F
|
|||
|
|
03 $000260-00027F
|
|||
|
|
04 $000280-00029F
|
|||
|
|
..
|
|||
|
|
253 $0021A0-0021BF
|
|||
|
|
254 $0021C0-0021DF
|
|||
|
|
255 $0021E0-0021FF
|
|||
|
|
|
|||
|
|
|
|||
|
|
The BAM bit breakdown is not very complicated. Each track allocation
|
|||
|
|
takes exactly 32 bytes. Looking at the above entry, we can extract the
|
|||
|
|
entry for track 1 (all 256 sectors), which starts at track 1, sector 2,
|
|||
|
|
offset $20 ($000220)...
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
000220: 00 00 00 00 0F FF FF FF 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
000230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Each byte represents 8 sectors. The first series of six bytes are broken
|
|||
|
|
down as follows...
|
|||
|
|
|
|||
|
|
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5
|
|||
|
|
76543210 76543210 76543210 76543210 76543210 76543210
|
|||
|
|
-------- -------- -------- -------- -------- --------
|
|||
|
|
00000000 00000000 00000000 00000000 00001111 11111111
|
|||
|
|
<20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>
|
|||
|
|
<20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>
|
|||
|
|
<20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>
|
|||
|
|
<20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20> <20>
|
|||
|
|
<20> Sec 7 <20> Sec 15 <20> Sec 23 <20> Sec 31 <20> Sec 39 <20> Sec 47
|
|||
|
|
Sec 0 Sec 8 Sec 16 Sec 24 Sec 32 Sec 40
|
|||
|
|
|
|||
|
|
Byte #0 covers sector 0-7, #1 covers 8-15 and so on. A '1' bit means the
|
|||
|
|
sector is free, and a '0' bit means the sector is allocated (used). For an
|
|||
|
|
empty partition, sectors 0-34 are always allocated. Note that even though
|
|||
|
|
sector 0 is not used (completely empty), it is still allocated.
|
|||
|
|
|
|||
|
|
|
|||
|
|
Looking back to the first sector of the partition block, it had the next
|
|||
|
|
t/s link set as $01/$22 (offset $002200), so here is the dump of that
|
|||
|
|
sector, which is the first directory block. This block is very similar in
|
|||
|
|
layout to a normal disk (D64, etc) containing GEOS files.
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
002200: 01 23 86 01 40 45 43 48 4F 20 48 41 57 4B A0 A0 <20>#<23><>@ECHO<48>HAWK<57><4B>
|
|||
|
|
002210: A0 A0 A0 A0 A0 00 00 00 00 60 01 02 15 13 02 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
002220: 00 00 86 02 32 50 4C 55 52 41 4C A0 A0 A0 A0 A0 <20><><EFBFBD><EFBFBD>2PLURAL<41><4C><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
002230: A0 A0 A0 A0 A0 00 00 00 00 60 01 02 15 19 02 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
002240: 00 00 86 03 04 52 45 41 43 54 4F 52 A0 A0 A0 A0 <20><><EFBFBD><EFBFBD><EFBFBD>REACTOR<4F><52><EFBFBD><EFBFBD>
|
|||
|
|
002250: A0 A0 A0 A0 A0 00 00 00 00 60 01 02 15 20 04 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
002260: 00 00 86 04 D8 54 48 45 20 54 52 41 49 4E A0 A0 <20><><EFBFBD><EFBFBD><EFBFBD>THE<48>TRAIN<49><4E>
|
|||
|
|
002270: A0 A0 A0 A0 A0 00 00 00 00 60 01 0A 10 23 03 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>#<23><>
|
|||
|
|
002280: 00 00 86 06 62 49 4E 46 49 4C 54 52 41 54 4F 52 <20><><EFBFBD><EFBFBD>bINFILTRATOR
|
|||
|
|
002290: A0 A0 A0 A0 A0 00 00 00 00 60 01 0A 10 2B 06 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>+<2B><>
|
|||
|
|
0022A0: 00 00 86 08 FE 53 54 4F 4E 45 20 41 47 45 A0 A0 <20><><EFBFBD><EFBFBD><EFBFBD>STONE<4E>AGE<47><45>
|
|||
|
|
0022B0: A0 A0 A0 A0 A0 00 00 00 00 60 01 0A 12 04 05 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0022C0: 00 00 86 0A D6 4E 49 43 4B 20 46 41 4C 44 4F 20 <20><><EFBFBD><EFBFBD><EFBFBD>NICK<43>FALDO<44>
|
|||
|
|
0022D0: 47 4F 4C 46 A0 00 00 00 00 60 01 0A 12 09 02 00 GOLF<4C><46><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0022E0: 00 00 86 0A D8 52 2D 54 59 50 45 A0 A0 A0 A0 A0 <20><><EFBFBD><EFBFBD><EFBFBD>R-TYPE<50><45><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0022F0: A0 A0 A0 A0 A0 00 00 00 00 60 01 0A 12 0D 05 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Byte:$00-01: T/S link to next directory block (set to $00/$FF if it's
|
|||
|
|
the last sector of the directory)
|
|||
|
|
02: Entry type. Typical values for this location are:
|
|||
|
|
$00 - Scratched (deleted file entry)
|
|||
|
|
80 - DEL file
|
|||
|
|
81 - SEQ file
|
|||
|
|
82 - PRG file
|
|||
|
|
83 - USR file
|
|||
|
|
84 - REL file
|
|||
|
|
85 - 1581 partition (only in emulated 1581 disks)
|
|||
|
|
86 - Native FD2000 subdirectory
|
|||
|
|
Bit:0-3: The actual filetype
|
|||
|
|
000 (0) - DEL
|
|||
|
|
001 (1) - SEQ
|
|||
|
|
010 (2) - PRG
|
|||
|
|
011 (3) - USR
|
|||
|
|
100 (4) - REL
|
|||
|
|
101 (5) - 1581 partition
|
|||
|
|
110 (6) - FD2000 subdirectory
|
|||
|
|
Values 7-15 are illegal
|
|||
|
|
4: Not used
|
|||
|
|
5: Used only during SAVE-@ replacement (?)
|
|||
|
|
6: Locked flag (if set produces ">" locked files)
|
|||
|
|
7: Closed flag (Not set produces "*", or "splat"
|
|||
|
|
files)
|
|||
|
|
03-04: Track/sector location of first sector of entry
|
|||
|
|
05-14: 16 character filename (in PETASCII, padded with $A0)
|
|||
|
|
15-16: Starting track/sector of REL super-side-sector info (If
|
|||
|
|
GEOS file, t/s link to info block)
|
|||
|
|
17: REL record length (if GEOS file, GEOS file structure
|
|||
|
|
descriptor, $00=sequential, $01=VLIR file)
|
|||
|
|
18: unknown, set to $00 (If GEOS file, GEOS file type
|
|||
|
|
descriptor)
|
|||
|
|
19-1D: File time/date stamp (seconds are not stored). This is
|
|||
|
|
the same timestamp that GEOS uses.
|
|||
|
|
19: Year (add 1900 for real year)
|
|||
|
|
1A: Month (1=JAN, 2=FEB etc)
|
|||
|
|
1B: Day (#1-#31)
|
|||
|
|
1C: Hour (24 hour time, #00-#23)
|
|||
|
|
1D: Minute (#00-#59)
|
|||
|
|
1E-1F: Size in sectors, low/high byte order ($1E + $1F * 256).
|
|||
|
|
The filesize in bytes is <= #sectors * 254
|
|||
|
|
20-3F: Second dir entry. From now on the first two bytes of
|
|||
|
|
each entry in the sector should be $00/$00, as they are
|
|||
|
|
unused.
|
|||
|
|
40-5F: Third dir entry
|
|||
|
|
60-7F: Fourth dir entry
|
|||
|
|
80-9F: Fifth dir entry
|
|||
|
|
A0-BF: Sixth dir entry
|
|||
|
|
C0-DF: Seventh dir entry
|
|||
|
|
E0-FF: Eighth dir entry
|
|||
|
|
|
|||
|
|
The above "size" at $1E-1F can either be the sector count of the file
|
|||
|
|
entry (file size), or the directory size if it's a directory. If it is a
|
|||
|
|
directory, it counts both the header and directory blocks but not any files
|
|||
|
|
or subsequent subdirectory blocks. This value will increment if any extra
|
|||
|
|
directory blocks that need to be allocated to store more files/directories.
|
|||
|
|
|
|||
|
|
Directory space is allocated dynamically, so the size will vary depending
|
|||
|
|
on how many entries are in the subdirectory, and how many blocks the whole
|
|||
|
|
directory takes. It might help to think of the native partition directory
|
|||
|
|
structure and capabilities as you would on a MSDOS machine. They are both
|
|||
|
|
dynamic, and appear to support as many subdirectories as disk space allows.
|
|||
|
|
There does not appear to be any limit on how many directory levels deep one
|
|||
|
|
can go. The "xxx blocks free" that would be seen after a directory listing
|
|||
|
|
would apply across the entire partition, as does the BAM for the partition.
|
|||
|
|
|
|||
|
|
Also note the timestamp on bytes $19-1D. The FD2000 drive has a built-in
|
|||
|
|
real-time clock, allowing for an accurate time/date stamp on file and
|
|||
|
|
directory creation. It is the same stamp that GEOS has used for years. For
|
|||
|
|
more info on GEOS files, read the GEOS.TXT document.
|
|||
|
|
|
|||
|
|
|
|||
|
|
Looking back at the first directory block, it had the entry "ECHO HAWK"
|
|||
|
|
set as a subdirectory, with it's T/S location as $01/$40 (offset $004000),
|
|||
|
|
and it's block size as 2. Here is the dump of the first block of that
|
|||
|
|
subdirectory.
|
|||
|
|
|
|||
|
|
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
|
|||
|
|
----------------------------------------------- ----------------
|
|||
|
|
004000: 01 41 48 00 45 43 48 4F 20 48 41 57 4B A0 A0 A0 <20>AH<41>ECHO<48>HAWK<57><4B><EFBFBD>
|
|||
|
|
004010: A0 A0 A0 A0 A0 A0 4A 4F A0 31 48 A0 A0 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>JO<4A>1H<31><48><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004020: 01 40 01 01 01 22 02 00 00 00 00 00 00 00 00 00 <20>@<40><><EFBFBD>"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
004090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
0040F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Byte:$00-01: Track/sector link to next directory block ($01/$41, or
|
|||
|
|
$004100)
|
|||
|
|
02: Disk format type ("H")
|
|||
|
|
03: unknown, set to $00
|
|||
|
|
04-15: Directory name (16 characters, padded with $A0)
|
|||
|
|
16-17: Disk ID's ("JO")
|
|||
|
|
18: Set to $A0
|
|||
|
|
19: DOS version ("1")
|
|||
|
|
1A: Disk format type ("H")
|
|||
|
|
1B-1C: Set to $A0
|
|||
|
|
1D-1F: unknown, set to $00
|
|||
|
|
20-21: Track/Sector pointer to present directory header block
|
|||
|
|
($01/$40, points to itself)
|
|||
|
|
22-23: Track/Sector pointer to parent directory header block
|
|||
|
|
($01/$01, points to previous directory)
|
|||
|
|
24-25: Track/Sector pointer to dir entry in previous directory
|
|||
|
|
($01/$22)
|
|||
|
|
26: Index pointer to dir entry in parent directory ($02)
|
|||
|
|
27-FF: unknown, set to $00
|
|||
|
|
|
|||
|
|
Each directory is preceeded by this "header" block, including the root
|
|||
|
|
(from above). This block is necessary because it is the only location which
|
|||
|
|
can hold the "directory" name, and all the track/sector pointers into
|
|||
|
|
various levels of the directory structure.
|
|||
|
|
|
|||
|
|
|
|||
|
|
From here, we go to the next block of the directory, holding the actual
|
|||
|
|
file listing, possibly with more subdirectories. This is block #2 (out of
|
|||
|
|
2) of the entry total. The layout and description is the same as the
|
|||
|
|
previous example of the first directory block.
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Creating A D2M Image
|
|||
|
|
--------------------
|
|||
|
|
|
|||
|
|
Follow these steps to create a D2M image. These instructions do not
|
|||
|
|
describe how to create a partition entry or subdirectories. For this info,
|
|||
|
|
you will need to read the above information very carefully.
|
|||
|
|
|
|||
|
|
1. Create a new file, and write out 6480 256-byte blocks of zero's.
|
|||
|
|
|
|||
|
|
2. If you need error bytes, write out another 6480 bytes of $01's. This
|
|||
|
|
is the job code for "no error".
|
|||
|
|
|
|||
|
|
3. Copy the DevBlock exactly, as shown previously (located in an existing
|
|||
|
|
image at track 26, sector 5, or offset $190500).
|
|||
|
|
|
|||
|
|
4. Create the system partition as described above (track 26, sector
|
|||
|
|
8-11).
|
|||
|
|
|
|||
|
|
5. Make sure the "SYSTEM" entry exists as the first entry in the system
|
|||
|
|
partition.
|
|||
|
|
|