SukkoPera / OpenC16RamExpansion

Open Hardware 64 Kb RAM Expansion for the Commodore 16
14 stars 4 forks source link

Try to get this working on all machines #2

Open SukkoPera opened 4 years ago

SukkoPera commented 4 years ago

AmiBay user eslapion indicates two possible modifications to make this work on all C16's:

  1. The first one is to put a switch on pin 1 (/CE) of the two 4416 of the C16, toggling between ground and 5Vdc - by default they are grounded.

  2. The second one is to use a modified 48 pin socket under the TED which will disconnect CAS from the mainboard and have it on a separate wire going to the 64k RAM cartridge. Just put a pull-up resistor on the 64k RAM cartridge which pulls-up the CAS line of the C16 board.

My opinion: Solution 1 is well-known but it's not really easy to do, as it requires desoldering the whole chips to get a "clean job".

Solution 2 is more interesting, but I find this would be ok if we wanted to make a board to be sandwiched between the TED and socket, carrying the RAM chips and whatever is needed. An internal expansion that cannot be removed, I mean. This is because the machine would no longer work if the expansion is unplugged at that point (unless you also bring out the /CAS signal going to the chips, add a switch and whatever).

The modification I am looking for would ideally be to add the missing circuitry so that the machine will use the expansion correctly, but so that it will still work correctly if the expansion is unplugged, without any manual intervention. Ideally, this mod would also be easy to install and it shouldn't require to cut any tracks. But I guess the latter is impossible to achieve, as the whole thing implies the splitting of the /RAS (or /CAS) signal in two, one addressing the internal chips and one going to the cartridge slot. Equations are easy:

!ras_int = !ras & (!a14 & !a15) => ras_int = ras | !(!a14 & !a15) => ras_int = ras | a14 | a15
!ras_ext = !ras & (a14 | a15) => ras_ext = ras | !(a14 | a15) => ras_ext = ras | (!a14 & !a15)
ras a14 a15 ras_int ras_ext
0 0 0 0 1
0 0 1 1 0
0 1 0 1 0
0 1 1 1 0
1 0 0 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 1 1

The point here is to rewrite these in order to use the least possible logic gates and to make sure that the memory detection routine in the ROM always does the right thing.

I think it can be done with a single 74253 or 4052 (Dual 4-TO-1 Multiplexers):

Pin 74253 CD4052B
1 /RAS GND
2 a15 Vcc
3 Vcc ras_int (with pull-up to Vcc)
4 Vcc Vcc
5 Vcc Vcc
6 GND /RAS
7 ras_int (with pull-up to Vcc) GND (power)
8 GND (power) GND (power)
9 ras_ext (with pull-up to Vcc) a15
10 Vcc a14
11 GND GND
12 GND Vcc
13 GND ras_ext (with pull-up to Vcc)
14 a14 GND
15 /RAS GND
16 Vcc (power) Vcc (power)

Another possibility is here.