home download screenshots documentation technical details disk images links

If you are in the ec64 base directory just type make. After succesful compilation you should find a binary in the bin/ directory. If you want to change some compiletime settings then you should edit the Config file.

ec64 consists of different parts: sys, io, ui, rom, core. Some of them are pure x86 assembler (sys, rom, core), one is pure C (ui) and one is a mix of assembler and C (io).

If you want to compile ec64 on your own you need nasm-0.98, there seem to float some versions around the net which won't work for ec64. They generate broken object files, so ec64 immediately crashes after start.

For assembler files you need nasm-0.98. If you have problems while compiling, perhaps you have an older version (0.97 may cause problems). Or the parameters in your NASM Environment Variable may conflict with compile time settings. Try "unset NASM" before compiling.

Each C file is compiled in 3 steps

  • compiling the .c file with gcc to an .s file with AT & T syntax
  • filtering this .s file through sed, resulting in a .S file
  • assembling this .S file with gas to an .o file
Yes this looks a little bit strange, because this could be done in one step with a single gcc call. But i've decided to do this to filter out some instructions out of the .s file, maybe this is obsolete if i would use some more advanced gcc options ;-)


After successful compilation, copy the binary to a place you like (/usr/bin or $HOME/bin might be a good place). If your kernel has support for a "real" fb device you can start this binary as normal user. If you have no fb device or you use vga16fb ec64 will try to access the VGA registers directly, but for this task ec64 needs root rights, either you start it as root, or you use the setuid mechanism, execute the following commands as root:

		chown root:root ec64
		chmod 4111 ec64

  • vesafb may cause problems, because the driver can't change color depth at run time.
  • check the file permissions of your audio and fb device, if you run ec64 as normal user, this user has to have read/write permissions on this devices.
  • For additional fb device drivers you should have a look at the GGI Project. In the GGI package you will find KGIcon drivers, which also have a fb device interface.
ec64 runs on console only. This means you can't start it from a pseudoterminal (like xterm). Note that programs like ttysnoop or screen also make use of pseudoterminals.

Some seconds after starting ec64 the blue C64 screen should appear. Now you are in "Keyboard mode" this means (nearly) all pressed keys will be mapped to the C64 keyboard. Here some special keys (all other keys can be examined through testing ;-):

		PC Keyboard		| C64 Keyboard
		Shift Left		| SHIFT Left
		Shift Right		| SHIFT Right
		Ctrl Left, Ctrl Right	| CONTROL
		Alt			| C=
		Pause			| RESTORE


The following keys have a special meaning to the emulator itself:

  • Ctrl+ESC quits ec64
  • F9 switches between the input modes: Keyboard, Joystick 1, Joystick 2, Monitor
  • F10 makes the Statusline always visible
  • F11 makes the Monitor always visible (in large resolutions this is always the case)
  • F12 takes a screenshot, if this feature was compiled in ec64

In "Joystick mode" only SPACE and the Cursorkeys are used to emulate a joystick on Port 1 or 2

Monitor Commands

In "Monitor mode" you are able to manipulate the emulation. The breakpoint commands are not very useful yet, so i don't explain very much details about them.

displays the ec64 version
load <d64|g64> <filename>
loads a D64 disk image in the C1541 drive (G64 not supported at the moment).
save <d64|g64> <filename>
saves the D64 disk image currently in the C1541 drive (G64 not supported at the moment).

NOTE: If you have no disk image loaded the C1541 drive contains an unformatted disk, this means you can't extract a D64 image.

displays the emulated cycles
stops the emulation
continues the emulation
reset <soft|hard>
resets the emulation. Soft means a warmstart and hard a cold start
sync <on|off>
If sync is off the emulation runs at full host CPU speed. If sync is on the emulation runs as fast as the original C64 (maybe slower if your system is too slow)
script <filename>
all commands you can enter in the monitor, can also be loaded as a script.

NOTE: you can produce endless loops if a script file executes itself via the script command

type <text>
types something on the C64 keyboard, this is useful for scripting. Special characters are escaped through a ^. If keys should be pressed at once (for example RUNSTOP and RESTORE), they have to be surrounded by a `.

		^l	SHIFT Left
		^r	SHIFT Right
		^o	C=
		^1	F1
		^2	F2
		^3	F3
		^4	F4
		^5	F5
		^6	F6
		^7	F7
		^8	F8
		^L	(<=)
		^E	(L)
		^U	(^)



  • type hello
  • type \ world ; if your text contains spaces you have to add a leading \
  • type \10 print"hello world"^N20 goto 10^Nrun^Ndummy^Sdummy`^S^T` ; test it and you will see what happens :-)

wait <number of frames>
waits the given number of frames (useful for scripts)
bpadd <modulid> <bptype> <bpflags> [start_address [end_address [value [mask]]]]
add a breakpoint. Available modulid's are: c64cpu c1541cpu. bptyte's: ro, rd, rs, wd, ws. Can also be written as read_opcode, read_data, read_stack, write_data, write_stack.


  • bpadd c64cpu ro +trap 1000 1fff

bplist <modulid> <bptype>
lists the breakpoints for modulid and bptype
bpdel <modulid> <bptype> <bpnumber>
deletes a breakpoint
quits ec64
quits ec64
shows all available commands
Commandline Options

		Usage: ec64 [-h] [-d <file>] [-s <file>] [-dsp <file>] [-fb <file>] [-f]
		            [-vm <mode>]

		  -h          this help
		  -s <file>   load and execute script on startup
		  -d <file>   load d64 file on startup
		  -dsp <file> audio device file
		  -fb <file>  fb device file
		  -f          fullscreen 400x300@60Hz on fb device
		  -vm <mode>  vga mode (supported values: 320x240, 360x240)

  • ec64 runs slower under ModeX than with the fb device, especially while massive screen changes and sprite movement.
  • if the emulation seems to hang, probably a C64 program used some features which are not implemented at the moment. If something strange happens the emulation will be stopped and you get a message to the monitor.
I have loaded a d64 image (either via -d-command line switch or with the load command in monitor mode) but nothing happens ?

You have just done that: loaded a disk image. This means you have inserted a disk in the C1541 disk drive. Now you need to issue the usual commands on a C64, to load something from the floppy. For showing disk contents use LOAD"$",8. For loading a program in memory use LOAD"programname",8 When the READY. prompt appears again type RUN. Games often use some tricks to automagically start the loaded program, so you only need to load the program with absolute address in memory via LOAD"programname",8,1. Or if you are really lazy LOAD"*",8,1 will also work, if the first program on disk is that what you want.

I have started ec64 on console, but it only says couldn't initialize video or something like ioctl(FBIOPUT_VSCREENINFO) failed , so whats wrong ?

Especially newer distributions boot Linux with the VESA frame buffer driver (vesafb) enabled. Execute cat /proc/fb to find out if this is the case. This driver is unable to change resolution or color depth. So either you use a fb driver suitable for your graphics card or you switch vesafb off. If you use lilo as your boot loader you may either try adding append = "video=vesa:off" to your boot image in /etc/lilo.conf. Or if you have a line starting with vga =  try uncommenting this first. This will hopefully switch off vesafb on next boot and ec64 will be able to use its built in VGA driver.

Change Log


  • the only thing that changed is the displayed eMail and Webaddress


  • the nasty gpm trick is not needed any more, because of KDSETMODE
  • additional support for the 320x240 resolution under ModeX
  • VIC: fixed a bug causing reset <soft|hard> to throw an exception


  • VIC: fixed a bug in bus_cycle_62


  • minor compilation fixes for newer gcc versions in gpm.c
  • CPU: fixed a bug in opcode_jmp_indirect


  • CPU now emulates most (but not all) illegal opcodes
  • screenshots possible
  • bug with large virtual resolutions fixed
  • fullscreen video support for fb devices (if your fb supports 400x300@60Hz)
  • support for ModeX 360x240 via direct VGA access (no fb device needed, but you have to run ec64 with root rights, because of sys_ioperm)
  • splitted ec64 in different parts: sys, io, ui, core (some of them are now written in C)
  • sprites are now displayed (but slow)
  • first working SID emulation
  • better keymapping (using raw keyboard mode)
  • first working joystick emulation (via keyboard)
  • builtin monitor with basic functionality


  • redesigned nearly everything (but cascaded CIA timers not reimplemented)
  • 4bpp support with vga16fb
  • faster than ec64-0.05 (realtime on pentium 166+)
  • VIC x scrolling works now
  • sprite DMA is implemented, but no sprites are displayed

ec64-0.05-19991219 (first official release):

  • runs on a pentium 300+ in realtime
  • no SID emulation
  • VIC is emulated without sprites and x scrolling
  • CPU emulates only legal opcodes

  • DISC: recognize SYNC not only on byte boundaries
  • SID: sync and ring modulation and filters
  • CIA: cascaded timers
  • VIA: latched/unlatched mode
  • VIC: sprite collision detection
  • VIC: fix sporadic DMA timing misbehavior
  • VIC: speed up sprite decoding
  • CPU: the missing illegal opcodes