JOYCE keyboard layout

If a key is pressed the keyboard controller sends the number of the key pressed as well as the state of the key to the CPU. The CPU uses both values as an index into a translation table and determines the corresponding character value. The keyboard mapping may be changed using the utility SETKEYS. The other way of reading the actual mapping is not an easy task. The translation tables reside in different addresses based upon the current BIOS version.
I wrote two small assembler routines reading the character table:
  1. Read the keyboard
  2. Save the keyboard mapping
Another option is to read a key by calling an XBIOS routine and filter control keys by number. If no control key was pressed simply write back the key number and state and read the character by regular BDOS call. A routine could look like this one:

;
; Routine reads a character from keyboard
;
; Carry flag is set if input available
; Accu holds character
;
	call	XBIOS		; Read key
	dw	00dah
	ret	nc		; No key pressed
;
; Analyze key number in reg C here.
; (E.g. cursor keys, number 6, 14, 15 and 79)
;
; If a key searched for will be found Accu must hold a
; value and the carry flag must be set
;
	....
;
; Carry on if no control key found
;
	call	XBIOS		; Rewrite number and state from registers B and C
	dw	00ddh
	ld	c,6
	ld	e,-1
	call	BDOS		; Read character
	or	a
	ret	z		; No character read
	scf
	ret

The keyboard is designed as follows:

Find the complete mapping of the keyboard here.
The control keys are defined as follows:

No value assigned ???No meaning in CP/M 3
No.KeyHex valueMeaning in CP/M 3 No.KeyHex valueMeaning in CP/M 3
0f4 f30x11Next screen 150x01Cursor left
1RELAY0x12Left character into new line 16DEL→0x07Delete character on the right
2f2 f10x1AEnd of file 18RETURN0x0DEnd of line
3PASTE0x17Recall previous line 20EXCH FIND0x1D???
4UNIT PARA 23[+]0x16???
5WORD CHAR0x06Cursor right 66STOP0x03Warmstart
60x06Cursor right 68TAB0x09Tabulator
7 72←DEL0x7FDelete character on the left
8EXIT(0x1B)ESCape 73f6 f50x13Stop screen output
10CUT0x14Writes character left to buffer 75CAN0x08Cancel
11COPY0x17Recalls previous line 76[-]0x1C???
12DOC PAGE 77f8 f70x10Toggle list output
13LINE EOL0x06 0x02Cursor to start of line 78ENTER0x0DEnd of line
140x1FCursor up 790x1ECursor down