Home » Archimedes archive » Acorn User » AU 1994-01.adf » !StarInfo_StarInfo » Anderson/PackerProg

Anderson/PackerProg

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

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

Tape/disk: Home » Archimedes archive » Acorn User » AU 1994-01.adf » !StarInfo_StarInfo
Filename: Anderson/PackerProg
Read OK:
File size: 0F50 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM     >StringPacker Module
   20REM By  Robert Anderson
   30REM For 32-bit machines
   40REM (c) BAU January 1994
   50:
   60DIM code% 1200
   70bits=0:byte=1:bit=2
   80swichunk=&CE900
   90FOR pass%=4 TO 6 STEP 2
  100P%=0:O%=code%
  110[OPT pass%
  120EQUD 0
  130EQUD init
  140EQUD 0
  150EQUD 0
  160EQUD title
  170EQUD help
  180EQUD helpcommand
  190EQUD swichunk
  200EQUD swicode
  210EQUD swi_table
  220EQUD 0
  230:
  240.title
  250EQUS "StringPacker"
  260EQUB 0
  270ALIGN
  280:
  290.help
  300EQUS "String Packer"+CHR$9+"1.01 (10 Aug 1993)  By Robert Anderson"
  310EQUB 0
  320ALIGN
  330:
  340.helpcommand
  350EQUS "StringPacker"
  360EQUB 0
  370ALIGN
  380EQUD 0
  390EQUD 0
  400EQUD 0
  410EQUD packhelp
  420:
  430.packhelp
  440EQUS "The StringPacker module packs and unpacks BASIC strings, via two SYS commands :"+CHR$13
  450EQUS CHR$9+"SYS "+CHR$34+"Packer_PackString"+CHR$34+",valid$,start$ TO addr% : packed$= $addr%"+CHR$13
  460EQUS CHR$9+"SYS "+CHR$34+"Packer_UnpackString"+CHR$34+",valid$,packed$ TO unpacked$"+CHR$13
  470EQUS "where valid$ is the validation string containing all the characters that can be used in the string concerned, and start$ is the string to be compacted."
  480EQUB 0
  490ALIGN
  500:
  510.swi_table
  520EQUS "Packer"
  530EQUB 0
  540EQUS "PackString"
  550EQUB 0
  560EQUS "UnpackString"
  570EQUB 0
  580EQUB 0
  590ALIGN
  600:
  610.init
  620STMFD R13!,{R14}
  630MOV R6,R12
  640LDR R12,[R12]
  650MOV R0,#6
  660MOV R3,#&100
  670SWI "OS_Module"
  680STR R2,[R6]
  690MOV R12,R6
  700LDMFD R13!,{PC}
  710:
  720.swicode
  730STMFD R13!,{R2-R11,R14}
  740MOV R6,R0
  750MOV R10,R1
  760LDR R12,[R12]
  770CMP R11,#2
  780ADDCC PC,PC,R11,LSL#2
  790LDMFD R13!,{R2-R11,PC}
  800B pack
  810B unpack
  820:
  830.pack
  840MOV byte,#0
  850MOV R3,#0
  860BL countbits
  870CMP bits,#8
  880BGE dontbother
  890MOV bit,#7
  900MOV R4,#0
  910LDRB R8,[R4,R10]
  920CMP R8,#0
  930BEQ finish
  940.loop
  950MOV R11,#0
  960.instr
  970LDRB R9,[R11,R6]
  980ADD R11,R11,#1
  990CMP R9,#0
 1000BEQ invalid
 1010CMP R9,R8
 1020BNE instr
 1030MOV R8,R11
 1040SUB R5,bits,#1
 1050MOV R11,#1
 1060.bitloop
 1070ANDS R9,R8,R11,LSL R5
 1080ORRNE R3,R3,R11,LSL bit
 1090SUBS bit,bit,#1
 1100BPL dontsave
 1110MOV bit,#7
 1120CMP R3,#13
 1130ADDGE R3,R3,#1
 1140STRB R3,[byte,R12]
 1150ADD byte,byte,#1
 1160MOV R3,#0
 1170.dontsave
 1180SUBS R5,R5,#1
 1190BPL bitloop
 1200ADD R4,R4,#1
 1210LDRB R8,[R4,R10]
 1220CMP R8,#0
 1230BNE loop
 1240CMP bit,#7
 1250BEQ finish
 1260CMP R3,#13
 1270ADDGE R3,R3,#1
 1280STRB R3,[byte,R12]
 1290ADD byte,byte,#1
 1300.finish
 1310MOV R3,#13
 1320STRB R3,[byte,R12]
 1330MOV R1,R0
 1340MOV R0,R12
 1350LDMFD R13!,{R2-R11,PC}
 1360:
 1370.countbits
 1380MOV R9,#0
 1390.findlen
 1400LDRB R8,[R9,R6]
 1410ADD R9,R9,#1
 1420CMP R8,#0
 1430BNE findlen
 1440MOV R0,#7
 1450MOV R8,#256
 1460MOV R5,#2
 1470.countloop
 1480SUB R8,R8,#3
 1490CMP R9,R8
 1500BGE out
 1510ADD R8,R8,#3
 1520SUB R0,R0,#1
 1530MOV R8,R5,LSL R0
 1540B countloop
 1550.out
 1560ADD R0,R0,#2
 1570MOV PC,R14
 1580:
 1590.invalid
 1600ADR R0,errorblock
 1610STRB R8,[R0,#15]
 1620LDMFD R13!,{R2-R11,R14}
 1630ORRS PC,R14,#1<<28
 1640.errorblock
 1650EQUD 345
 1660EQUS "Character ' ' not in validation string"
 1670EQUB 0
 1680ALIGN
 1690:
 1700.dontbother
 1710MOV R11,#0
 1720.findend
 1730ADD R11,R11,#1
 1740LDRB R8,[R10,R11]
 1750CMP R8,#0
 1760BNE findend
 1770MOV R8,#13
 1780STRB R8,[R10,R11]
 1790MOV R1,#8
 1800MOV R0,R10
 1810LDMFD R13!,{R2-R11,PC}
 1820:
 1830.unpack
 1840MOV byte,#0
 1850MOV R4,#0
 1860MOV R11,#1
 1870BL countbits
 1880CMP bits,#8
 1890BGE dontbother
 1900MOV bit,#7
 1910LDRB R8,[R10,byte]
 1920CMP R8,#14
 1930SUBGE R8,R8,#1
 1940.loop2
 1950MOV R3,#0
 1960SUB R5,bits,#1
 1970.bitloop2
 1980ANDS R9,R8,R11,LSL bit
 1990ORRNE R3,R3,R11,LSL R5
 2000SUBS bit,bit,#1
 2010BPL dontload
 2020MOV bit,#7
 2030ADD byte,byte,#1
 2040LDRB R8,[R10,byte]
 2050CMP R8,#14
 2060SUBGE R8,R8,#1
 2070.dontload
 2080SUBS R5,R5,#1
 2090BPL bitloop2
 2100SUB R3,R3,#1
 2110LDRB R9,[R6,R3]
 2120ADD R3,R3,#1
 2130STRB R9,[R12,R4]
 2140ADD R4,R4,#1
 2150CMP R3,#0
 2160BNE loop2
 2170SUB R4,R4,#1
 2180MOV R9,#13
 2190STRB R9,[R12,R4]
 2200MOV R1,R0
 2210MOV R0,R12
 2220LDMFD R13!,{R2-R11,PC}
 2230]:NEXT pass%
 2240OSCLI "Save Packer "+STR$~code%+"+"+STR$~P%
 2250*Settype Packer Module
 2260*RMload Packer
 2270PRINT"Module saved as 'Packer'"
 2280END

�     >StringPacker Module
� By  Robert Anderson
� For 32-bit machines
(� (c) BAU January 1994
2:
<� code% 1200
Fbits=0:byte=1:bit=2
Pswichunk=&CE900
Z� pass%=4 � 6 � 2
dP%=0:O%=code%
n[OPT pass%
x
EQUD 0
�
EQUD init
�
EQUD 0
�
EQUD 0
�EQUD title
�
EQUD help
�EQUD helpcommand
�EQUD swichunk
�EQUD swicode
�EQUD swi_table
�
EQUD 0
�:
�
.title
�EQUS "StringPacker"

EQUB 0
	ALIGN
:
"	.help
,DEQUS "String Packer"+�9+"1.01 (10 Aug 1993)  By Robert Anderson"
6
EQUB 0
@	ALIGN
J:
T.helpcommand
^EQUS "StringPacker"
h
EQUB 0
r	ALIGN
|
EQUD 0
�
EQUD 0
�
EQUD 0
�EQUD packhelp
�:
�
.packhelp
�^EQUS "The StringPacker module packs and unpacks BASIC strings, via two SYS commands :"+�13
�^EQUS �9+"SYS "+�34+"Packer_PackString"+�34+",valid$,start$ TO addr% : packed$= $addr%"+�13
�SEQUS �9+"SYS "+�34+"Packer_UnpackString"+�34+",valid$,packed$ TO unpacked$"+�13
֢EQUS "where valid$ is the validation string containing all the characters that can be used in the string concerned, and start$ is the string to be compacted."
�
EQUB 0
�	ALIGN
�:
�.swi_table
EQUS "Packer"

EQUB 0
EQUS "PackString"
&
EQUB 0
0EQUS "UnpackString"
:
EQUB 0
D
EQUB 0
N	ALIGN
X:
b	.init
lSTMFD R13!,{R14}
vMOV R6,R12
�LDR R12,[R12]
�
MOV R0,#6
�MOV R3,#&100
�SWI "OS_Module"
�STR R2,[R6]
�MOV R12,R6
�LDMFD R13!,{PC}
�:
�.swicode
�STMFD R13!,{R2-R11,R14}
�
MOV R6,R0
�MOV R10,R1
�LDR R12,[R12]
CMP R11,#2
ADDCC PC,PC,R11,LSL#2
LDMFD R13!,{R2-R11,PC}
 
B pack
*B unpack
4:
>	.pack
HMOV byte,#0
R
MOV R3,#0
\BL countbits
fCMP bits,#8
pBGE dontbother
zMOV bit,#7
�
MOV R4,#0
�LDRB R8,[R4,R10]
�
CMP R8,#0
�BEQ finish
�	.loop
�MOV R11,#0
�
.instr
�LDRB R9,[R11,R6]
�ADD R11,R11,#1
�
CMP R9,#0
�BEQ invalid
�
CMP R9,R8
�
BNE instr
MOV R8,R11
SUB R5,bits,#1
MOV R11,#1
$.bitloop
.�S R9,R8,R11,LSL R5
8�RNE R3,R3,R11,LSL bit
BSUBS bit,bit,#1
LBPL dontsave
VMOV bit,#7
`CMP R3,#13
jADDGE R3,R3,#1
tSTRB R3,[byte,R12]
~ADD byte,byte,#1
�
MOV R3,#0
�
.dontsave
�SUBS R5,R5,#1
�BPL bitloop
�ADD R4,R4,#1
�LDRB R8,[R4,R10]
�
CMP R8,#0
�BNE loop
�CMP bit,#7
�BEQ finish
�CMP R3,#13
�ADDGE R3,R3,#1
STRB R3,[byte,R12]

ADD byte,byte,#1
.finish
MOV R3,#13
(STRB R3,[byte,R12]
2
MOV R1,R0
<MOV R0,R12
FLDMFD R13!,{R2-R11,PC}
P:
Z.countbits
d
MOV R9,#0
n.findlen
xLDRB R8,[R9,R6]
�ADD R9,R9,#1
�
CMP R8,#0
�BNE findlen
�
MOV R0,#7
�MOV R8,#256
�
MOV R5,#2
�.countloop
�SUB R8,R8,#3
�
CMP R9,R8
�BGE out
�ADD R8,R8,#3
�SUB R0,R0,#1
�MOV R8,R5,LSL R0
B countloop
.out
ADD R0,R0,#2
"MOV PC,R14
,:
6.invalid
@ADR R0,errorblock
JSTRB R8,[R0,#15]
TLDMFD R13!,{R2-R11,R14}
^�RS PC,R14,#1<<28
h.errorblock
rEQUD 345
|1EQUS "Character ' ' not in validation string"
�
EQUB 0
�	ALIGN
�:
�.dontbother
�MOV R11,#0
�.findend
�ADD R11,R11,#1
�LDRB R8,[R10,R11]
�
CMP R8,#0
�BNE findend
�MOV R8,#13
�STRB R8,[R10,R11]
�
MOV R1,#8
MOV R0,R10
LDMFD R13!,{R2-R11,PC}
:
&.unpack
0MOV byte,#0
:
MOV R4,#0
DMOV R11,#1
NBL countbits
XCMP bits,#8
bBGE dontbother
lMOV bit,#7
vLDRB R8,[R10,byte]
�CMP R8,#14
�SUBGE R8,R8,#1
�
.loop2
�
MOV R3,#0
�SUB R5,bits,#1
�
.bitloop2
��S R9,R8,R11,LSL bit
��RNE R3,R3,R11,LSL R5
�SUBS bit,bit,#1
�BPL dontload
�MOV bit,#7
�ADD byte,byte,#1
�LDRB R8,[R10,byte]
CMP R8,#14
SUBGE R8,R8,#1

.dontload
 SUBS R5,R5,#1
*BPL bitloop2
4SUB R3,R3,#1
>LDRB R9,[R6,R3]
HADD R3,R3,#1
RSTRB R9,[R12,R4]
\ADD R4,R4,#1
f
CMP R3,#0
p
BNE loop2
zSUB R4,R4,#1
�MOV R9,#13
�STRB R9,[R12,R4]
�
MOV R1,R0
�MOV R0,R12
�LDMFD R13!,{R2-R11,PC}
�
]:� pass%
�%� "Save Packer "+�~code%+"+"+�~P%
�*Settype Packer Module
�*RMload Packer
��"Module saved as 'Packer'"
��
�
00000000  0d 00 0a 1e f4 20 20 20  20 20 3e 53 74 72 69 6e  |.....     >Strin|
00000010  67 50 61 63 6b 65 72 20  4d 6f 64 75 6c 65 0d 00  |gPacker Module..|
00000020  14 19 f4 20 42 79 20 20  52 6f 62 65 72 74 20 41  |... By  Robert A|
00000030  6e 64 65 72 73 6f 6e 0d  00 1e 19 f4 20 46 6f 72  |nderson..... For|
00000040  20 33 32 2d 62 69 74 20  6d 61 63 68 69 6e 65 73  | 32-bit machines|
00000050  0d 00 28 1a f4 20 28 63  29 20 42 41 55 20 4a 61  |..(.. (c) BAU Ja|
00000060  6e 75 61 72 79 20 31 39  39 34 0d 00 32 05 3a 0d  |nuary 1994..2.:.|
00000070  00 3c 10 de 20 63 6f 64  65 25 20 31 32 30 30 0d  |.<.. code% 1200.|
00000080  00 46 17 62 69 74 73 3d  30 3a 62 79 74 65 3d 31  |.F.bits=0:byte=1|
00000090  3a 62 69 74 3d 32 0d 00  50 13 73 77 69 63 68 75  |:bit=2..P.swichu|
000000a0  6e 6b 3d 26 43 45 39 30  30 0d 00 5a 15 e3 20 70  |nk=&CE900..Z.. p|
000000b0  61 73 73 25 3d 34 20 b8  20 36 20 88 20 32 0d 00  |ass%=4 . 6 . 2..|
000000c0  64 11 50 25 3d 30 3a 4f  25 3d 63 6f 64 65 25 0d  |d.P%=0:O%=code%.|
000000d0  00 6e 0e 5b 4f 50 54 20  70 61 73 73 25 0d 00 78  |.n.[OPT pass%..x|
000000e0  0a 45 51 55 44 20 30 0d  00 82 0d 45 51 55 44 20  |.EQUD 0....EQUD |
000000f0  69 6e 69 74 0d 00 8c 0a  45 51 55 44 20 30 0d 00  |init....EQUD 0..|
00000100  96 0a 45 51 55 44 20 30  0d 00 a0 0e 45 51 55 44  |..EQUD 0....EQUD|
00000110  20 74 69 74 6c 65 0d 00  aa 0d 45 51 55 44 20 68  | title....EQUD h|
00000120  65 6c 70 0d 00 b4 14 45  51 55 44 20 68 65 6c 70  |elp....EQUD help|
00000130  63 6f 6d 6d 61 6e 64 0d  00 be 11 45 51 55 44 20  |command....EQUD |
00000140  73 77 69 63 68 75 6e 6b  0d 00 c8 10 45 51 55 44  |swichunk....EQUD|
00000150  20 73 77 69 63 6f 64 65  0d 00 d2 12 45 51 55 44  | swicode....EQUD|
00000160  20 73 77 69 5f 74 61 62  6c 65 0d 00 dc 0a 45 51  | swi_table....EQ|
00000170  55 44 20 30 0d 00 e6 05  3a 0d 00 f0 0a 2e 74 69  |UD 0....:.....ti|
00000180  74 6c 65 0d 00 fa 17 45  51 55 53 20 22 53 74 72  |tle....EQUS "Str|
00000190  69 6e 67 50 61 63 6b 65  72 22 0d 01 04 0a 45 51  |ingPacker"....EQ|
000001a0  55 42 20 30 0d 01 0e 09  41 4c 49 47 4e 0d 01 18  |UB 0....ALIGN...|
000001b0  05 3a 0d 01 22 09 2e 68  65 6c 70 0d 01 2c 44 45  |.:.."..help..,DE|
000001c0  51 55 53 20 22 53 74 72  69 6e 67 20 50 61 63 6b  |QUS "String Pack|
000001d0  65 72 22 2b bd 39 2b 22  31 2e 30 31 20 28 31 30  |er"+.9+"1.01 (10|
000001e0  20 41 75 67 20 31 39 39  33 29 20 20 42 79 20 52  | Aug 1993)  By R|
000001f0  6f 62 65 72 74 20 41 6e  64 65 72 73 6f 6e 22 0d  |obert Anderson".|
00000200  01 36 0a 45 51 55 42 20  30 0d 01 40 09 41 4c 49  |.6.EQUB 0..@.ALI|
00000210  47 4e 0d 01 4a 05 3a 0d  01 54 10 2e 68 65 6c 70  |GN..J.:..T..help|
00000220  63 6f 6d 6d 61 6e 64 0d  01 5e 17 45 51 55 53 20  |command..^.EQUS |
00000230  22 53 74 72 69 6e 67 50  61 63 6b 65 72 22 0d 01  |"StringPacker"..|
00000240  68 0a 45 51 55 42 20 30  0d 01 72 09 41 4c 49 47  |h.EQUB 0..r.ALIG|
00000250  4e 0d 01 7c 0a 45 51 55  44 20 30 0d 01 86 0a 45  |N..|.EQUD 0....E|
00000260  51 55 44 20 30 0d 01 90  0a 45 51 55 44 20 30 0d  |QUD 0....EQUD 0.|
00000270  01 9a 11 45 51 55 44 20  70 61 63 6b 68 65 6c 70  |...EQUD packhelp|
00000280  0d 01 a4 05 3a 0d 01 ae  0d 2e 70 61 63 6b 68 65  |....:.....packhe|
00000290  6c 70 0d 01 b8 5e 45 51  55 53 20 22 54 68 65 20  |lp...^EQUS "The |
000002a0  53 74 72 69 6e 67 50 61  63 6b 65 72 20 6d 6f 64  |StringPacker mod|
000002b0  75 6c 65 20 70 61 63 6b  73 20 61 6e 64 20 75 6e  |ule packs and un|
000002c0  70 61 63 6b 73 20 42 41  53 49 43 20 73 74 72 69  |packs BASIC stri|
000002d0  6e 67 73 2c 20 76 69 61  20 74 77 6f 20 53 59 53  |ngs, via two SYS|
000002e0  20 63 6f 6d 6d 61 6e 64  73 20 3a 22 2b bd 31 33  | commands :"+.13|
000002f0  0d 01 c2 5e 45 51 55 53  20 bd 39 2b 22 53 59 53  |...^EQUS .9+"SYS|
00000300  20 22 2b bd 33 34 2b 22  50 61 63 6b 65 72 5f 50  | "+.34+"Packer_P|
00000310  61 63 6b 53 74 72 69 6e  67 22 2b bd 33 34 2b 22  |ackString"+.34+"|
00000320  2c 76 61 6c 69 64 24 2c  73 74 61 72 74 24 20 54  |,valid$,start$ T|
00000330  4f 20 61 64 64 72 25 20  3a 20 70 61 63 6b 65 64  |O addr% : packed|
00000340  24 3d 20 24 61 64 64 72  25 22 2b bd 31 33 0d 01  |$= $addr%"+.13..|
00000350  cc 53 45 51 55 53 20 bd  39 2b 22 53 59 53 20 22  |.SEQUS .9+"SYS "|
00000360  2b bd 33 34 2b 22 50 61  63 6b 65 72 5f 55 6e 70  |+.34+"Packer_Unp|
00000370  61 63 6b 53 74 72 69 6e  67 22 2b bd 33 34 2b 22  |ackString"+.34+"|
00000380  2c 76 61 6c 69 64 24 2c  70 61 63 6b 65 64 24 20  |,valid$,packed$ |
00000390  54 4f 20 75 6e 70 61 63  6b 65 64 24 22 2b bd 31  |TO unpacked$"+.1|
000003a0  33 0d 01 d6 a2 45 51 55  53 20 22 77 68 65 72 65  |3....EQUS "where|
000003b0  20 76 61 6c 69 64 24 20  69 73 20 74 68 65 20 76  | valid$ is the v|
000003c0  61 6c 69 64 61 74 69 6f  6e 20 73 74 72 69 6e 67  |alidation string|
000003d0  20 63 6f 6e 74 61 69 6e  69 6e 67 20 61 6c 6c 20  | containing all |
000003e0  74 68 65 20 63 68 61 72  61 63 74 65 72 73 20 74  |the characters t|
000003f0  68 61 74 20 63 61 6e 20  62 65 20 75 73 65 64 20  |hat can be used |
00000400  69 6e 20 74 68 65 20 73  74 72 69 6e 67 20 63 6f  |in the string co|
00000410  6e 63 65 72 6e 65 64 2c  20 61 6e 64 20 73 74 61  |ncerned, and sta|
00000420  72 74 24 20 69 73 20 74  68 65 20 73 74 72 69 6e  |rt$ is the strin|
00000430  67 20 74 6f 20 62 65 20  63 6f 6d 70 61 63 74 65  |g to be compacte|
00000440  64 2e 22 0d 01 e0 0a 45  51 55 42 20 30 0d 01 ea  |d."....EQUB 0...|
00000450  09 41 4c 49 47 4e 0d 01  f4 05 3a 0d 01 fe 0e 2e  |.ALIGN....:.....|
00000460  73 77 69 5f 74 61 62 6c  65 0d 02 08 11 45 51 55  |swi_table....EQU|
00000470  53 20 22 50 61 63 6b 65  72 22 0d 02 12 0a 45 51  |S "Packer"....EQ|
00000480  55 42 20 30 0d 02 1c 15  45 51 55 53 20 22 50 61  |UB 0....EQUS "Pa|
00000490  63 6b 53 74 72 69 6e 67  22 0d 02 26 0a 45 51 55  |ckString"..&.EQU|
000004a0  42 20 30 0d 02 30 17 45  51 55 53 20 22 55 6e 70  |B 0..0.EQUS "Unp|
000004b0  61 63 6b 53 74 72 69 6e  67 22 0d 02 3a 0a 45 51  |ackString"..:.EQ|
000004c0  55 42 20 30 0d 02 44 0a  45 51 55 42 20 30 0d 02  |UB 0..D.EQUB 0..|
000004d0  4e 09 41 4c 49 47 4e 0d  02 58 05 3a 0d 02 62 09  |N.ALIGN..X.:..b.|
000004e0  2e 69 6e 69 74 0d 02 6c  14 53 54 4d 46 44 20 52  |.init..l.STMFD R|
000004f0  31 33 21 2c 7b 52 31 34  7d 0d 02 76 0e 4d 4f 56  |13!,{R14}..v.MOV|
00000500  20 52 36 2c 52 31 32 0d  02 80 11 4c 44 52 20 52  | R6,R12....LDR R|
00000510  31 32 2c 5b 52 31 32 5d  0d 02 8a 0d 4d 4f 56 20  |12,[R12]....MOV |
00000520  52 30 2c 23 36 0d 02 94  10 4d 4f 56 20 52 33 2c  |R0,#6....MOV R3,|
00000530  23 26 31 30 30 0d 02 9e  13 53 57 49 20 22 4f 53  |#&100....SWI "OS|
00000540  5f 4d 6f 64 75 6c 65 22  0d 02 a8 0f 53 54 52 20  |_Module"....STR |
00000550  52 32 2c 5b 52 36 5d 0d  02 b2 0e 4d 4f 56 20 52  |R2,[R6]....MOV R|
00000560  31 32 2c 52 36 0d 02 bc  13 4c 44 4d 46 44 20 52  |12,R6....LDMFD R|
00000570  31 33 21 2c 7b 50 43 7d  0d 02 c6 05 3a 0d 02 d0  |13!,{PC}....:...|
00000580  0c 2e 73 77 69 63 6f 64  65 0d 02 da 1b 53 54 4d  |..swicode....STM|
00000590  46 44 20 52 31 33 21 2c  7b 52 32 2d 52 31 31 2c  |FD R13!,{R2-R11,|
000005a0  52 31 34 7d 0d 02 e4 0d  4d 4f 56 20 52 36 2c 52  |R14}....MOV R6,R|
000005b0  30 0d 02 ee 0e 4d 4f 56  20 52 31 30 2c 52 31 0d  |0....MOV R10,R1.|
000005c0  02 f8 11 4c 44 52 20 52  31 32 2c 5b 52 31 32 5d  |...LDR R12,[R12]|
000005d0  0d 03 02 0e 43 4d 50 20  52 31 31 2c 23 32 0d 03  |....CMP R11,#2..|
000005e0  0c 19 41 44 44 43 43 20  50 43 2c 50 43 2c 52 31  |..ADDCC PC,PC,R1|
000005f0  31 2c 4c 53 4c 23 32 0d  03 16 1a 4c 44 4d 46 44  |1,LSL#2....LDMFD|
00000600  20 52 31 33 21 2c 7b 52  32 2d 52 31 31 2c 50 43  | R13!,{R2-R11,PC|
00000610  7d 0d 03 20 0a 42 20 70  61 63 6b 0d 03 2a 0c 42  |}.. .B pack..*.B|
00000620  20 75 6e 70 61 63 6b 0d  03 34 05 3a 0d 03 3e 09  | unpack..4.:..>.|
00000630  2e 70 61 63 6b 0d 03 48  0f 4d 4f 56 20 62 79 74  |.pack..H.MOV byt|
00000640  65 2c 23 30 0d 03 52 0d  4d 4f 56 20 52 33 2c 23  |e,#0..R.MOV R3,#|
00000650  30 0d 03 5c 10 42 4c 20  63 6f 75 6e 74 62 69 74  |0..\.BL countbit|
00000660  73 0d 03 66 0f 43 4d 50  20 62 69 74 73 2c 23 38  |s..f.CMP bits,#8|
00000670  0d 03 70 12 42 47 45 20  64 6f 6e 74 62 6f 74 68  |..p.BGE dontboth|
00000680  65 72 0d 03 7a 0e 4d 4f  56 20 62 69 74 2c 23 37  |er..z.MOV bit,#7|
00000690  0d 03 84 0d 4d 4f 56 20  52 34 2c 23 30 0d 03 8e  |....MOV R4,#0...|
000006a0  14 4c 44 52 42 20 52 38  2c 5b 52 34 2c 52 31 30  |.LDRB R8,[R4,R10|
000006b0  5d 0d 03 98 0d 43 4d 50  20 52 38 2c 23 30 0d 03  |]....CMP R8,#0..|
000006c0  a2 0e 42 45 51 20 66 69  6e 69 73 68 0d 03 ac 09  |..BEQ finish....|
000006d0  2e 6c 6f 6f 70 0d 03 b6  0e 4d 4f 56 20 52 31 31  |.loop....MOV R11|
000006e0  2c 23 30 0d 03 c0 0a 2e  69 6e 73 74 72 0d 03 ca  |,#0.....instr...|
000006f0  14 4c 44 52 42 20 52 39  2c 5b 52 31 31 2c 52 36  |.LDRB R9,[R11,R6|
00000700  5d 0d 03 d4 12 41 44 44  20 52 31 31 2c 52 31 31  |]....ADD R11,R11|
00000710  2c 23 31 0d 03 de 0d 43  4d 50 20 52 39 2c 23 30  |,#1....CMP R9,#0|
00000720  0d 03 e8 0f 42 45 51 20  69 6e 76 61 6c 69 64 0d  |....BEQ invalid.|
00000730  03 f2 0d 43 4d 50 20 52  39 2c 52 38 0d 03 fc 0d  |...CMP R9,R8....|
00000740  42 4e 45 20 69 6e 73 74  72 0d 04 06 0e 4d 4f 56  |BNE instr....MOV|
00000750  20 52 38 2c 52 31 31 0d  04 10 12 53 55 42 20 52  | R8,R11....SUB R|
00000760  35 2c 62 69 74 73 2c 23  31 0d 04 1a 0e 4d 4f 56  |5,bits,#1....MOV|
00000770  20 52 31 31 2c 23 31 0d  04 24 0c 2e 62 69 74 6c  | R11,#1..$..bitl|
00000780  6f 6f 70 0d 04 2e 17 80  53 20 52 39 2c 52 38 2c  |oop.....S R9,R8,|
00000790  52 31 31 2c 4c 53 4c 20  52 35 0d 04 38 1a 84 52  |R11,LSL R5..8..R|
000007a0  4e 45 20 52 33 2c 52 33  2c 52 31 31 2c 4c 53 4c  |NE R3,R3,R11,LSL|
000007b0  20 62 69 74 0d 04 42 13  53 55 42 53 20 62 69 74  | bit..B.SUBS bit|
000007c0  2c 62 69 74 2c 23 31 0d  04 4c 10 42 50 4c 20 64  |,bit,#1..L.BPL d|
000007d0  6f 6e 74 73 61 76 65 0d  04 56 0e 4d 4f 56 20 62  |ontsave..V.MOV b|
000007e0  69 74 2c 23 37 0d 04 60  0e 43 4d 50 20 52 33 2c  |it,#7..`.CMP R3,|
000007f0  23 31 33 0d 04 6a 12 41  44 44 47 45 20 52 33 2c  |#13..j.ADDGE R3,|
00000800  52 33 2c 23 31 0d 04 74  16 53 54 52 42 20 52 33  |R3,#1..t.STRB R3|
00000810  2c 5b 62 79 74 65 2c 52  31 32 5d 0d 04 7e 14 41  |,[byte,R12]..~.A|
00000820  44 44 20 62 79 74 65 2c  62 79 74 65 2c 23 31 0d  |DD byte,byte,#1.|
00000830  04 88 0d 4d 4f 56 20 52  33 2c 23 30 0d 04 92 0d  |...MOV R3,#0....|
00000840  2e 64 6f 6e 74 73 61 76  65 0d 04 9c 11 53 55 42  |.dontsave....SUB|
00000850  53 20 52 35 2c 52 35 2c  23 31 0d 04 a6 0f 42 50  |S R5,R5,#1....BP|
00000860  4c 20 62 69 74 6c 6f 6f  70 0d 04 b0 10 41 44 44  |L bitloop....ADD|
00000870  20 52 34 2c 52 34 2c 23  31 0d 04 ba 14 4c 44 52  | R4,R4,#1....LDR|
00000880  42 20 52 38 2c 5b 52 34  2c 52 31 30 5d 0d 04 c4  |B R8,[R4,R10]...|
00000890  0d 43 4d 50 20 52 38 2c  23 30 0d 04 ce 0c 42 4e  |.CMP R8,#0....BN|
000008a0  45 20 6c 6f 6f 70 0d 04  d8 0e 43 4d 50 20 62 69  |E loop....CMP bi|
000008b0  74 2c 23 37 0d 04 e2 0e  42 45 51 20 66 69 6e 69  |t,#7....BEQ fini|
000008c0  73 68 0d 04 ec 0e 43 4d  50 20 52 33 2c 23 31 33  |sh....CMP R3,#13|
000008d0  0d 04 f6 12 41 44 44 47  45 20 52 33 2c 52 33 2c  |....ADDGE R3,R3,|
000008e0  23 31 0d 05 00 16 53 54  52 42 20 52 33 2c 5b 62  |#1....STRB R3,[b|
000008f0  79 74 65 2c 52 31 32 5d  0d 05 0a 14 41 44 44 20  |yte,R12]....ADD |
00000900  62 79 74 65 2c 62 79 74  65 2c 23 31 0d 05 14 0b  |byte,byte,#1....|
00000910  2e 66 69 6e 69 73 68 0d  05 1e 0e 4d 4f 56 20 52  |.finish....MOV R|
00000920  33 2c 23 31 33 0d 05 28  16 53 54 52 42 20 52 33  |3,#13..(.STRB R3|
00000930  2c 5b 62 79 74 65 2c 52  31 32 5d 0d 05 32 0d 4d  |,[byte,R12]..2.M|
00000940  4f 56 20 52 31 2c 52 30  0d 05 3c 0e 4d 4f 56 20  |OV R1,R0..<.MOV |
00000950  52 30 2c 52 31 32 0d 05  46 1a 4c 44 4d 46 44 20  |R0,R12..F.LDMFD |
00000960  52 31 33 21 2c 7b 52 32  2d 52 31 31 2c 50 43 7d  |R13!,{R2-R11,PC}|
00000970  0d 05 50 05 3a 0d 05 5a  0e 2e 63 6f 75 6e 74 62  |..P.:..Z..countb|
00000980  69 74 73 0d 05 64 0d 4d  4f 56 20 52 39 2c 23 30  |its..d.MOV R9,#0|
00000990  0d 05 6e 0c 2e 66 69 6e  64 6c 65 6e 0d 05 78 13  |..n..findlen..x.|
000009a0  4c 44 52 42 20 52 38 2c  5b 52 39 2c 52 36 5d 0d  |LDRB R8,[R9,R6].|
000009b0  05 82 10 41 44 44 20 52  39 2c 52 39 2c 23 31 0d  |...ADD R9,R9,#1.|
000009c0  05 8c 0d 43 4d 50 20 52  38 2c 23 30 0d 05 96 0f  |...CMP R8,#0....|
000009d0  42 4e 45 20 66 69 6e 64  6c 65 6e 0d 05 a0 0d 4d  |BNE findlen....M|
000009e0  4f 56 20 52 30 2c 23 37  0d 05 aa 0f 4d 4f 56 20  |OV R0,#7....MOV |
000009f0  52 38 2c 23 32 35 36 0d  05 b4 0d 4d 4f 56 20 52  |R8,#256....MOV R|
00000a00  35 2c 23 32 0d 05 be 0e  2e 63 6f 75 6e 74 6c 6f  |5,#2.....countlo|
00000a10  6f 70 0d 05 c8 10 53 55  42 20 52 38 2c 52 38 2c  |op....SUB R8,R8,|
00000a20  23 33 0d 05 d2 0d 43 4d  50 20 52 39 2c 52 38 0d  |#3....CMP R9,R8.|
00000a30  05 dc 0b 42 47 45 20 6f  75 74 0d 05 e6 10 41 44  |...BGE out....AD|
00000a40  44 20 52 38 2c 52 38 2c  23 33 0d 05 f0 10 53 55  |D R8,R8,#3....SU|
00000a50  42 20 52 30 2c 52 30 2c  23 31 0d 05 fa 14 4d 4f  |B R0,R0,#1....MO|
00000a60  56 20 52 38 2c 52 35 2c  4c 53 4c 20 52 30 0d 06  |V R8,R5,LSL R0..|
00000a70  04 0f 42 20 63 6f 75 6e  74 6c 6f 6f 70 0d 06 0e  |..B countloop...|
00000a80  08 2e 6f 75 74 0d 06 18  10 41 44 44 20 52 30 2c  |..out....ADD R0,|
00000a90  52 30 2c 23 32 0d 06 22  0e 4d 4f 56 20 50 43 2c  |R0,#2..".MOV PC,|
00000aa0  52 31 34 0d 06 2c 05 3a  0d 06 36 0c 2e 69 6e 76  |R14..,.:..6..inv|
00000ab0  61 6c 69 64 0d 06 40 15  41 44 52 20 52 30 2c 65  |alid..@.ADR R0,e|
00000ac0  72 72 6f 72 62 6c 6f 63  6b 0d 06 4a 14 53 54 52  |rrorblock..J.STR|
00000ad0  42 20 52 38 2c 5b 52 30  2c 23 31 35 5d 0d 06 54  |B R8,[R0,#15]..T|
00000ae0  1b 4c 44 4d 46 44 20 52  31 33 21 2c 7b 52 32 2d  |.LDMFD R13!,{R2-|
00000af0  52 31 31 2c 52 31 34 7d  0d 06 5e 15 84 52 53 20  |R11,R14}..^..RS |
00000b00  50 43 2c 52 31 34 2c 23  31 3c 3c 32 38 0d 06 68  |PC,R14,#1<<28..h|
00000b10  0f 2e 65 72 72 6f 72 62  6c 6f 63 6b 0d 06 72 0c  |..errorblock..r.|
00000b20  45 51 55 44 20 33 34 35  0d 06 7c 31 45 51 55 53  |EQUD 345..|1EQUS|
00000b30  20 22 43 68 61 72 61 63  74 65 72 20 27 20 27 20  | "Character ' ' |
00000b40  6e 6f 74 20 69 6e 20 76  61 6c 69 64 61 74 69 6f  |not in validatio|
00000b50  6e 20 73 74 72 69 6e 67  22 0d 06 86 0a 45 51 55  |n string"....EQU|
00000b60  42 20 30 0d 06 90 09 41  4c 49 47 4e 0d 06 9a 05  |B 0....ALIGN....|
00000b70  3a 0d 06 a4 0f 2e 64 6f  6e 74 62 6f 74 68 65 72  |:.....dontbother|
00000b80  0d 06 ae 0e 4d 4f 56 20  52 31 31 2c 23 30 0d 06  |....MOV R11,#0..|
00000b90  b8 0c 2e 66 69 6e 64 65  6e 64 0d 06 c2 12 41 44  |...findend....AD|
00000ba0  44 20 52 31 31 2c 52 31  31 2c 23 31 0d 06 cc 15  |D R11,R11,#1....|
00000bb0  4c 44 52 42 20 52 38 2c  5b 52 31 30 2c 52 31 31  |LDRB R8,[R10,R11|
00000bc0  5d 0d 06 d6 0d 43 4d 50  20 52 38 2c 23 30 0d 06  |]....CMP R8,#0..|
00000bd0  e0 0f 42 4e 45 20 66 69  6e 64 65 6e 64 0d 06 ea  |..BNE findend...|
00000be0  0e 4d 4f 56 20 52 38 2c  23 31 33 0d 06 f4 15 53  |.MOV R8,#13....S|
00000bf0  54 52 42 20 52 38 2c 5b  52 31 30 2c 52 31 31 5d  |TRB R8,[R10,R11]|
00000c00  0d 06 fe 0d 4d 4f 56 20  52 31 2c 23 38 0d 07 08  |....MOV R1,#8...|
00000c10  0e 4d 4f 56 20 52 30 2c  52 31 30 0d 07 12 1a 4c  |.MOV R0,R10....L|
00000c20  44 4d 46 44 20 52 31 33  21 2c 7b 52 32 2d 52 31  |DMFD R13!,{R2-R1|
00000c30  31 2c 50 43 7d 0d 07 1c  05 3a 0d 07 26 0b 2e 75  |1,PC}....:..&..u|
00000c40  6e 70 61 63 6b 0d 07 30  0f 4d 4f 56 20 62 79 74  |npack..0.MOV byt|
00000c50  65 2c 23 30 0d 07 3a 0d  4d 4f 56 20 52 34 2c 23  |e,#0..:.MOV R4,#|
00000c60  30 0d 07 44 0e 4d 4f 56  20 52 31 31 2c 23 31 0d  |0..D.MOV R11,#1.|
00000c70  07 4e 10 42 4c 20 63 6f  75 6e 74 62 69 74 73 0d  |.N.BL countbits.|
00000c80  07 58 0f 43 4d 50 20 62  69 74 73 2c 23 38 0d 07  |.X.CMP bits,#8..|
00000c90  62 12 42 47 45 20 64 6f  6e 74 62 6f 74 68 65 72  |b.BGE dontbother|
00000ca0  0d 07 6c 0e 4d 4f 56 20  62 69 74 2c 23 37 0d 07  |..l.MOV bit,#7..|
00000cb0  76 16 4c 44 52 42 20 52  38 2c 5b 52 31 30 2c 62  |v.LDRB R8,[R10,b|
00000cc0  79 74 65 5d 0d 07 80 0e  43 4d 50 20 52 38 2c 23  |yte]....CMP R8,#|
00000cd0  31 34 0d 07 8a 12 53 55  42 47 45 20 52 38 2c 52  |14....SUBGE R8,R|
00000ce0  38 2c 23 31 0d 07 94 0a  2e 6c 6f 6f 70 32 0d 07  |8,#1.....loop2..|
00000cf0  9e 0d 4d 4f 56 20 52 33  2c 23 30 0d 07 a8 12 53  |..MOV R3,#0....S|
00000d00  55 42 20 52 35 2c 62 69  74 73 2c 23 31 0d 07 b2  |UB R5,bits,#1...|
00000d10  0d 2e 62 69 74 6c 6f 6f  70 32 0d 07 bc 18 80 53  |..bitloop2.....S|
00000d20  20 52 39 2c 52 38 2c 52  31 31 2c 4c 53 4c 20 62  | R9,R8,R11,LSL b|
00000d30  69 74 0d 07 c6 19 84 52  4e 45 20 52 33 2c 52 33  |it.....RNE R3,R3|
00000d40  2c 52 31 31 2c 4c 53 4c  20 52 35 0d 07 d0 13 53  |,R11,LSL R5....S|
00000d50  55 42 53 20 62 69 74 2c  62 69 74 2c 23 31 0d 07  |UBS bit,bit,#1..|
00000d60  da 10 42 50 4c 20 64 6f  6e 74 6c 6f 61 64 0d 07  |..BPL dontload..|
00000d70  e4 0e 4d 4f 56 20 62 69  74 2c 23 37 0d 07 ee 14  |..MOV bit,#7....|
00000d80  41 44 44 20 62 79 74 65  2c 62 79 74 65 2c 23 31  |ADD byte,byte,#1|
00000d90  0d 07 f8 16 4c 44 52 42  20 52 38 2c 5b 52 31 30  |....LDRB R8,[R10|
00000da0  2c 62 79 74 65 5d 0d 08  02 0e 43 4d 50 20 52 38  |,byte]....CMP R8|
00000db0  2c 23 31 34 0d 08 0c 12  53 55 42 47 45 20 52 38  |,#14....SUBGE R8|
00000dc0  2c 52 38 2c 23 31 0d 08  16 0d 2e 64 6f 6e 74 6c  |,R8,#1.....dontl|
00000dd0  6f 61 64 0d 08 20 11 53  55 42 53 20 52 35 2c 52  |oad.. .SUBS R5,R|
00000de0  35 2c 23 31 0d 08 2a 10  42 50 4c 20 62 69 74 6c  |5,#1..*.BPL bitl|
00000df0  6f 6f 70 32 0d 08 34 10  53 55 42 20 52 33 2c 52  |oop2..4.SUB R3,R|
00000e00  33 2c 23 31 0d 08 3e 13  4c 44 52 42 20 52 39 2c  |3,#1..>.LDRB R9,|
00000e10  5b 52 36 2c 52 33 5d 0d  08 48 10 41 44 44 20 52  |[R6,R3]..H.ADD R|
00000e20  33 2c 52 33 2c 23 31 0d  08 52 14 53 54 52 42 20  |3,R3,#1..R.STRB |
00000e30  52 39 2c 5b 52 31 32 2c  52 34 5d 0d 08 5c 10 41  |R9,[R12,R4]..\.A|
00000e40  44 44 20 52 34 2c 52 34  2c 23 31 0d 08 66 0d 43  |DD R4,R4,#1..f.C|
00000e50  4d 50 20 52 33 2c 23 30  0d 08 70 0d 42 4e 45 20  |MP R3,#0..p.BNE |
00000e60  6c 6f 6f 70 32 0d 08 7a  10 53 55 42 20 52 34 2c  |loop2..z.SUB R4,|
00000e70  52 34 2c 23 31 0d 08 84  0e 4d 4f 56 20 52 39 2c  |R4,#1....MOV R9,|
00000e80  23 31 33 0d 08 8e 14 53  54 52 42 20 52 39 2c 5b  |#13....STRB R9,[|
00000e90  52 31 32 2c 52 34 5d 0d  08 98 0d 4d 4f 56 20 52  |R12,R4]....MOV R|
00000ea0  31 2c 52 30 0d 08 a2 0e  4d 4f 56 20 52 30 2c 52  |1,R0....MOV R0,R|
00000eb0  31 32 0d 08 ac 1a 4c 44  4d 46 44 20 52 31 33 21  |12....LDMFD R13!|
00000ec0  2c 7b 52 32 2d 52 31 31  2c 50 43 7d 0d 08 b6 0d  |,{R2-R11,PC}....|
00000ed0  5d 3a ed 20 70 61 73 73  25 0d 08 c0 25 ff 20 22  |]:. pass%...%. "|
00000ee0  53 61 76 65 20 50 61 63  6b 65 72 20 22 2b c3 7e  |Save Packer "+.~|
00000ef0  63 6f 64 65 25 2b 22 2b  22 2b c3 7e 50 25 0d 08  |code%+"+"+.~P%..|
00000f00  ca 1a 2a 53 65 74 74 79  70 65 20 50 61 63 6b 65  |..*Settype Packe|
00000f10  72 20 4d 6f 64 75 6c 65  0d 08 d4 12 2a 52 4d 6c  |r Module....*RMl|
00000f20  6f 61 64 20 50 61 63 6b  65 72 0d 08 de 1f f1 22  |oad Packer....."|
00000f30  4d 6f 64 75 6c 65 20 73  61 76 65 64 20 61 73 20  |Module saved as |
00000f40  27 50 61 63 6b 65 72 27  22 0d 08 e8 05 e0 0d ff  |'Packer'".......|
00000f50