diff --git a/Makefile b/Makefile
index 6fafe8ad284d8dda35e8e1ca30676468c348befa..600f36ab56bf7edeb412f00a9735559b196cdb6c 100644
--- a/Makefile
+++ b/Makefile
@@ -23,19 +23,22 @@ EXP_HDR = <export$dir>
 # Generic options:
 #
 MKDIR   = cdir
-AS      = aasm
+AS      = objasm
 CP      = copy
+LD      = link
 RM      = remove
 CCFLAGS = -c -depend !Depend -IC:
-ASFLAGS = -depend !Depend -Stamp -quit -module -To $@ -From
+ASFLAGS = -depend !Depend -Stamp -quit -module
 CPFLAGS = ~cfr~v
+LDFLAGS = -bin -base 0
 
 #
 # Program specific options:
 #
 COMPONENT = UnSqzAIF
-SOURCE    = s.Front
+SOURCE    = s.ModHead
 TARGET    = rm.UnSqzAIF
+OBJECT    = o.ModHead
 
 #
 # Generic rules:
@@ -49,9 +52,15 @@ install_rom: ${TARGET}
 
 clean:
 	${RM} ${TARGET}
+	${RM} o
 	@echo ${COMPONENT}: cleaned
 
-${TARGET}: ${SOURCE}
-	${AS} ${ASFLAGS} ${SOURCE}
+${TARGET}: ${OBJECT}
+	${LD} ${LDFLAGS} -o $@ ${OBJECT}
+	settype $@ Module
+
+${OBJECT}: ${SOURCE}
+	${MKDIR} o
+	${AS} ${ASFLAGS} -o $@ ${SOURCE}
 
 # Dynamic dependencies:
diff --git a/Version b/Version
deleted file mode 100644
index 8819dbdde36af6f777a02eb1c88ce5ff7b7f00e3..0000000000000000000000000000000000000000
--- a/Version
+++ /dev/null
@@ -1,13 +0,0 @@
-; > Version
-
-;; History:
-
-        GBLA    Version
-        GBLS    VString
-        GBLS    Date
-
-Version SETA    003
-VString SETS    "0.03" 
-Date    SETS    "10 Jul 1996"
-
-        END        
diff --git a/VersionASM b/VersionASM
new file mode 100644
index 0000000000000000000000000000000000000000..3bc57c154bf05a901854e20431c1a8041123285e
--- /dev/null
+++ b/VersionASM
@@ -0,0 +1,14 @@
+;
+; This file is automatically maintained by srccommit, do not edit manually.
+;
+                        GBLS    Module_MajorVersion
+                        GBLA    Module_Version
+                        GBLS    Module_MinorVersion
+                        GBLS    Module_Date
+                        GBLS    Module_FullVersion
+Module_MajorVersion     SETS    "0.05"
+Module_Version          SETA    5
+Module_MinorVersion     SETS    ""
+Module_Date             SETS    "30 Nov 1999"
+Module_FullVersion      SETS    "0.05"
+                        END
diff --git a/VersionNum b/VersionNum
new file mode 100644
index 0000000000000000000000000000000000000000..ba2a750f00cc5819d5c3a357133be11593a783f1
--- /dev/null
+++ b/VersionNum
@@ -0,0 +1,15 @@
+/* (0.05)
+ *
+ * This file is automatically maintained by srccommit, do not edit manually.
+ *
+ */
+#define Module_MajorVersion_CMHG        0.05
+#define Module_MinorVersion_CMHG        
+#define Module_Date_CMHG                30 Nov 1999
+
+#define Module_MajorVersion             "0.05"
+#define Module_Version                  5
+#define Module_MinorVersion             ""
+#define Module_Date                     "30 Nov 1999"
+
+#define Module_FullVersion              "0.05"
diff --git a/s/Front b/s/Front
deleted file mode 100644
index 4fabaef9740a86063a372ded9914295c8a0da9f1..0000000000000000000000000000000000000000
--- a/s/Front
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright 1996 Acorn Computers Ltd
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;     http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-;
-; > Sources.Front
-
-;;-----------------------------------------------------------------------------
-;; Decompression module for squeezed AIF files with intact AIF header
-;;-----------------------------------------------------------------------------
-
-Module_BaseAddr
-
-        GET     Hdr:ListOpts
-        GET     Hdr:Macros
-        GET     Hdr:System
-        GET     Hdr:Services
-        GET     Hdr:ModHand
-        GET     Hdr:MsgTrans
-        GET     Hdr:NdrDebug
-
-        GET     Version
-
-        GBLL    hostvdu
-        GBLL    debugwt
-
-debug    SETL   false
-debugwt  SETL   true             ; Misc debugging by WT
-hostvdu  SETL   false
-
-; ----------------------------------------------------------------------------------------------------------------------
-;       Definitions
-
-
-; ----------------------------------------------------------------------------------------------------------------------
-;       Workspace layout
-
-workspace       RN      R12
-                ^       0,workspace
-
-        ! 0, "Module workspace is &":CC:(:STR:(:INDEX:@)):CC:" bytes"
-
-; ----------------------------------------------------------------------------------------------------------------------
-        LNK     s.ModHead
-
diff --git a/s/ModHead b/s/ModHead
index e4f2e456ca179e5d1c34762979ddfd21a010b67f..3f1669ce6924174823d9bf3cefe88734c916cf53 100644
--- a/s/ModHead
+++ b/s/ModHead
@@ -13,10 +13,34 @@
 ; limitations under the License.
 ;
 ; > Sources.ModHead
-        LEADR   Module_LoadAddr
 
-        ASSERT  (.=Module_BaseAddr)
+;;-----------------------------------------------------------------------------
+;; Decompression module for squeezed AIF files with intact AIF header
+;;-----------------------------------------------------------------------------
 
+        GET     Hdr:ListOpts
+        GET     Hdr:Macros
+        GET     Hdr:System
+        GET     Hdr:Services
+        GET     Hdr:ModHand
+        GET     Hdr:MsgTrans
+        GET     Hdr:NdrDebug
+
+        GET     VersionASM
+
+        GBLL    hostvdu
+        GBLL    debugwt
+debug    SETL   false
+debugwt  SETL   false
+hostvdu  SETL   false
+
+        ! 0, "Module workspace is &":CC:(:STR:(:INDEX:@)):CC:" bytes"
+
+; ----------------------------------------------------------------------------------------------------------------------
+
+        AREA    |!!!ModuleHeader|, CODE, READONLY, PIC
+
+Module_BaseAddr
         DCD     0
         DCD     Initialise     - Module_BaseAddr
         DCD     0
@@ -24,17 +48,28 @@
         DCD     Title          - Module_BaseAddr
         DCD     Helpstr        - Module_BaseAddr
         DCD     0                                       ; Helptable
+  [ :LNOT: No32bitCode
         DCD     0                                       ; SWIbase
-        DCD     0
-        DCD     0
+        DCD     0                                       ; SWI handler code
+        DCD     0                                       ; SWI decode table
         DCD     0                                       ; SWIdecode
-        DCD     0
-        DCD     0
+        DCD     0                                       ; International messages
+        DCD     ModuleFlags    - Module_BaseAddr        ; Module flags
+  ]
 
 ; ---------------------------------------------------------------------------------------------------
 Title   DCB     "UnSqueezeAIF",0
-Helpstr DCB     "UnSqueezeAIF",9,"$VString ($Date)",0
-                ALIGN
+Helpstr DCB     "UnSqueezeAIF",9,"$Module_MajorVersion ($Module_Date)"
+  [ Module_MinorVersion <> ""
+        DCB     " $Module_MinorVersion"
+  ]
+        DCB     0
+        ALIGN
+
+  [ :LNOT: No32bitCode
+ModuleFlags
+        DCD     1       ; Module is 32-bit safe
+  ]
 
 ; ---------------------------------------------------------------------------------------------------
 
@@ -69,27 +104,30 @@ notneedederror
         DCB     "UnSqueezeAIF not needed on this platform",0
         ALIGN
 
-
-Service
-        ROUT
+ServiceTable
+        DCD     0                                ;flags
+        DCD     UService - Module_BaseAddr
+        DCD     Service_UKCompression
+        DCD     0                                ;terminator
+        DCD     ServiceTable - Module_BaseAddr
+Service ROUT
+        MOV     r0, r0                           ;magic instruction
         TEQ     r1, #Service_UKCompression
-        MOVNES  pc, lr                  ;Not our service.
-
-        CMP     r0, #0                  ;Is it the pre-decompression call?
-        MOVNES  pc, lr                  ;No, so we're not interested.
+        MOVNE   pc, lr                           ;Not our service.
+UService
+        CMP     r0, #0                           ;Is it the pre-decompression call?
+        MOVNE   pc, lr                           ;No, so we're not interested.
 
         Push    "r0,r2-r6,lr"
 
         LDR     r0,[r12]
         ANDS    r0,r0,#1
-        Pull    "r0,r2-r6,pc",EQ,^      ; forget it if not needed
+        Pull    "r0,r2-r6,pc",EQ        ; forget it if not needed
 
         ;Check whether the file is an AIF-headered file.
         LDR     lr, [r2, #&10]          ; We know R2 is &8000, 'cos it's an app
-        MOV     r0, #&EF000000          ; 'SWI'
-        ORR     r0, r0, #&0011          ; 'OS_Exit'
-
-        CMP     r0, lr                  ; Is the 5th word a 'SWI OS_Exit'?
+        EOR     r0, lr, #&EF000000      ; 'SWI'
+        EORS    r0, r0, #&0011          ; 'OS_Exit'  Is the 5th word a 'SWI OS_Exit'?
         MOVEQ   r6,#1
         MOVNE   r6,#0                   ;flag AIF/non-AIF
   [ :LNOT: AllowNonAIF
@@ -107,12 +145,13 @@ Service
         ;there's nothing to do, so quit, unclaimed.
 01      MOV     r1, #Service_UKCompression
         Debug   wt,"give up 1"
-        Pull    "r0,r2-r6,pc",,^
+        Pull    "r0,r2-r6,pc"
 
 02
         LDR     lr,[r2]
-        BIC     lr,lr,#&FF000000
-        ADD     r0,r2,lr,LSL #2         ;add offset of branch in bytes (should be +ve)
+        MOVS    lr, lr, LSL #8          ;remove top 8 bits
+        BMI     %BT01                   ;negative?  nasty branch - forget this code
+        ADD     r0,r2,lr,ASR #6         ;add offset of branch in bytes (should be +ve)
         ADD     r0,r0,#8                ;and account for PC+8
 
         ADR     r4,UnsqSignature
@@ -134,7 +173,7 @@ Service
 ;give up
 04      MOV     r1, #Service_UKCompression
         Debug   wt,"give up 2"
-        Pull    "r0,r2-r6,pc",,^
+        Pull    "r0,r2-r6,pc"
 
 05      ;found 1st word of signature
         MOV     r3,#UnsqSigSize-4
@@ -159,7 +198,7 @@ Service
         ADR     r5,CopySyncAndGoR4
         STR     r5,[r4],#4
 
-        ;if non-AIF, can't fix-up header to unsqueeze first, so cliam and return now
+        ;if non-AIF, can't fix-up header to unsqueeze first, so claim and return now
         ;this means code can't really be patched after unsqueeze, but at least the
         ;unsqueeze is fixed
         ;
@@ -167,22 +206,19 @@ Service
         ;because we know FileSwitch does a sychronise, after this service call (after
         ;the next service call, for patching, in fact)
 
-        CMP     r6,#0
-        MOVEQ   r1, #0                  ; Mark it as claimed.
-        Pull    "r0,r2-r6,pc",EQ,^      ; That's all folks!
+        ANDS    r1, r6, #1              ; AIF bit set?  If not, set Z, R1=0
+        Pull    "r0,r2-r6,pc",EQ        ; That's all folks!
 
         ;Now calculate the B needed to get back here once it's unsqueezed
         Debug   wt,"It's a squeezed AIF file which we can handle!"
         ADR     r0, retfrmunsq
-        MOV     r2, #&8000
-        ADD     r2, r2, #&14
+        MOV     r1, #&8000
+        ADD     r2, r1, #&14
         SUB     r0, r0, r2              ; R0 is the offset, accounting for PC+8
         MOV     r2, #&EA000000          ; Create the BAL bit of the instruction
         ORR     r0, r2, r0, LSR #2      ; OR in the offset
 
-        MOV     r1, #&8000
-        ADD     r1, r1, #&0C
-        LDR     lr, [r1]                ; Grab what was at the ImageEntryPoint
+        LDR     lr, [r1, #&0C]!         ; Grab what was at the ImageEntryPoint
         STR     r0, [r1]                ; Replace it with the branch
         Push    "lr"                    ; Stuff it safe on the stack, along with the cache status
   Debug wt,"synchronise"
@@ -190,9 +226,13 @@ Service
         SWI     XOS_SynchroniseCodeAreas ; we've been poking code
         LDR     lr,[sp]
         ;Now go do the unsqueeze
-        TEQP    pc, #0                  ; USR mode, all ints on
-        MOV     r12, #&80000000         ; Cause address extinction if used
-        MOV     r13, #&80000000         ; (keep 1.20 compat capable)
+        MOV     r0, #0
+        MRS     r0, CPSR
+        BICS    r0, r0, #&F             ; SVC32->USR32; SVC26->USR26
+        TEQEQP  pc, #Z_bit              ; USR26, retain Z set
+        MSRNE   CPSR_c, r0              ; USR mode, all ints on
+        MVN     r12, #0                 ; Cause address extinction if used
+        MOV     r13, r12                ; (keep 1.20 compat capable)
         MOV     pc, #&8000              ; Away the noo!
 
 retfrmunsq
@@ -200,17 +240,15 @@ retfrmunsq
         SWI     XOS_EnterOS             ; Back into SVC mode
         Pull    "r1"
   Debug wt,"back from unsqueeze",r1
-        MOV     r0, #&8000
-        ADD     r0, r0, #&0C
-        STR     r1, [r0]                ; Put the ImageEntryPoint instruction back!
-        MOV     r4, r0                  ; This is the new execution point
+        MOV     r4, #&8000              ; Construct the new execution point
+        STR     r1, [r4, #&C]!          ; Put the ImageEntryPoint instruction back!
         MOV     r0,#1
         MOV     r1,r4
         MOV     r2,r4
         SWI     XOS_SynchroniseCodeAreas ;we've been poking again
         STR     r4,[sp,#12]             ; update the stacked r4
         MOV     r1, #0                  ; Mark it as claimed.
-        Pull    "r0,r2-r6,pc",,^        ;That's all folks!
+        Pull    "r0,r2-r6,pc"           ;That's all folks!
 
 
 ;code to look for