Initial revision
[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