ON ERROR PRINT REPORT$;" at line ";ERL:END
DIM code% 256000
:
FOR pass%=0 TO 2 STEP 2
P%=code%
:
[          OPT        pass%

B       start

.offset_to_array_buffer
EQUD 320

.initialisation_code
STMFD   R13!,{R0-R12,R14}
LDR     R0,offset_to_array_buffer
ADD     R0,R12,R0
STR     R0,[R12,#0]
MOV     R0,#4
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#8
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#12
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#40
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#52
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#56
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#10
MOV     R1,#116
STR     R0,[R12,R1]
MOV     R0,#0
MOV     R1,#120
STR     R0,[R12,R1]
LDR     R0,[R12,#0]
MOV     R1,#0
ADD     R0,R0,R1
MOV     R2,#124
STR     R0,[R12,R2]
MOV     R0,#5
MOV     R1,#128
STR     R0,[R12,R1]
MOV     R0,#2
MOV     R1,#132
STR     R0,[R12,R1]
LDR     R0,[R12,#0]
MOV     R1,#44
ADD     R0,R0,R1
MOV     R2,#136
STR     R0,[R12,R2]
MOV     R0,#5
MOV     R1,#140
STR     R0,[R12,R1]
MOV     R0,#0
MOV     R1,#144
STR     R0,[R12,R1]
LDR     R0,[R12,#0]
MOV     R1,#116
ADD     R0,R0,R1
MOV     R2,#148
STR     R0,[R12,R2]
MOV     R0,#5
MOV     R1,#152
STR     R0,[R12,R1]
MOV     R0,#2
MOV     R1,#156
STR     R0,[R12,R1]
LDR     R0,[R12,#0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#116
MOV     R1,#6
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R0,R0,R1
MOV     R2,#160
STR     R0,[R12,R2]
LDR     R0,[R12,#0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#116
MOV     R1,#24
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R0,R0,R1
MOV     R2,#164
STR     R0,[R12,R2]
MOV     R0,#188
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#200
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#204
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#212
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#220
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#232
ADD     R0,R12,R0
BL      allocate_memory_for_string
MOV     R0,#5
MOV     R1,#236
STR     R0,[R12,R1]
MOV     R0,#0
MOV     R1,#240
STR     R0,[R12,R1]
LDR     R0,[R12,#0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#120
MOV     R1,#25
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R0,R0,R1
MOV     R2,#244
STR     R0,[R12,R2]
MOV     R0,#5
MOV     R1,#248
STR     R0,[R12,R1]
MOV     R0,#0
MOV     R1,#252
STR     R0,[R12,R1]
LDR     R0,[R12,#0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#120
MOV     R1,#31
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R0,R0,R1
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#0
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
STR     R0,[R12,R2]
STMFD   R13!,{1-11,14}
MOV     R0,#8
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
BL      allocate_memory_for_string
STMFD   R13!,{1-11,14}
MOV     R0,#20
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
BL      allocate_memory_for_string
STMFD   R13!,{1-11,14}
MOV     R0,#32
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
BL      allocate_memory_for_string
STMFD   R13!,{1-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
BL      allocate_memory_for_string
STMFD   R13!,{1-11,14}
MOV     R0,#40
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
BL      allocate_memory_for_string
LDMFD   R13!,{R0-R12,R15}^

.program_code



;  Example BASIC source file to demonstrate !Whizz. All supported commands
;  are included here along with some notes on there use. Please read through
;  this file before using !Whizz on your own code. To look up a command do
;  a search for *<command>*.
;  =========================================================================
;  *PRINT* command (print to screen, see PRINT# for file printing). Nice and
;  easy one to start with. Print is partially supported in that no TABs or
;  semi-colons can be used in a PRINT statement. Strings can be concatenated
;  using a '+'.
STMFD   R13!,{1-11,14}
MOV     R0,#0
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  A simple string
STMFD   R13!,{1-11,14}
MOV     R0,#16
ADD     R0,R11,R0
MOV     R1,#32
ADD     R1,R11,R1
MOV     R2,#40
ADD     R2,R11,R2
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Some joined strings
STMFD   R13!,{1-11,14}
MOV     R0,#44
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
;  A string var
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
MOV     R1,#52
ADD     R1,R11,R1
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Joining a string var to a str
STMFD   R13!,{1-11,14}
MOV     R0,#64
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#210
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Using the STR$ command
STMFD   R13!,{1-11,14}
MOV     R0,#84
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#210
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Printing an immediate integer
STMFD   R13!,{1-11,14}
MOV     R0,#100
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#210
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertHex8"
.str_loop2
LDRB    R3,[R0]
CMP     R3,#48
ADDEQ   R0,R0,#1
BEQ     str_loop2
CMP     R3,#0
SUBEQ   R0,R0,#1
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Printing a hex number
;  End of *PRINT* command.
;  =========================================================================
;  Different methods for specifying numbers (denary, hex and binary)
STMFD   R13!,{1-11,14}
MOV     R0,#100
LDMFD   R13!,{1-11,14}
MOV     R1,#16
STR     R0,[R12,R1]
;  A denary number
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#35
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#20
STR     R0,[R12,R1]
;  A hex number
STMFD   R13!,{1-11,14}
MOV     R0,#51
LDMFD   R13!,{1-11,14}
MOV     R1,#24
STR     R0,[R12,R1]
;  A binary number
STMFD   R13!,{1-11,14}
MOV     R0,#4
MOV     R1,#8
MOV     R0,R0,ASLR1
LDMFD   R13!,{1-11,14}
MOV     R1,#28
STR     R0,[R12,R1]
;  A shifted number
STMFD   R13!,{1-11,14}
MOV     R0,#16
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#24
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#28
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  =========================================================================
;  *ABS* command (in-built BASIC function which returns the ABSolute value
;  of a number, eg ABS(-3) = 3).
STMFD   R13!,{1-11,14}
MOV     R0,#3
RSB     R0,R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#32
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#32
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
CMP     R0,#0
RSBLT   R0,R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#36
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#124
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#32
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#152
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#36
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#172
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#32
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
CMP     R0,#0
RSBLT   R0,R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
MOV     R2,#192
ADD     R2,R11,R2
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  End of *ABS* command
;  =========================================================================
;  *ASC* command (returns the ASCII character of the first character in a
;  string). *CHR$* (returns the ASCII character with the given code)
STMFD   R13!,{1-11,14}
MOV     R0,#196
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#224
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
LDRB    R0,[R0]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#228
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
LDRB    R0,[R0]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#44
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#44
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#65
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R2,[R12,R1]
STRB    R0,[R2]
MOV     R0,#0
STRB    R0,[R2,#1]
LDR     R1,[R12,R1]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#80
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#224
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
LDRB    R0,[R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#1
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R2,[R12,R1]
STRB    R0,[R2]
MOV     R0,#0
STRB    R0,[R2,#1]
LDR     R1,[R12,R1]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  End of *ASC* and *CHR$* commands
;  ========================================================================
;  *DIV* and *MOD* (return the whole number (DIV) and the remainder (MOD)
;  after a division).
STMFD   R13!,{1-11,14}
MOV     R0,#14
LDMFD   R13!,{1-11,14}
MOV     R1,#48
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#6
LDMFD   R13!,{1-11,14}
MOV     R1,#20
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#108
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#120
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
ADD     R2,R11,R2
STMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#8
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R3,R0
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#52
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R3
MOV     R2,#56
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#128
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
MOV     R1,#20
LDR     R1,[R12,R1]
STMFD   R13!,{1-11,14}
BL      library_routine_divide
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#136
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
ADD     R2,R11,R2
STMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#8
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R3,R0
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#52
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R3
MOV     R2,#56
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  End of *DIV* and *MOD*
;  ========================================================================
;  *FOR* *TO* *STEP* *NEXT* (FOR..NEXT loops)
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
MOV     R2,#60
ADD     R2,R12,R2
STR     R0,[R2]
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R2,#64
ADD     R2,R12,R2
STR     R1,[R2]
.loop1
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  A simple loop
MOV     R0,#68
ADD     R0,R12,R0
LDR     R1,[R0]
MOV     R2,#64
ADD     R2,R12,R2
LDR     R3,[R2]
ADD     R4,R1,R3
STR     R4,[R0]
MOV     R5,#60
ADD     R5,R12,R5
LDR     R6,[R5]
CMP     R3,#0
BGT     loop_next_skip1
CMP     R4,R6
BGE     loop1
B       end_of_loop1
.loop_next_skip1
CMP     R4,R6
BLE     loop1
.end_of_loop1
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
MOV     R1,#72
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#50
LDMFD   R13!,{1-11,14}
MOV     R1,#76
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
MOV     R1,#80
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#72
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#76
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R2,#84
ADD     R2,R12,R2
STR     R0,[R2]
STMFD   R13!,{0,2-11,14}
MOV     R0,#80
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
MOV     R2,#88
ADD     R2,R12,R2
STR     R1,[R2]
.loop2
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
MOV     R1,#10
MOV     R2,#0
STMFD   R13!,{1-11,14}
BL      library_routine_divide
MOV     R0,R1
LDMFD   R13!,{1-11,14}
CMP     R0,R2
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else1
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#148
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R11,R1
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.else1
.endif1
MOV     R0,#68
ADD     R0,R12,R0
LDR     R1,[R0]
MOV     R2,#88
ADD     R2,R12,R2
LDR     R3,[R2]
ADD     R4,R1,R3
STR     R4,[R0]
MOV     R5,#84
ADD     R5,R12,R5
LDR     R6,[R5]
CMP     R3,#0
BGT     loop_next_skip2
CMP     R4,R6
BGE     loop2
B       end_of_loop2
.loop_next_skip2
CMP     R4,R6
BLE     loop2
.end_of_loop2
;  End of FOR..NEXT loops
;  ========================================================================
;  *LEFT$(* *RIGHT$(* *MID$(* (string manipulation)
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      library_routine_LEFT_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Leftmost 2 characters of the string
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#1
RSB     R1,R0,#0
LDMFD   R13!,{0,2-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      library_routine_LEFT_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Leftmost LEN-1 characters of the string
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#176
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R1,R11,R0
LDMFD   R13!,{0,2-11,14}
BL      library_routine_set_left_part_of_string
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      library_routine_RIGHT_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Rightmost 2 characters of the string
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      library_routine_RIGHT_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Rightmost character
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#180
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R1,R11,R0
LDMFD   R13!,{0,2-11,14}
BL      library_routine_set_right_part_of_string
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#3
LDMFD   R13!,{0-1,3-11,14}
MOV     R3,#4
LDR     R3,[R12,R3]
BL      library_routine_MID_function
MOV     R0,R3
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Starting from second char prints 3 chars
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#4
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#4
LDMFD   R13!,{0-1,3-11,14}
MOV     R3,#4
LDR     R3,[R12,R3]
BL      library_routine_MID_function
MOV     R0,R3
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Gives rest of string after 3rd character
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#4
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#180
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R2,R11,R0
LDMFD   R13!,{0-1,3-11,14}
BL      library_routine_set_middle_part_of_string
;  Alters the 4th and 5th characters
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  End of string manipulation functions
;  ========================================================================
;  *INSTR(* *LEN* (string info functions)
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#184
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#204
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
MOV     R1,#12
LDR     R1,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#220
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
BL      library_routine_LEN_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#252
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
ADD     R2,R11,R2
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#8
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#36
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R1,R11,R0
LDMFD   R13!,{0,2-11,14}
MOV     R2,#1
BL      library_routine_INSTR_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#44
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R1,R11,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#9
LDMFD   R13!,{0-1,3-11,14}
BL      library_routine_INSTR_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#92
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#48
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#92
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  End of *INSTR(* and *LEN*
;  ========================================================================
;  *STR$* (converting numbers into text)
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#0
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#16
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#104
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#16
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#128
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#16
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertHex8"
.str_loop17
LDRB    R3,[R0]
CMP     R3,#48
ADDEQ   R0,R0,#1
BEQ     str_loop17
CMP     R3,#0
SUBEQ   R0,R0,#1
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  ========================================================================
;  *SWAP* (swapping the contents of two variables)
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
MOV     R1,#48
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDMFD   R13!,{1-11,14}
MOV     R1,#20
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#152
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#176
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#96
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#48
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#96
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#20
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#152
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  ========================================================================
;  *CASE* *OF* *WHEN* *OTHERWISE* *ENDCASE (CASE construct)
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
MOV     R2,#100
ADD     R2,R12,R2
STR     R0,[R2]
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R2,#104
ADD     R2,R12,R2
STR     R1,[R2]
.loop3
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#108
STR     R0,[R12,R1]
MOV     R0,#0
MOV     R1,#112
STR     R0,[R12,R1]
.when1_1
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R0,#108
LDR     R0,[R12,R0]
CMP     R0,R1
MVNEQ   R0,#0
MOV     R1,#112
STREQ   R0,[R12,R1]
BEQ     case_action1_1
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R0,#108
LDR     R0,[R12,R0]
CMP     R0,R1
MVNEQ   R0,#0
MOV     R1,#112
STREQ   R0,[R12,R1]
BEQ     case_action1_1
STMFD   R13!,{0,2-11,14}
MOV     R1,#3
LDMFD   R13!,{0,2-11,14}
MOV     R0,#108
LDR     R0,[R12,R0]
CMP     R0,R1
MVNEQ   R0,#0
MOV     R1,#112
STREQ   R0,[R12,R1]
BEQ     case_action1_1
STMFD   R13!,{0,2-11,14}
MOV     R1,#4
LDMFD   R13!,{0,2-11,14}
MOV     R0,#108
LDR     R0,[R12,R0]
CMP     R0,R1
MVNEQ   R0,#0
MOV     R1,#112
STREQ   R0,[R12,R1]
BEQ     case_action1_1
STMFD   R13!,{0,2-11,14}
MOV     R1,#5
LDMFD   R13!,{0,2-11,14}
MOV     R0,#108
LDR     R0,[R12,R0]
CMP     R0,R1
MVNEQ   R0,#0
MOV     R1,#112
STREQ   R0,[R12,R1]
BEQ     case_action1_1
B       when1_2
.case_action1_1
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#208
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.when1_2
STMFD   R13!,{0,2-11,14}
MOV     R1,#6
LDMFD   R13!,{0,2-11,14}
MOV     R0,#108
LDR     R0,[R12,R0]
CMP     R0,R1
MVNEQ   R0,#0
MOV     R1,#112
STREQ   R0,[R12,R1]
BEQ     case_action1_2
B       when1_3
.case_action1_2
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#224
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.when1_3
MOV     R1,#112
LDR     R0,[R12,R1]
CMN     R0,#1
BEQ     endcase1
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#236
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.when1_4
.endcase1
MOV     R0,#68
ADD     R0,R12,R0
LDR     R1,[R0]
MOV     R2,#104
ADD     R2,R12,R2
LDR     R3,[R2]
ADD     R4,R1,R3
STR     R4,[R0]
MOV     R5,#100
ADD     R5,R12,R5
LDR     R6,[R5]
CMP     R3,#0
BGT     loop_next_skip3
CMP     R4,R6
BGE     loop3
B       end_of_loop3
.loop_next_skip3
CMP     R4,R6
BLE     loop3
.end_of_loop3
;  End of CASE construct
;  ========================================================================
;  *DIM*. Dimensioning arrays and areas of memory. Note   the size of all
;  arrays and areas of memory MUST be an absolute value (eg. you can't have
;  DIM array%(size%) or DIM block% size%)
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#148
LDR     R1,[R12,R1]
MOV     R2,#256
MUL     R3,R0,R2
ADD     R0,R1,R3
LDMFD   R13!,{1-11,14}
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#252
MOV     R1,#2
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#65
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R2,[R12,R1]
STRB    R0,[R2]
MOV     R0,#0
STRB    R0,[R2,#1]
LDR     R1,[R12,R1]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#12
MOV     R1,#3
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
ADD     R2,R11,R2
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R2,#152
MOV     R3,#160
BL      library_routine_retrieve_string_array_value
LDMFD   R13!,{1-11,14}
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R2,#152
MOV     R3,#160
BL      library_routine_retrieve_string_array_value
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#44
MOV     R1,#3
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R11,R1
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R2,#152
MOV     R3,#160
BL      library_routine_retrieve_string_array_value
LDMFD   R13!,{1-11,14}
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{0-2,4-11,14}
MOV     R3,#50
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R0,R0,ASL#2
MOV     R1,#124
LDR     R1,[R12,R1]
ADD     R0,R1,R0
STR     R3,[R0]
STMFD   R13!,{0-2,4-11,14}
MOV     R3,#100
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R2,#128
MOV     R4,#136
BL      library_routine_address_of_integer_array_element
STR     R3,[R0]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R0,R0,ASL#2
MOV     R1,#124
LDR     R1,[R12,R1]
LDR     R0,[R1,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R2,#128
MOV     R3,#136
BL      library_routine_retrieve_integer_array_value
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#148
LDR     R1,[R12,R1]
MOV     R2,#256
MUL     R3,R0,R2
ADD     R0,R1,R3
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#2
LDMFD   R13!,{0,2-11,14}
MOV     R2,#152
MOV     R3,#160
BL      library_routine_retrieve_string_array_value
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#128
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#0
LDMFD   R13!,{0,2-11,14}
STRB    R2,[R0,R1]
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#64
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
STRB    R2,[R0,R1]
STMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#0
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
MOV     R2,R0
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#4
LDMFD   R13!,{0,2-11,14}
STR     R2,[R0,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#56
MOV     R1,#3
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
MOV     R1,#8
ADD     R1,R0,R1
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#112
MOV     R1,#3
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertHex8"
.str_loop23
LDRB    R3,[R0]
CMP     R3,#48
ADDEQ   R0,R0,#1
BEQ     str_loop23
CMP     R3,#0
SUBEQ   R0,R0,#1
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#144
MOV     R1,#3
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
ADD     R2,R11,R2
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#156
MOV     R1,#3
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
LDRB    R0,[R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#192
MOV     R1,#3
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
LDRB    R0,[R0,R1]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#224
MOV     R1,#3
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#4
LDMFD   R13!,{0,2-11,14}
LDR     R0,[R0,R1]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#8
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
LDR     R0,[R12,R0]
MOV     R1,#8
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  End of *DIM*
;  ========================================================================
;  *OSCLI*. Performing CLI (*) commands from a BASIC program.
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#40
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_CLI"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#40
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#48
MOV     R1,#4
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R11,R1
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_CLI"
;  End of *OSCLI*
;  ========================================================================
;  *SYS* (calling SWI routines).
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#56
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#0
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{0-2,4-11,14}
MOV     R3,#0
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{0-3,5-11,14}
MOV     R4,#0
LDMFD   R13!,{0-3,5-11,14}
STMFD   R13!,{0-4,6-11,14}
MOV     R5,#0
LDMFD   R13!,{0-4,6-11,14}
STMFD   R13!,{0-5,7-11,14}
MOV     R6,#0
LDMFD   R13!,{0-5,7-11,14}
STMFD   R13!,{0-6,8-11,14}
MOV     R7,#0
LDMFD   R13!,{0-6,8-11,14}
STMFD   R13!,{0-7,9-11,14}
MOV     R8,#0
LDMFD   R13!,{0-7,9-11,14}
STMFD   R13!,{0-8,10-11,14}
MOV     R9,#0
LDMFD   R13!,{0-8,10-11,14}
SWI     "OS_CLI"
;  A simple SWI call
STMFD   R13!,{1-11,14}
MOV     R0,#0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#0
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{0-2,4-11,14}
MOV     R3,#0
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{0-3,5-11,14}
MOV     R4,#0
LDMFD   R13!,{0-3,5-11,14}
STMFD   R13!,{0-4,6-11,14}
MOV     R5,#0
LDMFD   R13!,{0-4,6-11,14}
STMFD   R13!,{0-5,7-11,14}
MOV     R6,#0
LDMFD   R13!,{0-5,7-11,14}
STMFD   R13!,{0-6,8-11,14}
MOV     R7,#0
LDMFD   R13!,{0-6,8-11,14}
STMFD   R13!,{0-7,9-11,14}
MOV     R8,#0
LDMFD   R13!,{0-7,9-11,14}
STMFD   R13!,{0-8,10-11,14}
MOV     R9,#0
LDMFD   R13!,{0-8,10-11,14}
SWI     "OS_ReadMonotonicTime"
STMFD   R13!,{R0-R11,R14}
MOV     R1,#168
STR     R0,[R12,R1]
LDMFD   R13!,{R0-R11,R14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#64
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#0
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{0-2,4-11,14}
MOV     R3,#0
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{0-3,5-11,14}
MOV     R4,#0
LDMFD   R13!,{0-3,5-11,14}
STMFD   R13!,{0-4,6-11,14}
MOV     R5,#0
LDMFD   R13!,{0-4,6-11,14}
STMFD   R13!,{0-5,7-11,14}
MOV     R6,#0
LDMFD   R13!,{0-5,7-11,14}
STMFD   R13!,{0-6,8-11,14}
MOV     R7,#0
LDMFD   R13!,{0-6,8-11,14}
STMFD   R13!,{0-7,9-11,14}
MOV     R8,#0
LDMFD   R13!,{0-7,9-11,14}
STMFD   R13!,{0-8,10-11,14}
MOV     R9,#0
LDMFD   R13!,{0-8,10-11,14}
SWI     "XOS_CLI"
STMFD   R13!,{R0-R11,R14}
MOV     R1,#172
STR     R0,[R12,R1]
LDMFD   R13!,{R0-R11,R14}
STMFD   R13!,{R0-R11,R14}
MOV     R0,R1
MOV     R1,#176
STR     R0,[R12,R1]
LDMFD   R13!,{R0-R11,R14}
STMFD   R13!,{R0-R11,R14}
MOV     R0,R2
MOV     R1,#180
STR     R0,[R12,R1]
LDMFD   R13!,{R0-R11,R14}
STMFD   R13!,{R0-R11,R14}
MOV     R0,R15,ASR#28
MOV     R1,#184
STR     R0,[R12,R1]
LDMFD   R13!,{R0-R11,R14}
STMFD   R13!,{1-11,14}
MOV     R0,#184
LDR     R0,[R12,R0]
MOV     R1,#1
AND     R0,R0,R1
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else2
;  File 'wibble' doesn't exist
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#76
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#128
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#4
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#188
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
.repeat_loop1
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#172
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#68
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
LDRB    R0,[R0,R1]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#192
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#192
LDR     R0,[R12,R0]
MOV     R1,#0
CMP     R0,R1
MVNNE   R0,#0
MOVEQ   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else3
STMFD   R13!,{1-11,14}
MOV     R0,#188
LDR     R0,[R12,R0]
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#192
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R2,[R12,R1]
STRB    R0,[R2]
MOV     R0,#0
STRB    R0,[R2,#1]
LDR     R1,[R12,R1]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#188
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
MOV     R1,#1
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
.else3
.endif3
STMFD   R13!,{1-11,14}
MOV     R0,#192
LDR     R0,[R12,R0]
MOV     R1,#0
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     repeat_loop1
STMFD   R13!,{1-11,14}
MOV     R0,#188
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.else2
.endif2
;  ========================================================================
;  *WHILE* *ENDWHILE*
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
.while_loop1
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
MOV     R1,#10
CMP     R0,R1
MVNLT   R0,#0
MOVGE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     end_of_while_loop1
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
MOV     R1,#1
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#196
STR     R0,[R12,R1]
.while_loop2
STMFD   R13!,{1-11,14}
MOV     R0,#196
LDR     R0,[R12,R0]
MOV     R1,#2
CMP     R0,R1
MVNLT   R0,#0
MOVGE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     end_of_while_loop2
STMFD   R13!,{1-11,14}
MOV     R0,#196
LDR     R0,[R12,R0]
MOV     R1,#1
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
MOV     R1,#196
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#196
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Nested WHILE loop
B       while_loop2
.end_of_while_loop2
B       while_loop1
.end_of_while_loop1
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#196
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  ========================================================================
;  *REPEAT* *UNTIL*
STMFD   R13!,{1-11,14}
MOV     R0,#0
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
.repeat_loop2
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
MOV     R1,#1
ADD     R0,R0,R1
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#68
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#1
LDMFD   R13!,{0-1,3-11,14}
MOV     R3,#4
LDR     R3,[R12,R3]
BL      library_routine_MID_function
MOV     R0,R3
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#200
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
MOV     R0,#200
LDR     R0,[R12,R0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#224
MOV     R1,#4
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R11,R1
STMFD   R13!,{1-11,14}
BL      library_routine_compare_strings_for_equivalence
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     repeat_loop2
;  ========================================================================
;  *IF* *THEN* *ELSE* *ENDIF*. All IF constructs must be in the form IF,
;  THEN, [ELSE], ENDIF.
STMFD   R13!,{1-11,14}
MOV     R0,#100
LDMFD   R13!,{1-11,14}
MOV     R1,#48
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#200
LDMFD   R13!,{1-11,14}
MOV     R1,#20
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
MOV     R1,#100
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else4
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#228
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.else4
.endif4
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
MOV     R1,#20
LDR     R1,[R12,R1]
CMP     R0,R1
MVNGT   R0,#0
MOVLE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else5
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#252
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
B       endif5
.else5
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#40
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.endif5
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
MOV     R1,#20
LDR     R1,[R12,R1]
MOV     R2,#48
LDR     R2,[R12,R2]
MOV     R3,#100
MOV     R4,#20
LDR     R4,[R12,R4]
MOV     R5,#3
STMFD   R13!,{0-5,7-11,14}
MOV     R0,#88
MOV     R1,#2
ADD     R6,R0,R1,ASL#8
LDMFD   R13!,{0-5,7-11,14}
MUL     R4,R5,R4
CMP     R0,R1
MVNLE   R0,#0
MOVGT   R0,#0
CMP     R2,R3
MVNEQ   R2,#0
MOVNE   R2,#0
CMP     R4,R6
MVNEQ   R4,#0
MOVNE   R4,#0
AND     R0,R0,R2
AND     R0,R0,R4
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else6
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#96
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
B       endif6
.else6
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#120
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.endif6
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
MOV     R1,#100
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else7
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
MOV     R1,#200
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else8
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#144
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
B       endif8
.else8
STMFD   R13!,{1-11,14}
MOV     R0,#20
LDR     R0,[R12,R0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#144
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else9
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#172
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.else9
.endif9
.endif8
.else7
.endif7
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#48
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#20
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      multiply_two_numbers
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#32
MOV     R1,#78
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else10
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#192
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
.else10
.endif10
;  End of *IF* *THEN* *ELSE* *ENDIF*
;  ========================================================================
;  *OPENOUT* *OPENIN* *OPENUP* *CLOSE* *PTR#* *EXT#* *EOF#* *PRINT#*
;  *INPUT#* *BGET#* *BPUT#* (ie. file handling).
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#204
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#240
MOV     R1,#5
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#204
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#&83
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R1,R11,R0
LDMFD   R13!,{0,2-11,14}
MOV     R2,#0
SWI     "OS_Find"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#208
STR     R0,[R12,R1]
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#24
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R2,R11,R0
LDMFD   R13!,{0-1,3-11,14}
.loop4
LDRB    R0,[R2],#1
CMP     R0,#0
SWINE   "OS_BPut"
BNE     loop4
MOV     R0,#10
SWI     "OS_BPut"
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#12
LDR     R2,[R12,R0]
LDMFD   R13!,{0-1,3-11,14}
.loop5
LDRB    R0,[R2],#1
CMP     R0,#0
SWINE   "OS_BPut"
BNE     loop5
MOV     R0,#10
SWI     "OS_BPut"
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#204
LDR     R2,[R12,R0]
LDMFD   R13!,{0-1,3-11,14}
.loop6
LDRB    R0,[R2],#1
CMP     R0,#0
SWINE   "OS_BPut"
BNE     loop6
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#224
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
LDRB    R0,[R0]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
LDMFD   R13!,{1-11,14}
MOV     R2,R0
LDMFD   R13!,{0-1,3-11,14}
.loop7
LDRB    R0,[R2],#1
CMP     R0,#0
SWINE   "OS_BPut"
BNE     loop7
MOV     R0,#10
SWI     "OS_BPut"
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Find"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#212
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#&43
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R1,R11,R0
LDMFD   R13!,{0,2-11,14}
MOV     R2,#0
SWI     "OS_Find"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#208
STR     R0,[R12,R1]
.while_loop3
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Args"
CMP     R2,#0
MVNNE   R0,#0
MOVEQ   R0,#0
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
CMP     R0,#0
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     end_of_while_loop3
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_BGet"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#216
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#216
LDR     R0,[R12,R0]
MOV     R1,#10
CMP     R0,R1
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     else11
STMFD   R13!,{1-11,14}
MOV     R0,#212
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#164
MOV     R1,#4
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#212
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
B       endif11
.else11
STMFD   R13!,{1-11,14}
MOV     R0,#212
LDR     R0,[R12,R0]
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#216
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R2,[R12,R1]
STRB    R0,[R2]
MOV     R0,#0
STRB    R0,[R2,#1]
LDR     R1,[R12,R1]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#212
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
.endif11
B       while_loop3
.end_of_while_loop3
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Find"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#220
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#&C3
STMFD   R13!,{0,2-11,14}
MOV     R0,#220
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
MOV     R2,#0
SWI     "OS_Find"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#208
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#60
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#2
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Args"
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#76
MOV     R1,#6
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
ADD     R2,R11,R2
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R1,R2
MOV     R2,#40
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
MOV     R0,#1
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R2,#10
LDMFD   R13!,{0-1,3-11,14}
SWI     "OS_Args"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#88
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_BGet"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Find"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#&83
STMFD   R13!,{0,2-11,14}
MOV     R0,#220
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
MOV     R2,#0
SWI     "OS_Find"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#208
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R1,#68
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
MOV     R2,#224
ADD     R2,R12,R2
STR     R0,[R2]
STMFD   R13!,{0,2-11,14}
MOV     R1,#1
LDMFD   R13!,{0,2-11,14}
MOV     R2,#228
ADD     R2,R12,R2
STR     R1,[R2]
.loop8
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#68
LDR     R2,[R12,R0]
LDMFD   R13!,{0-1,3-11,14}
BL      library_routine_PRINT_integer_to_file
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#116
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#68
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
BL      library_routine_PRINT_string_to_file
MOV     R0,#68
ADD     R0,R12,R0
LDR     R1,[R0]
MOV     R2,#228
ADD     R2,R12,R2
LDR     R3,[R2]
ADD     R4,R1,R3
STR     R4,[R0]
MOV     R5,#224
ADD     R5,R12,R5
LDR     R6,[R5]
CMP     R3,#0
BGT     loop_next_skip8
CMP     R4,R6
BGE     loop8
B       end_of_loop8
.loop_next_skip8
CMP     R4,R6
BLE     loop8
.end_of_loop8
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Find"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#&43
STMFD   R13!,{0,2-11,14}
MOV     R0,#220
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
MOV     R2,#0
SWI     "OS_Find"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#208
STR     R0,[R12,R1]
.while_loop4
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Args"
CMP     R2,#0
MVNNE   R0,#0
MOVEQ   R0,#0
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
CMP     R0,#0
MVNEQ   R0,#0
MOVNE   R0,#0
LDMFD   R13!,{1-11,14}
CMP     R0,#0
BEQ     end_of_while_loop4
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_INPUT_integer_from_file
MOV     R1,#16
STR     R0,[R12,R1]
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
MOV     R2,#4
BL      library_routine_INPUT_string_from_file
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
MOV     R0,#16
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
B       while_loop4
.end_of_while_loop4
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#208
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
SWI     "OS_Find"
;  End of file handling
;  =========================================================================
;  *TIME* *TIME$*
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
SWI     "OS_ReadMonotonicTime"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
MOV     R0,#4
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#14
MOV     R3,#4
LDR     R1,[R12,R3]
MOV     R2,#0
STR     R2,[R1]
SWI     "OS_Word"
.no_read_times1
LDRB    R4,[R1],#1
CMP     R4,#13
BNE     no_read_times1
STRB    R2,[R1,#-1]
LDR     R0,[R12,R3]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
SWI     "OS_ReadMonotonicTime"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#168
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#14
MOV     R3,#4
LDR     R1,[R12,R3]
MOV     R2,#0
STR     R2,[R1]
SWI     "OS_Word"
.no_read_times2
LDRB    R4,[R1],#1
CMP     R4,#13
BNE     no_read_times2
STRB    R2,[R1,#-1]
LDR     R0,[R12,R3]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#232
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#124
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
MOV     R1,#232
LDR     R1,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R2,#4
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#136
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  We could have just done  
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#124
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
MOV     R0,#14
MOV     R3,#4
LDR     R1,[R12,R3]
MOV     R2,#0
STR     R2,[R1]
SWI     "OS_Word"
.no_read_times3
LDRB    R4,[R1],#1
CMP     R4,#13
BNE     no_read_times3
STRB    R2,[R1,#-1]
LDR     R1,[R12,R3]
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#136
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
SWI     "OS_ReadMonotonicTime"
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  =========================================================================
;  *PROC* *DEFPROC* *ENDPROC* (calling, defining and exiting functions and
;  procedures). *LOCAL* variables are covered also.
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#160
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
LDR     R1,[R12,R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
MOV     R0,#100
LDMFD   R13!,{1-11,14}
MOV     R1,#16
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#44
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R1,#244
LDR     R1,[R12,R1]
MOV     R2,#256
MUL     R3,R0,R2
ADD     R0,R1,R3
LDMFD   R13!,{1-11,14}
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{0-2,4-11,14}
MOV     R3,#200
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
MOV     R0,R0,ASL#2
STMFD   R13!,{0,2-11,14}
MOV     R0,#0
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
ADD     R0,R1,R0
STR     R3,[R0]
BL      our_procedure
;  Calling the procedure (no parameters).
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R1,#10
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#16
LDR     R2,[R12,R0]
LDMFD   R13!,{0-1,3-11,14}
STMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#1
LDMFD   R13!,{1-11,14}
MOV     R1,#244
LDR     R1,[R12,R1]
MOV     R2,#256
MUL     R3,R0,R2
ADD     R0,R1,R3
LDMFD   R13!,{1-11,14}
MOV     R3,R0
LDMFD   R13!,{0-2,4-11,14}
STMFD   R13!,{0-3,5-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
MOV     R0,R0,ASL#2
STMFD   R13!,{0,2-11,14}
MOV     R0,#0
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
LDR     R0,[R1,R0]
LDMFD   R13!,{1-11,14}
MOV     R4,R0
LDMFD   R13!,{0-3,5-11,14}
BL      our_new_procedure
STMFD   R13!,{1-11,14}
MOV     R0,#12
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Just to prove the LOCAL 'string$' has gone out of scope
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
BL      our_function
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#4
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#168
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#4
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#16
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#5
LDMFD   R13!,{1-11,14}
MOV     R0,R0,ASL#2
STMFD   R13!,{0,2-11,14}
MOV     R0,#0
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
LDR     R0,[R1,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
BL      multiply_two_numbers
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#4
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#208
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#4
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDR     R0,[R12,R0]
LDMFD   R13!,{1-11,14}
MOV     R1,#4
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R2,#8
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
;  Don't forget the END (doesn't have to go at the end of the file).

LDR     R15,[R12,#-4]

;  ================== EXAMPLE PROCEDURES / FUNCTIONS =======================

.our_procedure
STMFD   R13!,{R0-R11,R14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#248
MOV     R1,#6
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
LDMFD   R13!,{R0-R11,R15}^


.our_new_procedure
STMFD   R13!,{R0-R11,R14}
STMFD   R13!,{R0,R1}
STMFD   R13!,{0,2-11,14}
MOV     R0,#8
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
BL      library_routine_place_string_in_buffer
LDMFD   R13!,{R0,R1}
STMFD   R13!,{R0,R1}
MOV     R0,R1
STMFD   R13!,{0,2-11,14}
MOV     R0,#12
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
LDMFD   R13!,{R0,R1}
STMFD   R13!,{R0,R1}
MOV     R0,R2
STMFD   R13!,{0,2-11,14}
MOV     R0,#16
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
LDMFD   R13!,{R0,R1}
STMFD   R13!,{R0,R1}
MOV     R0,R3
STMFD   R13!,{0,2-11,14}
MOV     R0,#20
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
BL      library_routine_place_string_in_buffer
LDMFD   R13!,{R0,R1}
STMFD   R13!,{R0,R1}
MOV     R0,R4
STMFD   R13!,{0,2-11,14}
MOV     R0,#24
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
LDMFD   R13!,{R0,R1}
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#28
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#32
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R2,[R12,R1]
STRB    R0,[R2]
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#28
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#20
MOV     R1,#7
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
MOV     R0,#8
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R12,R1
LDR     R1,[R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#32
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R1,[R0]
LDMFD   R13!,{0,2-11,14}
BL      library_routine_place_string_in_buffer
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#32
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#64
MOV     R1,#7
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#40
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#64
MOV     R1,#7
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
STMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#28
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
MOV     R2,#12
SWI     "OS_ConvertInteger4"
MOV     R1,R0
LDMFD   R13!,{0,2-11,14}
STMFD   R13!,{1-11,14}
STMFD   R13!,{0-1,3-11,14}
MOV     R0,#40
MOV     R1,#1
ADD     R2,R0,R1,ASL#8
LDMFD   R13!,{0-1,3-11,14}
LDR     R2,[R12,R2]
BL      concatenate_strings
MOV     R0,R2
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#104
MOV     R1,#7
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R11,R0
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#12
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
STMFD   R13!,{1-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#16
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
STMFD   R13!,{1-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#20
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
SWI     "OS_Write0"
SWI     "OS_NewLine"
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#24
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
LDR     R1,[R12,R1]
BL      library_routine_convert_integer_to_decimal_string
STMFD   R13!,{1-11,14}
MOV     R0,#36
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
LDR     R0,[R12,R0]
SWI     "OS_Write0"
SWI     "OS_NewLine"
LDMFD   R13!,{R0-R11,R15}^


.our_function
STMFD   R13!,{R1-R11,R14}
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#44
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#48
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#10
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#44
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
MOV     R0,#100
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#48
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#44
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#48
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R12,R1
LDR     R1,[R1]
MUL     R0,R1,R0
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{R1-R11,R15}^


.multiply_two_numbers
STMFD   R13!,{R1-R11,R14}
STMFD   R13!,{R0,R1}
STMFD   R13!,{0,2-11,14}
MOV     R0,#52
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
LDMFD   R13!,{R0,R1}
STMFD   R13!,{R0,R1}
MOV     R0,R1
STMFD   R13!,{0,2-11,14}
MOV     R0,#56
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
LDMFD   R13!,{R0,R1}
MOV     R0,#0
STMFD   R13!,{0,2-11,14}
MOV     R0,#60
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#52
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
STMFD   R13!,{0,2-11,14}
MOV     R0,#56
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
ADD     R1,R12,R1
LDR     R1,[R1]
MUL     R0,R1,R0
LDMFD   R13!,{1-11,14}
STMFD   R13!,{0,2-11,14}
MOV     R0,#60
MOV     R1,#1
ADD     R1,R0,R1,ASL#8
LDMFD   R13!,{0,2-11,14}
STR     R0,[R12,R1]
STMFD   R13!,{1-11,14}
STMFD   R13!,{1-11,14}
MOV     R0,#60
MOV     R1,#1
ADD     R0,R0,R1,ASL#8
LDMFD   R13!,{1-11,14}
ADD     R0,R12,R0
LDR     R0,[R0]
LDMFD   R13!,{1-11,14}
LDMFD   R13!,{R1-R11,R15}^


.offset_of_next_string
EQUD 8400

; allocate memory for the given string - this should be a 256 byte buffer at the end of the
; array buffer memory. Ensure that the allocated memory is cleared.

.allocate_memory_for_string
          STMFD   R13!,{R0-R11,R14}
          LDR     R1,offset_of_next_string
          ADD     R2,R1,R12
          STR     R2,[R0]
          ADD     R3,R1,#256
          STR     R3,offset_of_next_string
          MOV     R0,#0
          ADD     R1,R2,#256
.iloop7
          STRB    R0,[R2],#1
          CMP     R2,R1
          BLT     iloop7
          LDMFD   R13!,{R0-R11,R15}^

; concatenate the two null terminated strings pointed to by R0 and R1 and return the result
; as a null terminated string placed in the buffer pointed to by R2.

.concatenate_strings
          STMFD   R13!,{R0-R11,R14}
.iloop6
          LDRB    R3,[R0],#1
          CMP     R3,#0
          BEQ     ilabel3
          STRB    R3,[R2],#1
          B       iloop6
.ilabel3
          LDRB    R3,[R1],#1
          STRB    R3,[R2],#1
          CMP     R3,#0
          BNE     ilabel3
          LDMFD   R13!,{R0-R11,R15}^

; place the null terminated string (the address of which is passed in R0) into the buffer whose
; address is passed in R1.

.library_routine_place_string_in_buffer
          STMFD   R13!,{R0-R11,R14}
.iloop1
          LDRB    R2,[R0],#1
          STRB    R2,[R1],#1
          CMP     R2,#0
          BNE     iloop1
          LDMFD   R13!,{R0-R11,R15}^

; compare the two strings pointed to by R0 and R1. Return -1 in R2 if they are identical OR 0
; if they are not.

.library_routine_compare_strings_for_equivalence
          STMFD   R13!,{R0,R1,R3-R11,R14}
          MVN     R2,#0
.iloop2
          LDRB    R3,[R0],#1
          LDRB    R4,[R1],#1
          CMP     R3,R4
          MOVNE   R2,#0
          CMP     R3,#0
          BNE     iloop2
          LDMFD   R13!,{R0,R1,R3-R11,R15}^
                    
; return the length of the null terminated string pointed to by R0 in R0.

.library_routine_LEN_function
          STMFD   R13!,{R1-R11,R14}
          MOV     R1,#0
.iloop3
          LDRB    R2,[R0],#1
          CMP     R2,#0
          ADDNE   R1,R1,#1
          BNE     iloop3
          MOV     R0,R1
          LDMFD   R13!,{R1-R11,R15}^
          
; place the leftmost R1 number of characters of the null terminated string pointed to by R0 in
; the buffer pointed to by R2. Note that it is possible that R1 is an invalid number (ie. it
; may be a negative number (other than -1), greater than the length of the string or a zero).
; Return the address of the resulting string in R0. If a value of -1 is passed in R1 then
; return the string minus the rightmost character.
                    
.library_routine_LEFT_function
          STMFD   R13!,{R1-R11,R14}
          MOV     R3,R0                            ; R3 = (preserved) pointer to string
          MOV     R4,R2                            ; R4 = (preserved) pointer to resulting $
          BL      library_routine_LEN_function
          CMP     R1,R0
          MOVGT   R1,R0
          CMN     R1,#1                            ; does R1 = -1 (special value)
          SUBEQ   R1,R0,#1                         ; if so then set to len of string -1
          CMP     R1,#0
          MOVLT   R1,#0                            ; R1 = valid number of characters
          ADD     R0,R3,R1                         ; R0 = end pointer (last char + 1)
.iloop4
          CMP     R3,R0
          BEQ     ilabel1
          LDRB    R5,[R3],#1
          STRB    R5,[R2],#1
          B       iloop4
.ilabel1
          MOV     R5,#0
          STRB    R5,[R2],#1
          MOV     R0,R4
          LDMFD   R13!,{R1-R11,R15}^
          
; place the rightmost R1 number of characters of the null terminated string pointed to by R0 in
; the buffer pointed to by R2. Note that it is possible that R1 is an invalid number (ie. it
; may be a negative number, greater than the length of the string or a zero). Return the
; address of the resulting string in R0.
                    
.library_routine_RIGHT_function
          STMFD   R13!,{R1-R11,R14}
          MOV     R3,R0                            ; R3 = (preserved) pointer to string
          MOV     R4,R2                            ; R4 = (preserved) pointer to resulting $
          BL      library_routine_LEN_function
          CMP     R1,R0
          MOVGT   R1,R0
          CMP     R1,#0
          MOVLT   R1,#0                            ; R1 = valid number of characters
          ADD     R0,R3,R0                         ; R0 = end pointer (last char + 1)
          SUB     R1,R0,R1                         ; R1 = pointer to first required character
.iloop5
          CMP     R1,R0
          BEQ     ilabel2
          LDRB    R3,[R1],#1
          STRB    R3,[R2],#1
          B       iloop5
.ilabel2
          MOV     R3,#0
          STRB    R3,[R2],#1
          MOV     R0,R4
          LDMFD   R13!,{R1-R11,R15}^
          
; return a pointer to a copy of the given section of the given string pointed to by R0. R1
; should hold the position of the first character, R2 the number of characters and R3 a pointer
; to where the resulting string should be placed. All registers should be preserved. Note that
; the values in R1 and R2 could (potentially) be invalid.

.library_routine_MID_function
          STMFD   R13!,{R0-R11,R14}
          MOV     R4,R0                            ; R4 = preserved pointer to string
          BL      library_routine_LEN_function     ; R0 = length of string
          CMP     R1,R0
          MOVGT   R1,R0                            ; ensures R1 isn't too high a number
          CMP     R1,#0
          MOVLE   R1,#1                            ; ensures R1 isn't too small
          ADD     R5,R1,R2
          SUB     R5,R5,#1                         ; position of last character in substring
          CMP     R5,R0
          SUBGT   R2,R0,R1
          ADDGT   R2,R2,#1                         ; ensures R2 not too large
          CMP     R2,#0
          MOVLT   R2,#0                            ; ensures R2 not too small
          MOV     R0,R4                            ; restore original string pointer
          ADD     R4,R0,R1
          SUB     R4,R4,#1                         ; R4 = pointer to first character
          ADD     R5,R4,R2                         ; R5 = pointer to last character + 1
.iloop8
          CMP     R4,R5
          BEQ     ilabel4
          LDRB    R6,[R4],#1
          STRB    R6,[R3],#1
          B       iloop8
.ilabel4
          MOV     R6,#0
          STRB    R6,[R3]                          ; null terminate the resulting string
          LDMFD   R13!,{R0-R11,R15}^
          
; return the position of the first instance of the given substring in the given string OR 0 if
; not found. On entry R0 = pointer to string, R1 = pointer to substring and R2 = first
; character to begin searching from. On exit R0 is the  result register.

.library_routine_INSTR_function
          STMFD   R13!,{R1-R11,R14}
          MOV     R3,R0                            ; R3 = preserved pointer to string
          BL      library_routine_LEN_function     ; R0 = length of string
          CMP     R2,R0
          MOVGT   R2,R0                            ; ensures R2 isn't too large
          CMP     R2,#0
          MOVLE   R2,#1                            ; ensures R2 isn't too small
          ADD     R4,R3,R0                         ; pointer to last character + 1
          MOV     R0,R3                            ; restore string pointer
          ADD     R0,R0,R2
          SUB     R0,R0,#1                         ; set pointer to start of search
.iloop9
          CMP     R0,R4                            ; has end of string been reached ?
          MOVEQ   R0,#0                            ; if so then set position to 0 and exit
          BEQ     ilabel5                          
          BL      library_routine_compare_start_of_string_with_substring
          CMN     R2,#1                            
          SUBEQ   R0,R0,R3                         ; was a match found ?
          ADDEQ   R0,R0,#1                         ; if so then set position and exit loop.
          BEQ     ilabel5
          ADD     R0,R0,#1
          B       iloop9
          
.ilabel5
          LDMFD   R13!,{R1-R11,R15}^

; check to see if the beginning of the string pointed to by R0 is identical to the substring
; pointed to by R1. If it is then return -1 in R2, otherwise return 0 in R2.

.library_routine_compare_start_of_string_with_substring
          STMFD   R13!,{R0,R1,R3-R11,R14}
.iloop10
          LDRB    R2,[R0],#1
          LDRB    R3,[R1],#1
          CMP     R2,R3
          MOVNE   R5,#0
          BNE     ilabel6
          LDRB    R3,[R1]
          CMP     R3,#0
          BNE     iloop10
          MVN     R5,#0
.ilabel6
          MOV     R2,R5
          LDMFD   R13!,{R0,R1,R3-R11,R15}^
 
; the following subroutine divides two numbers. On entry R0=dividend, R1=divisor. On exit
; R0=quotient, R1=remainder.
         
.library_routine_divide
          STMFD   R13!,{R2-R11,R14}
          ANDS    R6,R0,#1<<31
          RSBMI   R0,R0,#0
          EOR     R5,R6,R1
          CMP     R1,#0
          RSBMI   R1,R1,#0
          MOV     R2,#0
          MOV     R3,#0
          MOV     R4,#1<<31
.iloop11
          MOVS    R0,R0,ASL#1
          ADC     R2,R2,R2
          CMP     R2,R1
          SUBGE   R2,R2,R1
          ORRGE   R3,R3,R4
          MOVS    R4,R4,LSR#1
          BNE     iloop11
          CMP     R5,#0
          RSBMI   R3,R3,#0
          MOV     R0,R3
          MOV     R1,R2
          LDMFD   R13!,{R2-R11,R15}^
          
; check to see if the string pointed to by R0 is greater than the string pointed to by R1.
; Return -1 in R2 if it is, 0 otherwise.

.library_routine_compare_strings_for_greater_than
          STMFD   R13!,{R0,R1,R3-R11,R14}
.iloop12
          LDRB    R2,[R0],#1
          LDRB    R3,[R1],#1
          ADD     R4,R2,R3
          CMP     R4,#0
          MOVEQ   R2,#0
          BEQ     ilabel7
          CMP     R2,R3
          BEQ     iloop12
          MVNGT   R2,#0
          MOVLE   R2,#0
.ilabel7
          LDMFD   R13!,{R0,R1,R3-R11,R15}^

; set the rightmost part of the null terminated string pointed to by R0 to the null terminated
; string pointed to by R1. This subroutine mimics the BASIC RIGHT$(..= command.

.library_routine_set_right_part_of_string
          STMFD   R13!,{R0-R11,R14}
          MOV     R2,R0                            ; R2 = preserved string pointer
          BL      library_routine_LEN_function
          MOV     R3,R0                            ; R3 = length of first string
          MOV     R0,R1
          BL      library_routine_LEN_function     ; R0 = number of characters to replace
          CMP     R0,R3
          BGT     ilabel8
          ADD     R4,R2,R3
          SUB     R4,R4,R0                         ; R4 = pointer to first char to replace
.iloop13
          LDRB    R5,[R1],#1
          STRB    R5,[R4],#1
          CMP     R5,#0
          BNE     iloop13
.ilabel8
          LDMFD   R13!,{R0-R11,R15}^

; set the leftmost part of the null terminated string pointed to by R0 to the null terminated
; string pointed to by R1. This subroutine mimics the BASIC LEFT$(..= command.

.library_routine_set_left_part_of_string
          STMFD   R13!,{R0-R11,R14}
          MOV     R2,R0                            ; R2 = preserved string pointer
          BL      library_routine_LEN_function
          MOV     R3,R0                            ; R3 = length of first string
          MOV     R0,R1
          BL      library_routine_LEN_function     ; R0 = number of characters to replace
          CMP     R0,R3
          BGT     ilabel9
.iloop14
          LDRB    R5,[R1],#1
          CMP     R5,#0
          STRNEB  R5,[R2],#1
          BNE     iloop14
.ilabel9
          LDMFD   R13!,{R0-R11,R15}^

; beginning with the R1 character set the given section of the string pointed to by R0 to the
; string pointed to by R2.

.library_routine_set_middle_part_of_string
          STMFD   R13!,{R0-R11,R14}
          MOV     R3,R0                            ; R3 = preserved string pointer
          BL      library_routine_LEN_function     ; R0 = length of first string
          CMP     R1,R0
          BGT     ilabel10                         ; ensure that R1 not too big
          CMP     R1,#0
          MOVLE   R1,#1                            ; ensure that R1 not too small
          ADD     R0,R3,R1
          SUB     R0,R0,#1                         ; R0 = pntr to section of str to replace
          MOV     R1,R2                            ; R1 = pntr to replacement string
          BL      library_routine_set_left_part_of_string
.ilabel10
          LDMFD   R13!,{R0-R11,R15}^

; retrieve the integer value from the required (two dimensional) integer array. On entry R0=
; x dimension, R1 = y dimension, R3 = offset to array's address (not the address of the array!)
; and R2 = offset to the arrays width. On exit R0 = value. All other registers should be
; preserved.

.library_routine_retrieve_integer_array_value
          STMFD   R13!,{R1-R11,R14}
          LDR     R2,[R12,R2]
          ADD     R2,R2,#1
          MOV     R2,R2,ASL#2
          MUL     R2,R1,R2
          MOV     R4,R0,ASL#2
          ADD     R4,R2,R4
          LDR     R1,[R12,R3]
          LDR     R0,[R1,R4]
          LDMFD   R13!,{R1-R11,R15}^
          
; retrieve the address of the string value from the required (two dimensional) string array.
; On entry R0 = x dimension, R1 = y dimension,R2 = offset to array's width and R3 = offset
; to array's address.

.library_routine_retrieve_string_array_value
          STMFD   R13!,{R1-R11,R14}
          LDR     R2,[R12,R2]
          ADD     R2,R2,#1
          MOV     R2,R2,ASL#8
          MUL     R2,R1,R2
          MOV     R4,R0,ASL#8
          ADD     R4,R2,R4
          LDR     R1,[R12,R3]
          ADD     R0,R1,R4
          LDMFD   R13!,{R1-R11,R15}^
          
; return the address of the given array's given element. On entry R0 and R1 are the x and y
; dimensions of the required element (respectively), R2 = offset to width of array and R4 =
; offset to address of array. On exit R0 = address of element.

.library_routine_address_of_integer_array_element
          STMFD   R13!,{R1-R11,R14}
          LDR     R2,[R12,R2]
          ADD     R2,R2,#1
          MOV     R2,R2,ASL#2
          MUL     R2,R1,R2
          MOV     R5,R0,ASL#2
          ADD     R5,R2,R5
          LDR     R1,[R12,R4]
          ADD     R0,R1,R5
          LDMFD   R13!,{R1-R11,R15}^

; write the given string to the given *open* file. On entry R0 = pointer to string, R1 =
; file handle.

.library_routine_PRINT_string_to_file
          STMFD   R13!,{R0-R11,R14}
          MOV     R2,R0
          MOV     R0,#0
          SWI     "OS_BPut"
          MOV     R0,R2
          BL      library_routine_LEN_function
          SWI     "OS_BPut"
          ADD     R3,R2,R0
          SUB     R3,R3,#1
.iloop15
          LDRB    R0,[R3],#-1
          SWI     "OS_BPut"
          CMP     R3,R2
          BGE     iloop15
          LDMFD   R13!,{R0-R11,R15}^
          
; write the given integer to the given *open* file. On entry R2 = integer to be written, R1 =
; file handle.

.library_routine_PRINT_integer_to_file
          STMFD   R13!,{R0-R11,R14}
          MOV     R0,#&40
          SWI     "OS_BPut"
          AND     R0,R2,#%11111111000000000000000000000000
          MOV     R0,R0,ASR#24
          SWI     "OS_BPut"
          AND     R0,R2,#%111111110000000000000000
          MOV     R0,R0,ASR#16
          SWI     "OS_BPut"
          AND     R0,R2,#%1111111100000000
          MOV     R0,R0,ASR#8
          SWI     "OS_BPut"
          AND     R0,R2,#%11111111
          SWI     "OS_BPut"
          LDMFD   R13!,{R0-R11,R15}^

; read a string from the given file and return a pointer to it. On entry R1 = file handle, R2=
; pointer to string buffer. On exit R0 = address of string buffer.

.library_routine_INPUT_string_from_file
          STMFD   R13!,{R1-R11,R14}
          SWI     "OS_BGet"
          SWI     "OS_BGet"
          LDR     R2,[R12,R2]
          ADD     R3,R2,R0
          MOV     R4,#0
          STRB    R4,[R3],#-1
.iloop16
          SWI     "OS_BGet"
          STRB    R0,[R3],#-1
          CMP     R3,R2
          BGE     iloop16
          MOV     R0,R2
          LDMFD   R13!,{R1-R11,R15}^
          
; read in an integer from the given open file. On entry R1 = file handle. On exit R0 = integer

.library_routine_INPUT_integer_from_file
          STMFD   R13!,{R1-R11,R14}
          MOV     R2,#0
          SWI     "OS_BGet"
          SWI     "OS_BGet"
          ADD     R2,R2,R0,ASL#3
          SWI     "OS_BGet"
          ADD     R2,R2,R0,ASL#2
          SWI     "OS_BGet"
          ADD     R2,R2,R0,ASL#1
          SWI     "OS_BGet"
          ADD     R0,R2,R0
          LDMFD   R13!,{R1-R11,R15}^

; convert the integer passed in R0 to a string and place at the address passed in R1. Pad with
; leading spaces so as the string is 10 characters long.

.library_routine_convert_integer_to_decimal_string
          STMFD   R13!,{R0-R11,R14}
          MOV     R2,#12
          SWI     "OS_BinaryToDecimal"
          MOV     R3,#0
          STRB    R3,[R1,R2]
          CMP     R2,#10
          BEQ     ilabel11
          ADD     R6,R1,R2                       ; R6 = source pointer
          SUB     R4,R6,R1                       ; R4 = length of string
          ADD     R5,R1,#10                      ; R5 = destination pointer
.iloop17
          LDRB    R7,[R6],#-1
          STRB    R7,[R5],#-1
          CMP     R6,R1
          BGE     iloop17
          MOV     R7,#32                         ; ASCII code for a space character
.iloop18
          STRB    R7,[R1],#1                     ; write space character to buffer
          CMP     R1,R5                          ; check to see if padding done
          BLE     iloop18
.ilabel11
          LDMFD   R13!,{R0-R11,R15}^

.set_up_pointer_to_immediate_data_store
STMFD   R13!,{R0-R10,R12,R14}
ADR     R11,immediate_data_store
LDMFD   R13!,{R0-R10,R12,R15}^

.immediate_data_store
EQUS "Hello world !!"+CHR$0 : ALIGN
EQUS "Hello again, "+CHR$0 : ALIGN
EQUS "world"+CHR$0 : ALIGN
EQUS " !!"+CHR$0 : ALIGN
EQUS "Goodbye"+CHR$0 : ALIGN
EQUS " everyone"+CHR$0 : ALIGN
EQUS "Here is a number : "+CHR$0 : ALIGN
EQUS "And again  : "+CHR$0 : ALIGN
EQUS "Converting to hex : "+CHR$0 : ALIGN
EQUS "The original number was "+CHR$0 : ALIGN
EQUS "The new number is "+CHR$0 : ALIGN
EQUS "What was it again, "+CHR$0 : ALIGN
EQUS " ?"+CHR$0 : ALIGN
EQUS "The ASCII value of A is "+CHR$0 : ALIGN
EQUS "A"+CHR$0 : ALIGN
EQUS "This is a string. The ASCII value of the first character is : "+CHR$0 : ALIGN
EQUS "The character with an ASCII code of 65 is "+CHR$0 : ALIGN
EQUS "The character after A is "+CHR$0 : ALIGN
EQUS "Dividing "+CHR$0 : ALIGN
EQUS " by "+CHR$0 : ALIGN
EQUS "Gives "+CHR$0 : ALIGN
EQUS " remainder "+CHR$0 : ALIGN
EQUS " is divisible by 10"+CHR$0 : ALIGN
EQUS "Hello"+CHR$0 : ALIGN
EQUS "G"+CHR$0 : ALIGN
EQUS "p!"+CHR$0 : ALIGN
EQUS "This is a string"+CHR$0 : ALIGN
EQUS "The string : "+CHR$0 : ALIGN
EQUS "The length of the string is "+CHR$0 : ALIGN
EQUS " characters"+CHR$0 : ALIGN
EQUS "'is a' occurs at position "+CHR$0 : ALIGN
EQUS "is a"+CHR$0 : ALIGN
EQUS "s"+CHR$0 : ALIGN
EQUS "The first 's' after pos. 8 in the string is at pos. "+CHR$0 : ALIGN
EQUS "The number in denary = "+CHR$0 : ALIGN
EQUS "The number in hex = "+CHR$0 : ALIGN
EQUS "Number 1 = "+CHR$0 : ALIGN
EQUS "Number 2 = "+CHR$0 : ALIGN
EQUS "After swapping the numbers..."+CHR$0 : ALIGN
EQUS "Number is 1-5"+CHR$0 : ALIGN
EQUS "Number is 6"+CHR$0 : ALIGN
EQUS "Number is 7-10"+CHR$0 : ALIGN
EQUS " to everyone. "+CHR$0 : ALIGN
EQUS " is the first letter of the "+CHR$0 : ALIGN
EQUS "alphabet !"+CHR$0 : ALIGN
EQUS "This is a string dumped in a dimensioned area of memory"+CHR$0 : ALIGN
EQUS "The block is at the address &"+CHR$0 : ALIGN
EQUS " in memory"+CHR$0 : ALIGN
EQUS "The byte at block% holds the value "+CHR$0 : ALIGN
EQUS "The byte after holds the value "+CHR$0 : ALIGN
EQUS "The word at block%+4 holds the value "+CHR$0 : ALIGN
EQUS "The string in the block is :"+CHR$0 : ALIGN
EQUS "Help"+CHR$0 : ALIGN
EQUS " syntax"+CHR$0 : ALIGN
EQUS "Podules"+CHR$0 : ALIGN
EQUS "Run Wibble"+CHR$0 : ALIGN
EQUS "You haven't got a file called wibble on your disc"+CHR$0 : ALIGN
EQUS "The actual error returned was : "+CHR$0 : ALIGN
EQUS ""+CHR$0 : ALIGN
EQUS "Entering the WHILE loop..."+CHR$0 : ALIGN
EQUS "Exiting the WHILE loop..."+CHR$0 : ALIGN
EQUS "o"+CHR$0 : ALIGN
EQUS "The first number is 100"+CHR$0 : ALIGN
EQUS "The first number is greater than the second"+CHR$0 : ALIGN
EQUS "The second number is greater than or equal to the first"+CHR$0 : ALIGN
EQUS "Yep - that's all true"+CHR$0 : ALIGN
EQUS "What a load of rubbish"+CHR$0 : ALIGN
EQUS "Both numbers are correct"+CHR$0 : ALIGN
EQUS "This isn't right"+CHR$0 : ALIGN
EQUS "That worked"+CHR$0 : ALIGN
EQUS "This is the second line of the file"+CHR$0 : ALIGN
EQUS "The ASCII code for 'A' is "+CHR$0 : ALIGN
EQUS "TestFile"+CHR$0 : ALIGN
EQUS "This is the first line of the file"+CHR$0 : ALIGN
EQUS "The file is "+CHR$0 : ALIGN
EQUS " bytes long"+CHR$0 : ALIGN
EQUS "The byte at offset 10 is "+CHR$0 : ALIGN
EQUS "Number "+CHR$0 : ALIGN
EQUS "Today is "+CHR$0 : ALIGN
EQUS "The monotonic time is "+CHR$0 : ALIGN
EQUS "Hello !"+CHR$0 : ALIGN
EQUS "The result of the first function is "+CHR$0 : ALIGN
EQUS "The result of the second function is "+CHR$0 : ALIGN
EQUS "I am now in the procedure"+CHR$0 : ALIGN
EQUS "This is a local var. The string passed was "+CHR$0 : ALIGN
EQUS "Our temporary variable has a value of "+CHR$0 : ALIGN
EQUS "The other parameters were : "+CHR$0 : ALIGN

.start

ADR     R13,end_of_code
ADD     R13,R13,#10240
ADD     R12,R13,#4
STR     R14,[R12,#-4]
BL      initialisation_code
BL      set_up_pointer_to_immediate_data_store
B       program_code

.end_of_code

]
:
NEXT
SYS "OS_File",10,"<whizz$dir>.WorkDir.ObjectCode",&FF8,,code%,end_of_code

memory_for_data%=12762
required_memory%=memory_for_data%+(end_of_code-code%)
PRINT'"The compiled code will require a total of "+STR$required_memory%+" bytes of memory to run."

END
