====== 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)