* == cmap.asm ==========================================================
*
* Written by William S. Hawes (1988)
*
* ======================================================================
* This keymap was built following the documentation in volume 1 of the RKM.
* Any resemblance to a correct keymap is purely fortuitous.

         INCLUDE  "exec/types.i"
         INCLUDE  "devices/keymap.i"

         ; The file must begin with a KeyMapNode structure

         moveq    #20,d0               ; 1/2 LN_SUCC 
         rts                           ; 2/2 LN_SUCC

         dc.l     0                    ; LN_PRED
         dc.b     0                    ; LN_TYPE
         dc.b     0                    ; LN_PRI
         dc.l     MapName              ; LN_NAME (keymap name)

         dc.l     LoKeyMapTypes
         dc.l     LoKeyMap
         dc.l     LoCapsable
         dc.l     LoRepeatable
         dc.l     HiKeyMapTypes
         dc.l     HiKeyMap
         dc.l     HiCapsable
         dc.l     HiRepeatable

         ; The LoCapsable vector (bit array) indicates whether the shifted
         ; code should be used if the CAPS LOCK light is on.

         CNOP     0,4
LoCapsable
         dc.b     0                    ; codes 00-07
         dc.b     0                    ; codes 08-0F
         dc.b     $FF                  ; codes 10-17
         dc.b     $03                  ; codes 18-1F
         dc.b     $FF                  ; codes 20-27
         dc.b     $01                  ; codes 28-2F
         dc.b     $FE                  ; codes 30-37
         dc.b     $00                  ; codes 38-3F

         ; The HiCapsable vector (bit array)

HiCapsable
         dc.b     0                    ; codes 40-47
         dc.b     0                    ; codes 48-4F
         dc.b     0                    ; codes 50-57
         dc.b     0                    ; codes 58-5F
         dc.b     0                    ; codes 60-67
         dc.b     0
         dc.b     0
         dc.b     0

         ; The LoRepeatable vector (bit array) indicates whether the key
         ; should be repeated when it's held down.

LoRepeatable
         dc.b     $FF                  ; codes 00-07
         dc.b     $BF                  ; codes 08-0F
         dc.b     $FF                  ; codes 10-17
         dc.b     $EF                  ; codes 18-1F
         dc.b     $FF                  ; codes 20-27
         dc.b     $EF                  ; codes 28-2F
         dc.b     $FF                  ; codes 30-37
         dc.b     $F7                  ; codes 38-3F

         ; The HiRepeatable vector (bit array)

HiRepeatable
         dc.b     $47                  ; codes 40-47
         dc.b     $F4                  ; codes 48-4F
         dc.b     $FF                  ; codes 50-57
         dc.b     $03                  ; codes 58-5F
         dc.b     $00                  ; codes 60-67
         dc.b     0
         dc.b     0
         dc.b     0

         ; Keymap types for the low keycodes (hex 00-3F) ... all "vanilla"

LoKeyMapTypes
         dc.b     KC_VANILLA           ; (00)
         dc.b     KC_VANILLA           ; (01)
         dc.b     KC_VANILLA           ; (02)
         dc.b     KC_VANILLA           ; (03)
         dc.b     KC_VANILLA           ; (04)
         dc.b     KC_VANILLA           ; (05)
         dc.b     KC_VANILLA           ; (06)
         dc.b     KC_VANILLA           ; (07)
         dc.b     KC_VANILLA           ; (08)
         dc.b     KC_VANILLA           ; (09)
         dc.b     KC_VANILLA           ; (0A)
         dc.b     KC_VANILLA           ; (0B)
         dc.b     KC_VANILLA           ; (0C)
         dc.b     KC_VANILLA           ; (0D)
         dc.b     KCF_NOP              ; (0E)
         dc.b     KC_VANILLA           ; (0F)

         dc.b     KC_VANILLA           ; (10)
         dc.b     KC_VANILLA           ; (11)
         dc.b     KC_VANILLA           ; (12)
         dc.b     KC_VANILLA           ; (13)
         dc.b     KC_VANILLA           ; (14)
         dc.b     KC_VANILLA           ; (15)
         dc.b     KC_VANILLA           ; (16)
         dc.b     KC_VANILLA           ; (17)
         dc.b     KC_VANILLA           ; (18)
         dc.b     KC_VANILLA           ; (19)
         dc.b     KC_VANILLA           ; (1A)
         dc.b     KC_VANILLA           ; (1B)
         dc.b     KCF_NOP              ; (1C)
         dc.b     KC_VANILLA           ; (1D)
         dc.b     KC_VANILLA           ; (1E)
         dc.b     KC_VANILLA           ; (1F)

         dc.b     KC_VANILLA           ; (20)
         dc.b     KC_VANILLA           ; (21)
         dc.b     KC_VANILLA           ; (22)
         dc.b     KC_VANILLA           ; (23)
         dc.b     KC_VANILLA           ; (24)
         dc.b     KC_VANILLA           ; (25)
         dc.b     KC_VANILLA           ; (26)
         dc.b     KC_VANILLA           ; (27)
         dc.b     KC_VANILLA           ; (28)
         dc.b     KC_VANILLA           ; (29)
         dc.b     KC_VANILLA           ; (2A)
         dc.b     KCF_NOP              ; (2B)
         dc.b     KCF_NOP              ; (2C)
         dc.b     KC_VANILLA           ; (2D)
         dc.b     KC_VANILLA           ; (2E)
         dc.b     KC_VANILLA           ; (2F)

         dc.b     KCF_NOP              ; (30)
         dc.b     KC_VANILLA           ; (31)
         dc.b     KC_VANILLA           ; (32)
         dc.b     KC_VANILLA           ; (33)
         dc.b     KC_VANILLA           ; (34)
         dc.b     KC_VANILLA           ; (35)
         dc.b     KC_VANILLA           ; (36)
         dc.b     KC_VANILLA           ; (37)
         dc.b     KC_VANILLA           ; (38)
         dc.b     KC_VANILLA           ; (39)
         dc.b     KC_VANILLA           ; (3A)
         dc.b     KCF_NOP              ; (3B)
         dc.b     KC_VANILLA           ; (3C)
         dc.b     KC_VANILLA           ; (3D)
         dc.b     KC_VANILLA           ; (3E)
         dc.b     KC_VANILLA           ; (3F)

         ; This is the key types array for the high keycodes (hex 40-67)

HiKeyMapTypes
         dc.b     KCF_ALT              ; (40) space
         dc.b     KC_NOQUAL            ; (41) backspace
         dc.b     KCF_STRING!KCF_SHIFT ; (42) tab
         dc.b     KC_NOQUAL            ; (43) enter
         dc.b     KCF_CONTROL          ; (44) return
         dc.b     KCF_ALT              ; (45) escape
         dc.b     KC_NOQUAL            ; (46) delete
         dc.b     KCF_NOP              ; (47)
         dc.b     KCF_NOP              ; (48)
         dc.b     KCF_NOP              ; (49)
         dc.b     KCF_ALT              ; (4A) numeric pad -
         dc.b     KCF_NOP              ; (4B)

         dc.b     KCF_STRING!KCF_SHIFT             ; (4C) up arrow
         dc.b     KCF_STRING!KCF_SHIFT             ; (4D) down arrow
         dc.b     KCF_STRING!KCF_SHIFT!KCF_CONTROL ; (4E) right arrow
         dc.b     KCF_STRING!KCF_SHIFT!KCF_CONTROL ; (4F) left arrow

         dc.b     KCF_STRING!KCF_SHIFT ; (50) F1
         dc.b     KCF_STRING!KCF_SHIFT ; (51) F2
         dc.b     KCF_STRING!KCF_SHIFT ; (52) F3
         dc.b     KCF_STRING!KCF_SHIFT ; (53) F4
         dc.b     KCF_STRING!KCF_SHIFT ; (54) F5
         dc.b     KCF_STRING!KCF_SHIFT ; (55) F6
         dc.b     KCF_STRING!KCF_SHIFT ; (56) F7
         dc.b     KCF_STRING!KCF_SHIFT ; (57) F8
         dc.b     KCF_STRING!KCF_SHIFT ; (58) F9
         dc.b     KCF_STRING!KCF_SHIFT ; (59) F10

         dc.b     KCF_NOP              ; (5A)
         dc.b     KCF_NOP              ; (5B)
         dc.b     KCF_NOP              ; (5C)
         dc.b     KCF_NOP              ; (5D)
         dc.b     KCF_NOP              ; (5E)
         dc.b     KCF_STRING           ; (5F) Help

         dc.b     KCF_NOP              ; (60) Left Shift
         dc.b     KCF_NOP              ; (61) Right Shift
         dc.b     KCF_NOP              ; (62) Caps Lock
         dc.b     KCF_NOP              ; (63) Control
         dc.b     KCF_NOP              ; (64) Left Alt
         dc.b     KCF_NOP              ; (65) Left Alt
         dc.b     KCF_NOP              ; (66) Left Amiga
         dc.b     KCF_NOP              ; (67) Right Amiga

         ; These are the low keycode entries

LoKeyMap
         dc.b     ('~')+$80,('`')+$80,'~','`'   ; (00)
         dc.b     ('!')+$80,('1')+$80,'!','1'   ; (01)
         dc.b     ('@')+$80,('2')+$80,'@','2'   ; (02)
         dc.b     ('#')+$80,('3')+$80,'#','3'   ; (03)
         dc.b     ('$')+$80,('4')+$80,'$','4'   ; (04)
         dc.b     ('%')+$80,('5')+$80,'%','5'   ; (05)
         dc.b     ('^')+$80,('6')+$80,'^','6'   ; (06)
         dc.b     ('&')+$80,('7')+$80,'&','7'   ; (07)
         dc.b     ('*')+$80,('8')+$80,'*','8'   ; (08)
         dc.b     ('(')+$80,('9')+$80,'(','9'   ; (09)
         dc.b     (')')+$80,('0')+$80,')','0'   ; (0A)
         dc.b     ('_')+$80,('-')+$80,'_','-'   ; (0B) -_
         dc.b     ('+')+$80,('=')+$80,'+','='   ; (0C) =+
         dc.b     ('|')+$80,('\')+$80,'|','\'   ; (0D) \|
         dc.b     0,0,0,0                       ; (0E)
         dc.b     ('0')+$80,('0')+$80,'0','0'   ; (0F) numeric 0

         dc.b     ('Q')+$80,('q')+$80,'Q','q'   ; (10) Q
         dc.b     ('W')+$80,('w')+$80,'W','w'   ; (11) W
         dc.b     ('E')+$80,('e')+$80,'E','e'   ; (12) E
         dc.b     ('R')+$80,('r')+$80,'R','r'   ; (13) R
         dc.b     ('T')+$80,('t')+$80,'T','t'   ; (14) T
         dc.b     ('Y')+$80,('y')+$80,'Y','y'   ; (15) Y
         dc.b     ('U')+$80,('u')+$80,'U','u'   ; (16) U
         dc.b     ('I')+$80,('i')+$80,'I','i'   ; (17) I
         dc.b     ('O')+$80,('o')+$80,'O','o'   ; (18) O
         dc.b     ('P')+$80,('p')+$80,'P','p'   ; (19) P
         dc.b     ('{')+$80,('[')+$80,'{','['   ; (1A) [{
         dc.b     ('{')+$80,(']')+$80,'}',']'   ; (1B) ]}
         dc.b     0,0,0,0                       ; (1C)
         dc.b     ('1')+$80,('1')+$80,'1','1'   ; (1D) numeric pad 1
         dc.b     ('2')+$80,('2')+$80,'2','2'   ; (1E) numeric pad 2
         dc.b     ('3')+$80,('3')+$80,'3','3'   ; (1F) numeric pad 3

         dc.b     ('A')+$80,('a')+$80,'A','a'   ; (20) A
         dc.b     ('S')+$80,('s')+$80,'S','s'   ; (21) S
         dc.b     ('D')+$80,('d')+$80,'D','d'   ; (22) D
         dc.b     ('F')+$80,('f')+$80,'F','f'   ; (23) F
         dc.b     ('G')+$80,('g')+$80,'G','g'   ; (24) G
         dc.b     ('H')+$80,('h')+$80,'H','h'   ; (25) H
         dc.b     ('J')+$80,('j')+$80,'J','j'   ; (26) J
         dc.b     ('K')+$80,('k')+$80,'K','k'   ; (27) K
         dc.b     ('L')+$80,('l')+$80,'L','l'   ; (28) L
         dc.b     (':')+$80,(';')+$80,':',';'   ; (29) ;:
         dc.b     ('"')+$80,($27)+$80,'"',$27   ; (2A) '"
         dc.b     0,0,0,0                       ; (2B)
         dc.b     0,0,0,0                       ; (2C)
         dc.b     ('4')+$80,('4')+$80,'4','4'   ; (2D) numeric pad 4
         dc.b     ('5')+$80,('5')+$80,'5','5'   ; (2E) numeric pad 5
         dc.b     ('6')+$80,('6')+$80,'6','6'   ; (2F) numeric pad 6

         dc.b     0,0,0,0                       ; (30)
         dc.b     ('Z')+$80,('z')+$80,'Z','z'   ; (31) Z
         dc.b     ('X')+$80,('x')+$80,'X','x'   ; (32) X
         dc.b     ('C')+$80,('c')+$80,'C','c'   ; (33) C
         dc.b     ('V')+$80,('v')+$80,'V','v'   ; (34) V
         dc.b     ('B')+$80,('b')+$80,'B','b'   ; (35) B
         dc.b     ('N')+$80,('n')+$80,'N','n'   ; (36) N
         dc.b     ('M')+$80,('m')+$80,'M','m'   ; (37) M
         dc.b     ('<')+$80,(',')+$80,'<',','   ; (38) ,<
         dc.b     ('>')+$80,('.')+$80,'>','.'   ; (39) .>
         dc.b     ('?')+$80,('/')+$80,'?','/'   ; (3A) /?
         dc.b     0,0,0,0                       ; (3B)
         dc.b     ('.')+$80,('.')+$80,'.','.'   ; (3C) numeric pad .
         dc.b     ('7')+$80,('7')+$80,'7','7'   ; (3D) numeric pad 7
         dc.b     ('8')+$80,('8')+$80,'8','8'   ; (3E) numeric pad 8
         dc.b     ('9')+$80,('9')+$80,'9','9'   ; (3F) numeric pad 9

         ; This is the keymap table for the high keycodes

HiKeyMap
         dc.b     0,0,$A0,$20          ; (40) space
         dc.b     0,0,$00,$08          ; (41) backspace
         dc.l     Tab                  ; (42) tab
         dc.b     0,0,$00,$0D          ; (43) enter
         dc.b     0,0,$0A,$0D          ; (44) return
         dc.b     0,0,$9B,$1B          ; (45) escape
         dc.b     0,0,$00,$7F          ; (46) delete
         dc.l     0                    ; (47)
         dc.l     0                    ; (48)
         dc.l     0                    ; (49)
         dc.b     0,0,$FF,$2D          ; (4A) numeric pad -
         dc.l     0                    ; (4B)
         dc.l     Up                   ; (4C) up arrow
         dc.l     Down                 ; (4D) down arrow
         dc.l     Fwd                  ; (4E) right arrow
         dc.l     Bkwd                 ; (4F) left arrow

         dc.l     F1                   ; (50) F1
         dc.l     F2                   ; (51) F2
         dc.l     F3                   ; (52) F3
         dc.l     F4                   ; (53) F4
         dc.l     F5                   ; (54) F5
         dc.l     F6                   ; (55) F6
         dc.l     F7                   ; (56) F7
         dc.l     F8                   ; (57) F8
         dc.l     F9                   ; (58) F9
         dc.l     F10                  ; (59) F10
         dc.l     0                    ; (5A)
         dc.l     0                    ; (5B)
         dc.l     0                    ; (5C)
         dc.l     0                    ; (5D)
         dc.l     0                    ; (5E)
         dc.l     Help                 ; (5F) Help

         dc.l     0                    ; (60) Left Shift
         dc.l     0                    ; (61) Right Shift
         dc.l     0                    ; (62) Caps Lock
         dc.l     0                    ; (63) Control
         dc.l     0                    ; (64) Left Alt
         dc.l     0                    ; (65) Right Alt
         dc.l     0                    ; (66) Left Amiga
         dc.l     0                    ; (67) Right Amiga

         ; The string descriptors begin here.  First, an explanation:
         ; A string descriptor consists of 2 bytes for each qualifier bit.
         ; The first byte is the length of the string, and the second is
         ; the (signed) offset from the start of the descriptor.
         ; The assumed order of qualifiers doesn't appear to be documented,
         ; but is probably none/shift/control/alt

Tab      dc.b     TabShft-TabNone      ; length
         dc.b     TabNone-Tab          ; offset
         dc.b     TabStop-TabShft      ; length
         dc.b     TabShft-Tab          ; offset

TabNone  dc.b     $09
TabShft  dc.b     $9B,'Z'
TabStop

Up       dc.b     UpShft-UpNone        ; length
         dc.b     UpNone-Up            ; offset
         dc.b     UpStop-UpShft        ; length
         dc.b     UpShft-Up            ; offset

UpNone   dc.b     $9B,'A'
UpShft   dc.b     $9B,'T'
UpStop

Down     dc.b     DownShft-DownNone    ; length
         dc.b     DownNone-Down        ; offset
         dc.b     DownStop-DownShft    ; length
         dc.b     DownShft-Down        ; offset

DownNone dc.b     $9B,'B'
DownShft dc.b     $9B,'S'
DownStop

         ; Forward (right arrow)

Fwd      dc.b     FwdShft-FwdNone      ; length
         dc.b     FwdNone-Fwd          ; offset
         dc.b     FwdCtrl-FwdShft      ; length
         dc.b     FwdShft-Fwd          ; offset
         dc.b     FwdStop-FwdCtrl      ; length
         dc.b     FwdCtrl-Fwd          ; offset

FwdNone  dc.b     $9B,'C'
FwdShft  dc.b     $9B,' @'
FwdCtrl  dc.b     $9B,' @',$9B,' @',$9B,' @'
FwdStop

         ; Backward (left arrow)

Bkwd     dc.b     BkwdShft-BkwdNone    ; length
         dc.b     BkwdNone-Bkwd        ; offset
         dc.b     BkwdCtrl-BkwdShft    ; length
         dc.b     BkwdShft-Bkwd        ; offset
         dc.b     BkwdStop-BkwdCtrl    ; length
         dc.b     BkwdCtrl-Bkwd        ; offset

BkwdNone dc.b     $9B,'D'
BkwdShft dc.b     $9B,' A'
BkwdCtrl dc.b     $9B,' A',$9B,' A',$9B,' A'
BkwdStop

         ; Function keys

F1       dc.b     F1Shft-F1None        ; length
         dc.b     F1None-F1            ; offset
         dc.b     F1Stop-F1Shft        ; length
         dc.b     F1Shft-F1            ; offset

F1None   dc.b     $9B,'0~'
F1Shft   dc.b     $9B,'10~'
F1Stop

F2       dc.b     F2Shft-F2None        ; length
         dc.b     F2None-F2            ; offset
         dc.b     F2Stop-F2Shft        ; length
         dc.b     F2Shft-F2            ; offset

F2None   dc.b     $9B,'1~'
F2Shft   dc.b     $9B,'11~'
F2Stop

F3       dc.b     F3Shft-F3None        ; length
         dc.b     F3None-F3            ; offset
         dc.b     F3Stop-F3Shft        ; length
         dc.b     F3Shft-F3            ; offset

F3None   dc.b     $9B,'2~'
F3Shft   dc.b     $9B,'12~'
F3Stop

F4       dc.b     F4Shft-F4None        ; length
         dc.b     F4None-F4            ; offset
         dc.b     F4Stop-F4Shft        ; length
         dc.b     F4Shft-F4            ; offset

F4None   dc.b     $9B,'3~'
F4Shft   dc.b     $9B,'13~'
F4Stop

F5       dc.b     F5Shft-F5None        ; length
         dc.b     F5None-F5            ; offset
         dc.b     F5Stop-F5Shft        ; length
         dc.b     F5Shft-F5            ; offset

F5None   dc.b     $9B,'4~'
F5Shft   dc.b     $9B,'14~'
F5Stop

F6       dc.b     F6Shft-F6None        ; length
         dc.b     F6None-F6            ; offset
         dc.b     F6Stop-F6Shft        ; length
         dc.b     F6Shft-F6            ; offset

F6None   dc.b     $9B,'5~'
F6Shft   dc.b     $9B,'15~'
F6Stop

F7       dc.b     F7Shft-F7None        ; length
         dc.b     F7None-F7            ; offset
         dc.b     F7Stop-F7Shft        ; length
         dc.b     F7Shft-F7            ; offset

F7None   dc.b     $9B,'6~'
F7Shft   dc.b     $9B,'16~'
F7Stop

F8       dc.b     F8Shft-F8None        ; length
         dc.b     F8None-F8            ; offset
         dc.b     F8Stop-F8Shft        ; length
         dc.b     F8Shft-F8            ; offset

F8None   dc.b     $9B,'7~'
F8Shft   dc.b     $9B,'17~'
F8Stop

F9       dc.b     F9Shft-F9None        ; length
         dc.b     F9None-F9            ; offset
         dc.b     F9Stop-F9Shft        ; length
         dc.b     F9Shft-F9            ; offset

F9None   dc.b     $9B,'8~'
F9Shft   dc.b     $9B,'18~'
F9Stop

F10      dc.b     F10Shft-F10None      ; length
         dc.b     F10None-F10          ; offset
         dc.b     F10Stop-F10Shft      ; length
         dc.b     F10Shft-F10          ; offset

F10None  dc.b     $9B,'9~'
F10Shft  dc.b     $9B,'19~'
F10Stop

         ; The 'help' key ... no qualifiers

Help     dc.b     HelpStop-HelpNone    ; length
         dc.b     HelpNone-Help        ; offset

HelpNone dc.b     $9B,'?~'
HelpStop

MapName  dc.b     'cmap',0

         END
