Mac Plus ROM Adapter
The Mac Plus (and associated machines) have 1MB of contiguous address space around the ROM, starting at $400000 through $4FFFFF. However, the Plus ROM is only 128K in size. This project is for an adapter to allow a full 1MB ROM plugged into the Mac Plus, and a modified ROM image to utilize the extra space as a ROM disk.
Adapter:
The two Mac Plus ROM sockets are each 28 pin DIP, compatible with 27C512 EPROMs, except pin 22 is an extra address line (making the Plus ROM sockets capable of addressing 256KB unmodified):
+------------+ A15 |1 28| Vcc A12 |2 27| A14 A7 |3 26| A13 A6 |4 25| A8 A5 |5 24| A9 A4 |6 23| A11 A3 |7 22| /Vpp (A16 for the Plus) A2 |8 21| A10 A1 |9 20| /E A0 |10 19| Q7 Q0 |11 18| Q6 Q1 |12 17| Q5 Q2 |13 16| Q4 GND |14 15| Q3 +------------+ 27C512This project adapts two 29F040 32pin DIP flash ROMs to the Plus rom sockets. The 29F040 has a capacity of 512KB, for a total of 1MB.
The Plus data bus is 16bits wide, with each of the 2 ROMs providing 8bits. Since each ROM is only providing every other byte, the processor's address lines are shifted up by 1 bit relative to the ROM's address lines. That is to say, A0 on the ROM is the processor's A1, all the way through the ROM's A15 is the processor's A16.
Since the processor's A17 goes to pin 22 of the ROM sockets, which this adapter board can wire to the 29F040's A16, that only leaves 2 address lines unaccounted for, to get the full 1MB addressed.
This adapter brings those 2 extra address lines out to a header, which is then manually connected to the processor's A18 and A19 pins. In this case, I am using test clips to simply clip to those pins on the processor.
ROM:
The ROM modification is based on the ROM disk driver I wrote for dougg3's Mac ROM SIMM. There have been a few changes and improvements to the driver for this project.
In addition to the driver, the ROM its self needs to be modified to add the driver and make sure it gets loaded.
First, I disabled the ROM check at $D9A:
@@ -215,16 +215,16 @@ 00000d60 42 a1 42 61 23 08 46 58 55 41 66 fa 33 3c ff ef |B.Ba#.FXUAf.3<..| 00000d70 42 78 01 84 4e 75 70 01 28 40 70 00 72 00 41 f9 |Bx..Nup.(@p.r.A.| 00000d80 00 40 00 00 26 18 34 3c ff fd 30 18 d2 80 51 ca |.@..&.4<..0...Q.| -00000d90 ff fa b7 81 30 01 48 41 82 40 66 00 00 9a 52 4c |....0.HA.@f...RL| +00000d90 ff fa b7 81 30 01 48 41 82 40 4e 71 4e 71 52 4c |....0.HA.@NqNqRL| 00000da0 42 53 70 ff 72 02 76 0f 24 4b d5 c1 d2 81 34 80 |BSp.r.v.$K....4.| 00000db0 4a 53 66 0a 42 53 b1 52 56 cb ff ee 67 04 32 13 |JSf.BS.RV...g.2.| -00000dc0 60 74 24 4b d5 c1 42 53 34 80 4a 53 66 2e 24 4b |`t$K..BS4.JSf.$K| +00000dc0 4e 71 24 4b d5 c1 42 53 34 80 4a 53 66 2e 24 4b |Nq$K..BS4.JSf.$K| 00000dd0 e5 81 74 01 76 05 46 42 34 82 b4 52 56 cb ff f8 |..t.v.FB4..RV...| 00000de0 66 1a 22 4b 76 00 52 43 b6 51 66 10 d3 c1 b4 43 |f."Kv.RC.Qf....C| 00000df0 6e f4 d5 c1 52 42 0c 42 00 08 6f d8 52 4c 70 00 |n...RB.B..o.RLp.| 00000e00 0c ab 00 40 00 00 02 ae 67 22 4a 06 6a 1e 41 fa |...@....g"J.j.A.| -00000e10 00 9c 4b fa 00 04 60 24 41 fa 00 96 4b fa 00 04 |..K...`$A...K...| -00000e20 60 1a 41 fa 00 8a 4b fa 00 04 60 10 2a 4a 72 00 |`.A...K...`.*Jr.| +00000e10 00 9c 4b fa 00 04 4e 71 41 fa 00 96 4b fa 00 04 |..K...NqA...K...| +00000e20 4e 71 41 fa 00 8a 4b fa 00 04 4e 71 2a 4a 72 00 |NqA...K...Nq*Jr.| 00000e30 32 00 48 40 82 40 20 0d 4a 41 4e d6 22 0a 92 8b |2.H@.@ .JAN."...| 00000e40 24 01 42 42 48 42 76 00 36 01 d4 83 84 fc 00 03 |$.BBHBv.6.......| 00000e50 42 42 48 42 26 0a 55 82 d4 82 d6 82 d2 82 3e 01 |BBHB&.U.......>.|
That allows the ROM to be modified and not fail the checksum, so now for loading the driver. I'm replacing the .Print driver, but to prevent problems post-boot, I've renamed the .Print driver and gave it a different driver number. That way, after the system has booted, the system can load its own printer driver. But the .Print driver is smaller than my ROM disk driver, so I can't just blat down the driver on top of it. Instead, I'm placing my ROM disk driver beyond the end of ROM, and on entry to the .Print driver, it jumps to my driver instead:
@@ -6000,7 +6000,7 @@ 00017720 00 3a 53 45 52 44 00 00 00 76 4d 44 45 46 00 00 |.:SERD...vMDEF..| 00017730 00 82 57 44 45 46 00 00 00 8e 50 41 43 4b 00 02 |..WDEF....PACK..| 00017740 00 9a 43 55 52 53 00 03 00 be 46 4f 4e 54 00 01 |..CURS....FONT..| -00017750 00 ee 00 02 00 17 58 01 78 4c 00 00 00 00 00 03 |......X.xL......| +00017750 00 ee 00 15 00 17 58 01 78 4c 00 00 00 00 00 03 |......X.xL......| 00017760 00 10 58 01 79 c0 00 00 00 00 00 04 00 0a 58 01 |..X.y.........X.| 00017770 7d 30 00 00 00 00 00 0a 00 05 58 01 9d a0 00 00 |}0........X.....| 00017780 00 00 00 09 00 00 58 01 a6 fa 00 00 00 00 00 00 |......X.........| @@ -6014,12 +6014,12 @@ 00017800 f2 38 00 00 00 00 00 00 00 1e 58 01 f2 84 00 00 |.8........X.....| 00017810 00 00 00 0c ff ff 58 01 f2 8c 00 00 00 00 04 2e |......X.........| 00017820 4d 50 50 04 2e 41 54 50 05 2e 53 6f 6e 79 06 2e |MPP..ATP..Sony..| -00017830 53 6f 75 6e 64 06 2e 50 72 69 6e 74 07 43 68 69 |Sound..Print.Chi| +00017830 53 6f 75 6e 64 06 2e 42 72 61 75 6e 07 43 68 69 |Sound..Braun.Chi| 00017840 63 61 67 6f c0 00 01 74 00 00 00 54 4f 00 00 00 |cago...t...TO...| 00017850 00 00 00 00 00 24 00 28 00 2c 00 30 00 34 06 2e |.....$.(.,.0.4..| -00017860 50 72 69 6e 74 20 00 00 44 52 56 52 00 02 00 19 |Print ..DRVR....| -00017870 72 08 60 10 72 0a 60 0c 72 0c 60 08 72 0e 60 04 |r.`.r.`.r.`.r.`.| -00017880 72 10 4e 71 59 4f 48 e7 00 c0 3f 01 3f 38 0a 5a |r.NqYOH...?.?8.Z| +00017860 42 72 61 75 6e 20 00 00 44 52 56 52 00 02 00 19 |Braun ..DRVR....| +00017870 70 00 60 10 70 01 60 0c 70 02 60 08 70 03 60 04 |p.`.p.`.p.`.p.`.| +00017880 70 04 4e 71 4e f9 00 42 00 44 3f 01 3f 38 0a 5a |p.NqN..B.D?.?8.Z| 00017890 2f 09 20 78 0a 50 20 50 31 e8 00 14 0a 5a 59 4f |/. x.P P1....ZYO| 000178a0 3f 3c e0 00 a9 ba 24 5f 08 d2 00 07 22 52 61 00 |?<....$_...."Ra.| 000178b0 00 ac 3f 00 30 38 02 10 61 00 00 a4 55 4f 2f 09 |..?.08..a...UO/.|But wait! There's more! The .Print driver isn't opened prior to boot. It just lives in ROM and the System can load and use it if it doesn't have a newer version. In order to be able to boot off this new driver, it needs to be loaded prior to boot. The ROM loads 2 drivers prior to booting: the .Sony (floppy) driver and the .Sound driver. I'm modifying the ROM to instead open the .Sony driver and my driver, then within my driver I open the .Sound driver. This is the part where I tell it to open my driver instead of the .Sound driver:
@@ -133,7 +133,7 @@ 00000840 45 fa ff ca 72 10 61 06 54 88 54 89 72 10 14 11 |E...r.a.T.T.r...| 00000850 60 06 2e 97 2e 97 10 9a 51 c9 ff f8 4e 75 20 08 |`.......Q...Nu .| 00000860 74 00 34 18 d4 80 22 c2 51 c9 ff f6 4e 75 05 2e |t.4...".Q...Nu..| -00000870 53 6f 6e 79 06 2e 53 6f 75 6e 64 20 70 30 31 c0 |Sony..Sound p01.| +00000870 53 6f 6e 79 06 2e 42 72 61 75 6e 20 70 30 31 c0 |Sony..Braun p01.| 00000880 01 d2 e5 80 a7 1e 21 c8 01 1c 9e fc 00 32 20 4f |......!......2 O| 00000890 42 28 00 1b 43 fa ff d8 21 49 00 12 a0 00 43 fa |B(..C...!I....C.| 000008a0 ff d4 21 49 00 12 a0 00 de fc 00 32 4e b9 00 41 |..!I.......2N..A|That's the extent of the modifications to the original Plus ROM. The rest of the 1MB is arranged as follows:
$400000 - $41FFFF - The modified Plus ROM.
$420000 - $427FFF - ROM Disk driver and whatever else.
$428000 - $4FFFFF - ROM Disk image (884736 bytes).
This gives a ~850KB disk image, and more than enough space for future code expansion.
One of the changes I made to the ROM disk driver from the ROM SIMM Driver is displaying a message at boot telling you to hold down 'r' if you want to boot from ROM, and a modified happy mac icon indicating the ROM disk is being used.
Files:
plusrom3.osm The adapter board in Osmond PCBplusrom3.zip Gerbers for the adapter board
modplus.bin Modified ROM with driver. Concatenate a disk image to the end of this for a usable ROM.
split.c A .c program to split the final ROM image into even and odd chunks for programming into flash.
macplus.rom Modified ROM without the driver. This ROM probably won't be of much use without the driver.
ROMDisk The ROM disk DRVR resource.
Updated November 29 2014