Home » Archimedes archive » Archimedes World » AW Readers Services Special FebMar 92.adf » !ArcWorld/Goodies/TaskKill/TaskKiller

!ArcWorld/Goodies/TaskKill/TaskKiller

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Archimedes World » AW Readers Services Special FebMar 92.adf
Filename: !ArcWorld/Goodies/TaskKill/TaskKiller
Read OK:
File size: 198A bytes
Load address: FFFFFB42
Exec address: 86D78294
File contents
   10REM > TaskKiller
   70REM === Manifest definitions ===
   90R0=0:r0=0
  100R1=1:r1=1
  110R2=2:r2=2
  120R3=3:r3=3
  130R4=4:r4=4
  140R5=5:r5=5
  150R6=6:r6=6
  160R7=7:r7=7
  170R8=8:r8=8
  180R9=9
  190R10=10
  200R11=11
  210R12=12:wp=12
  220R13=13:sp=13
  230R14=14:lr=14
  240R15=15:PC=R15:pc=15:psr=15
  381ModHandReason_Claim = 6
  382Service_Reset = &27
  383EventV = &10
  384Event_Keyboard = 11
  402SVC_mode=1
  410cr%=13
  440keytodump   = &5E    :REM left-ALT
  470ctrlkey     = &3B    :REM left-CTRL
  550VIDC =&03400000
  570REM Some Workspace offsets
  590LastCtrlEvent   = 0
  600LastDumpEvent   = 4
  610interlock       = 8
  630Test_WorkspaceSize= &100
  660REM ===
  680DIM code% 100*1024
  700PROCDOIT
  720END
  740DEFPROCDOIT
  760Module_Title$="TaskKiller"
  770Module_Help$ =Module_Title$+CHR$9+"0.10 ("+MID$(TIME$,5,LEN("04 Jul 1989"))+")"
  780saveas$="$.KillModule"
  830REM ===
  850PRINT"Assembling "+saveas$
  870 REM PROCworkspace
  890pass%=0
  900FORopt%=0TO2STEP2:REM :opt%=opt% OR 1
  910P%=code%
  920pass%+=1
  930PRINT"Pass ";pass%
  970PROClibrary
 1010NEXT
 1030OSCLI("SAVE "+saveas$+" "+STR$~code%+" "+STR$~P%)
 1040OSCLI("SETTYPE "+saveas$+" FFA")
 1060ENDPROC
 1080DEFPROClibrary
 1090[OPTopt%
 1110.Module_BaseAddr
 1140  EQUD 0
 1150  EQUD Test_Init    -Module_BaseAddr
 1160  EQUD Test_Die     -Module_BaseAddr
 1170  EQUD Test_Service -Module_BaseAddr
 1180  EQUD Test_Title   -Module_BaseAddr
 1190  EQUD Test_HelpStr -Module_BaseAddr
 1200  EQUD 0
 1220.Test_Title
 1240  EQUS   Module_Title$:EQUB 0
 1260.Test_HelpStr
 1280  EQUS   Module_Help$:EQUB 0
 1320  ALIGN
 1360; r0-r6 may be corrupted
 1380.Test_Init
 1390  STMFD R13!,{R14}
 1410  LDR     r2, [r12]               ; Coming from hard reset ?
 1420  TEQ     r2, #0
 1430  BNE     ll001
 1450  MOV     r0, #ModHandReason_Claim
 1460  MOV     r3, #Test_WorkspaceSize
 1470  SWI     "XOS_Module"
 1480  ; 'No room in RMA' is acceptable message
 1490  LDMVSFD R13!,{PC}
 1500  STR     r2, [r12]
 1580.ll001
 1590  MOV     wp, r2                  ; Dereference on all resets !
 1610  BL      Test_Service_Reset
 1620  LDMFD R13!,{PC}
 1650.Test_Service
 1670  TEQ     r1, #Service_Reset
 1680  MOVNE   pc, lr
 1700  LDR     wp, [r12]               ; Dereference on service
 1720.Test_Service_Reset
 1730  STMFD R13!,{r0-r2,R14}
 1750  MOV     r14, #0
 1760  STR     r14, [R12,#LastCtrlEvent]
 1770  STR     r14, [R12,#LastDumpEvent]
 1790  MOV     r0, #EventV
 1800  ADR     r1, EventCode
 1810  BL      ClaimVector
 1830  MOV     r0, #14                 ; Enable event
 1840  MOV     r1, #Event_Keyboard
 1850  SWI     "XOS_Byte"
 1870  MOV     r0, #0
 1880  STRB    r0, [R12,#interlock ]
 1890  LDMFD R13!,{r0-r2,PC}
 1910; Let Module handler take care of removing our workspace on fatal death
 1920; Or shunting it around on Tidy - none of it is absolute
 1940.Test_Die
 1950  STMFD R13!,{r0-r2,R14}
 1970  MOV     r0, #13                 ; Disable event
 1980  MOV     r1, #Event_Keyboard
 1990  SWI     "XOS_Byte"
 2010  LDR     wp, [r12]               ; Dereference on death
 2020  MOV     r0, #EventV
 2030  ADR     r1, EventCode
 2040  BL      DelinkVector
 2050  LDMFD R13!,{r0-r2,PC}
 2080.ClaimVector
 2090  STMFD R13!,{r2,R14}
 2110  BL      DelinkVector
 2120  MOV     r2, wp        ; Use wp itself - saves dereferencing
 2130  SWI     "XOS_Claim"     ; on actual code entries
 2140  LDMFD R13!,{r2,PC}^
 2160.DelinkVector
 2170  STMFD R13!,{r0-r2,R14}
 2180.ll002
 2190  LDMIA R13,{R0,R1}
 2200  MOV     r2, wp
 2210  SWI     "XOS_Release"
 2220  BVC     ll002
 2230  CMP     PC,#0
 2240  LDMFD R13!,{r0-r2,PC}
 2260; Entered in some mode or other, probably IRQ
 2280.EventCode
 2300  CMP     r0, #Event_Keyboard
 2310  MOVNE   pc, lr                  ; Pass it on if wrong event
 2330  ; In    r1 = key down = 1, key up = 0
 2340  ;       r2 = key number
 2370  STMFD R13!,{r0-r1,r4-r5,R14}
 2410  MOV     r14, #ctrlkey
 2420  CMP     r2, r14
 2430  STREQ   r1,[R12,#LastCtrlEvent]  ; 0 -> key is now up
 2440  BEQ     ll003
 2480  MOV     r14, #keytodump
 2490  CMP     r2, r14
 2500  STREQ   r1, [R12,#LastDumpEvent]    ; 0 -> key is now up
 2510; Pass it on if not one of our keys
 2520  LDMNEFD R13!,{r0-r1,r4-r5,PC}
 2540; Abort on first keystroke if ctrl is down too
 2560.ll003
 2570  LDR R14,[R12,#LastCtrlEvent] ; Is CTRL key down ?
 2580  TEQ     r14, #0
 2590  LDMEQFD R13!,{r0-r1,r4-r5,PC}   ; Ignore
 2600  LDR     r14, [R12,#LastDumpEvent  ]    ; Is ALT key down as well ?
 2610  TEQ     r14, #0
 2620  LDMEQFD R13!,{r0-r1,r4-r5,PC}   ; Ignore
 2640; Into SVC mode so we can call SWI's
 2660  MOV     r5, psr                 ; Remember mode + flags
 2670  BIC     r4, r5, #SVC_mode
 2680  TEQP    r4, #SVC_mode           ; Force SVC mode
 2690  MOV R0,R0
 2700  STMFD R13!,{R14} \\ lr_svc
 2720  MOV     r14, #VIDC
 2730; Set border cyan
 2731  MOV     r4,#&40000000
 2732  ORR     r4,r4,#&CC0
 2740  STR     r4, [r14]
 2760; Set the CallBackHandler up NOW !!!
 2780  LDRB    r0, [R12,#interlock   ]
 2790  TEQ     r0, #0
 2800  BNE     ll004                   ; [already requested]
 2820  ADR     r0, CallBackCode
 2830  MOV     r1, wp
 2840  SWI     "XOS_AddCallBack"
 2850  MOVVC   r0, #1
 2860  STRVCB  r0, [R12,#interlock  ]
 2870 
 2880.ll004
 2890  LDMFD R13!,{R14} \\ lr_svc
 2900  TEQP    r5, #0                  ; Back to caller's mode
 2910  MOV R0,R0
 2920  LDMFD R13!,{r0-r1,r4-r5,PC}   ; Pass it on
 2940; In    r0-r6 may be corrupted
 2950;       wp valid
 2960;       SVC mode, IRQ enabled
 2980.CallBackCode
 2990  STMFD R13!, {R14}
 3010  MOV     r14, #VIDC
 3020  MOV     r0, #&40000000          ; Set border black
 3030  STR     r0, [r14]
 3050  MOV     r0, #0
 3060  STRB    r0, [R12,#interlock ]
 3070 
 3080  TEQP PC,#0  ; Force User Mode now
 3090  MOV R0,R0   ; NOP instruction to allow CPU time to sort itself out
 3110  ADR     r0 , errblock%
 3120  SWI "OS_GenerateError"
 3200  LDMFD R13!,{PC}
 3230.errblock%
 3240  EQUD -1   ; Try 0 instead here
 3260  EQUS "Aborted"
 3270  EQUB 0
 3280  ALIGN
 3310.tracename%
 3320  EQUS "HostVdu:"
 3330  EQUB 0
 3340  ALIGN
 3370]
 3380ENDPROC
 3940DEFFNADDR(reg,dest)
 3950IF (dest - P% - 8) >=0 THEN
 3960  IF (dest - P% - 8) < &10000 THEN
 3970    [OPTopt%
 3980    ADD reg,PC,#(dest - P% - 8 ) AND &FF
 3990    ADD reg,reg,#(dest - P% - 4) AND &FF00
 4000    ]
 4010  ELSE
 4020  IF (dest - P% - 8) < &1000000 THEN
 4030    [OPTopt%
 4040    ADD reg,PC,#(dest - P% - 8 ) AND &FF
 4050    ADD reg,reg,#(dest - P% - 4) AND &FF00
 4060    ADD reg,reg,#(dest - P% - 0) AND &FF0000
 4070    ]
 4080  ELSE
 4090    ERROR 0,"ADR out of range"
 4100  ENDIF
 4110  ENDIF
 4120ELSE
 4130  IF (0-(dest - P% - 8)) < &10000 THEN
 4140    [OPTopt%
 4150    SUB reg,PC,#(0-(dest - P% - 8 )) AND &FF
 4160    SUB reg,reg,#(0-(dest - P% - 4)) AND &FF00
 4170    ]
 4180  ELSE
 4190  IF (0-(dest - P% - 8)) < &1000000 THEN
 4200    [OPTopt%
 4210    SUB reg,PC,#(0-(dest - P% - 8 )) AND &FF
 4220    SUB reg,reg,#(0-(dest - P% - 4)) AND &FF00
 4230    SUB reg,reg,#(0-(dest - P% - 0)) AND &FF0000
 4240    ]
 4250  ELSE
 4260    ERROR 0,"ADR out of range"
 4270  ENDIF
 4280  ENDIF
 4290ENDIF
 4300=""
 4320END
� > TaskKiller
F"� === Manifest definitions ===
Z
R0=0:r0=0
d
R1=1:r1=1
n
R2=2:r2=2
x
R3=3:r3=3
�
R4=4:r4=4
�
R5=5:r5=5
�
R6=6:r6=6
�
R7=7:r7=7
�
R8=8:r8=8
�R9=9
�
R10=10
�
R11=11
�R12=12:wp=12
�R13=13:sp=13
�R14=14:lr=14
�R15=15:PC=R15:pc=15:psr=15
}ModHandReason_Claim = 6
~Service_Reset = &27
EventV = &10
�Event_Keyboard = 11
�SVC_mode=1
�
cr%=13
�$keytodump   = &5E    :� left-ALT
�%ctrlkey     = &3B    :� left-CTRL
&VIDC =&03400000
:� Some Workspace offsets
NLastCtrlEvent   = 0
XLastDumpEvent   = 4
binterlock       = 8
vTest_WorkspaceSize= &100
�	� ===
�� code% 100*1024
�	�DOIT
��
�
��DOIT
�Module_Title$="TaskKiller"
GModule_Help$ =Module_Title$+�9+"0.10 ("+��$,5,�("04 Jul 1989"))+")"
saveas$="$.KillModule"
>	� ===
R�"Assembling "+saveas$
f � PROCworkspace
zpass%=0
�!�opt%=0�2�2:� :opt%=opt% OR 1
�P%=code%
�pass%+=1
��"Pass ";pass%
��library
��
+�("SAVE "+saveas$+" "+�~code%+" "+�~P%)
 �("SETTYPE "+saveas$+" FFA")
$�
8
��library
B[OPTopt%
V.Module_BaseAddr
t  EQUD 0
~(  EQUD Test_Init    -Module_BaseAddr
�(  EQUD Test_Die     -Module_BaseAddr
�(  EQUD Test_Service -Module_BaseAddr
�(  EQUD Test_Title   -Module_BaseAddr
�(  EQUD Test_HelpStr -Module_BaseAddr
�  EQUD 0
�.Test_Title
�!  EQUS   Module_Title$:EQUB 0
�.Test_HelpStr
   EQUS   Module_Help$:EQUB 0
(  ALIGN
P; r0-r6 may be corrupted
d.Test_Init
n  STMFD R13!,{R14}
�@  LDR     r2, [r12]               ; Coming from hard reset ?
�  TEQ     r2, #0
�  BNE     ll001
�&  MOV     r0, #ModHandReason_Claim
�%  MOV     r3, #Test_WorkspaceSize
�  SWI     "XOS_Module"
�.  ; 'No room in RMA' is acceptable message
�  LDMVSFD R13!,{PC}
�  STR     r2, [r12]
,
.ll001
6C  MOV     wp, r2                  ; Dereference on all resets !
J   BL      Test_Service_Reset
T  LDMFD R13!,{PC}
r.Test_Service
�   TEQ     r1, #Service_Reset
�  MOVNE   pc, lr
�>  LDR     wp, [r12]               ; Dereference on service
�.Test_Service_Reset
�  STMFD R13!,{r0-r2,R14}
�  MOV     r14, #0
�'  STR     r14, [R12,#LastCtrlEvent]
�'  STR     r14, [R12,#LastDumpEvent]
�  MOV     r0, #EventV
  ADR     r1, EventCode
  BL      ClaimVector
&4  MOV     r0, #14                 ; Enable event
0!  MOV     r1, #Event_Keyboard
:  SWI     "XOS_Byte"
N  MOV     r0, #0
X#  STRB    r0, [R12,#interlock ]
b  LDMFD R13!,{r0-r2,PC}
vK; Let Module handler take care of removing our workspace on fatal death
�<; Or shunting it around on Tidy - none of it is absolute
�
.Test_Die
�  STMFD R13!,{r0-r2,R14}
�5  MOV     r0, #13                 ; Disable event
�!  MOV     r1, #Event_Keyboard
�  SWI     "XOS_Byte"
�<  LDR     wp, [r12]               ; Dereference on death
�  MOV     r0, #EventV
�  ADR     r1, EventCode
�  BL      DelinkVector
  LDMFD R13!,{r0-r2,PC}
 .ClaimVector
*  STMFD R13!,{r2,R14}
>  BL      DelinkVector
HA  MOV     r2, wp        ; Use wp itself - saves dereferencing
R6  SWI     "XOS_Claim"     ; on actual code entries
\  LDMFD R13!,{r2,PC}^
p.DelinkVector
z  STMFD R13!,{r0-r2,R14}
�
.ll002
�  LDMIA R13,{R0,R1}
�  MOV     r2, wp
�  SWI     "XOS_Release"
�  BVC     ll002
�  CMP     PC,#0
�  LDMFD R13!,{r0-r2,PC}
�1; Entered in some mode or other, probably IRQ
�.EventCode
�!  CMP     r0, #Event_Keyboard
	A  MOVNE   pc, lr                  ; Pass it on if wrong event
	+  ; In    r1 = key down = 1, key up = 0
	$  ;       r2 = key number
	B"  STMFD R13!,{r0-r1,r4-r5,R14}
	j  MOV     r14, #ctrlkey
	t  CMP     r2, r14
	~;  STREQ   r1,[R12,#LastCtrlEvent]  ; 0 -> key is now up
	�  BEQ     ll003
	�  MOV     r14, #keytodump
	�  CMP     r2, r14
	�>  STREQ   r1, [R12,#LastDumpEvent]    ; 0 -> key is now up
	�'; Pass it on if not one of our keys
	�#  LDMNEFD R13!,{r0-r1,r4-r5,PC}
	�2; Abort on first keystroke if ctrl is down too

.ll003

7  LDR R14,[R12,#LastCtrlEvent] ; Is CTRL key down ?
  TEQ     r14, #0
.  LDMEQFD R13!,{r0-r1,r4-r5,PC}   ; Ignore
(H  LDR     r14, [R12,#LastDumpEvent  ]    ; Is ALT key down as well ?
2  TEQ     r14, #0
<.  LDMEQFD R13!,{r0-r1,r4-r5,PC}   ; Ignore
P(; Into SVC mode so we can call SWI's
d=  MOV     r5, psr                 ; Remember mode + flags
n  BIC     r4, r5, #SVC_mode
x6  TEQP    r4, #SVC_mode           ; Force SVC mode
�  MOV R0,R0
�   STMFD R13!,{R14} \\ lr_svc
�  MOV     r14, #VIDC
�; Set border cyan
�  MOV     r4,#&40000000
�  �R     r4,r4,#&CC0
�  STR     r4, [r14]
�(; Set the CallBackHandler up NOW !!!
�%  LDRB    r0, [R12,#interlock   ]
�  TEQ     r0, #0
�;  BNE     ll004                   ; [already requested]
  ADR     r0, CallBackCode
  MOV     r1, wp
  SWI     "XOS_AddCallBack"
"  MOVVC   r0, #1
,$  STRVCB  r0, [R12,#interlock  ]
6 
@
.ll004
J   LDMFD R13!,{R14} \\ lr_svc
T=  TEQP    r5, #0                  ; Back to caller's mode
^  MOV R0,R0
h0  LDMFD R13!,{r0-r1,r4-r5,PC}   ; Pass it on
|"; In    r0-r6 may be corrupted
�;       wp valid
�!;       SVC mode, IRQ enabled
�.CallBackCode
�  STMFD R13!, {R14}
�  MOV     r14, #VIDC
�8  MOV     r0, #&40000000          ; Set border black
�  STR     r0, [r14]
�  MOV     r0, #0
�#  STRB    r0, [R12,#interlock ]
� 
'  TEQP PC,#0  ; Force User Mode now
H  MOV R0,R0   ; NOP instruction to allow CPU time to sort itself out
&  ADR     r0 , errblock%
0  SWI "OS_GenerateError"
�  LDMFD R13!,{PC}
�.errblock%
�$  EQUD -1   ; Try 0 instead here
�  EQUS "Aborted"
�  EQUB 0
�  ALIGN
�.tracename%
�  EQUS "HostVdu:"

  EQUB 0

  ALIGN

*]

4�
dݤADDR(reg,dest)
n� (dest - P% - 8) >=0 �
x"  � (dest - P% - 8) < &10000 �
�    [OPTopt%
�*    ADD reg,PC,#(dest - P% - 8 ) � &FF
�,    ADD reg,reg,#(dest - P% - 4) � &FF00
�	    ]
�  �
�$  � (dest - P% - 8) < &1000000 �
�    [OPTopt%
�*    ADD reg,PC,#(dest - P% - 8 ) � &FF
�,    ADD reg,reg,#(dest - P% - 4) � &FF00
�.    ADD reg,reg,#(dest - P% - 0) � &FF0000
�	    ]
�  �
�    � 0,"ADR out of range"
  �
  �
�
"&  � (0-(dest - P% - 8)) < &10000 �
,    [OPTopt%
6.    SUB reg,PC,#(0-(dest - P% - 8 )) � &FF
@0    SUB reg,reg,#(0-(dest - P% - 4)) � &FF00
J	    ]
T  �
^(  � (0-(dest - P% - 8)) < &1000000 �
h    [OPTopt%
r.    SUB reg,PC,#(0-(dest - P% - 8 )) � &FF
|0    SUB reg,reg,#(0-(dest - P% - 4)) � &FF00
�2    SUB reg,reg,#(0-(dest - P% - 0)) � &FF0000
�	    ]
�  �
�    � 0,"ADR out of range"
�  �
�  �
��
�=""
��
�
00000000  0d 00 0a 12 f4 20 3e 20  54 61 73 6b 4b 69 6c 6c  |..... > TaskKill|
00000010  65 72 0d 00 46 22 f4 20  3d 3d 3d 20 4d 61 6e 69  |er..F". === Mani|
00000020  66 65 73 74 20 64 65 66  69 6e 69 74 69 6f 6e 73  |fest definitions|
00000030  20 3d 3d 3d 0d 00 5a 0d  52 30 3d 30 3a 72 30 3d  | ===..Z.R0=0:r0=|
00000040  30 0d 00 64 0d 52 31 3d  31 3a 72 31 3d 31 0d 00  |0..d.R1=1:r1=1..|
00000050  6e 0d 52 32 3d 32 3a 72  32 3d 32 0d 00 78 0d 52  |n.R2=2:r2=2..x.R|
00000060  33 3d 33 3a 72 33 3d 33  0d 00 82 0d 52 34 3d 34  |3=3:r3=3....R4=4|
00000070  3a 72 34 3d 34 0d 00 8c  0d 52 35 3d 35 3a 72 35  |:r4=4....R5=5:r5|
00000080  3d 35 0d 00 96 0d 52 36  3d 36 3a 72 36 3d 36 0d  |=5....R6=6:r6=6.|
00000090  00 a0 0d 52 37 3d 37 3a  72 37 3d 37 0d 00 aa 0d  |...R7=7:r7=7....|
000000a0  52 38 3d 38 3a 72 38 3d  38 0d 00 b4 08 52 39 3d  |R8=8:r8=8....R9=|
000000b0  39 0d 00 be 0a 52 31 30  3d 31 30 0d 00 c8 0a 52  |9....R10=10....R|
000000c0  31 31 3d 31 31 0d 00 d2  10 52 31 32 3d 31 32 3a  |11=11....R12=12:|
000000d0  77 70 3d 31 32 0d 00 dc  10 52 31 33 3d 31 33 3a  |wp=12....R13=13:|
000000e0  73 70 3d 31 33 0d 00 e6  10 52 31 34 3d 31 34 3a  |sp=13....R14=14:|
000000f0  6c 72 3d 31 34 0d 00 f0  1e 52 31 35 3d 31 35 3a  |lr=14....R15=15:|
00000100  50 43 3d 52 31 35 3a 70  63 3d 31 35 3a 70 73 72  |PC=R15:pc=15:psr|
00000110  3d 31 35 0d 01 7d 1b 4d  6f 64 48 61 6e 64 52 65  |=15..}.ModHandRe|
00000120  61 73 6f 6e 5f 43 6c 61  69 6d 20 3d 20 36 0d 01  |ason_Claim = 6..|
00000130  7e 17 53 65 72 76 69 63  65 5f 52 65 73 65 74 20  |~.Service_Reset |
00000140  3d 20 26 32 37 0d 01 7f  10 45 76 65 6e 74 56 20  |= &27....EventV |
00000150  3d 20 26 31 30 0d 01 80  17 45 76 65 6e 74 5f 4b  |= &10....Event_K|
00000160  65 79 62 6f 61 72 64 20  3d 20 31 31 0d 01 92 0e  |eyboard = 11....|
00000170  53 56 43 5f 6d 6f 64 65  3d 31 0d 01 9a 0a 63 72  |SVC_mode=1....cr|
00000180  25 3d 31 33 0d 01 b8 24  6b 65 79 74 6f 64 75 6d  |%=13...$keytodum|
00000190  70 20 20 20 3d 20 26 35  45 20 20 20 20 3a f4 20  |p   = &5E    :. |
000001a0  6c 65 66 74 2d 41 4c 54  0d 01 d6 25 63 74 72 6c  |left-ALT...%ctrl|
000001b0  6b 65 79 20 20 20 20 20  3d 20 26 33 42 20 20 20  |key     = &3B   |
000001c0  20 3a f4 20 6c 65 66 74  2d 43 54 52 4c 0d 02 26  | :. left-CTRL..&|
000001d0  13 56 49 44 43 20 3d 26  30 33 34 30 30 30 30 30  |.VIDC =&03400000|
000001e0  0d 02 3a 1c f4 20 53 6f  6d 65 20 57 6f 72 6b 73  |..:.. Some Works|
000001f0  70 61 63 65 20 6f 66 66  73 65 74 73 0d 02 4e 17  |pace offsets..N.|
00000200  4c 61 73 74 43 74 72 6c  45 76 65 6e 74 20 20 20  |LastCtrlEvent   |
00000210  3d 20 30 0d 02 58 17 4c  61 73 74 44 75 6d 70 45  |= 0..X.LastDumpE|
00000220  76 65 6e 74 20 20 20 3d  20 34 0d 02 62 17 69 6e  |vent   = 4..b.in|
00000230  74 65 72 6c 6f 63 6b 20  20 20 20 20 20 20 3d 20  |terlock       = |
00000240  38 0d 02 76 1c 54 65 73  74 5f 57 6f 72 6b 73 70  |8..v.Test_Worksp|
00000250  61 63 65 53 69 7a 65 3d  20 26 31 30 30 0d 02 94  |aceSize= &100...|
00000260  09 f4 20 3d 3d 3d 0d 02  a8 14 de 20 63 6f 64 65  |.. ===..... code|
00000270  25 20 31 30 30 2a 31 30  32 34 0d 02 bc 09 f2 44  |% 100*1024.....D|
00000280  4f 49 54 0d 02 d0 05 e0  0d 02 e4 0a dd f2 44 4f  |OIT...........DO|
00000290  49 54 0d 02 f8 1e 4d 6f  64 75 6c 65 5f 54 69 74  |IT....Module_Tit|
000002a0  6c 65 24 3d 22 54 61 73  6b 4b 69 6c 6c 65 72 22  |le$="TaskKiller"|
000002b0  0d 03 02 47 4d 6f 64 75  6c 65 5f 48 65 6c 70 24  |...GModule_Help$|
000002c0  20 3d 4d 6f 64 75 6c 65  5f 54 69 74 6c 65 24 2b  | =Module_Title$+|
000002d0  bd 39 2b 22 30 2e 31 30  20 28 22 2b c1 91 24 2c  |.9+"0.10 ("+..$,|
000002e0  35 2c a9 28 22 30 34 20  4a 75 6c 20 31 39 38 39  |5,.("04 Jul 1989|
000002f0  22 29 29 2b 22 29 22 0d  03 0c 1a 73 61 76 65 61  |"))+")"....savea|
00000300  73 24 3d 22 24 2e 4b 69  6c 6c 4d 6f 64 75 6c 65  |s$="$.KillModule|
00000310  22 0d 03 3e 09 f4 20 3d  3d 3d 0d 03 52 1a f1 22  |"..>.. ===..R.."|
00000320  41 73 73 65 6d 62 6c 69  6e 67 20 22 2b 73 61 76  |Assembling "+sav|
00000330  65 61 73 24 0d 03 66 14  20 f4 20 50 52 4f 43 77  |eas$..f. . PROCw|
00000340  6f 72 6b 73 70 61 63 65  0d 03 7a 0b 70 61 73 73  |orkspace..z.pass|
00000350  25 3d 30 0d 03 84 21 e3  6f 70 74 25 3d 30 b8 32  |%=0...!.opt%=0.2|
00000360  88 32 3a f4 20 3a 6f 70  74 25 3d 6f 70 74 25 20  |.2:. :opt%=opt% |
00000370  4f 52 20 31 0d 03 8e 0c  50 25 3d 63 6f 64 65 25  |OR 1....P%=code%|
00000380  0d 03 98 0c 70 61 73 73  25 2b 3d 31 0d 03 a2 12  |....pass%+=1....|
00000390  f1 22 50 61 73 73 20 22  3b 70 61 73 73 25 0d 03  |."Pass ";pass%..|
000003a0  ca 0c f2 6c 69 62 72 61  72 79 0d 03 f2 05 ed 0d  |...library......|
000003b0  04 06 2b ff 28 22 53 41  56 45 20 22 2b 73 61 76  |..+.("SAVE "+sav|
000003c0  65 61 73 24 2b 22 20 22  2b c3 7e 63 6f 64 65 25  |eas$+" "+.~code%|
000003d0  2b 22 20 22 2b c3 7e 50  25 29 0d 04 10 20 ff 28  |+" "+.~P%)... .(|
000003e0  22 53 45 54 54 59 50 45  20 22 2b 73 61 76 65 61  |"SETTYPE "+savea|
000003f0  73 24 2b 22 20 46 46 41  22 29 0d 04 24 05 e1 0d  |s$+" FFA")..$...|
00000400  04 38 0d dd f2 6c 69 62  72 61 72 79 0d 04 42 0c  |.8...library..B.|
00000410  5b 4f 50 54 6f 70 74 25  0d 04 56 14 2e 4d 6f 64  |[OPTopt%..V..Mod|
00000420  75 6c 65 5f 42 61 73 65  41 64 64 72 0d 04 74 0c  |ule_BaseAddr..t.|
00000430  20 20 45 51 55 44 20 30  0d 04 7e 28 20 20 45 51  |  EQUD 0..~(  EQ|
00000440  55 44 20 54 65 73 74 5f  49 6e 69 74 20 20 20 20  |UD Test_Init    |
00000450  2d 4d 6f 64 75 6c 65 5f  42 61 73 65 41 64 64 72  |-Module_BaseAddr|
00000460  0d 04 88 28 20 20 45 51  55 44 20 54 65 73 74 5f  |...(  EQUD Test_|
00000470  44 69 65 20 20 20 20 20  2d 4d 6f 64 75 6c 65 5f  |Die     -Module_|
00000480  42 61 73 65 41 64 64 72  0d 04 92 28 20 20 45 51  |BaseAddr...(  EQ|
00000490  55 44 20 54 65 73 74 5f  53 65 72 76 69 63 65 20  |UD Test_Service |
000004a0  2d 4d 6f 64 75 6c 65 5f  42 61 73 65 41 64 64 72  |-Module_BaseAddr|
000004b0  0d 04 9c 28 20 20 45 51  55 44 20 54 65 73 74 5f  |...(  EQUD Test_|
000004c0  54 69 74 6c 65 20 20 20  2d 4d 6f 64 75 6c 65 5f  |Title   -Module_|
000004d0  42 61 73 65 41 64 64 72  0d 04 a6 28 20 20 45 51  |BaseAddr...(  EQ|
000004e0  55 44 20 54 65 73 74 5f  48 65 6c 70 53 74 72 20  |UD Test_HelpStr |
000004f0  2d 4d 6f 64 75 6c 65 5f  42 61 73 65 41 64 64 72  |-Module_BaseAddr|
00000500  0d 04 b0 0c 20 20 45 51  55 44 20 30 0d 04 c4 0f  |....  EQUD 0....|
00000510  2e 54 65 73 74 5f 54 69  74 6c 65 0d 04 d8 21 20  |.Test_Title...! |
00000520  20 45 51 55 53 20 20 20  4d 6f 64 75 6c 65 5f 54  | EQUS   Module_T|
00000530  69 74 6c 65 24 3a 45 51  55 42 20 30 0d 04 ec 11  |itle$:EQUB 0....|
00000540  2e 54 65 73 74 5f 48 65  6c 70 53 74 72 0d 05 00  |.Test_HelpStr...|
00000550  20 20 20 45 51 55 53 20  20 20 4d 6f 64 75 6c 65  |   EQUS   Module|
00000560  5f 48 65 6c 70 24 3a 45  51 55 42 20 30 0d 05 28  |_Help$:EQUB 0..(|
00000570  0b 20 20 41 4c 49 47 4e  0d 05 50 1c 3b 20 72 30  |.  ALIGN..P.; r0|
00000580  2d 72 36 20 6d 61 79 20  62 65 20 63 6f 72 72 75  |-r6 may be corru|
00000590  70 74 65 64 0d 05 64 0e  2e 54 65 73 74 5f 49 6e  |pted..d..Test_In|
000005a0  69 74 0d 05 6e 16 20 20  53 54 4d 46 44 20 52 31  |it..n.  STMFD R1|
000005b0  33 21 2c 7b 52 31 34 7d  0d 05 82 40 20 20 4c 44  |3!,{R14}...@  LD|
000005c0  52 20 20 20 20 20 72 32  2c 20 5b 72 31 32 5d 20  |R     r2, [r12] |
000005d0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
000005e0  43 6f 6d 69 6e 67 20 66  72 6f 6d 20 68 61 72 64  |Coming from hard|
000005f0  20 72 65 73 65 74 20 3f  0d 05 8c 14 20 20 54 45  | reset ?....  TE|
00000600  51 20 20 20 20 20 72 32  2c 20 23 30 0d 05 96 13  |Q     r2, #0....|
00000610  20 20 42 4e 45 20 20 20  20 20 6c 6c 30 30 31 0d  |  BNE     ll001.|
00000620  05 aa 26 20 20 4d 4f 56  20 20 20 20 20 72 30 2c  |..&  MOV     r0,|
00000630  20 23 4d 6f 64 48 61 6e  64 52 65 61 73 6f 6e 5f  | #ModHandReason_|
00000640  43 6c 61 69 6d 0d 05 b4  25 20 20 4d 4f 56 20 20  |Claim...%  MOV  |
00000650  20 20 20 72 33 2c 20 23  54 65 73 74 5f 57 6f 72  |   r3, #Test_Wor|
00000660  6b 73 70 61 63 65 53 69  7a 65 0d 05 be 1a 20 20  |kspaceSize....  |
00000670  53 57 49 20 20 20 20 20  22 58 4f 53 5f 4d 6f 64  |SWI     "XOS_Mod|
00000680  75 6c 65 22 0d 05 c8 2e  20 20 3b 20 27 4e 6f 20  |ule"....  ; 'No |
00000690  72 6f 6f 6d 20 69 6e 20  52 4d 41 27 20 69 73 20  |room in RMA' is |
000006a0  61 63 63 65 70 74 61 62  6c 65 20 6d 65 73 73 61  |acceptable messa|
000006b0  67 65 0d 05 d2 17 20 20  4c 44 4d 56 53 46 44 20  |ge....  LDMVSFD |
000006c0  52 31 33 21 2c 7b 50 43  7d 0d 05 dc 17 20 20 53  |R13!,{PC}....  S|
000006d0  54 52 20 20 20 20 20 72  32 2c 20 5b 72 31 32 5d  |TR     r2, [r12]|
000006e0  0d 06 2c 0a 2e 6c 6c 30  30 31 0d 06 36 43 20 20  |..,..ll001..6C  |
000006f0  4d 4f 56 20 20 20 20 20  77 70 2c 20 72 32 20 20  |MOV     wp, r2  |
00000700  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000710  3b 20 44 65 72 65 66 65  72 65 6e 63 65 20 6f 6e  |; Dereference on|
00000720  20 61 6c 6c 20 72 65 73  65 74 73 20 21 0d 06 4a  | all resets !..J|
00000730  20 20 20 42 4c 20 20 20  20 20 20 54 65 73 74 5f  |   BL      Test_|
00000740  53 65 72 76 69 63 65 5f  52 65 73 65 74 0d 06 54  |Service_Reset..T|
00000750  15 20 20 4c 44 4d 46 44  20 52 31 33 21 2c 7b 50  |.  LDMFD R13!,{P|
00000760  43 7d 0d 06 72 11 2e 54  65 73 74 5f 53 65 72 76  |C}..r..Test_Serv|
00000770  69 63 65 0d 06 86 20 20  20 54 45 51 20 20 20 20  |ice...   TEQ    |
00000780  20 72 31 2c 20 23 53 65  72 76 69 63 65 5f 52 65  | r1, #Service_Re|
00000790  73 65 74 0d 06 90 14 20  20 4d 4f 56 4e 45 20 20  |set....  MOVNE  |
000007a0  20 70 63 2c 20 6c 72 0d  06 a4 3e 20 20 4c 44 52  | pc, lr...>  LDR|
000007b0  20 20 20 20 20 77 70 2c  20 5b 72 31 32 5d 20 20  |     wp, [r12]  |
000007c0  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 44  |             ; D|
000007d0  65 72 65 66 65 72 65 6e  63 65 20 6f 6e 20 73 65  |ereference on se|
000007e0  72 76 69 63 65 0d 06 b8  17 2e 54 65 73 74 5f 53  |rvice.....Test_S|
000007f0  65 72 76 69 63 65 5f 52  65 73 65 74 0d 06 c2 1c  |ervice_Reset....|
00000800  20 20 53 54 4d 46 44 20  52 31 33 21 2c 7b 72 30  |  STMFD R13!,{r0|
00000810  2d 72 32 2c 52 31 34 7d  0d 06 d6 15 20 20 4d 4f  |-r2,R14}....  MO|
00000820  56 20 20 20 20 20 72 31  34 2c 20 23 30 0d 06 e0  |V     r14, #0...|
00000830  27 20 20 53 54 52 20 20  20 20 20 72 31 34 2c 20  |'  STR     r14, |
00000840  5b 52 31 32 2c 23 4c 61  73 74 43 74 72 6c 45 76  |[R12,#LastCtrlEv|
00000850  65 6e 74 5d 0d 06 ea 27  20 20 53 54 52 20 20 20  |ent]...'  STR   |
00000860  20 20 72 31 34 2c 20 5b  52 31 32 2c 23 4c 61 73  |  r14, [R12,#Las|
00000870  74 44 75 6d 70 45 76 65  6e 74 5d 0d 06 fe 19 20  |tDumpEvent].... |
00000880  20 4d 4f 56 20 20 20 20  20 72 30 2c 20 23 45 76  | MOV     r0, #Ev|
00000890  65 6e 74 56 0d 07 08 1b  20 20 41 44 52 20 20 20  |entV....  ADR   |
000008a0  20 20 72 31 2c 20 45 76  65 6e 74 43 6f 64 65 0d  |  r1, EventCode.|
000008b0  07 12 19 20 20 42 4c 20  20 20 20 20 20 43 6c 61  |...  BL      Cla|
000008c0  69 6d 56 65 63 74 6f 72  0d 07 26 34 20 20 4d 4f  |imVector..&4  MO|
000008d0  56 20 20 20 20 20 72 30  2c 20 23 31 34 20 20 20  |V     r0, #14   |
000008e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 20  |              ; |
000008f0  45 6e 61 62 6c 65 20 65  76 65 6e 74 0d 07 30 21  |Enable event..0!|
00000900  20 20 4d 4f 56 20 20 20  20 20 72 31 2c 20 23 45  |  MOV     r1, #E|
00000910  76 65 6e 74 5f 4b 65 79  62 6f 61 72 64 0d 07 3a  |vent_Keyboard..:|
00000920  18 20 20 53 57 49 20 20  20 20 20 22 58 4f 53 5f  |.  SWI     "XOS_|
00000930  42 79 74 65 22 0d 07 4e  14 20 20 4d 4f 56 20 20  |Byte"..N.  MOV  |
00000940  20 20 20 72 30 2c 20 23  30 0d 07 58 23 20 20 53  |   r0, #0..X#  S|
00000950  54 52 42 20 20 20 20 72  30 2c 20 5b 52 31 32 2c  |TRB    r0, [R12,|
00000960  23 69 6e 74 65 72 6c 6f  63 6b 20 5d 0d 07 62 1b  |#interlock ]..b.|
00000970  20 20 4c 44 4d 46 44 20  52 31 33 21 2c 7b 72 30  |  LDMFD R13!,{r0|
00000980  2d 72 32 2c 50 43 7d 0d  07 76 4b 3b 20 4c 65 74  |-r2,PC}..vK; Let|
00000990  20 4d 6f 64 75 6c 65 20  68 61 6e 64 6c 65 72 20  | Module handler |
000009a0  74 61 6b 65 20 63 61 72  65 20 6f 66 20 72 65 6d  |take care of rem|
000009b0  6f 76 69 6e 67 20 6f 75  72 20 77 6f 72 6b 73 70  |oving our worksp|
000009c0  61 63 65 20 6f 6e 20 66  61 74 61 6c 20 64 65 61  |ace on fatal dea|
000009d0  74 68 0d 07 80 3c 3b 20  4f 72 20 73 68 75 6e 74  |th...<; Or shunt|
000009e0  69 6e 67 20 69 74 20 61  72 6f 75 6e 64 20 6f 6e  |ing it around on|
000009f0  20 54 69 64 79 20 2d 20  6e 6f 6e 65 20 6f 66 20  | Tidy - none of |
00000a00  69 74 20 69 73 20 61 62  73 6f 6c 75 74 65 0d 07  |it is absolute..|
00000a10  94 0d 2e 54 65 73 74 5f  44 69 65 0d 07 9e 1c 20  |...Test_Die.... |
00000a20  20 53 54 4d 46 44 20 52  31 33 21 2c 7b 72 30 2d  | STMFD R13!,{r0-|
00000a30  72 32 2c 52 31 34 7d 0d  07 b2 35 20 20 4d 4f 56  |r2,R14}...5  MOV|
00000a40  20 20 20 20 20 72 30 2c  20 23 31 33 20 20 20 20  |     r0, #13    |
00000a50  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 44  |             ; D|
00000a60  69 73 61 62 6c 65 20 65  76 65 6e 74 0d 07 bc 21  |isable event...!|
00000a70  20 20 4d 4f 56 20 20 20  20 20 72 31 2c 20 23 45  |  MOV     r1, #E|
00000a80  76 65 6e 74 5f 4b 65 79  62 6f 61 72 64 0d 07 c6  |vent_Keyboard...|
00000a90  18 20 20 53 57 49 20 20  20 20 20 22 58 4f 53 5f  |.  SWI     "XOS_|
00000aa0  42 79 74 65 22 0d 07 da  3c 20 20 4c 44 52 20 20  |Byte"...<  LDR  |
00000ab0  20 20 20 77 70 2c 20 5b  72 31 32 5d 20 20 20 20  |   wp, [r12]    |
00000ac0  20 20 20 20 20 20 20 20  20 20 20 3b 20 44 65 72  |           ; Der|
00000ad0  65 66 65 72 65 6e 63 65  20 6f 6e 20 64 65 61 74  |eference on deat|
00000ae0  68 0d 07 e4 19 20 20 4d  4f 56 20 20 20 20 20 72  |h....  MOV     r|
00000af0  30 2c 20 23 45 76 65 6e  74 56 0d 07 ee 1b 20 20  |0, #EventV....  |
00000b00  41 44 52 20 20 20 20 20  72 31 2c 20 45 76 65 6e  |ADR     r1, Even|
00000b10  74 43 6f 64 65 0d 07 f8  1a 20 20 42 4c 20 20 20  |tCode....  BL   |
00000b20  20 20 20 44 65 6c 69 6e  6b 56 65 63 74 6f 72 0d  |   DelinkVector.|
00000b30  08 02 1b 20 20 4c 44 4d  46 44 20 52 31 33 21 2c  |...  LDMFD R13!,|
00000b40  7b 72 30 2d 72 32 2c 50  43 7d 0d 08 20 10 2e 43  |{r0-r2,PC}.. ..C|
00000b50  6c 61 69 6d 56 65 63 74  6f 72 0d 08 2a 19 20 20  |laimVector..*.  |
00000b60  53 54 4d 46 44 20 52 31  33 21 2c 7b 72 32 2c 52  |STMFD R13!,{r2,R|
00000b70  31 34 7d 0d 08 3e 1a 20  20 42 4c 20 20 20 20 20  |14}..>.  BL     |
00000b80  20 44 65 6c 69 6e 6b 56  65 63 74 6f 72 0d 08 48  | DelinkVector..H|
00000b90  41 20 20 4d 4f 56 20 20  20 20 20 72 32 2c 20 77  |A  MOV     r2, w|
00000ba0  70 20 20 20 20 20 20 20  20 3b 20 55 73 65 20 77  |p        ; Use w|
00000bb0  70 20 69 74 73 65 6c 66  20 2d 20 73 61 76 65 73  |p itself - saves|
00000bc0  20 64 65 72 65 66 65 72  65 6e 63 69 6e 67 0d 08  | dereferencing..|
00000bd0  52 36 20 20 53 57 49 20  20 20 20 20 22 58 4f 53  |R6  SWI     "XOS|
00000be0  5f 43 6c 61 69 6d 22 20  20 20 20 20 3b 20 6f 6e  |_Claim"     ; on|
00000bf0  20 61 63 74 75 61 6c 20  63 6f 64 65 20 65 6e 74  | actual code ent|
00000c00  72 69 65 73 0d 08 5c 19  20 20 4c 44 4d 46 44 20  |ries..\.  LDMFD |
00000c10  52 31 33 21 2c 7b 72 32  2c 50 43 7d 5e 0d 08 70  |R13!,{r2,PC}^..p|
00000c20  11 2e 44 65 6c 69 6e 6b  56 65 63 74 6f 72 0d 08  |..DelinkVector..|
00000c30  7a 1c 20 20 53 54 4d 46  44 20 52 31 33 21 2c 7b  |z.  STMFD R13!,{|
00000c40  72 30 2d 72 32 2c 52 31  34 7d 0d 08 84 0a 2e 6c  |r0-r2,R14}.....l|
00000c50  6c 30 30 32 0d 08 8e 17  20 20 4c 44 4d 49 41 20  |l002....  LDMIA |
00000c60  52 31 33 2c 7b 52 30 2c  52 31 7d 0d 08 98 14 20  |R13,{R0,R1}.... |
00000c70  20 4d 4f 56 20 20 20 20  20 72 32 2c 20 77 70 0d  | MOV     r2, wp.|
00000c80  08 a2 1b 20 20 53 57 49  20 20 20 20 20 22 58 4f  |...  SWI     "XO|
00000c90  53 5f 52 65 6c 65 61 73  65 22 0d 08 ac 13 20 20  |S_Release"....  |
00000ca0  42 56 43 20 20 20 20 20  6c 6c 30 30 32 0d 08 b6  |BVC     ll002...|
00000cb0  13 20 20 43 4d 50 20 20  20 20 20 50 43 2c 23 30  |.  CMP     PC,#0|
00000cc0  0d 08 c0 1b 20 20 4c 44  4d 46 44 20 52 31 33 21  |....  LDMFD R13!|
00000cd0  2c 7b 72 30 2d 72 32 2c  50 43 7d 0d 08 d4 31 3b  |,{r0-r2,PC}...1;|
00000ce0  20 45 6e 74 65 72 65 64  20 69 6e 20 73 6f 6d 65  | Entered in some|
00000cf0  20 6d 6f 64 65 20 6f 72  20 6f 74 68 65 72 2c 20  | mode or other, |
00000d00  70 72 6f 62 61 62 6c 79  20 49 52 51 0d 08 e8 0e  |probably IRQ....|
00000d10  2e 45 76 65 6e 74 43 6f  64 65 0d 08 fc 21 20 20  |.EventCode...!  |
00000d20  43 4d 50 20 20 20 20 20  72 30 2c 20 23 45 76 65  |CMP     r0, #Eve|
00000d30  6e 74 5f 4b 65 79 62 6f  61 72 64 0d 09 06 41 20  |nt_Keyboard...A |
00000d40  20 4d 4f 56 4e 45 20 20  20 70 63 2c 20 6c 72 20  | MOVNE   pc, lr |
00000d50  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000d60  20 3b 20 50 61 73 73 20  69 74 20 6f 6e 20 69 66  | ; Pass it on if|
00000d70  20 77 72 6f 6e 67 20 65  76 65 6e 74 0d 09 1a 2b  | wrong event...+|
00000d80  20 20 3b 20 49 6e 20 20  20 20 72 31 20 3d 20 6b  |  ; In    r1 = k|
00000d90  65 79 20 64 6f 77 6e 20  3d 20 31 2c 20 6b 65 79  |ey down = 1, key|
00000da0  20 75 70 20 3d 20 30 0d  09 24 1d 20 20 3b 20 20  | up = 0..$.  ;  |
00000db0  20 20 20 20 20 72 32 20  3d 20 6b 65 79 20 6e 75  |     r2 = key nu|
00000dc0  6d 62 65 72 0d 09 42 22  20 20 53 54 4d 46 44 20  |mber..B"  STMFD |
00000dd0  52 31 33 21 2c 7b 72 30  2d 72 31 2c 72 34 2d 72  |R13!,{r0-r1,r4-r|
00000de0  35 2c 52 31 34 7d 0d 09  6a 1b 20 20 4d 4f 56 20  |5,R14}..j.  MOV |
00000df0  20 20 20 20 72 31 34 2c  20 23 63 74 72 6c 6b 65  |    r14, #ctrlke|
00000e00  79 0d 09 74 15 20 20 43  4d 50 20 20 20 20 20 72  |y..t.  CMP     r|
00000e10  32 2c 20 72 31 34 0d 09  7e 3b 20 20 53 54 52 45  |2, r14..~;  STRE|
00000e20  51 20 20 20 72 31 2c 5b  52 31 32 2c 23 4c 61 73  |Q   r1,[R12,#Las|
00000e30  74 43 74 72 6c 45 76 65  6e 74 5d 20 20 3b 20 30  |tCtrlEvent]  ; 0|
00000e40  20 2d 3e 20 6b 65 79 20  69 73 20 6e 6f 77 20 75  | -> key is now u|
00000e50  70 0d 09 88 13 20 20 42  45 51 20 20 20 20 20 6c  |p....  BEQ     l|
00000e60  6c 30 30 33 0d 09 b0 1d  20 20 4d 4f 56 20 20 20  |l003....  MOV   |
00000e70  20 20 72 31 34 2c 20 23  6b 65 79 74 6f 64 75 6d  |  r14, #keytodum|
00000e80  70 0d 09 ba 15 20 20 43  4d 50 20 20 20 20 20 72  |p....  CMP     r|
00000e90  32 2c 20 72 31 34 0d 09  c4 3e 20 20 53 54 52 45  |2, r14...>  STRE|
00000ea0  51 20 20 20 72 31 2c 20  5b 52 31 32 2c 23 4c 61  |Q   r1, [R12,#La|
00000eb0  73 74 44 75 6d 70 45 76  65 6e 74 5d 20 20 20 20  |stDumpEvent]    |
00000ec0  3b 20 30 20 2d 3e 20 6b  65 79 20 69 73 20 6e 6f  |; 0 -> key is no|
00000ed0  77 20 75 70 0d 09 ce 27  3b 20 50 61 73 73 20 69  |w up...'; Pass i|
00000ee0  74 20 6f 6e 20 69 66 20  6e 6f 74 20 6f 6e 65 20  |t on if not one |
00000ef0  6f 66 20 6f 75 72 20 6b  65 79 73 0d 09 d8 23 20  |of our keys...# |
00000f00  20 4c 44 4d 4e 45 46 44  20 52 31 33 21 2c 7b 72  | LDMNEFD R13!,{r|
00000f10  30 2d 72 31 2c 72 34 2d  72 35 2c 50 43 7d 0d 09  |0-r1,r4-r5,PC}..|
00000f20  ec 32 3b 20 41 62 6f 72  74 20 6f 6e 20 66 69 72  |.2; Abort on fir|
00000f30  73 74 20 6b 65 79 73 74  72 6f 6b 65 20 69 66 20  |st keystroke if |
00000f40  63 74 72 6c 20 69 73 20  64 6f 77 6e 20 74 6f 6f  |ctrl is down too|
00000f50  0d 0a 00 0a 2e 6c 6c 30  30 33 0d 0a 0a 37 20 20  |.....ll003...7  |
00000f60  4c 44 52 20 52 31 34 2c  5b 52 31 32 2c 23 4c 61  |LDR R14,[R12,#La|
00000f70  73 74 43 74 72 6c 45 76  65 6e 74 5d 20 3b 20 49  |stCtrlEvent] ; I|
00000f80  73 20 43 54 52 4c 20 6b  65 79 20 64 6f 77 6e 20  |s CTRL key down |
00000f90  3f 0d 0a 14 15 20 20 54  45 51 20 20 20 20 20 72  |?....  TEQ     r|
00000fa0  31 34 2c 20 23 30 0d 0a  1e 2e 20 20 4c 44 4d 45  |14, #0....  LDME|
00000fb0  51 46 44 20 52 31 33 21  2c 7b 72 30 2d 72 31 2c  |QFD R13!,{r0-r1,|
00000fc0  72 34 2d 72 35 2c 50 43  7d 20 20 20 3b 20 49 67  |r4-r5,PC}   ; Ig|
00000fd0  6e 6f 72 65 0d 0a 28 48  20 20 4c 44 52 20 20 20  |nore..(H  LDR   |
00000fe0  20 20 72 31 34 2c 20 5b  52 31 32 2c 23 4c 61 73  |  r14, [R12,#Las|
00000ff0  74 44 75 6d 70 45 76 65  6e 74 20 20 5d 20 20 20  |tDumpEvent  ]   |
00001000  20 3b 20 49 73 20 41 4c  54 20 6b 65 79 20 64 6f  | ; Is ALT key do|
00001010  77 6e 20 61 73 20 77 65  6c 6c 20 3f 0d 0a 32 15  |wn as well ?..2.|
00001020  20 20 54 45 51 20 20 20  20 20 72 31 34 2c 20 23  |  TEQ     r14, #|
00001030  30 0d 0a 3c 2e 20 20 4c  44 4d 45 51 46 44 20 52  |0..<.  LDMEQFD R|
00001040  31 33 21 2c 7b 72 30 2d  72 31 2c 72 34 2d 72 35  |13!,{r0-r1,r4-r5|
00001050  2c 50 43 7d 20 20 20 3b  20 49 67 6e 6f 72 65 0d  |,PC}   ; Ignore.|
00001060  0a 50 28 3b 20 49 6e 74  6f 20 53 56 43 20 6d 6f  |.P(; Into SVC mo|
00001070  64 65 20 73 6f 20 77 65  20 63 61 6e 20 63 61 6c  |de so we can cal|
00001080  6c 20 53 57 49 27 73 0d  0a 64 3d 20 20 4d 4f 56  |l SWI's..d=  MOV|
00001090  20 20 20 20 20 72 35 2c  20 70 73 72 20 20 20 20  |     r5, psr    |
000010a0  20 20 20 20 20 20 20 20  20 20 20 20 20 3b 20 52  |             ; R|
000010b0  65 6d 65 6d 62 65 72 20  6d 6f 64 65 20 2b 20 66  |emember mode + f|
000010c0  6c 61 67 73 0d 0a 6e 1f  20 20 42 49 43 20 20 20  |lags..n.  BIC   |
000010d0  20 20 72 34 2c 20 72 35  2c 20 23 53 56 43 5f 6d  |  r4, r5, #SVC_m|
000010e0  6f 64 65 0d 0a 78 36 20  20 54 45 51 50 20 20 20  |ode..x6  TEQP   |
000010f0  20 72 34 2c 20 23 53 56  43 5f 6d 6f 64 65 20 20  | r4, #SVC_mode  |
00001100  20 20 20 20 20 20 20 20  20 3b 20 46 6f 72 63 65  |         ; Force|
00001110  20 53 56 43 20 6d 6f 64  65 0d 0a 82 0f 20 20 4d  | SVC mode....  M|
00001120  4f 56 20 52 30 2c 52 30  0d 0a 8c 20 20 20 53 54  |OV R0,R0...   ST|
00001130  4d 46 44 20 52 31 33 21  2c 7b 52 31 34 7d 20 5c  |MFD R13!,{R14} \|
00001140  5c 20 6c 72 5f 73 76 63  0d 0a a0 18 20 20 4d 4f  |\ lr_svc....  MO|
00001150  56 20 20 20 20 20 72 31  34 2c 20 23 56 49 44 43  |V     r14, #VIDC|
00001160  0d 0a aa 15 3b 20 53 65  74 20 62 6f 72 64 65 72  |....; Set border|
00001170  20 63 79 61 6e 0d 0a ab  1b 20 20 4d 4f 56 20 20  | cyan....  MOV  |
00001180  20 20 20 72 34 2c 23 26  34 30 30 30 30 30 30 30  |   r4,#&40000000|
00001190  0d 0a ac 18 20 20 84 52  20 20 20 20 20 72 34 2c  |....  .R     r4,|
000011a0  72 34 2c 23 26 43 43 30  0d 0a b4 17 20 20 53 54  |r4,#&CC0....  ST|
000011b0  52 20 20 20 20 20 72 34  2c 20 5b 72 31 34 5d 0d  |R     r4, [r14].|
000011c0  0a c8 28 3b 20 53 65 74  20 74 68 65 20 43 61 6c  |..(; Set the Cal|
000011d0  6c 42 61 63 6b 48 61 6e  64 6c 65 72 20 75 70 20  |lBackHandler up |
000011e0  4e 4f 57 20 21 21 21 0d  0a dc 25 20 20 4c 44 52  |NOW !!!...%  LDR|
000011f0  42 20 20 20 20 72 30 2c  20 5b 52 31 32 2c 23 69  |B    r0, [R12,#i|
00001200  6e 74 65 72 6c 6f 63 6b  20 20 20 5d 0d 0a e6 14  |nterlock   ]....|
00001210  20 20 54 45 51 20 20 20  20 20 72 30 2c 20 23 30  |  TEQ     r0, #0|
00001220  0d 0a f0 3b 20 20 42 4e  45 20 20 20 20 20 6c 6c  |...;  BNE     ll|
00001230  30 30 34 20 20 20 20 20  20 20 20 20 20 20 20 20  |004             |
00001240  20 20 20 20 20 20 3b 20  5b 61 6c 72 65 61 64 79  |      ; [already|
00001250  20 72 65 71 75 65 73 74  65 64 5d 0d 0b 04 1e 20  | requested].... |
00001260  20 41 44 52 20 20 20 20  20 72 30 2c 20 43 61 6c  | ADR     r0, Cal|
00001270  6c 42 61 63 6b 43 6f 64  65 0d 0b 0e 14 20 20 4d  |lBackCode....  M|
00001280  4f 56 20 20 20 20 20 72  31 2c 20 77 70 0d 0b 18  |OV     r1, wp...|
00001290  1f 20 20 53 57 49 20 20  20 20 20 22 58 4f 53 5f  |.  SWI     "XOS_|
000012a0  41 64 64 43 61 6c 6c 42  61 63 6b 22 0d 0b 22 14  |AddCallBack"..".|
000012b0  20 20 4d 4f 56 56 43 20  20 20 72 30 2c 20 23 31  |  MOVVC   r0, #1|
000012c0  0d 0b 2c 24 20 20 53 54  52 56 43 42 20 20 72 30  |..,$  STRVCB  r0|
000012d0  2c 20 5b 52 31 32 2c 23  69 6e 74 65 72 6c 6f 63  |, [R12,#interloc|
000012e0  6b 20 20 5d 0d 0b 36 05  20 0d 0b 40 0a 2e 6c 6c  |k  ]..6. ..@..ll|
000012f0  30 30 34 0d 0b 4a 20 20  20 4c 44 4d 46 44 20 52  |004..J   LDMFD R|
00001300  31 33 21 2c 7b 52 31 34  7d 20 5c 5c 20 6c 72 5f  |13!,{R14} \\ lr_|
00001310  73 76 63 0d 0b 54 3d 20  20 54 45 51 50 20 20 20  |svc..T=  TEQP   |
00001320  20 72 35 2c 20 23 30 20  20 20 20 20 20 20 20 20  | r5, #0         |
00001330  20 20 20 20 20 20 20 20  20 3b 20 42 61 63 6b 20  |         ; Back |
00001340  74 6f 20 63 61 6c 6c 65  72 27 73 20 6d 6f 64 65  |to caller's mode|
00001350  0d 0b 5e 0f 20 20 4d 4f  56 20 52 30 2c 52 30 0d  |..^.  MOV R0,R0.|
00001360  0b 68 30 20 20 4c 44 4d  46 44 20 52 31 33 21 2c  |.h0  LDMFD R13!,|
00001370  7b 72 30 2d 72 31 2c 72  34 2d 72 35 2c 50 43 7d  |{r0-r1,r4-r5,PC}|
00001380  20 20 20 3b 20 50 61 73  73 20 69 74 20 6f 6e 0d  |   ; Pass it on.|
00001390  0b 7c 22 3b 20 49 6e 20  20 20 20 72 30 2d 72 36  |.|"; In    r0-r6|
000013a0  20 6d 61 79 20 62 65 20  63 6f 72 72 75 70 74 65  | may be corrupte|
000013b0  64 0d 0b 86 14 3b 20 20  20 20 20 20 20 77 70 20  |d....;       wp |
000013c0  76 61 6c 69 64 0d 0b 90  21 3b 20 20 20 20 20 20  |valid...!;      |
000013d0  20 53 56 43 20 6d 6f 64  65 2c 20 49 52 51 20 65  | SVC mode, IRQ e|
000013e0  6e 61 62 6c 65 64 0d 0b  a4 11 2e 43 61 6c 6c 42  |nabled.....CallB|
000013f0  61 63 6b 43 6f 64 65 0d  0b ae 17 20 20 53 54 4d  |ackCode....  STM|
00001400  46 44 20 52 31 33 21 2c  20 7b 52 31 34 7d 0d 0b  |FD R13!, {R14}..|
00001410  c2 18 20 20 4d 4f 56 20  20 20 20 20 72 31 34 2c  |..  MOV     r14,|
00001420  20 23 56 49 44 43 0d 0b  cc 38 20 20 4d 4f 56 20  | #VIDC...8  MOV |
00001430  20 20 20 20 72 30 2c 20  23 26 34 30 30 30 30 30  |    r0, #&400000|
00001440  30 30 20 20 20 20 20 20  20 20 20 20 3b 20 53 65  |00          ; Se|
00001450  74 20 62 6f 72 64 65 72  20 62 6c 61 63 6b 0d 0b  |t border black..|
00001460  d6 17 20 20 53 54 52 20  20 20 20 20 72 30 2c 20  |..  STR     r0, |
00001470  5b 72 31 34 5d 0d 0b ea  14 20 20 4d 4f 56 20 20  |[r14]....  MOV  |
00001480  20 20 20 72 30 2c 20 23  30 0d 0b f4 23 20 20 53  |   r0, #0...#  S|
00001490  54 52 42 20 20 20 20 72  30 2c 20 5b 52 31 32 2c  |TRB    r0, [R12,|
000014a0  23 69 6e 74 65 72 6c 6f  63 6b 20 5d 0d 0b fe 05  |#interlock ]....|
000014b0  20 0d 0c 08 27 20 20 54  45 51 50 20 50 43 2c 23  | ...'  TEQP PC,#|
000014c0  30 20 20 3b 20 46 6f 72  63 65 20 55 73 65 72 20  |0  ; Force User |
000014d0  4d 6f 64 65 20 6e 6f 77  0d 0c 12 48 20 20 4d 4f  |Mode now...H  MO|
000014e0  56 20 52 30 2c 52 30 20  20 20 3b 20 4e 4f 50 20  |V R0,R0   ; NOP |
000014f0  69 6e 73 74 72 75 63 74  69 6f 6e 20 74 6f 20 61  |instruction to a|
00001500  6c 6c 6f 77 20 43 50 55  20 74 69 6d 65 20 74 6f  |llow CPU time to|
00001510  20 73 6f 72 74 20 69 74  73 65 6c 66 20 6f 75 74  | sort itself out|
00001520  0d 0c 26 1c 20 20 41 44  52 20 20 20 20 20 72 30  |..&.  ADR     r0|
00001530  20 2c 20 65 72 72 62 6c  6f 63 6b 25 0d 0c 30 1c  | , errblock%..0.|
00001540  20 20 53 57 49 20 22 4f  53 5f 47 65 6e 65 72 61  |  SWI "OS_Genera|
00001550  74 65 45 72 72 6f 72 22  0d 0c 80 15 20 20 4c 44  |teError"....  LD|
00001560  4d 46 44 20 52 31 33 21  2c 7b 50 43 7d 0d 0c 9e  |MFD R13!,{PC}...|
00001570  0e 2e 65 72 72 62 6c 6f  63 6b 25 0d 0c a8 24 20  |..errblock%...$ |
00001580  20 45 51 55 44 20 2d 31  20 20 20 3b 20 54 72 79  | EQUD -1   ; Try|
00001590  20 30 20 69 6e 73 74 65  61 64 20 68 65 72 65 0d  | 0 instead here.|
000015a0  0c bc 14 20 20 45 51 55  53 20 22 41 62 6f 72 74  |...  EQUS "Abort|
000015b0  65 64 22 0d 0c c6 0c 20  20 45 51 55 42 20 30 0d  |ed"....  EQUB 0.|
000015c0  0c d0 0b 20 20 41 4c 49  47 4e 0d 0c ee 0f 2e 74  |...  ALIGN.....t|
000015d0  72 61 63 65 6e 61 6d 65  25 0d 0c f8 15 20 20 45  |racename%....  E|
000015e0  51 55 53 20 22 48 6f 73  74 56 64 75 3a 22 0d 0d  |QUS "HostVdu:"..|
000015f0  02 0c 20 20 45 51 55 42  20 30 0d 0d 0c 0b 20 20  |..  EQUB 0....  |
00001600  41 4c 49 47 4e 0d 0d 2a  05 5d 0d 0d 34 05 e1 0d  |ALIGN..*.]..4...|
00001610  0f 64 14 dd a4 41 44 44  52 28 72 65 67 2c 64 65  |.d...ADDR(reg,de|
00001620  73 74 29 0d 0f 6e 1b e7  20 28 64 65 73 74 20 2d  |st)..n.. (dest -|
00001630  20 50 25 20 2d 20 38 29  20 3e 3d 30 20 8c 0d 0f  | P% - 8) >=0 ...|
00001640  78 22 20 20 e7 20 28 64  65 73 74 20 2d 20 50 25  |x"  . (dest - P%|
00001650  20 2d 20 38 29 20 3c 20  26 31 30 30 30 30 20 8c  | - 8) < &10000 .|
00001660  0d 0f 82 10 20 20 20 20  5b 4f 50 54 6f 70 74 25  |....    [OPTopt%|
00001670  0d 0f 8c 2a 20 20 20 20  41 44 44 20 72 65 67 2c  |...*    ADD reg,|
00001680  50 43 2c 23 28 64 65 73  74 20 2d 20 50 25 20 2d  |PC,#(dest - P% -|
00001690  20 38 20 29 20 80 20 26  46 46 0d 0f 96 2c 20 20  | 8 ) . &FF...,  |
000016a0  20 20 41 44 44 20 72 65  67 2c 72 65 67 2c 23 28  |  ADD reg,reg,#(|
000016b0  64 65 73 74 20 2d 20 50  25 20 2d 20 34 29 20 80  |dest - P% - 4) .|
000016c0  20 26 46 46 30 30 0d 0f  a0 09 20 20 20 20 5d 0d  | &FF00....    ].|
000016d0  0f aa 07 20 20 cc 0d 0f  b4 24 20 20 e7 20 28 64  |...  ....$  . (d|
000016e0  65 73 74 20 2d 20 50 25  20 2d 20 38 29 20 3c 20  |est - P% - 8) < |
000016f0  26 31 30 30 30 30 30 30  20 8c 0d 0f be 10 20 20  |&1000000 .....  |
00001700  20 20 5b 4f 50 54 6f 70  74 25 0d 0f c8 2a 20 20  |  [OPTopt%...*  |
00001710  20 20 41 44 44 20 72 65  67 2c 50 43 2c 23 28 64  |  ADD reg,PC,#(d|
00001720  65 73 74 20 2d 20 50 25  20 2d 20 38 20 29 20 80  |est - P% - 8 ) .|
00001730  20 26 46 46 0d 0f d2 2c  20 20 20 20 41 44 44 20  | &FF...,    ADD |
00001740  72 65 67 2c 72 65 67 2c  23 28 64 65 73 74 20 2d  |reg,reg,#(dest -|
00001750  20 50 25 20 2d 20 34 29  20 80 20 26 46 46 30 30  | P% - 4) . &FF00|
00001760  0d 0f dc 2e 20 20 20 20  41 44 44 20 72 65 67 2c  |....    ADD reg,|
00001770  72 65 67 2c 23 28 64 65  73 74 20 2d 20 50 25 20  |reg,#(dest - P% |
00001780  2d 20 30 29 20 80 20 26  46 46 30 30 30 30 0d 0f  |- 0) . &FF0000..|
00001790  e6 09 20 20 20 20 5d 0d  0f f0 07 20 20 cc 0d 0f  |..    ]....  ...|
000017a0  fa 1e 20 20 20 20 85 20  30 2c 22 41 44 52 20 6f  |..    . 0,"ADR o|
000017b0  75 74 20 6f 66 20 72 61  6e 67 65 22 0d 10 04 07  |ut of range"....|
000017c0  20 20 cd 0d 10 0e 07 20  20 cd 0d 10 18 05 cc 0d  |  .....  .......|
000017d0  10 22 26 20 20 e7 20 28  30 2d 28 64 65 73 74 20  |."&  . (0-(dest |
000017e0  2d 20 50 25 20 2d 20 38  29 29 20 3c 20 26 31 30  |- P% - 8)) < &10|
000017f0  30 30 30 20 8c 0d 10 2c  10 20 20 20 20 5b 4f 50  |000 ...,.    [OP|
00001800  54 6f 70 74 25 0d 10 36  2e 20 20 20 20 53 55 42  |Topt%..6.    SUB|
00001810  20 72 65 67 2c 50 43 2c  23 28 30 2d 28 64 65 73  | reg,PC,#(0-(des|
00001820  74 20 2d 20 50 25 20 2d  20 38 20 29 29 20 80 20  |t - P% - 8 )) . |
00001830  26 46 46 0d 10 40 30 20  20 20 20 53 55 42 20 72  |&FF..@0    SUB r|
00001840  65 67 2c 72 65 67 2c 23  28 30 2d 28 64 65 73 74  |eg,reg,#(0-(dest|
00001850  20 2d 20 50 25 20 2d 20  34 29 29 20 80 20 26 46  | - P% - 4)) . &F|
00001860  46 30 30 0d 10 4a 09 20  20 20 20 5d 0d 10 54 07  |F00..J.    ]..T.|
00001870  20 20 cc 0d 10 5e 28 20  20 e7 20 28 30 2d 28 64  |  ...^(  . (0-(d|
00001880  65 73 74 20 2d 20 50 25  20 2d 20 38 29 29 20 3c  |est - P% - 8)) <|
00001890  20 26 31 30 30 30 30 30  30 20 8c 0d 10 68 10 20  | &1000000 ...h. |
000018a0  20 20 20 5b 4f 50 54 6f  70 74 25 0d 10 72 2e 20  |   [OPTopt%..r. |
000018b0  20 20 20 53 55 42 20 72  65 67 2c 50 43 2c 23 28  |   SUB reg,PC,#(|
000018c0  30 2d 28 64 65 73 74 20  2d 20 50 25 20 2d 20 38  |0-(dest - P% - 8|
000018d0  20 29 29 20 80 20 26 46  46 0d 10 7c 30 20 20 20  | )) . &FF..|0   |
000018e0  20 53 55 42 20 72 65 67  2c 72 65 67 2c 23 28 30  | SUB reg,reg,#(0|
000018f0  2d 28 64 65 73 74 20 2d  20 50 25 20 2d 20 34 29  |-(dest - P% - 4)|
00001900  29 20 80 20 26 46 46 30  30 0d 10 86 32 20 20 20  |) . &FF00...2   |
00001910  20 53 55 42 20 72 65 67  2c 72 65 67 2c 23 28 30  | SUB reg,reg,#(0|
00001920  2d 28 64 65 73 74 20 2d  20 50 25 20 2d 20 30 29  |-(dest - P% - 0)|
00001930  29 20 80 20 26 46 46 30  30 30 30 0d 10 90 09 20  |) . &FF0000.... |
00001940  20 20 20 5d 0d 10 9a 07  20 20 cc 0d 10 a4 1e 20  |   ]....  ..... |
00001950  20 20 20 85 20 30 2c 22  41 44 52 20 6f 75 74 20  |   . 0,"ADR out |
00001960  6f 66 20 72 61 6e 67 65  22 0d 10 ae 07 20 20 cd  |of range"....  .|
00001970  0d 10 b8 07 20 20 cd 0d  10 c2 05 cd 0d 10 cc 07  |....  ..........|
00001980  3d 22 22 0d 10 e0 05 e0  0d ff                    |="".......|
0000198a