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
    +------------+
        27C512
This 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 PCB
plusrom3.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