comparison level2/modules/keydrv_cc3.asm @ 1254:5bced1e03639

Changed to new naming convention
author boisy
date Sun, 17 Aug 2003 16:25:29 +0000
parents
children 67e11bfc9cd4
comparison
equal deleted inserted replaced
1253:50d6f82d16d9 1254:5bced1e03639
1 ********************************************************************
2 * KeyDrv - Keyboard Driver for CoCo 3
3 *
4 * $Id$
5 *
6 * Ed. Comments Who YY/MM/DD
7 * ------------------------------------------------------------------
8 * 4 L2 Upgrade distribution version
9 * Annotations by Robert Gault RG 98/10/10
10
11 nam KeyDrv
12 ttl Keyboard Driver for CoCo 3
13
14 * Disassembled 98/09/09 09:02:10 by Disasm v1.6 (C) 1988 by RML
15
16 ifp1
17 use defsfile
18 endc
19
20 tylg set Systm+Objct
21 atrv set ReEnt+rev
22 rev set $01
23 edition equ 4
24
25 mod eom,name,tylg,atrv,start,size
26 size equ .
27
28 name fcs /KeyDrv/
29 fcb edition
30
31 start lbra Init init/term; CLRB RTS
32 lbra Term
33 lbra FuncKeys test for keys F1, F2
34
35 ReadKys ldu <D.CCMem CC3IO global memory $1000
36 ldx #PIA0Base base address of PIA#1
37 clrb
38 comb
39 stb $02,x clear all strobe lines
40 ldb ,x read PIA#1
41 comb bit values 0=off 1=on
42 andb #%00001111 keep only buttons
43 bne L0059 branch if button pushed; error routine
44 clr $02,x enable all strobe lines
45 lda ,x read PIA#1
46 coma
47 anda #%01111111 mask only the joystick conparator
48 beq L0042 branch if no keys pressed
49 pshs dp
50 tfr u,d
51 tfr a,dp set DP to the address in regU
52 bsr L005C evaluate the found key matrix
53 puls dp return to system DP
54 bpl L005B valid key
55 L0042 clra regA would have been the found key
56 ldb <G.CapLok,u CapsLock/SysRq key down flag
57 bne L0056
58 clr <G.KTblLC,u Key table entry# last checked (1-3)
59 coma
60 comb
61 sta <G.LKeyCd,u last keyboard code
62 sta <G.2Key1,u 2nd key table storage; $FF=none
63 std <G.2Key2,u format (Row/Column)
64 L0056 clr <G.CapLok,u see above
65 L0059 ldb #$FF
66 L005B rts
67
68 L005C ldx #PIA0Base base value of PIA#1
69 clra
70 clrb
71 std <G.ShftDn shift/CTRL flag; 0=NO $FF=YES
72 std <G.KeyFlg PIA bits/ALT flag
73 * %00000111-Column # (Output, 0-7)
74 * %00111000-Row # (Input, 0-6)
75 coma
76 comb set primary key table
77 std <G.Key1 key 1&2 flags $FF=none
78 sta <G.Key3 key 3 ²
79 deca ie. lda #%11111110
80 sta $02,x strobe one column
81 L006E lda ,x read PIA#1
82 coma
83 anda #$7F keep only keys, bit 0=off 1=on
84 beq L0082
85 ldb #$FF preset counter to -1
86 L0077 incb
87 lsra bit test regA
88 bcc L007E no key so branch
89 lbsr L010E convert column/row to matrix value and store it
90 L007E cmpb #$06 max counter
91 bcs L0077 loop if more bits to test
92 L0082 inc <G.KeyFlg counter; used here for column
93 orcc #Carry bit marker; disable strobe
94 rol $02,x shift to next column
95 bcs L006E not finished with columns so loop
96 lbsr L0166 simultaneous check; recover key matrix value
97 bmi L00F5 invalid so go
98 cmpa <G.LKeyCd last keyboard code
99 bne L0095
100 inc <G.KySame same key flag ?counter?
101 L0095 sta <G.LKeyCd setup for last key pressed
102 beq L00B5
103 suba #$1A the key value (matrix) of Z
104 bhi L00B5 not a letter so go
105 adda #$1A restore regA
106 ldb <G.CntlDn CTRL flag
107 bne L00E0 CTRL is down so go
108 adda #$40 convert to ASCII value; all caps
109 ldb <G.ShftDn shift key flag
110 ldy <G.CurDev get current device static memory pointer
111 eorb <$21,y caps lock and keyboard mouse flags
112 andb #$01 test caps flag
113 bne L00E0 not shifted so go
114 adda #$20 convert to ASCII lower case
115 bra L00E0
116 * key is not a letter; this routine is not based on some underlining principle of
117 * the keyboard hardware. It is also a function of the decode table at $1DC,pcr.
118 L00B5 ldb #$03
119 mul regB = (key#-26) times 3
120 lda <G.ShftDn shift key flag
121 beq L00BF not shifted so go
122 incb
123 bra L00C5
124 L00BF lda <G.CntlDn CTRL flag
125 beq L00C5
126 addb #$02
127 L00C5 ldx <G.CurDev point regX to device’s static memory
128 lda <$22,x key sense flag
129 beq L00D0 not set so go
130 cmpb #$11 spacebar
131 ble L00F3 must be an arrow so go
132 L00D0 cmpb #$4C SHIFTed ALT key
133 blt L00D8 not ALT, CTRL, F1, F2, or SHIFT so go
134 inc <G.AltDwn flag special keys (ALT,CTRL)
135 subb #$06
136 L00D8 leax >L01DC,pcr decode table
137 lda b,x
138 bmi L00F6 if regA = $81 - $84
139 * several entries to this routine from any key press; regA is already ASCII
140 L00E0 ldb <G.AltDwn was ALT flagged?
141 beq L00F0 no so go
142 cmpa #$3F ?
143 bls L00EE # or code
144 cmpa #$5B [
145 bcc L00EE capital letter so go
146 ora #$20 convert to lower case
147 L00EE ora #$80 set for ALT characters
148 L00F0 andcc #^Negative not negative
149 rts
150 L00F3 orcc #Negative set negative
151 L00F5 rts
152 L00F6 inc <G.CapLok caps lock/SysRq
153 inc <G.Clear one shot caps lock/SysRq
154 bra L00F0
155 L00FC pshs b,a convert column into power of 2
156 clrb
157 orcc #Carry
158 inca
159 L0102 rolb
160 deca
161 bne L0102
162 bra L0108 WHY IS THIS HERE??
163 L0108 orb <G.KySns previous value of column
164 stb <G.KySns
165 puls pc,b,a
166 L010E pshs b,a
167 cmpb #$03 is it row 3?
168 bne L011C
169 lda <G.KeyFlg get column #
170 cmpa #$03 is it column 3?; ie up arrow
171 blt L011C if lt must be a letter
172 bsr L00FC its a non letter so bsr
173 L011C lslb B*8 8 keys per row
174 lslb
175 lslb
176 addb <G.KeyFlg add in the column #
177 cmpb #$33 ALT
178 bne L012B
179 inc <G.AltDwn ALT down flag
180 ldb #$04
181 bra L0108
182 L012B cmpb #$34 CTRL
183 bne L0135
184 inc <G.CntlDn CTRL down flag
185 ldb #$02
186 bra L0108
187 L0135 cmpb #$37 shift key
188 bne L013F
189 com <G.ShftDn shift down flag
190 ldb #$01
191 bra L0108
192 * check how many key (1-3) are currently being pressed
193 L013F pshs x
194 leax <$2D,u 1st key table
195 bsr L014A
196 puls x
197 puls pc,b,a
198 L014A pshs a
199 lda ,x
200 bpl L0156
201 stb ,x
202 ldb #$01
203 puls pc,a
204 L0156 lda $01,x
205 bpl L0160
206 stb $01,x
207 ldb #$02
208 puls pc,a
209 L0160 stb $02,x
210 ldb #$03
211 puls pc,a
212 * simlutaneous key test
213 L0166 pshs y,x,b
214 ldb <G.KTblLC key table entry#
215 beq L019D
216 leax <$2A,u point to 2nd key table
217 pshs b
218 L0171 leay <$2D,u 1st key table
219 ldb #$03
220 lda ,x get key#1
221 bmi L018F go if invalid? (no key)
222 L017A cmpa ,y is it a match?
223 bne L0184 go if not a matched key
224 clr ,y
225 com ,y set value to $FF
226 bra L018F
227 L0184 leay $01,y
228 decb
229 bne L017A
230 lda #$FF
231 sta ,x
232 dec <G.KTblLC key table entry#
233 L018F leax $01,x
234 dec ,s column counter
235 bne L0171
236 leas $01,s
237 ldb <G.KTblLC key table entry (can test for 3 simul keys)
238 beq L019D
239 bsr L01C4
240 L019D leax <$2D,u 1st key table
241 lda #$03
242 L01A2 ldb ,x+
243 bpl L01B5
244 deca
245 bne L01A2
246 ldb <G.KTblLc key table entry (can test for 3 simul keys)
247 beq L01C0
248 decb
249 leax <$2A,u 2nd key table
250 lda b,x
251 bra L01BE
252 L01B5 tfr b,a
253 leax <$2A,u 2nd key table
254 bsr L014A
255 stb <G.KTblLC
256 L01BE puls pc,y,x,b
257 L01C0 orcc #Negative flag negative
258 puls pc,y,x,b
259 L01C4 leax <$2A,u
260 bsr L01CF
261 leax $01,x
262 bsr L01CF
263 leax -$01,x
264 L01CF lda ,x
265 bpl L01DB
266 ldb $01,x
267 bmi L01DB
268 sta $01,x
269 stb ,x
270 L01DB rts
271 * These seem to be special key combination values; 3 per key in ASCII
272 *L01DC fcb @,shift@,nul
273 * fcb up,shifted,CTRL
274 * fcb down, shifted, CTRLed
275 * fcb left, shifted, CTRLed
276 * fcb right, shifted, CTRLed
277 * fcb spacebar, spacebar, spacebar
278 * fcb ’0,’0,$81 signal shiftlock change
279 * fcb ’1,’!,’|
280 * fcb ’2,’”,null
281 * fcb ’3,’#,’~
282 * fcb ’4,’$,null
283 * fcb ’5,’%,null
284 * fcb ’6,’&,null
285 * fcb ’7,’’,’^
286 * fcb ’8,’(,’[
287 * fcb ’9,’),’]
288 * fcb ’:,’*,null
289 * fcb ’;,’+,DEL
290 * fcb ’,,’<,’{
291 * fcb ’-,’=,’_
292 * fcb ’.,’>,’}
293 * fcb ’/,’?,’\
294 * fcb ENTER,ENTER,ENTER
295 * I think these are for ALT
296 * fcb $82,$83,$84
297 * fcb ENQ,BREAK,ESC
298 * the next I think are for the F1 and F2 keys
299 * fcb ’1,’3,’5
300 * fcb ’2,’4,’6
301 L01DC fdb $4060,$000c,$1c13,$0a1a,$1208,$1810,$0919,$1120
302 fdb $2020,$3030,$8131,$217c,$3222,$0033,$237e,$3424
303 fdb $0035,$2500,$3626,$0037,$275e,$3828,$5b39,$295d
304 fdb $3a2a,$003b,$2b7f,$2c3c,$7b2d,$3d5f,$2e3e,$7d2f
305 fdb $3f5c,$0d0d,$0d82,$8384,$0503,$1b31,$3335,$3234
306 fcb $36
307
308 Init
309 Term clrb
310 rts
311
312 FuncKeys ldu <D.CCMem
313 ldx #PIA0Base
314 clra
315 ldb #%11011111 strob column #6 PIA#1
316 stb $02,x
317 ldb ,x read PIA#1
318 bitb #%01000000 test for F1 function key
319 bne L0240
320 inca flag F1
321 L0240 ldb #%10111111 strobe column #7 PIA#1
322 stb $02,x
323 ldb ,x read PIA#1
324 bitb #%01000000 test for F2 function key
325 bne L024C
326 ora #$04 flag F2
327 L024C rts
328
329 emod
330 eom equ *
331 end
332
333