dsforth: added `[CHAR]`
[urasm.git] / dsforth / main_key6.zas
blob94a6a2780ec41dd4881f36cbed619bfc5e3cff66
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; keyboard driver
3 ;; based on the sources from AberSoft
4 ;; modified by Ketmar
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 keyTranTbl:
8   defb  198,91     ;; AND->[
9   defb  197,93     ;; OR->]
10   defb  172,127    ;; AT->(c)
11   defb  226,126    ;; STOP->~
12   defb  195,124    ;; NOT->|
13   defb  205,92     ;; STEP->\
14   defb  204,123    ;; TO->{
15   defb  203,125    ;; THEN->}
16   defb  0
18 $FORTH_CONST (KEY-SHOW-CURSOR) key_show_cursor
19 key_show_cursor: defb 1,0
22   IF USE_EXT_LAST_KEY
23 $FORTH_CODE_WORD LAST-KEY-RESET
24 ;; k8
25 ;; ( -- )
26   xor   a
27   ld    (#5C08),a  ;; last_k
28   jp    i_next
29 $FORTH_END_CODE_WORD LAST-KEY-RESET
32 $FORTH_CODE_WORD LAST-KEY?
33 ;; k8
34 ;; ( -- c )
35   ld    a,(#5C08)  ;; last_k
36   or    a
37   jr    z,key_query_done
38   cp    6
39   jr    nz,key_query_not_cs2
40   xor   a
41 key_query_not_cs2:
42   cp    128
43   jr    c,key_query_done
44 ;; translate codes
45   ld    e,a
46   ld    hl,keyTranTbl
47 key_query_trans_loop:
48   ld    a,(hl)    ;; src
49   inc   hl
50   or    a         ;; end?
51   jr    z,key_query_done
52   cp    e
53   ld    a,(hl)    ;; dest
54   inc   hl
55   jr    nz,key_query_trans_loop
56 key_query_done:
57   ld    l,a
58   ld    h,0
59   jp    i_pushhl
60 $FORTH_END_CODE_WORD LAST-KEY?
61   ENDIF
64 ;; show cursor, wait for key
65 $FORTH_CODE_WORD KEY
66 ;; k8
67 ;; ( -- c )
68   push  bc
70   ld    a,2
71   call  #1601
73 key_0:
74   xor   a
75   ld    (#5C08),a  ;; last_k
77 ;; change cursor shape according to FRAMES
78 key_1:
79   ld    a,(key_show_cursor)
80   or    a
81   jr    z,key_x3
82   ;; draw cursor
83   ld    a,(#5C78)  ;; frames
84   and   #2F        ;; each 24th frame (~0.5 sec)
85   ld    l,177
86   and   #20
87   jr    z,key_x1
88   inc   l
89 key_x1:
90 ;; check CAPS & change cursor shape
91   ld    a,(#5C6A)  ;; flags
92   and   #08
93   jr    nz,key_x2
94   dec   l
95 key_x2:
96   call  emit6_internal
97 ;;BS
98   ld    hl,emit6x
99   dec   (hl)
101 ;; wait for keypress
102 key_x3:
103 ;;;   CALL #02BF      ;; keyboard
104   ld    a,(#5C08)  ;; last_k
105   or    a
106   jr    z,key_1
108 ;; something's pressed
109   cp    #06       ;; CS+2?
110   jr    nz,key_3
111 ;;toggle CAPS
112   ld    hl,#5C6A  ;; flags
113   ld    a,#08     ;; CAPS flag
114   xor   (hl)
115   ld    (hl),a
116   jr    key_0
118 key_3:
119 ;; translate codes
120   ld    e,a
121   ld    hl,keyTranTbl
122 key_t0:
123   ld    a,(hl)    ;; src
124   inc   hl
125   or    a         ;; end?
126   jr    z,key_tq
127   cp    e
128   ld    a,(hl)    ;; dest
129   inc   hl
130   jr    nz,key_t0
131   ld    e,a
133 ;; check codes
134 key_tq:
135   ld    a,e
136   cp    128
137   jr    nc,key_0
139   ld    l,a
140   ld    h,0
141   push  hl        ;; save keycode
143 ;; erase cursor
144   ld    a,(key_show_cursor)
145   or    a
146   jr    z,key_skip_erase_cursor
147   ;; erase it
148   ld    l,32
149   call  emit6_internal
150 ;;BS
151   ld    hl,emit6x
152   dec   (hl)
153 key_skip_erase_cursor:
155   pop   hl
156   pop   bc
157   jp    i_pushhl
158 $FORTH_END_CODE_WORD KEY