chiark / gitweb /
JPEG support and other fixes from Nick Clark
[ssr] / StraySrc / Libraries / Sapphire / s / keyString
1 ;
2 ; keyString.s
3 ;
4 ; Translating key codes to strings (MDW)
5 ;
6 ; © 1994-1998 Straylight
7 ;
8
9 ;----- Licensing note -------------------------------------------------------
10 ;
11 ; This file is part of Straylight's Sapphire library.
12 ;
13 ; Sapphire is free software; you can redistribute it and/or modify
14 ; it under the terms of the GNU General Public License as published by
15 ; the Free Software Foundation; either version 2, or (at your option)
16 ; any later version.
17 ;
18 ; Sapphire is distributed in the hope that it will be useful,
19 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 ; GNU General Public License for more details.
22 ;
23 ; You should have received a copy of the GNU General Public License
24 ; along with Sapphire.  If not, write to the Free Software Foundation,
25 ; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
27 ;----- Standard header ------------------------------------------------------
28
29                 GET     libs:header
30                 GET     libs:swis
31
32 ;----- External dependencies ------------------------------------------------
33
34                 GET     sapphire:msgs
35                 GET     sapphire:keyMap
36                 GET     sapphire:string
37
38 ;----- Constants ------------------------------------------------------------
39
40 kstr__shift     EQU     (1<<8)
41 kstr__ctrl      EQU     (1<<9)
42 kstr__keypad    EQU     (1<<10)
43 kstr__func      EQU     (1<<11)
44
45 ;----- Macros ---------------------------------------------------------------
46
47                 MACRO
48 $label          KENTRY  $char,$shift,$ctrl,$keypad,$func
49 $label          DCB     $char
50                 DCB     ($shift<<0)+($ctrl<<1)+($keypad<<2)+($func<<3)
51                 MEND
52
53 ;----- KeyString tables -----------------------------------------------------
54
55                 AREA    |Sapphire$$Code|,CODE,READONLY
56
57                 ; --- &000 - &00F ---
58
59 kstr__lower     KENTRY  ' ',    0,1,0,0
60                 KENTRY  'A',    0,1,0,0
61                 KENTRY  'B',    0,1,0,0
62                 KENTRY  'C',    0,1,0,0
63                 KENTRY  'D',    0,1,0,0
64                 KENTRY  'E',    0,1,0,0
65                 KENTRY  'F',    0,1,0,0
66                 KENTRY  'G',    0,1,0,0
67                 KENTRY  'H',    0,1,0,0
68                 KENTRY  'I',    0,1,0,0
69                 KENTRY  'J',    0,1,0,0
70                 KENTRY  'K',    0,1,0,0
71                 KENTRY  'L',    0,1,0,0
72                 KENTRY  'M',    0,1,0,0
73                 KENTRY  'N',    0,1,0,0
74                 KENTRY  'O',    0,1,0,0
75
76                 ; --- &010 - &01F ---
77
78                 KENTRY  'P',    0,1,0,0
79                 KENTRY  'Q',    0,1,0,0
80                 KENTRY  'R',    0,1,0,0
81                 KENTRY  'S',    0,1,0,0
82                 KENTRY  'T',    0,1,0,0
83                 KENTRY  'U',    0,1,0,0
84                 KENTRY  'V',    0,1,0,0
85                 KENTRY  'W',    0,1,0,0
86                 KENTRY  'X',    0,1,0,0
87                 KENTRY  'Y',    0,1,0,0
88                 KENTRY  'Z',    0,1,0,0
89                 KENTRY  &01B,   0,0,0,0
90                 KENTRY  &01C,   0,0,0,0
91                 KENTRY  &01D,   0,0,0,0
92                 KENTRY  &01E,   0,0,0,0
93                 KENTRY  &07F,   0,1,0,0
94
95                 ; --- &100 - &10F ---
96
97 kstr__upper     KENTRY  ' ',    1,1,0,0
98                 KENTRY  'A',    1,1,0,0
99                 KENTRY  'B',    1,1,0,0
100                 KENTRY  'C',    1,1,0,0
101                 KENTRY  'D',    1,1,0,0
102                 KENTRY  'E',    1,1,0,0
103                 KENTRY  'F',    1,1,0,0
104                 KENTRY  'G',    1,1,0,0
105                 KENTRY  'H',    1,1,0,0
106                 KENTRY  'I',    1,1,0,0
107                 KENTRY  'J',    1,1,0,0
108                 KENTRY  'K',    1,1,0,0
109                 KENTRY  'L',    1,1,0,0
110                 KENTRY  'M',    1,1,0,0
111                 KENTRY  'N',    1,1,0,0
112                 KENTRY  'O',    1,1,0,0
113
114                 ; --- &110 - &11F ---
115
116                 KENTRY  'P',    1,1,0,0
117                 KENTRY  'Q',    1,1,0,0
118                 KENTRY  'R',    1,1,0,0
119                 KENTRY  'S',    1,1,0,0
120                 KENTRY  'T',    1,1,0,0
121                 KENTRY  'U',    1,1,0,0
122                 KENTRY  'V',    1,1,0,0
123                 KENTRY  'W',    1,1,0,0
124                 KENTRY  'X',    1,1,0,0
125                 KENTRY  'Y',    1,1,0,0
126                 KENTRY  'Z',    1,1,0,0
127                 KENTRY  &01B,   1,0,0,0
128                 KENTRY  &01C,   1,0,0,0
129                 KENTRY  &01D,   1,0,0,0
130                 KENTRY  &01E,   1,0,0,0
131                 KENTRY  &07F,   1,1,0,0
132
133                 ; --- &120 - &12F ---
134
135                 KENTRY  ' ',    1,0,0,0
136                 KENTRY  '/',    0,1,1,0
137                 KENTRY  '*',    0,1,1,0
138                 KENTRY  '#',    0,1,1,0
139                 KENTRY  '-',    0,1,1,0
140                 KENTRY  '+',    0,1,1,0
141                 KENTRY  &01D,   0,1,1,0
142                 KENTRY  '.',    0,1,1,0
143                 KENTRY  0,      0,0,0,0
144                 KENTRY  0,      0,0,0,0
145                 KENTRY  0,      0,0,0,0
146                 KENTRY  '[',    0,1,0,0
147                 KENTRY  '\',    0,1,0,0
148                 KENTRY  ']',    0,1,0,0
149                 KENTRY  0,      0,0,0,0
150                 KENTRY  '-',    0,1,0,0
151
152                 ; --- &130 - &13F ---
153
154                 KENTRY  '0',    0,1,0,0
155                 KENTRY  '1',    0,1,0,0
156                 KENTRY  '2',    0,1,0,0
157                 KENTRY  '3',    0,1,0,0
158                 KENTRY  '4',    0,1,0,0
159                 KENTRY  '5',    0,1,0,0
160                 KENTRY  '6',    0,1,0,0
161                 KENTRY  '7',    0,1,0,0
162                 KENTRY  '8',    0,1,0,0
163                 KENTRY  '9',    0,1,0,0
164                 KENTRY  0,      0,0,0,0
165                 KENTRY  &01B,   0,1,0,0
166                 KENTRY  &01C,   0,1,0,0
167                 KENTRY  &01D,   0,1,0,0
168                 KENTRY  &01E,   0,1,0,0
169                 KENTRY  0,      0,0,0,0
170
171                 ; --- &140 - &14F ---
172
173                 KENTRY  0,      0,0,0,0
174                 KENTRY  '/',    1,1,1,0
175                 KENTRY  '*',    1,1,1,0
176                 KENTRY  '#',    1,1,1,0
177                 KENTRY  '-',    1,1,1,0
178                 KENTRY  '+',    1,1,1,0
179                 KENTRY  &01D,   1,1,1,0
180                 KENTRY  '.',    1,1,1,0
181                 KENTRY  0,      0,0,0,0
182                 KENTRY  0,      0,0,0,0
183                 KENTRY  0,      0,0,0,0
184                 KENTRY  '[',    1,1,0,0
185                 KENTRY  '\',    1,1,0,0
186                 KENTRY  ']',    1,1,0,0
187                 KENTRY  0,      0,0,0,0
188                 KENTRY  '-',    1,1,0,0
189
190                 ; --- &150 - &15F ---
191
192                 KENTRY  '0',    1,1,0,0
193                 KENTRY  '1',    1,1,0,0
194                 KENTRY  '2',    1,1,0,0
195                 KENTRY  '3',    1,1,0,0
196                 KENTRY  '4',    1,1,0,0
197                 KENTRY  '5',    1,1,0,0
198                 KENTRY  '6',    1,1,0,0
199                 KENTRY  '7',    1,1,0,0
200                 KENTRY  '8',    1,1,0,0
201                 KENTRY  '9',    1,1,0,0
202                 KENTRY  0,      0,0,0,0
203                 KENTRY  &01B,   1,1,0,0
204                 KENTRY  &01C,   1,1,0,0
205                 KENTRY  &01D,   1,1,0,0
206                 KENTRY  &01E,   1,1,0,0
207                 KENTRY  0,      0,0,0,0
208
209                 ; --- &160 - &16F ---
210
211                 KENTRY  0,      0,0,0,0
212                 KENTRY  '/',    0,0,1,0
213                 KENTRY  '*',    0,0,1,0
214                 KENTRY  '#',    0,0,1,0
215                 KENTRY  '-',    0,0,1,0
216                 KENTRY  '+',    0,0,1,0
217                 KENTRY  &01D,   0,0,1,0
218                 KENTRY  '.',    0,0,1,0
219                 KENTRY  0,      0,0,0,0
220                 KENTRY  0,      0,0,0,0
221                 KENTRY  0,      0,0,0,0
222                 KENTRY  0,      0,0,0,0
223                 KENTRY  0,      0,0,0,0
224                 KENTRY  0,      0,0,0,0
225                 KENTRY  0,      0,0,0,0
226                 KENTRY  0,      0,0,0,0
227
228                 ; --- &170 - &17F ---
229
230                 KENTRY  0,      0,0,0,0
231                 KENTRY  '/',    1,0,1,0
232                 KENTRY  '*',    1,0,1,0
233                 KENTRY  '#',    1,0,1,0
234                 KENTRY  '-',    1,0,1,0
235                 KENTRY  '+',    1,0,1,0
236                 KENTRY  &01D,   1,0,1,0
237                 KENTRY  '.',    1,0,1,0
238                 KENTRY  0,      0,0,0,0
239                 KENTRY  0,      0,0,0,0
240                 KENTRY  0,      0,0,0,0
241                 KENTRY  0,      0,0,0,0
242                 KENTRY  0,      0,0,0,0
243                 KENTRY  0,      0,0,0,0
244                 KENTRY  0,      0,0,0,0
245                 KENTRY  &07F,   1,0,0,0
246
247                 ; --- &180 - &18F ---
248
249                 KENTRY  0,      0,0,0,1
250                 KENTRY  1,      0,0,0,1
251                 KENTRY  2,      0,0,0,1
252                 KENTRY  3,      0,0,0,1
253                 KENTRY  4,      0,0,0,1
254                 KENTRY  5,      0,0,0,1
255                 KENTRY  6,      0,0,0,1
256                 KENTRY  7,      0,0,0,1
257                 KENTRY  8,      0,0,0,1
258                 KENTRY  9,      0,0,0,1
259                 KENTRY  13,     0,0,0,1
260                 KENTRY  14,     0,0,0,1
261                 KENTRY  15,     0,0,0,1
262                 KENTRY  16,     0,0,0,1
263                 KENTRY  17,     0,0,0,1
264                 KENTRY  18,     0,0,0,1
265
266                 ; --- &190 - &19F ---
267
268                 KENTRY  0,      1,0,0,1
269                 KENTRY  1,      1,0,0,1
270                 KENTRY  2,      1,0,0,1
271                 KENTRY  3,      1,0,0,1
272                 KENTRY  4,      1,0,0,1
273                 KENTRY  5,      1,0,0,1
274                 KENTRY  6,      1,0,0,1
275                 KENTRY  7,      1,0,0,1
276                 KENTRY  8,      1,0,0,1
277                 KENTRY  9,      1,0,0,1
278                 KENTRY  13,     1,0,0,1
279                 KENTRY  14,     1,0,0,1
280                 KENTRY  15,     1,0,0,1
281                 KENTRY  16,     1,0,0,1
282                 KENTRY  17,     1,0,0,1
283                 KENTRY  18,     1,0,0,1
284
285                 ; --- &1A0 - &1AF ---
286
287                 KENTRY  0,      0,1,0,1
288                 KENTRY  1,      0,1,0,1
289                 KENTRY  2,      0,1,0,1
290                 KENTRY  3,      0,1,0,1
291                 KENTRY  4,      0,1,0,1
292                 KENTRY  5,      0,1,0,1
293                 KENTRY  6,      0,1,0,1
294                 KENTRY  7,      0,1,0,1
295                 KENTRY  8,      0,1,0,1
296                 KENTRY  9,      0,1,0,1
297                 KENTRY  13,     0,1,0,1
298                 KENTRY  14,     0,1,0,1
299                 KENTRY  15,     0,1,0,1
300                 KENTRY  16,     0,1,0,1
301                 KENTRY  17,     0,1,0,1
302                 KENTRY  18,     0,1,0,1
303
304                 ; --- &1B0 - &1BF ---
305
306                 KENTRY  0,      1,1,0,1
307                 KENTRY  1,      1,1,0,1
308                 KENTRY  2,      1,1,0,1
309                 KENTRY  3,      1,1,0,1
310                 KENTRY  4,      1,1,0,1
311                 KENTRY  5,      1,1,0,1
312                 KENTRY  6,      1,1,0,1
313                 KENTRY  7,      1,1,0,1
314                 KENTRY  8,      1,1,0,1
315                 KENTRY  9,      1,1,0,1
316                 KENTRY  13,     1,1,0,1
317                 KENTRY  14,     1,1,0,1
318                 KENTRY  15,     1,1,0,1
319                 KENTRY  16,     1,1,0,1
320                 KENTRY  17,     1,1,0,1
321                 KENTRY  18,     1,1,0,1
322
323                 ; --- &1C0 - &1CF ---
324
325                 KENTRY  '0',    0,0,1,0
326                 KENTRY  '1',    0,0,1,0
327                 KENTRY  '2',    0,0,1,0
328                 KENTRY  '3',    0,0,1,0
329                 KENTRY  '4',    0,0,1,0
330                 KENTRY  '5',    0,0,1,0
331                 KENTRY  '6',    0,0,1,0
332                 KENTRY  '7',    0,0,1,0
333                 KENTRY  '8',    0,0,1,0
334                 KENTRY  '9',    0,0,1,0
335                 KENTRY  10,     0,0,0,1
336                 KENTRY  11,     0,0,0,1
337                 KENTRY  12,     0,0,0,1
338                 KENTRY  19,     0,0,0,1
339                 KENTRY  20,     0,0,0,1
340                 KENTRY  21,     0,0,0,1
341
342                 ; --- &1D0 - &1DF ---
343
344                 KENTRY  '0',    1,0,1,0
345                 KENTRY  '1',    1,0,1,0
346                 KENTRY  '2',    1,0,1,0
347                 KENTRY  '3',    1,0,1,0
348                 KENTRY  '4',    1,0,1,0
349                 KENTRY  '5',    1,0,1,0
350                 KENTRY  '6',    1,0,1,0
351                 KENTRY  '7',    1,0,1,0
352                 KENTRY  '8',    1,0,1,0
353                 KENTRY  '9',    1,0,1,0
354                 KENTRY  10,     1,0,0,1
355                 KENTRY  11,     1,0,0,1
356                 KENTRY  12,     1,0,0,1
357                 KENTRY  19,     1,0,0,1
358                 KENTRY  20,     1,0,0,1
359                 KENTRY  21,     1,0,0,1
360
361                 ; --- &1E0 - &1EF ---
362
363                 KENTRY  '0',    0,1,1,0
364                 KENTRY  '1',    0,1,1,0
365                 KENTRY  '2',    0,1,1,0
366                 KENTRY  '3',    0,1,1,0
367                 KENTRY  '4',    0,1,1,0
368                 KENTRY  '5',    0,1,1,0
369                 KENTRY  '6',    0,1,1,0
370                 KENTRY  '7',    0,1,1,0
371                 KENTRY  '8',    0,1,1,0
372                 KENTRY  '9',    0,1,1,0
373                 KENTRY  10,     0,1,0,1
374                 KENTRY  11,     0,1,0,1
375                 KENTRY  12,     0,1,0,1
376                 KENTRY  19,     0,1,0,1
377                 KENTRY  20,     0,1,0,1
378                 KENTRY  21,     0,1,0,1
379
380                 ; --- &1F0 - &1FF ---
381
382                 KENTRY  '0',    1,1,1,0
383                 KENTRY  '1',    1,1,1,0
384                 KENTRY  '2',    1,1,1,0
385                 KENTRY  '3',    1,1,1,0
386                 KENTRY  '4',    1,1,1,0
387                 KENTRY  '5',    1,1,1,0
388                 KENTRY  '6',    1,1,1,0
389                 KENTRY  '7',    1,1,1,0
390                 KENTRY  '8',    1,1,1,0
391                 KENTRY  '9',    1,1,1,0
392                 KENTRY  10,     1,1,0,1
393                 KENTRY  11,     1,1,0,1
394                 KENTRY  12,     1,1,0,1
395                 KENTRY  19,     1,1,0,1
396                 KENTRY  20,     1,1,0,1
397                 KENTRY  21,     1,1,0,1
398
399 ;----- Main code ------------------------------------------------------------
400
401 ; --- keyString ---
402 ;
403 ; On entry:     R0 == key number, from Straylight extended keymap
404 ;               R1 == 0 => return full shortcuts (for e.g. writable icons)
405 ;                     1 => return abbreviated shortcuts (for e.g. menus)
406 ;
407 ; On exit:      CS if key number was recognised, and
408 ;                 R0 == pointer to short cut string
409 ;               else CC and
410 ;                 R0 corrupted
411 ;
412 ; Use:          Translates a key number into a string suitable for
413 ;               displaying to a user, and returns a pointer to the
414 ;               translated string.
415
416                 EXPORT  keyString
417 keyString       ROUT
418
419                 BIC     R14,R14,#C_flag
420                 STMFD   R13!,{R1-R5,R14}        ;Save some registers
421
422                 ; --- Find the correct entry in the tables ---
423
424                 CMP     R0,#' '                 ;Is it a control key?
425                 ADRLT   R2,kstr__lower          ;Yes -- point to low table
426                 ADDLT   R2,R2,R0,LSL #1         ;And find the entry
427                 BLT     %10keyString            ;Skip ahead after this
428
429                 CMP     R0,#&FF                 ;Is it in the upper half?
430                 ADRGT   R2,kstr__upper          ;Yes -- point to high table
431                 BICGT   R0,R0,#&100             ;Chop off the top bit
432                 ADDGT   R2,R2,R0,LSL #1         ;And find the entry again
433                 BGT     %10keyString            ;Skip ahead after this
434
435                 CMP     R0,#&7F                 ;Is it a delete?
436                 ADREQ   R2,kstr__delete         ;Yes -- point to delete entry
437                 LDMNEFD R13!,{R1-R5,PC}^        ;No -- return to caller
438
439                 ; --- Load the entry from the table ---
440
441 10keyString     AND     R14,R2,#3               ;Get bottom two bits of R2
442                 LDR     R2,[R2,-R14]            ;Load the word properly
443                 MOV     R14,R14,LSL #3          ;Get the correct shift value
444                 MOV     R2,R2,LSR R14           ;And shift R2 nicely
445
446                 TST     R2,#&FF                 ;Make sure bottom byte non-0
447                 TSTEQ   R2,#kstr__func          ;Or is it a function key?
448                 LDMEQFD R13!,{R1-R5,PC}^        ;Return to caller if neither
449
450                 ; --- Find the base key name ---
451
452                 TST     R2,#kstr__func          ;Is it really a function key?
453                 BEQ     %20keyString            ;No -- skip this bit
454                 AND     R4,R2,#&ff              ;Get the key byte out
455                 CMP     R4,#12                  ;Is it F12?
456                 LDMEQFD R13!,{R1-R5,PC}^        ;Yes -- always ignore F12
457
458                 ADR     R3,kstr__fkeys          ;Point to key names table
459                 LDR     R0,[R3,R4,LSL #2]       ;Get the correct entry out
460                 CMP     R0,#0                   ;Is it a null pointer?
461                 BLNE    msgs_lookup             ;No -- lookup message
462                 BNE     %30keyString            ;And skip ahead nicely
463
464                 ADR     R0,kstr__fmsg           ;Point to `kstrF:F%i2'
465                 BL      msgs_lookup             ;Lookup the message
466                 ADD     R1,R11,#50              ;Point to scratchpad
467                 BL      str_subst               ;And fill the string in
468                 B       %30keyString            ;Now do the rest of it all
469
470 kstr__delete    KENTRY  &7F,    0,0,0,0         ;Dummy entry for delete
471
472 kstr__fkeys     DCD     kstr__print
473                 DCD     0,0,0,0,0,0
474                 DCD     0,0,0,0,0,0
475                 DCD     kstr__tab
476                 DCD     kstr__copy
477                 DCD     kstr__left
478                 DCD     kstr__right
479                 DCD     kstr__down
480                 DCD     kstr__up
481                 DCD     kstr__insert
482                 DCD     kstr__pageDown
483                 DCD     kstr__pageUp
484
485 kstr__fmsg      DCB     "kstrF",0
486 kstr__print     DCB     "kstrPRT",0
487 kstr__tab       DCB     "kstrTAB",0
488 kstr__copy      DCB     "kstrCOPY",0
489 kstr__left      DCB     "kstrLEFT",0
490 kstr__right     DCB     "kstrRIGHT",0
491 kstr__down      DCB     "kstrDOWN",0
492 kstr__up        DCB     "kstrUP",0
493 kstr__insert    DCB     "kstrINS",0
494 kstr__pageDown  DCB     "kstrPDN",0
495 kstr__pageUp    DCB     "kstrPUP",0
496
497                 ; --- Handle strange keys in lower map ---
498
499 20keyString     AND     R4,R2,#&ff              ;Get the key byte out
500                 CMP     R4,#key_Return          ;Is it the return code?
501                 BNE     %21keyString            ;No -- skip
502                 TST     R2,#kstr__keypad        ;Is it on the keypad?
503                 BNE     %22keyString            ;Yes -- handle it
504
505 21keyString     CMP     R4,#key_Delete          ;Is it a delete key?
506                 BEQ     %23keyString            ;Yes -- handle that too
507                 CMP     R4,#' '                 ;Is it a space?
508                 BEQ     %24keyString            ;Yes -- handle that too
509                 SUB     R14,R4,#&1B             ;Is it a strange one?
510                 CMP     R14,#4                  ;Is it one of the four?
511                 BLO     %25keyString            ;Yes -- handle that
512
513                 ADD     R0,R11,#50              ;Point to spare bit of buffer
514                 STRB    R4,[R0,#0]              ;Store character in buffer
515                 MOV     R3,#0                   ;Terminate the string
516                 STRB    R3,[R0,#1]              ;Store that in buffer too
517                 B       %30keyString            ;Skip to final processing
518
519                 ; --- Handle various special cases ---
520
521 22keyString     BIC     R2,R2,#kstr__keypad     ;Yes -- remove keypad flag
522                 ADR     R0,kstr__enter          ;Yes -- point to string
523                 BL      msgs_lookup             ;Translate it as usual
524                 B       %30                     ;We've got a base string
525
526 kstr__enter     DCB     "kstrENTER",0
527
528 23keyString     ADR     R0,kstr__delmsg         ;Point to the string
529                 BL      msgs_lookup             ;Translate it as usual
530                 B       %30                     ;We've got a base string
531
532 kstr__delmsg    DCB     "kstrDEL",0
533
534 24keyString     ADR     R0,kstr__space          ;Point to the string
535                 BL      msgs_lookup             ;Translate it as usual
536                 B       %30                     ;We've got a base string
537
538 kstr__space     DCB     "kstrSPC",0
539
540 25keyString     ADR     R0,kstr__lowtbl         ;Point to the table
541                 LDR     R0,[R0,R14,LSL #2]      ;Load the correct entry
542                 BL      msgs_lookup             ;Translate it as usual
543                 B       %30                     ;We've got a base string
544
545 kstr__lowtbl    DCD     kstr__escape
546                 DCD     kstr__backspc
547                 DCD     kstr__return
548                 DCD     kstr__home
549
550 kstr__escape    DCB     "kstrESC",0
551 kstr__backspc   DCB     "kstrBSP",0
552 kstr__return    DCB     "kstrRET",0
553 kstr__home      DCB     "kstrHOME",0
554
555                 ; --- Finally, handle modifier strings ---
556
557 30keyString     MOV     R5,R0                   ;Keep pointer to base key
558                 LDR     R4,[R13,#0]             ;Get shortcut style wanted
559                 MOV     R0,R11                  ;Point to the scratchpad
560
561                 TST     R2,#kstr__shift         ;Is shift held down?
562                 MOVNE   R1,#'\8b'                 ;Yes -- short character
563                 ADRNE   R3,kstr__shmod          ;And long message
564                 BLNE    %80keyString            ;Sort everything out
565
566                 TST     R2,#kstr__ctrl          ;Is shift held down?
567                 MOVNE   R1,#'^'                 ;Yes -- short character
568                 ADRNE   R3,kstr__ctmod          ;And long message
569                 BLNE    %80keyString            ;Sort everything out
570
571                 TST     R2,#kstr__keypad        ;Is shift held down?
572                 MOVNE   R1,#'k'                 ;Yes -- short character
573                 ADRNE   R3,kstr__kpmod          ;And long message
574                 BLNE    %80keyString            ;Sort everything out
575
576                 MOV     R1,R5                   ;Point to base string
577                 BL      str_cpy                 ;Copy the last string in
578                 MOV     R0,R11                  ;Point to string in buffer
579                 LDMFD   R13!,{R1-R5,R14}        ;Load the registers
580                 ORRS    PC,R14,#C_flag          ;We handled it (eventually)
581
582 kstr__shmod     DCB     "kstrSH",0
583 kstr__ctmod     DCB     "kstrCTL",0
584 kstr__kpmod     DCB     "kstrKPD",0
585
586                 ; --- Work out what a modifier should look like ---
587
588 80keyString     CMP     R4,#0                   ;Do we want short mod chars?
589                 STRNEB  R1,[R0],#1              ;Yes -- store char nicely
590                 MOVNES  PC,R14                  ;And return to caller
591                 STMFD   R13!,{R0,R14}           ;Save some registers
592                 MOV     R0,R3                   ;Point to message tag
593                 BL      msgs_lookup             ;Translate the string
594                 MOV     R1,R0                   ;Keep pointer to message
595                 LDMFD   R13!,{R0}               ;Restore a register
596                 BL      str_cpy                 ;Attach string to end
597                 LDMFD   R13!,{PC}^              ;Return to caller
598
599                 LTORG
600
601 ;----- That's all, folks ----------------------------------------------------
602
603                 END