This project is an extension to the MROM64 project, which replaces the ROM chips inside a Commodore 64 with a small PCB containing a single, larger ROM and some bank-switching logic. The MROM64 takes the place of the Kernal and Character set ROMs, and stores 7/8 Kernals (depending on board version) and 16 Character sets. Only one Kernal and Character set is selected at any time, and the selection is performed by setting a binary value on a row of pin headers. The idea for this selector panel was also the motivation for developing the MROM64 in the first place.
The idea for this project struck during the summer of 2025, when I was looking for an application to use my DIS1417 displays, which take 4-bit binary input and display the corresponding hexadecimal digit. A 4-bit wide number has a range of 0 to 15, and can be represented by a single hexadecimal digit (in ascending order: 0 through 9, then A, B, C, D, E, F). At this point in time, I had replaced the ROMs in my C64 C with Henning Liebenau's reprom64, which stores multiple ROM images for the Kernal and Character set, with the active bank being selected by binary number. This gave me the idea of a small external panel for the C64 case, which would contain 2 DIS1417 displays (one for the Kernal selection and the other for the Character set selection), and the DIS1417s would display the current selection.
I could have made a ROM bank selector panel for Liebenau's reprom64, but the reprom64 can only store 4 Kernals and 4 Character sets, which meant that the DIS1417s would only ever display 4 values (0 through 3). I wanted to utilise the entire output range of the DIS1417s, so I needed a ROM replacement that could store more Kernal and Character sets (up to 16 of each). I then proceeded to develop the MROM64, which stores 16 Character sets and 8 Kernals, which was a compromise as the Kernals are twice the size of the Character sets. The Kernal images are 8K bytes, and the Character sets are 4K bytes each. This arrangement fills up a 1M bit "010" type ROM chip (e.g. 27C010), and 8 more Kernal images would require 1.5M bits, which necessitates an upper-bound capacity like 2M bits (using a "020" type ROM chip) and more complex bank-switching logic (in turn, increasing the number of chips on the MROM64 board).
After completing the MROM64 and having one installed and running flawlessly in my C64 C, I could begin work on the selection panel. The panel needs 2 binary counters, with the output of each setting the binary number for the Kernal and Charset selections. In an early prototype, I used a 74HCT393, which is a single DIP-14 chip that contains two binary counters. The following diagram of the '393 is from the Fairchild DM74LS393 datasheet:
The project files no longer exist, so I quickly spun up the following schematic to show how the system looked:
This solution was almost perfect, as the 74HCT393 is a single chip with the two counters I needed, and is a standard, off-the-shelf "jellybean" part, but there were some deal-breaking problems.
Firstly, each counter is incremented by a pulse on the CP pin that is provided by a button. The CP pin needs a pullup resistor so that it has a default high state when the button is not pressed, and the buttons each needed a resistor and capacitor to form an RC filter that would debounce the pulse (without debouncing, a press of the switch would send multiple pulses and, therefore, increment the counter more than once). 6 passive components were needed in addition to the 74HCT393, displays and buttons.
Secondly, the counters would have random values when first powered on. The master reset pins allow resetting the counters to 0, but a power-on reset would also need additional components. If the resets were active low, I could use a single capacitor to delay the rise of the voltage applied to the reset pins during power-on, thus ensuring that reset was asserted during power-on, but this is not the case. The master reset pins are active high, so a logic 1 is needed on the reset pins to reset the counters. This necessitates a NOT gate (which could be made with a transistor) in addition to a delay element. I decided to abandon this path as it would require upwards of 10 additional passive components.
The way forward was to use a microcontroller that can monitor the states of the buttons, debounce the button inputs, and increment the binary output by 1. This minimises external parts count as the microcontroller has internal pull-up resistors that can be enabled on the pins that the buttons are wired to, and debouncing can be done in software. The binary outputs to the MROM64 can also have any default power-on state I choose, as defined in the program I write.
I decided to use an ATtiny44A, which is available in a DIP-14 package (same as the DIS1417 displays), and has 12 GPIO pins, which is enough to accommodate: 3 button inputs, a 4-bit Charset output to the MROM64, a 3-bit Kernal output to the MROM64, a blanking output to the displays (allows for flashing/dimming), and a reset output to the C64 motherboard. The ATtiny44A also contains an internal RC oscillator (so no external clock circuit is needed), and persistent EEPROM, which can be used to store the current Kernal and Character set outputs long-term without power, allowing the values that were set during last use to be recovered and used when powered on.
The following schematic describes the complete panel:
The selector panel is connected to the MROM64 using a standard flat flex cable, and a small adapter board that sits on the MROM64's pin header and allows the flat flex cable to be connected.
North of the MROM64 is a interposer with a single pin header than allows a reset pulse to be injected. This allows the selector panel to reset the C64. A 200 ohm resistor is installed in series with the injected reset signal as the ATtiny44A must discharge a capacitor on the reset input through one of its GPIO pins. This resistor limits the high discharge current to not damage the ATtiny.
Observe the flat flex cable threaded through the case:
The flat flex cable connects to the selector panel:
The selector panel is mounted to the case using a non-destructive and reversible method. I designed these 3D-printable C-shaped mounts which are inserted into the vents and rotated 90 degrees. The design contains a hole which a brass insert can be pushed into using a hot soldering iron, giving a M2 threaded hole.
For a demonstration video, please follow this link to its location on file.nthpulse.net.
This project and all components of it are open source and can be downloaded at the following links:
Reset injector for C64 250469 motherboardPage created: 04SEP2026
Last modified: 05SEP2026