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 | 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: 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]:
Further structure used by FAT12 and FAT16, also known as Extended BIOS Parameter Block:
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):
To figure out where the first sector begins, lets map the disk:
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 000If 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 000And 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 |