A C64 Multicartridge#
The expansion port, located at the back of the Commodore 64, was designed to allow the computer to interface with a variety of external devices and accessories. One of the most popular uses of this port was the ability to load software programs via cartridges. Unlike the traditional method of loading programs from floppy disks or cassette tapes, which could be slow and cumbersome, cartridges offered a faster and more convenient alternative.
These cartridges were compact plastic modules that contained software encoded on ROM chips. When a user inserted a cartridge into the expansion port, the Commodore 64 would immediately recognize it upon powering on, bypassing the need to load software from an external drive. This was not only quicker but also allowed for larger, more complex programs to be run with ease. Games, productivity tools, and educational software could be accessed almost instantaneously.
Given this ease of use, in 2021 I had the ambition to design my own modern cartridge for the C64. Of course, plenty of cartridges already exist. My aim was to produce a cartridge that is cheap, though versatile, using modern off-the-shelf components. My design (as shown below), is based on the Versa64Cart, with the notable difference that I use an SST39SF040 EEPROM which has a capacity of 512 KiB, 8 times as much as the chip used in the Versa64Cart. This enhanced storage capacity allows for 64 x 8 KiB banks of memory.

The C64 “MegaCart”#
Cartridge memory mapping#
The contents of a C64 cartridge is exposed to certain areas in memory area of
the computer’s 64 KiB address space, specifically between $8000-$BFFF
and between $E000-$FFFF
. A representation of this memory space is
provided below. Important to take home from this diagram is that certain parts
of the C64’s operating system can be swapped out for the contents of the
cartridge. Depending on how the cartridge is designed, it can thus utilize
existing routines on the C64 to its advantage or completely substitute them for
its own.

Memory map of the C64. Pending on the control signals /EXROM and /GAME (explained below), the cartridge ROM is banked into memory.#
The memory mapping of cartridges in the Commodore 64 is managed through the use of two specific control signals, which are wired to the cartridge pins: /GAME, and /EXROM. The way that the C64 interacts with the cartridge, i.e. requests ROM data, is managed via another two control lines from the C64, /ROML and /ROMH and one pin on the cartridge ROM, /OE. When this latter pin is tied to low, the ROM will expose its data on the data bus, otherwise, it will do nothing.
Note
The “/” in front of the line names indicates that the lines are active-low. In other words, the line or signal is considered to be active when it is pulled to GND.
With the two /GAME and /EXROM control lines, we have - broadly speaking - three cartridge modes as indicated by the table below.
/EXROM |
/GAME |
/ROML |
/ROMH |
---|---|---|---|
1 |
0 |
|
|
0 |
1 |
|
N.A. |
0 |
0 |
|
|
With only /GAME tied low, the C64 runs in so-called Ultimax mode and the
cartridge can expose two 8 KiB segments into regions $8000-$9FFF
and
$E000-$FFFF
. When /EXROM is tied low, an 8 KiB segment at
$8000-$9FFF
is reserved for the cartridge. Finally, when both /GAME
and /EXROM are tied low, a continous 16 KiB segment is allocated to the
cartridge between $8000-$BFFF
. By connecting the /ROML and /ROMH lines
to the output enable /OE of the ROM chip on the cartridge, the user can control
how the cartridge will respond to the C64 trying to read from the aforementioned
memory spaces.
Upon boot, the C64 KERNAL will probe whether the text CBM80
is available
at $8004-$8008
, if so, it will start execution from $8000
.
Otherwise, it will boot up its internal BASIC system. If the cartridge however
is configured with only /GAME tied low, the 8KiB section at
$E000-$FFFF
where the KERNAL normally resides is banked out to the
cartridge, basically allowing the cartridge to “overwrite” the KERNAL routines.
In this configuration, upon boot, the 6502 processor reads the reset vector
located at $FFFC
and jumps to that address.
For a multicartridge, this implies that the cartridge should offer the option to the user to select whether the program residing at a particular place on the EEPROM is an 8 KiB or a 16 KiB program and where it will be banked into memory. The various options are reflected in the schematic as seen below. By means of two jumpers, the user can select whether the program is 8 or 16 KiB and whether it resides in the lower or upper half of memory. Furthermore, by means of a DIP switch, the /GAME or /EXROM pins can be tied to either low or high. Furthermore, the same DIP switch is also used to select a section from cartridge memory, allowing to user to choose the 8 KiB starting bank on the cartridge.
Circuit diagram of the MegaCart.#
Software selection#
With 512 KiB of EEPROM space at my disposal, I aimed to produce a versatile selection of applications and games that would be of interest to the user. Of course, my search is limited to cartridge-based programs. In the end, I settled for the selection as shown in the image below. The set contains 8 applications and 32 games. There are 24 x 16 KiB programs and 16 x 8 KiB programs, completely filling up the 512 KiB ROM space. In the image shown below, also the DIP position and jumper settings of the cartridge is shown.
To give an example, when the user wants to load the “Dead Test” program (a very handy diagnostics program),
/GAME is tied to low and /EXROM is kept high. Furthermore, the first position on
the cartridge ROM with a 8 KiB program size is selected and banked to
$E000-$FFFF
by tying /ROMH to /OE. Thus, upon boot, the KERNAL is
swapped out for contents on the cartridge ROM and the 6502 processor reads the
reset vector at $FFFC
. For this cartridge, the reset vector points to
position $E000
and thus code is executed from that position.

DIP switch and jumper settings for the MegaCart.#
A funny little detail is that one of the programs on the cartridge was designed by myself. It is an extremely simple joystick tester which I coded up in 6502-assembly sometime in 2021.

Screenshot of the Joystick tester.#
Reception#
For the past four years, I have offered these cartridges up for sale on Marktplaats and Ebay. From what I have heard back from people who bought the cartridge is that they like it. They mention that the cartridge targets the user who wishes to play with an original C64 using a carefully curated set of applications and games without investing a whole lot of money into a very professional though more expensive solution like the Ultimate-II+ or the Kung Fu Flash. In a way, the cartridge can act as a stepping stone towards these more expensive products, basically testing whether retro-computing is something they want to invest it before making the big jump.
Further reading#
For an in-depth discussion on bank-switching and the way that the control lines work, have a look at this YouTube video from retrobits.
The C64 Wiki offers a nice banking table, explaining how parts of the C64 memory mapped are wired.
World of Jani offers a nice post how to make your own simple C64 cartridge.