User Tools

Site Tools


Modify Keyboard Decoding

The Kernal calls a routine for checking the keyboard in the interrupt routine. The mapping of keyboard code to PETSCII character is done via tables, which are stored in ROM at addresses $EB81 for unshifted keys, $EBC2 for shifted keys, $EC03 for keys pressed together with the CBM key, and $EC78 for keys pressed together with the control key.

The tables are in ROM, but their selection based on the currently pressed Shift/CBM/Ctrl keys is vectored over $28f, so it is rather easy to replace the decoding.

For example, to switch Y and Z to emulate the common layout on German keyboards, a minimally invasive approach would be:

1. Select some piece of RAM where you want to out your new decoding table. For the following steps, I have chosen the area of $2a7-$2ff, which is unused by the Kernal and on of the lesser-used addresses of typical programs

2. Copy the decoding table from the Kernal into that area:

 t eb81 ebc1 2a7 in VICE monitor

3. Switch the decoding of Y and Z:

 >2c0 5a
 >2b3 59

4. write a new routine selecting the new decoding and put it right after your table:

 a 2e8
 .02e8  lda $28d
 .02eb  beq 2f0
 .02ed  jmp $eb4b
 .02f0  lda #$a7
 .02f2  sta $f5
 .02f4  lda #$02
 .02f6  sta $f6
 .02f8  jmp $eae0

5. Change the pointer in $28f to your new routine:

 > 28f e8 02

That's it, Y and Z are now switched. If you also want to switch the shifted values, you need to copy and modify another table (see $EBC2 in Kernal)

base/modify_keyboard_decoding.txt · Last modified: 2022-05-01 20:17 by wil