Due to the very nature of what the SuperCPU is and does, there are differences
in portions of your computer's memory map when the SuperCPU is enabled.
These differences fall into two main segments of memory: the I/O area, where
the SuperCPU registers are located; and the Kernel, which has been patched
out of necessity.
Within the I/O space, there are three specific ranges of memory that are
affected: $D070-$D07F; $D0B0-D0BF; and $D200-$D3FF.
All registers are located in VIC register mirror locations. On a stock system,
reading these locations always returns an $FF, and writing these locations
does not fall through into RAM while I/O is switched in. Therefore, these
locations are generally considered useless on a stock system when I/O is
The registers in the $D07x range and some of the flags in the $D0Bx range
are write-sensitive switches. In other words, any write (POKE or machine
language 'store' operation) to a register in that range will cause the register's
assigned function to activate, regardless of the value being written into
Also note that the new registers have been created using a 'sandwich' assignment
that minimizes the chances of memory fill problems. In other words, a memory
fill might trigger a slowdown when writing to the register that provides
this capability; however, the very next location written to in either direction
causes a speed-up, so the SuperCPU could only be slowed down inadvertently
for the duration of one machine instruction. The same situation applies
to the hardware enable and disable registers: the locations on either side
of the hardware enable register is a hardware disable register. Therefore,
memory fills in either direction could only inadvertently enable the hardware
for one machine instruction operation. Programmers are urged to use the
documented locations (and not the 'duplicates') to maintain a 'standard
location' for calling these functions.
Important SuperCPU Memory Locations
Location Note Purpose
$D074 (53364) (1) GEOS Optimization (mirror VIC Bank 02, $8000-$BFFF)
$D075 (53365) (1) VIC Bank 01 Optimization (mirror $4000-$7FFF)
$D076 (53366) (1) BASIC Optimization (mirror $0400-$07FF)
$D077 (53367) (1) No Optimization (default; mirror all memory)
$D07A (53370) (2) Software Speed Select - Normal (1 MHz)
$D07B (53371) (3) Software Speed Select - Turbo (20 MHz) (*$D079)
$D07E (53374) (2) Hardware Register Enable
$D07F (53375) (2) Hardware Register Disable (*$D07D)
$D0B2 (53426) (4) Bit 7: Hardware Register Enable Flag (1=Enabled)
Bit 6: System 1 MHz Flag (1=Enabled)
$D0B4 (53428) (5) Bits 7 & 6: Optimization Mode Flags:
00xxxxxx=GEOS Optimization Enabled
01xxxxxx=VIC Bank 01 Optimization Enabled
10xxxxxx=VIC Bank 02 Optimization Enabled
$D0B5 (53429) (6) Bit 7: JiffyDOS Switch Flag (1=Enabled)
Bit 6: Speed Switch Flag (1=1 MHz)
$D0B6 (53430) (4) Bit 7: Processor Emulation Mode Flag (1=Emulation)
Bit 6: Reset Switch Flag (1=Switch Pressed)
$D0B8 (53432) (4) Bit 7: Software 1 MHz Flag (1=1 MHz)
Bit 6: Master 1 MHz Flag (1=1 MHz via any source)
$D0BC (53433) (5) Bit 7: DOS Extension Mode Flag (1=Enabled)
Bit 6: RAMLink Hardware Registers Flag (1=Enabled)
$D200-$D2FF (53760-54015) (4) RAM
$D300-$D3FF (54016-54271) (5) RAM (available for user programs)
(1) Write only, hardware registers must be enabled to activate location.
(2) Write only, active with hardware registers enabled or disabled.
(3) Write only, active with hardware registers enabled or disabled, but
does not over-ride hardware Speed switch.
(4) Read only with hardware registers disabled, Read/Write with hardware
registers enabled, write access reserved for system only.
(5) Read only with hardware registers disabled, Read/Write with hardware
(6) Read only with hardware registers enabled or disabled (write with hardware
registers enabled has no effect).
(*) Duplicate register location.
IMPORTANT NOTE: Enabling the SuperCPU hardware registers also causes some
changes in the Kernal ROM memory map ($E000-$FFFF). To avoid problems, do
not leave the hardware registers enabled any longer than necessary.
RESERVED REGISTER LOCATIONS
In addition to the documented registers, there are undocumented locations
in both the $D07x and $D0Bx ranges which are reserved for system use only.
These locations are only active while the SuperCPU's hardware registers
are enabled. Do not write to undocumented locations in these ranges while
the hardware registers are enabled.
DETECTING A SUPERCPU
There are several possible methods to detect the presence of a SuperCPU
on a computer. One of the more simple methods would be to check bit 7 of
$D0BC. On a stock 64, this bit would always be high (logic 1), but on a
SuperCPU it will normally be set to 0 whenever a user program is in control.
The following BASIC program checks this bit and determines whether a SuperCPU
is present and enabled:
110 IF X=0 THEN PRINT "SUPERCPU MODE"
120 IF X=1 THEN PRINT "STOCK MODE"
SOFTWARE SPEED CONTROL
When writing or modifying BASIC programs, you can easily control the speed
using POKE commands. This might be desirable if you have a program with
fixed timing loops, such as FOR/NEXT delays. To slow down a program, you
would use POKE 53370,0. Likewise, to speed the program back up, use POKE
53371,0. Here's a brief programming example to clarify this further:
120 POKE 53370,0 : REM SLOW DOWN TO 1 MHZ
130 FOR I = 1 TO 1000 : REM FOR/NEXT TIMING LOOP
140 NEXT : REM FOR/NEXT TIMING LOOP
150 POKE 53371,0 : REM SPEED UP TO 20 MHZ
The optimization modes supply a means by which programmers, and in some
cases users, can optimize their software to operate as quickly as possible.
The advantage gained by optimization can be dramatic-a simple FOR/NEXT loop
in BASIC executes more than twice as fast when the correct optimization
mode is selected. Normally the SuperCPU needs to copy all of its own fast
RAM contents into the slower RAM of the computer since it doesn't know where
the VIC will be getting data from. If you know the VIC data requirements
for a specific program, however, you can limit the amount of memory mirroring.
To do so, you must enter three POKE commands: one to enable the hardware
registers of the SuperCPU, a second to select the optimization mode, and
a third to disable the hardware registers of the SuperCPU.
For example, to optimize a program that uses the standard text screen memory
($0400-$07FF) for the VIC, you would use the BASIC Optimization mode. To
do this, load the program, but before running it enter:
and press RETURN. Similarly, you can use the same method to select any of
the other optimization modes. To set the optimization for a program that
uses VIC bank 01 ($4000-$7FFF) for screen or bit-mapped graphics, use:
To set the optimization for a program that uses VIC bank 02 ($8000-$BFFF)
for screen or bit-mapped graphics, use:
To disable any of the optimization modes after a program has finished, either
reset the SuperCPU, or use these POKE commands:
You can also use these pokes within your own programs, or programs that
you are capable of modifying. Here's an example of a short BASIC program
that turns on BASIC Optimization, prints to the screen, then disables optimization
20 PRINT CHR$(147);
30 FOR I = 1 TO 20
40 : PRINT "HELLO"
You can also use these methods in machine language programs, but instead
of using POKE commands, use one of the store opcodes such as STA, STX or
STY to perform the desired change. For example, the assembly code to enable
BASIC Optimization might look like this:
STA $D07E ; ENABLE HARDWARE REGISTERS
STA $D076 ; SELECT BASIC OPTIMIZATION
STA $D07F ; DISABLE HARDWARE REGISTERS
Since the value stored doesn't matter, you needn't worry about the loading
the .A, .X, or .Y register before actually performing the store operations.
While the above example uses STA, it could have just as easily used any
other store opcode.
For additional information on programming the SuperCPU, contact CMD about
the availability of the SuperCPU Programmers Kit, scheduled for release
in the latter part of 1996.
Copyright © 1996 by Creative Micro Designs,