Dan Kohn's PromDisk III Project Page

PromDisk III Project

On Dec 3, 2007, I purchased a AMPC-104 4-Slot MicroBox Industrial mini computer from Ebay for $15. When it arrived and I went to test it, I powered it up just to see the POST test and, much to my surprise, it booted to a program. The computer had NO harddrive or floppy disk, but it did have one card I wasn't familiar with. I pulled the card and it was marked "Micro Computer Specialists PromDisk™ III". Hence I started this project to figure out how to put MY programs onto the PromDisk Card.



I started by checking the internet and found the company was still in around (LINK). There website did have info on the PromDisk IV, but not on the card I had. I wrote them, but when they got back to me, they said that card was no longer supported and suggested that I buy a newer version.

That road blocked, I started my own investigation. First thing I needed to do was to see what was on the PROMS on the card. But when I went to read them on the ChipProg+ where I work, the TC57H1000AD IC was not listed. I tried and failed to find an equivelent. A few days latter I tried again and this time I got a hit from http://www.loadparts.com/catalog/t/5725.asp which stated:

TC57H1000AD
TC57H1000
57H1000AD
TC57H1000AD   TOS     17   Datasheet   Cross Part  

Alternate Parts (cross reference Parts) 
27C010 | 27C040 | 27C100 | 27C210 | 27C240 | 
27C256 | 27C400 | 27C512 | 27C800 | AM27C010 | 
I then checked the datasheets and found that the 27C010 had the correct number of pins and, since I already knew from fooling around with the "drive" that the disk had 256K, the 27C010 with 128K made sense (128K * 2 IC's = 256K).

Going back to the ChipProg+, armed with this new info, I was able to dump the proms. It should be noted that the first attempt appeared to work, but I made the assumption that the ChipProg+ would default so that, when the IC was read and then saved, it would save all the memory of the selected IC, this was NOT the case, it defaulted to 8k, so I had to force it to read and write from location 0x00000 to 0x1FFFF.

After looking at the "drive" with an old copy of Norton Utilities for DOS, it seemed to me that the proms just replaced the magnetic media of a floppy disk with PROMS. The more I looked at the dumps, the more this seemed likely. So I started to investigate DOS Disk Formats.

References used:
  • PC-Intern by Michael Tischer and Bruno Jennrich, July 1996
  • "File Allocation Table" article from Wikipedia
    Using the information gathered above, I first searched for the BOOT sector by trying to find the "OEM Name" as described in the Wikipedia document above. Below is the dump of that area in the 1st PROM:

    00000400  eb 3c 90 4d 53 44 4f 53  35 2e 30 00 02 01 01 00  |ë<.MSDOS5.0.....|
    00000410  02 80 00 fe 01 f0 02 00  08 00 02 00 01 00 00 00  |...þ.ð..........|
    00000420  5a 58 06 00 80 00 29 41  5e 38 21 00 53 2d 44 4f  |ZX....)A^8!.S-DO|
    00000430  53 5f 36 20 20 20 46 41  54 31 32 00 20 20 fa 33  |S_6   FAT12.  ú3|
    00000440  c0 8e d0 bc 00 7c 16 07  bb 78 00 36 c5 37 1e 56  |À.м.|..»x.6Å7.V|
    00000450  16 53 bf 3e 7c b9 0b 00  fc f3 a4 06 1f c6 45 fe  |.S¿>|¹..üó¤..ÆEþ|
    00000460  0f 8b 0e 18 7c 88 4d f9  89 47 02 c7 07 3e 7c fb  |....|.Mù.G.Ç.>|û|
    00000470  cd 13 72 79 33 c0 39 06  13 7c 74 08 8b 0e 13 7c  |Í.ry3À9..|t....||
    00000480  89 0e 20 7c a0 10 7c f7  26 16 7c 03 06 1c 7c 13  |.. | .|÷&.|...|.|
    00000490  16 1e 7c 03 06 0e 7c 83  d2 00 a3 50 7c 89 16 52  |..|...|.Ò.£P|..R|
    000004a0  7c a3 49 7c 89 16 4b 7c  b8 20 00 f7 26 11 7c 8b  ||£I|..K|¸ .÷&.|.|
    000004b0  1e 0b 7c 03 c3 48 f7 f3  01 06 49 7c 83 16 4b 7c  |..|.ÃH÷ó..I|..K||
    000004c0  00 bb 00 05 8b 16 52 7c  a1 50 7c e8 92 00 72 1d  |.»....R|¡P|è..r.|
    000004d0  b0 01 e8 ac 00 72 16 8b  fb b9 0b 00 be e6 7d f3  |°.è¬.r..û¹..¾æ}ó|
    000004e0  a6 75 0a 8d 7f 20 b9 0b  00 f3 a6 74 18 be 9e 7d  |¦u... ¹..ó¦t.¾.}|
    000004f0  e8 5f 00 33 c0 cd 16 5e  1f 8f 04 8f 44 02 cd 19  |è_.3ÀÍ.^....D.Í.|
    00000500  58 58 58 eb e8 8b 47 1a  48 48 8a 1e 0d 7c 32 ff  |XXXëè.G.HH...|2ÿ|
    00000510  f7 e3 03 06 49 7c 13 16  4b 7c bb 00 07 b9 03 00  |÷ã..I|..K|»..¹..|
    00000520  50 52 51 e8 3a 00 72 d8  b0 01 e8 54 00 59 5a 58  |PRQè:.rØ°.èT.YZX|
    00000530  72 bb 05 01 00 83 d2 00  03 1e 0b 7c e2 e2 8a 2e  |r»....Ò....|ââ..|
    00000540  15 7c 8a 16 24 7c 8b 1e  49 7c a1 4b 7c ea 00 00  |.|..$|..I|¡K|ê..|
    00000550  70 00 ac 0a c0 74 29 b4  0e bb 07 00 cd 10 eb f2  |p.¬.Àt)´.»..Í.ëò|
    00000560  3b 16 18 7c 73 19 f7 36  18 7c fe c2 88 16 4f 7c  |;..|s.÷6.|þÂ..O||
    00000570  33 d2 f7 36 1a 7c 88 16  25 7c a3 4d 7c f8 c3 f9  |3Ò÷6.|..%|£M|øÃù|
    00000580  c3 b4 02 8b 16 4d 7c b1  06 d2 e6 0a 36 4f 7c 8b  |ô...M|±.Òæ.6O|.|
    00000590  ca 86 e9 8a 16 24 7c 8a  36 25 7c cd 13 c3 0d 0a  |Ê.é..$|.6%|Í.Ã..|
    000005a0  4e 6f 6e 2d 53 79 73 74  65 6d 20 64 69 73 6b 20  |Non-System disk |
    000005b0  6f 72 20 64 69 73 6b 20  65 72 72 6f 72 0d 0a 52  |or disk error..R|
    000005c0  65 70 6c 61 63 65 20 61  6e 64 20 70 72 65 73 73  |eplace and press|
    000005d0  20 61 6e 79 20 6b 65 79  20 77 68 65 6e 20 72 65  | any key when re|
    000005e0  61 64 79 0d 0a 00 49 4f  20 20 20 20 20 20 53 59  |ady...IO      SY|
    000005f0  53 4d 53 44 4f 53 20 20  20 53 59 53 00 00 55 aa  |SMSDOS   SYS..Uª|
    
    Breaking down the table on Wikipedia for the PromDisk dump above [italics in description is the translated value from the prom]:
    Byte Offset Length (bytes) PromDisk Values
    (in hex)
    Description
    0x00 3 eb 3c 90 Jump instruction. [JMP 053e] This instruction will be executed and will skip past the rest of the (non-executable) header if the partition is booted from.
    0x03 8 4d 53 44 4f 53 35 2e 30 OEM Name (padded with spaces) [MSDOS5.0]. MS-DOS checks this field to determine which other parts of the boot record can be relied on.
    0x0b 2 00 02 Bytes per sector [0x200 or 512]. A common value is 512, especially for file systems on IDE (or compatible) disks. The BIOS Parameter Block starts here.
    0x0d 1 01 Sectors per cluster [1]. Allowed values are powers of two from 1 to 128. However, the value must not be such that the number of bytes per cluster becomes greater than 32(KB).
    0x0e 2 01 00 Reserved sector count [0x0001 or 1]. The number of sectors before the first FAT in the file system image. Should be 1 for FAT12/FAT16. Usually 32 for FAT32.

    According to A Description of the DOS File System These bits include The total number of reserved sectors, including the bootstrap sector.
    0x10 1 02 Number of file allocation tables [2]. Almost always 2.
    0x11 2 80 00 Maximum number of root directory entries [0x0080 or 128]. Only used on FAT12 and FAT16, where the root directory is handled specially. Should be 0 for FAT32. This value should always be such that the root directory ends on a sector boundary (i.e. such that its size becomes a multiple of the sector size). 224 is typical for floppy disks.
    0x13 2 fe 01 Total sectors [0x01fe or 510]
    0x15 1 f0 Media descriptor [0xf0] 3.5" Double Sided, 80 tracks per side, 18 or 36 sectors per track (1.44MB or 2.88MB). 5.25" Double Sided, 15 sectors per track (1.2MB). Used also for other media types.

    Same value of media descriptor should be repeated as first byte of each copy of FAT. Certain operating systems (MSX-DOS version 1.0) ignore boot sector parameters altogether and use media descriptor value from the first byte of FAT to determine file system parameters.
    0x16 2 02 00 Sectors per File Allocation Table for FAT12/FAT16 [0x0002 or 2]
    0x18 2 08 00 Sectors per track [0x0008]
    0x1a 2 02 00 Number of heads [0x0002]
    0x1c 4 01 00 00 00 Hidden sectors [0x00000001]
    0x20 4 5a 58 06 00 Total sectors (if greater than 65535; otherwise, see offset 0x13)

    Further structure used by FAT12 and FAT16, also known as Extended BIOS Parameter Block:

    Byte Offset Length (bytes) PromDisk Values
    (in hex)
    Description
    0x24 1 80 Physical drive number [0x80 or 128]
    0x25 1 00 Reserved ("current head")
    0x26 1 29 Extended boot signature. Value is 0x29.
    0x27 4 41 5e 38 21 ID (serial number)
    0x2b 11 00 53 2d 44 4f 53 5f 36 20 20 20 Volume Label
    0x36 8 46 41 54 31 32 00 20 20 FAT file system type, padded with blanks (0x20), [FAT12]. This is not meant to be used to determine drive type, however, some utilities use it in this way.
    0x3e 448 see dump Operating system boot code
    0x1FE 2 55 aa Boot sector signature [0x55 0xAA]


    So now I know the PromDisk III is formated as FAT12 and all the other parameters of the "disk". These were also verified using Norton Utilities for DOS (except for the Media Descriptor that was reported to be 0xF8 according to NU).

    So now onto the File Allocation Table. According to the documentation, the file alocation table is Beyond both the Boot Sector and Reserved Sectors (including the Boot Sector so I dont have any). Since, in my dump, the Boot Sector ends at 0x05FF and there is ONE reserved Sector (the boot sector itself) then the FAT should be at 0x0600. Since each FAT is 2 sectors long (offset 0x16 above), then the duplicate FAT should be at 0x0600 + 2* 0x0200 = 0x0A00. This appears to be the case (I love it when stuff works out!).

    Now that I know the location of the FAT, I need to find the directory entries themselves. According to the documentation the root directory for FAT12 is right after the 2nd FAT, so if the 2nd FAT starts at 0x0A00 and it is 2 sectors long (2* 0x0200 = 0x0400) long then the Directory should be at 0x0600 + 0x0400 = 0x0E00. Sure enough, there it is:
    00000e00  49 4f 20 20 20 20 20 20  53 59 53 07 00 00 00 00  |IO      SYS.....|
    00000e10  00 00 00 00 00 00 00 30  6a 1a 02 00 16 9e 00 00  |.......0j.......|
    00000e20  4d 53 44 4f 53 20 20 20  53 59 53 07 00 00 00 00  |MSDOS   SYS.....|
    00000e30  00 00 00 00 00 00 00 30  6a 1a 52 00 fa 94 00 00  |.......0j.R.ú...|
    00000e40  43 4f 4d 4d 41 4e 44 20  43 4f 4d 01 00 00 00 00  |COMMAND COM.....|
    00000e50  00 00 00 00 00 00 00 30  6a 1a 9d 00 bd ce 00 00  |.......0j...½Î..|
    00000e60  41 55 54 4f 45 58 45 43  42 41 54 00 00 00 00 00  |AUTOEXECBAT.....|
    00000e70  00 00 00 00 00 00 61 79  16 23 05 01 6a 00 00 00  |......ay.#..j...|
    00000e80  43 4f 4e 46 49 47 20 20  53 59 53 20 00 00 00 00  |CONFIG  SYS ....|
    00000e90  00 00 00 00 00 00 9d 86  1b 23 06 01 15 00 00 00  |.........#......|
    00000ea0  41 39 50 45 53 4d 41 58  45 58 45 00 00 00 00 00  |A9PESMAXEXE.....|
    00000eb0  00 00 00 00 00 00 41 4d  94 1e 07 01 70 af 00 00  |......AM....p¯..|
    00000ec0  4d 41 58 20 20 20 20 20  43 46 47 00 00 00 00 00  |MAX     CFG.....|
    00000ed0  00 00 00 00 00 00 e7 51  42 1e 5f 01 de 01 00 00  |......çQB._.Þ...|
    00000ee0  50 52 4f 4d 44 49 53 4b  28 52 29 08 00 00 00 00  |PROMDISK(R).....|
    00000ef0  00 00 00 00 00 00 ab 86  1b 23 00 00 00 00 00 00  |......«..#......|
    00000f00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    
    It will be easiest to figure out were the autoexec.bat file is, since it will be stored in ASCII. So now to figure out how to use the Directory and FAT to find the file on the PROMS.

    First, translating the Directory Entry (using the table from Wikipedia):
    Byte Offset Length PromDisk Values
    (in hex)
    Description
    0x00 8 41 55 54 4f 45 58 45 43 DOS file name [AUTOEXEC]

    The first byte can have the following special values:

    0x00 Entry is available and no subsequent entry is in use
    0x05 Initial character is actually 0xE5
    0x2E 'Dot' entry; either '.' or '..'
    0xE5 Entry has been previously erased and is not available. File undelete utilities must replace this character with a regular character as part of the undeletion process.
    0x08 3 42 41 54 DOS file extension [BAT]
    0x0b 1 00 File Attributes

    The first byte can have the following special values:

    Bit Mask Description
    0 0x01 Read Only
    1 0x02 Hidden
    2 0x04 System
    3 0x08 Volume Label (only allowed in entry in root directory)
    4 0x10 Subdirectory
    5 0x20 Archive
    6 0x40 Device (internal use only, never found on disk)
    7 0x80 Unused

    An attribute value of 0x0F is used to designate a long file name entry.

    0x0c 1 00 Reserved; two bits are used by NT and later versions to encode case information (see below); otherwise 0
    0x0d 1 00 Create time, fine resolution: 10ms units, values from 0 to 199.
    0x0e 2 00 00 Create time. The hour, minute and second are encoded according to the following bitmap:
    Bits Description
    15-11 Hours (0-23)
    10-5 Minutes (0-59)
    4-0 Seconds/2 (0-29)

    Note that the seconds is recorded only to a 2 second resolution. Finer resolution for file creation is found at offset 0x0d.

    0x10 2 00 00 Create date. The year, month and day are encoded according to the following bitmap:
    Bits Description
    15-9 Year (0 = 1980, 127 = 2107)
    8-5 Month (1 = January, 12 = December)
    4-0 Day (1 - 31)
    0x12 2 00 00 Last access date; see offset 0x10 for description.
    0x14 2 00 00 EA-Index (used by OS2 and NT) in FAT12 and FAT16, High 2 bytes of first cluster number in FAT32
    0x16 61 79 00 00 Last modified time; see offset 0x0e for description.
    0x18 2 16 23 Last modified date; see offset 0x10 for description.
    0x1a 2 05 01 First cluster in FAT12 [0x0105 or 261]. Low 2 bytes of first cluster in FAT32. Entries with the Volume Label flag, subdirectory ".." pointing to root, and empty files with size 0 should have first cluster 0.
    0x1c 4 6a 00 00 00 File size [0x0000006a or 106 bytes] . Entries with the Volume Label or Subdirectory flag set should have a size of 0.


    To figure out where the first sector begins, lets map the disk:

    Boot
    sector


    0x0400 -> 0x05FF
    File
    Allocation
    Table #1

    0x0600 -> 0x09FF
    File
    Allocation
    Table #2

    0x0A00 -> 0x0DFF
    Root
    Directory


    0x0E00 -> 0x1DFF
    Data Region (for files and directories) ...
    (To end of partition or disk)


    0x01E00 -> 0x3FFFF


    I tried to match up the cluster number for Autoexec.bat above (0x0105) and the address of the autoexec.bat in the proms (0x22400 or 0x02400 on second prom), but the calculations just didn't add up. I thought that all I would have to do is take the location of the file (0x22400) and divide it by the number of bytes per cluster (0x0200) and I would get the start cluster in the Directory.

    So if I do that calculation I get:

    0x022400 / 0x00200 = 0x00112

    but I expected 0x0105. WHY? I started digging. The first thing I found was that according to PC Intern Chapter 17: the cluster numbers refer to the beginning of the data structure rather than the beginning of the volume". So that would then give me:

    (0x022400-0x01E00) / 0x00200 = 0x00103

    but I still expected 0x0105. So again WHY? Going back to the PC Intern Chapter 17, it makes a reference to Subtracting 2 from the cluster number because The first two FAT entries contain the media descriptor, so the FAT entry 2 is actually the zero cluster on the volume, so that would mean that I would actually add two in my calculation (going the other way) so I would get:

    ((0x022400-0x01E00) / 0x00200) + 2 = 0x00105

    OR

    ((Location of File on Prom - Location of Start of Data Area) / Bytes per Cluster) + 2 = Start Cluster of File

    I checked this formula for other files, and it seems to hold up. (That is finding the start location from the Directory Entry). But what about that FAT for files longer than one cluster?

    FAT12 Packing (from http://alumnus.caltech.edu/~pje/dosfiles.html)

    Versions of DOS before 3.00 used a file allocation table with 12-bit entries. Each group of three consecutive bytes contains two 12-bit entries, arranged as follows:

    The first byte contains the eight least significant bits of the first entry.
    The four least significant bits of the second byte contain the four most significant bits of the first entry.
    The four most significant bits of the second byte contain the four least significant bits of the second entry.
    The third byte contains the eight most significant bits of the second entry.

    In other words, if UV, WX and YZ are the hexadecimal representations of the three consecutive bytes, then the entries are XUV and YZW, respectively.

    So here is a partial copy of the FAT12 portion of the PromDiskIII:

    Loc	UVWXYZ  	Cluster	XUV	YZW
    0000600	f0ffff		---	ff0	fff
    0000603	034000		002	003	004
    0000606	056000		004	005	006
    0000609	078000		006	007	008
    000060c	09a000		008	009	00a
    000060f	0bc000		00A	00b	00c
    0000612	0de000		00C	00d	00e
    0000615	0f0001		00E	00f	010
    0000618	112001		010	011	012
    000061b	134001		012	013	014
    000061e	156001		014	015	016
    0000621	178001		016	017	018
    0000624	19a001		018	019	01a
    0000627	1bc001		01A	01b	01c
    000062a	1de001		01C	01d	01e
    000062d	1f0002		01E	01f	020
    0000630	212002		020	021	022
    0000633	234002		022	023	024
    0000636	256002		024	025	026
    0000639	278002		026	027	028
    000063c	29a002		028	029	02a
    000063f	2bc002		02A	02b	02c
    0000642	2de002		02C	02d	02e
    0000645	2f0003		02E	02f	030
    0000648	312003		030	031	032
    000064b	334003		032	033	034
    000064e	356003		034	035	036
    0000651	378003		036	037	038
    0000654	39a003		038	039	03a
    0000657	3bc003		03A	03b	03c
    000065a	3de003		03C	03d	03e
    000065d	3f0004		03E	03f	040
    0000660	412004		040	041	042
    0000663	434004		042	043	044
    0000666	456004		044	045	046
    0000669	478004		046	047	048
    000066c	49a004		048	049	04a
    000066f	4bc004		04A	04b	04c
    0000672	4de004		04C	04d	04e
    0000675	4f0005		04E	04f	050
    0000678	51f0ff		050	051	fff
    000067b	534005		052	053	054
    000067e	556005		054	055	056
    0000681	578005		056	057	058
    0000684	59a005		058	059	05a
    0000687	5bc005		05A	05b	05c
    000068a	5de005		05C	05d	05e
    000068d	5f0006		05E	05f	060
    0000690	612006		060	061	062
    0000693	634006		062	063	064
    0000696	656006		064	065	066
    0000699	678006		066	067	068
    000069c	69a006		068	069	06a
    000069f	6bc006		06A	06b	06c
    00006a2	6de006		06C	06d	06e
    00006a5	6f0007		06E	06f	070
    00006a8	712007		070	071	072
    00006ab	734007		072	073	074
    00006ae	756007		074	075	076
    00006b1	778007		076	077	078
    00006b4	79a007		078	079	07a
    00006b7	7bc007		07A	07b	07c
    00006ba	7de007		07C	07d	07e
    00006bd	7f0008		07E	07f	080
    00006c0	812008		080	081	082
    00006c3	834008		082	083	084
    00006c6	856008		084	085	086
    00006c9	878008		086	087	088
    00006cc	89a008		088	089	08a
    00006cf	8bc008		08A	08b	08c
    00006d2	8de008		08C	08d	08e
    00006d5	8f0009		08E	08f	090
    00006d8	912009		090	091	092
    00006db	934009		092	093	094
    00006de	956009		094	095	096
    00006e1	978009		096	097	098
    00006e4	99a009		098	099	09a
    00006e7	9bc009		09A	09b	09c
    00006ea	ffef09		09C	fff	09e
    00006ed	9f000a		09E	09f	0a0
    00006f0	a1200a		0A0	0a1	0a2
    00006f3	a3400a		0A2	0a3	0a4
    00006f6	a5600a		0A4	0a5	0a6
    00006f9	a7800a		0A6	0a7	0a8
    00006fc	a9a00a		0A8	0a9	0aa
    00006ff	abc00a		0AA	0ab	0ac
    0000702	ade00a		0AC	0ad	0ae
    0000705	af000b		0AE	0af	0b0
    0000708	b1200b		0B0	0b1	0b2
    000070b	b3400b		0B2	0b3	0b4
    000070e	b5600b		0B4	0b5	0b6
    0000711	b7800b		0B6	0b7	0b8
    0000714	b9a00b		0B8	0b9	0ba
    0000717	bbc00b		0BA	0bb	0bc
    000071a	bde00b		0BC	0bd	0be
    000071d	bf000c		0BE	0bf	0c0
    0000720	c1200c		0C0	0c1	0c2
    0000723	c3400c		0C2	0c3	0c4
    0000726	c5600c		0C4	0c5	0c6
    0000729	c7800c		0C6	0c7	0c8
    000072c	c9a00c		0C8	0c9	0ca
    000072f	cbc00c		0CA	0cb	0cc
    0000732	cde00c		0CC	0cd	0ce
    0000735	cf000d		0CE	0cf	0d0
    0000738	d1200d		0D0	0d1	0d2
    000073b	d3400d		0D2	0d3	0d4
    000073e	d5600d		0D4	0d5	0d6
    0000741	d7800d		0D6	0d7	0d8
    0000744	d9a00d		0D8	0d9	0da
    0000747	dbc00d		0DA	0db	0dc
    000074a	dde00d		0DC	0dd	0de
    000074d	df000e		0DE	0df	0e0
    0000750	e1200e		0E0	0e1	0e2
    0000753	e3400e		0E2	0e3	0e4
    0000756	e5600e		0E4	0e5	0e6
    0000759	e7800e		0E6	0e7	0e8
    000075c	e9a00e		0E8	0e9	0ea
    000075f	ebc00e		0EA	0eb	0ec
    0000762	ede00e		0EC	0ed	0ee
    0000765	ef000f		0EE	0ef	0f0
    0000768	f1200f		0F0	0f1	0f2
    000076b	f3400f		0F2	0f3	0f4
    000076e	f5600f		0F4	0f5	0f6
    0000771	f7800f		0F6	0f7	0f8
    0000774	f9a00f		0F8	0f9	0fa
    0000777	fbc00f		0FA	0fb	0fc
    000077a	fde00f		0FC	0fd	0fe
    000077d	ff0010		0FE	0ff	100
    0000780	012110		100	101	102
    0000783	034110		102	103	104
    0000786	ffffff		104	fff	fff
    0000789	ff8f10		106	fff	108
    000078c	09a110		108	109	10a
    000078f	0bc110		10A	10b	10c
    0000792	0de110		10C	10d	10e
    0000795	0f0111		10E	10f	110
    0000798	112111		110	111	112
    000079b	134111		112	113	114
    000079e	156111		114	115	116
    00007a1	178111		116	117	118
    00007a4	19a111		118	119	11a
    00007a7	1bc111		11A	11b	11c
    00007aa	1de111		11C	11d	11e
    00007ad	1f0112		11E	11f	120
    00007b0	212112		120	121	122
    00007b3	234112		122	123	124
    00007b6	256112		124	125	126
    00007b9	278112		126	127	128
    00007bc	29a112		128	129	12a
    00007bf	2bc112		12A	12b	12c
    00007c2	2de112		12C	12d	12e
    00007c5	2f0113		12E	12f	130
    00007c8	312113		130	131	132
    00007cb	334113		132	133	134
    00007ce	356113		134	135	136
    00007d1	378113		136	137	138
    00007d4	39a113		138	139	13a
    00007d7	3bc113		13A	13b	13c
    00007da	3de113		13C	13d	13e
    00007dd	3f0114		13E	13f	140
    00007e0	412114		140	141	142
    00007e3	434114		142	143	144
    00007e6	456114		144	145	146
    00007e9	478114		146	147	148
    00007ec	49a114		148	149	14a
    00007ef	4bc114		14A	14b	14c
    00007f2	4de114		14C	14d	14e
    00007f5	4f0115		14E	14f	150
    00007f8	512115		150	151	152
    00007fb	534115		152	153	154
    00007fe	556115		154	155	156
    0000801	578115		156	157	158
    0000804	59a115		158	159	15a
    0000807	5bc115		15A	15b	15c
    000080a	5de115		15C	15d	15e
    000080d	ffffff		15E	fff	fff
    0000810	000000		160	000	000
    0000813	000000		162	000	000
    0000816	000000		164	000	000
    0000819	000000		166	000	000
    000081c	000000		168	000	000
    000081f	000000		16A	000	000
    0000822	000000		16C	000	000
    0000825	000000		16E	000	000
    0000828	000000		170	000	000
    000082b	000000		172	000	000
    000082e	000000		174	000	000
    0000831	000000		176	000	000
    0000834	000000		178	000	000
    0000837	000000		17A	000	000
    000083a	000000		17C	000	000
    000083d	000000		17E	000	000
    0000840	000000		180	000	000
    0000843	000000		182	000	000
    0000846	000000		184	000	000
    0000849	000000		186	000	000
    000084c	000000		188	000	000
    000084f	000000		18A	000	000
    0000852	000000		18C	000	000
    0000855	000000		18E	000	000
    0000858	000000		190	000	000
    000085b	000000		192	000	000
    000085e	000000		194	000	000
    0000861	000000		196	000	000
    
    If a cluster has FFF in it, that means the file ends in that cluster. For files under 512 bytes, the cluster number in the Directory table will hold a FFF in the File Allocation Table for that cluster. So, for the example of the AUTOEXEC.BAT file that is only 106 bytes and starts at cluster 0x0105, cluster 0x0105 in the FAT has FFF (end of file).


    Testing:

    To test all this new knowlage, I am going to try to add a multiple cluster ascii file (an excerpt from the Hitch Hiker's Guide to the Gallaxy) to the PromDiskIII at culster 0x0160. If my formula above is correct, that would put it on PROM2, at location 0x0DA00.

    I used Free Hex Editor NEO to edit the original PROM2 file and added a text file to location 0x0DA00 and saved it. Then I went into the PROM1 file and added the following entries:

    At Location 0x0f00 (first empty directory entry) I added the following:
    00000f00  48 48 47 54 54 47 20 20  54 58 54 00 00 00 00 00  |HHGTTG  TXT.....|
    00000f10  00 00 00 00 00 00 00 00  00 00 60 01 fc 06 00 00  |..........'.ü...|
    
    The FC 06 00 00 is the hex 06FC or 1788 bytes (the size of the file). This ends up being ~3.5 clusters.

    Note: I left the file time and date blank (0x00).

    Now for the File Allocation Table. Cluster 0x160 is found starting at location 0x00810 and also at 0x00C10 (remember there are TWO File Allocation Tables). I am using the table format used above, but filled in the Culster info and then figured out the values to put in memory:

    Loc	UVWXYZ  	Cluster	XUV	YZW
    0000810	612116		160	161	162
    0000813	63f1ff		162	163	fff
    0000816	000000		164	000	000
    
    And those were placed in memory (only showing one here). It should be noted that when I checked the file sizes, I noticed that PROM1's new file lost 2 bytes, thinking caution is the better part of valor, I re-entered the changes using the original PROM1 file, and this time the file was the correct size.

    Now I just have to burn them to the proms and see if the new file appears and can be read off the PromDiskIII correctly.

    Two Days Latter....

    Erase the Proms for 20 minutes and then burned the PROMS with the new images created above. Installed the card in a 486dx and disabled the Hard Drive, and low and behold, it booted, and the new text file appeared and was the correct size (the time and date were blank - but I put zero's in the Directory Entry for those values).

    So it worked, and now I should be able to build my own PROM's any time I need to.

    QED

    last update: 3/3/2008