To create a cartridge for your C64 in the simplest form, is wiring a 8K ROM to the expansion port.

The CPU can only see a maximum of 65536 bytes. Adding a cartridge will not give you additional memory, instead it will replace memory at $8000, $A000 or $E000 depending on how ROML, ROMH, EXROM and GAME lines are being handled in the expansion port.

It is possible to bank in and out ROML/ROMH areas to gain access to different banks or RAM. This is how EasyFlash cartriges provide 1MB to the C64, it however only sees 16K of the 1MB at a time.

 

 

There are basically three types of cartridges for the C64:

8K Cartridge, $8000-$9FFF (ROML).
GAME = 1, EXROM = 0
ROML is read only. Basic ROM and Kernal ROM are available.


16K Cartridge, $8000-$9FFF / $A000-$BFFF (ROML / ROMH).
GAME = 0, EXROM = 0
ROML/ROMH are read only, Basic ROM is overwritten by ROMH.


16K Cartridge, $8000-$9FFF / $E000-$FFFF (ROML / ROMH). Ultimax mode.
GAME = 0, EXROM = 1
Ultimax mode is an emulation of the Japanese CBM machine called “MAX”. It is a predecessor of the C64 with less RAM. In Ultimax mode ROMH replaces the kernal at $E000. You do not need ROML for a cartridge to function and can be left out.

 

 

Cartridge autostart
When starting up, the CPU will load the reset vector from $FFFC/$FFFD into the program counter and continue from there. If a normal cartridge is present, it executes the kernal and checks for a cartridge identifier string.

cbm80
Kernal will look for the string “CBM80” at $8004- and will do a “JMP($8000)” if found.

If an Ultimax cartridge is inserted, the kernel is overwritten by ROMH and therefor $FFFC/$FFFD must point to your code.


8/16K Cartridge code example

 

 

Test the code above with WinVICE:

 

 

Commodore 64 Expansion port pinout:

Expansion Port

 


 

8K Cartridge $8000-$9FFF

8Kcart_8000


16K Cartridge $8000-$BFFF


16K Cartridge $8000-$BFFF (Single chip version)

16K cartrige at $8000-$bfff

A 27128 chip and a two input AND gate consisting of two diodes and a resistor. You can also use a 74LS08.


 

8K Cartridge $e000-$FFFF (Ultimax, no ROML at $8000)
You can create a 16K Ultimax cartridge by adding a 8K EPROM and connect it to ROML($8000-$9FFF).

8K cartrige at $e000 (ultimax)


 

Link(s):
Check out SukkoPera’s Open Hardware 8Kb Cartridge at: https://github.com/SukkoPera/OpenC64Cart
 


 

Update 2015.12: Corrected an error in the 16K cart schematic. EXROM/GAME should be connected and not IO2/EXROM. Text was correct but QC slipped on the drawing. Thanks to mATE for notifying me about it.
 
Update 2016.01: Updated Ultimax cart schematic with $e000-$ffff. Text was correct but again QC has slipped on the drawing. Thanks to Bart for the heads up.
 
Update 2017.12: Added single chip 16K schematic.