Version 1.6 adds new features as well as bugfixes and improvements.

Support has been added for expanding the number of available control lines by adding one or more daisy chained 74595 serial shift registers. Each register will add another 8-bit wide control port. See port expansion for details.

The firmware update command has been improved for updates that break binary compatibility with existing configuration stored on the device. An optional second argument can be used to specify a configuration file. If present, the exisiting configuration will be disabled before update and reinstalled after the update. This method is required when updating to version 1.6. Please see the update instructions.

The configuration syntax has been improved by adding an alternative short notation for specifying control lines. Instead of using the verbose port a bit 6 it is now possible to simply use a6.

It is now possible to configure the speed at which the keyboard is scanned. The new speed directive can be used to select “slow” mode or “fast” mode. Slow scanning is required when the keyboard cable is longer than in a stock C64, for example when installing the device in an SX64.

The power-on sequence has been improved by adding an early scan and relay step so that keys pressed during power-up are seen as early as possible by the C64. Thus compatibility with cartridges that check for keypresses during power up has been improved.

A new serial command has been added to directly type a PETSCII-code on the keyboard.

The client utility now features a reset command to trigger a reset of the device via USB.

Some bugs relating to symbol parsing and text output have been fixed.

For a detailed list of changes please refer to the remainder of this post.

The project page contains the complete documentation.

Changes in version 1.6:


  • support for expansion of control lines via multiple daisy chained 74595 serial shift registers. Additional registers will appear as additional virtual ports c, d, e etc. and can be used like the native ports a and b. The only limitation is that the expanded ports can not be set to tristate.

  • Implemented the corresponding “expand” configuration directive to configure port expansion, specifying the number of additional ports and the location of the required control lines on the native ports.

  • Improved update command for updates that require regeneration of binary configuration data. The update command accepts an optional second argument specifying the location of a configuration file.

  • Added “speed” command to configure either slow or fast keyboard scanning. Slow scanning is necessary for long keyboard cables, as in the SX64 (reported by Davide Gustin)

  • Added commands to control the keyboard matrix directly from USB

  • Added new serial command to set control lines directly

  • Added new serial command to type a PETSCII character

  • Added USB command to reset the device, implemented reset command for the client utility

  • Allow multiple map commands for the same key

  • Added early scan and relay step on power up to allow cartridges to see key presses early on during their startup sequence (reported by Gero Ihde)

  • Fixed bug in symbol parsing where all lines containing equal signs were interpreted as symbol definitions (reported by Sven Arke)

  • Fixed bugs in internal print routine

  • Added bash completion support

Build system

  • Fixed build errors/warnings on MacOSX/clang (missing fmemopen())
  • Fixed definition of sleep() for all build environments
  • Fill binary firmware image with 0xff up to 128k
  • Adjusted assembler sources for KickAssembler 4.x

Update instructions

This update breaks binary compatibility for existing configuration data on the device. Please follow these instructions to perform the update:

  1. Update the keyman64 client utility first

  2. Use the new two-argument form of the update command to update the firmware:

     $ keyman64 update keyman64-application-1.6.hex my.conf

where “my.conf” should point to your configuration file.

This will first delete the current configuration on the device, then update the firmware and after that regenerate your configuration and finally transfer the new configuration to the device.