System information
For the Commodore 64, the register at address $0001 is used to decide which ROMs that should be switched in
and which ROMs that should be switched out. In total, the Commodore 64 has 64 kB of RAM and 20 kB of ROM
memory.
The Commodore 128 has more sophisticated memory management than the Commodore 64. The C128 has a
separate chip called the MMU (Memory Management Unit) for memory management, which the Commodore 64
does not have. Using the MMU, it is possible to set four different pre-set memory configurations. The pre-set
memory configurations can only be defined when the I/O ROM is switched in but once the pre-set memory
configurations have been defined it is possible to switch between them regardless of how the memory is
configured. The first three of the four pre-defined memory configurations are used by the operating system (the
two first ones are used by the BASIC CHRGET routine and possibly at more places as well). If you try changing
one of these three pre-set memory configurations, BASIC may no longer work correctly (you may end up in the
machine code monitor). You can however always set the memory configuration directly by writing to memory
location $FF00 without using pre-set memory configurations.
A memory configuration defines which ROMs that should be switched in and which ROMs that should be switched
out. The Commodore 128 has two RAM banks (bank 0 and bank 1), each consisting of 64 kB RAM, and the
memory configuration also defines which of the two RAM banks that should be switched in (the other one is
switched out). When using BASIC, RAM bank 0 is used for program code and RAM bank 1 for variables. That
variables are put in another RAM bank than BASIC program code makes it easier to mix BASIC and assembly
code than on the Commodore 64 where it is easy to destroy program code unless it is carefully thought about
which address the Start-Of-Variables (SOV) pointer points at after a LOAD.
The MMU also makes it possible to define if memory should be shared between the two RAM banks. If memory is
shared, it can be defined how much memory that is shared and if memory should be shared at the bottom or at
the top of the banks or both. Sharing memory means that if bank 1 is switched in and a memory location in a
shared area is accessed, it is the memory location in bank 0 that is accessed instead of in bank 1.
The VIC chip can access 16 kB of memory at once (both in Commodore 64 and in Commodore 128) meaning that
it can point at four different places in a 64 kB RAM bank. The MMU in the Commodore 128 is used to define
which of the two RAM banks that the VIC chip should use. This can be defined independently from the setting
made in the MMU regarding which RAM bank that is switched in for the CPU to see.
The MMU also makes it possible to redirect page 0 (address $0000-$00FF) and page 1 (address $0100-$01FF) in
memory. (One page contains $0100 addresses.) This means that if the software tries to access a memory
location in these two pages, the access is redirected to a memory location where the lower 8 address bits are the
same but the higher 8 address bits are set to another value that has been defined by the user in a register in
the MMU. Page 0 contains a lot of variables used by the operating system and page 1 contains the processor
stack so the possibility to redirect these pages makes it possible to quickly switch between different sets of
variable values and processor stacks.
Of course, the memory map for the Commodore 128 is different from that for the Commodore 64. For example,
the BASIC text normally begins at $1C01 instead of at $0801. However, if the BASIC command GRAPHIC is used
to define one of the graphics modes, the start of BASIC text is moved to $4001 (under BASIC ROM).
Furthermore, the BASIC and machine code monitor ROM ($4000-$BFFF) take up 4 times as much ROM memory
as the BASIC ROM on the Commodore 64 ($A000-$BFFF). The memory area $C000-$CFFF that is often used for
machine code programs on the C64 is on the C128 used by the screen editor ROM that is a part of the Kernal
ROM. On the C128, there are some areas that are particularly suitable for machine code programs. For example,
$1300-$1BFF is free. If the tape buffer, RS-232 buffers and BASIC sprite definition area are not needed, $0B00-
$0FFF can also be used. In zero page, $FA-$FE are free but $FA is unsafe to use due to a bug in the Kernal.
These are some of the major differences in the memory map.
VIC features and bugs
The 8564-VIC graphics chip in the Commodore 128 has two extra registers that the 6567-VIC graphics chip in
the Commodore 64 does not have. These two extra registers are used for new keys on the keyboard (more
columns in the keyboard matrix) and 2 MHz mode. These features are described at other places on this page. It
might seem a bit strange that the 2 MHz register is located in the VIC chip considering that the VIC chip does
not support 2 MHz mode (it results in garbage on the screen) but this is the way it is.
The two versions of the VIC chip are not interchangeable. You cannot put a 8564-VIC chip in a C64 or a 6567-
VIC chip in a C128. Both the 8564-VIC and the 6567-VIC are often referred to as VIC-II (8564-VIC is sometimes
called VIC-IIe where "e" means enhanced). This is because they are successors of the VIC (VIC-I) chip that
existed in the Commodore VIC 20 computer and predecessors of the VIC-III chip in the Commodore 65. On this
page the 8564-VIC chip is often simply referred to as VIC.
With the 8564-VIC chip, you can see vertical lines going through the middle of each of the columns of the
screen. When I first used a C128, I thought that there was something wrong with it but I then found out that
this bug exists on all C128s. However, it is more visible on some C128s than on others. This depends on the