Many reverse-engineered versions of “KERNAL”, the C64’s ROM operating system exist, and some of them even in a form that can be built into the original binary. But how about building the original C64 KERNAL source with the original tools?
The Commodore engineer Dennis Jarvis rescued many disks with Commodore source, which he gave to Steve Gray for preservation. One of these disks, c64kernal.d64, contains the complete source of the original KERNAL version (901227-01), including all build tools. Let’s build it!
Building KERNAL
First, we need a Commodore PET. Any PET will do, as long as it has enough RAM. 32 KB should be fine. For a disk drive, a 2040 or 4040 is recommended if you want to create the cross-reference database (more RAM needed for many open files), otherwise a 2031 will do just fine. The VICE emulator will allow you to configure such a system.
First you should delete the existing cross-reference files on disk. With the c1541 command line tool that comes with VICE, this can be done like this:
c1541 c64kernal.d64 -delete xr* -validate
Now attach the disk image and either have the emulator autostart it, or
LOAD"ASX4.0",8
RUN
This will run the “PET RESIDENT ASSEMBLER”. Now answer the questions like this:
PET RESIDENT ASSEMBLER V102780 (C) 1980 BY COMMODORE BUSINESS MACHINES OBJECT FILE (CR OR D:NAME): KERNAL.HEX HARD COPY (CR/Y OR N)? N CROSS REFERENCE (CR/NO OR Y)? N SOURCE FILE NAME? KERNAL
The assembler will now do its work and create the file “KERNAL.HEX” on disk. This will take about 16 minutes, so you probably want to switch your emulator into “Warp Mode”. When it is done, quit the emulator to make sure the contents of the disk image are flushed.
Using c1541, we can extract the output of the assembler:
c1541 c64kernal.d64 -read kernal.hex
The file is in MOS Technology Hex format and can be converted using srecord:
tr '\r' '\n' < kernal.hex > kernal_lf.hex
srec_cat kernal_lf.hex -MOS_Technologies \
-offset -0xe000 \
-fill 0xaa 0x0000 0x1fff \
-o kernal.bin -Binary
This command makes sure to fill the gaps with a value of 0xAA like the original KERNAL ROM.
The resulting file is identical with 901227-01 except for the following:
- $E000-$E4AB is empty instead of containing the overflow BASIC code
- $E4AC does not contain the checksum (the BASIC program “chksum” on the disk is used to calculate it)
- $FFF6 does not contain the “RRBY” signature
Also note that $FF80, the KERNAL version byte is $AA – the first version of KERNAL did not yet use this location for the version byte, so the effective version byte is the fill byte.
Browsing the Source
An ASCII/LF version of the source code is available at https://github.com/mist64/cbmsrc.
;**************************************** ;* * ;* KK K EEEEE RRRR NN N AAA LL * ;* KK KK EE RR R NNN N AA A LL * ;* KKK EE RR R NNN N AA A LL * ;* KKK EEEE RRRR NNNNN AAAAA LL * ;* KK K EE RR R NN NN AA A LL * ;* KK KK EE RR R NN NN AA A LL * ;* KK KK EEEEE RR R NN NN AA A LLLLL * ;* * ;*************************************** ; ;*************************************** ;* PET KERNAL * ;* MEMORY AND I/O DEPENDENT ROUTINES * ;* DRIVING THE HARDWARE OF THE * ;* FOLLOWING CBM MODELS: * ;* COMMODORE 64 OR MODIFED VIC-40 * ;* COPYRIGHT (C) 1982 BY * ;* COMMODORE BUSINESS MACHINES (CBM) * ;*************************************** .SKI 3 ;****LISTING DATE --1200 14 MAY 1982**** .SKI 3 ;*************************************** ;* THIS SOFTWARE IS FURNISHED FOR USE * ;* USE IN THE VIC OR COMMODORE COMPUTER* ;* SERIES ONLY. * ;* * ;* COPIES THEREOF MAY NOT BE PROVIDED * ;* OR MADE AVAILABLE FOR USE ON ANY * ;* OTHER SYSTEM. * ;* * ;* THE INFORMATION IN THIS DOCUMENT IS * ;* SUBJECT TO CHANGE WITHOUT NOTICE. * ;* * ;* NO RESPONSIBILITY IS ASSUMED FOR * ;* RELIABILITY OF THIS SOFTWARE. RSR * ;* * ;*************************************** .END
Very nice! It’s amazing to be able to re-assemble a working binary from original source. Well done!
The original BASIC source is there too if anyone is interested.
Steve
I almost thought I’d never see an entry from you in my RSS feed ever again :-).
A fascinating read, as usual. Congrats!
Are you really sure “compiling” is the right term for an assembly source? We’ve always used the term “to ASSEMBLE a source”.
@David: Agreed, I changed the title from “Compiling” to “Building”.
Great work!
P.S.
I am trying to find the original tape load routine but I can’t find the line were the border color is incremented/changed to create the famous “bar effect”.
Zibri:
There isn’t any border color change in the original tape routine. That was something that tape turbo loaders did. However the tape load routine will turn off and on the screen, which you should be able to find.
hi People. I’m looking for resources to Compile / Assemble the original C64 kernal. I see some links on this track are broken, and the last post on this topic is from 2 years ago.. I’m sorry for bringing this back, but any help would be very appreaciated. thanks.
As usually, “Google is your friend”: Those myth-enshrouded original disk images “c64kernal.d64” and “c64-basic.d64” from Commodore can still be downloaded at https://www.zimmers.net/anonftp/pub/cbm/src/c64/index.html
Thanks to Dennis Jarvis, Steve Gray, Bo Zimmerman & Michael Steil who made this magic going on here possible!