Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / asmgo.mud
diff --git a/mim/development/mim/vaxc/asmgo.mud b/mim/development/mim/vaxc/asmgo.mud
new file mode 100644 (file)
index 0000000..5c1492a
--- /dev/null
@@ -0,0 +1,754 @@
+
+<DEFINE PROCESS-BRANCH-1 (INST BYTEOFF CODEPTR
+                         "AUX" PTR LREF (XREF <>) ROFF CDV)
+       #DECL ((INSC EAT CODEPTR INST BYTEOFF PTR INITLEN) FIX (LREF) LABEL-REF
+              (XREF) <OR FALSE XREF-INFO> (CDV) <OR FALSE CODEVEC>)
+       <SET PTR <CHTYPE <ANDB .INST 65535> FIX>>
+       <SET LREF <NTH ,LABEL-TABLE .PTR>>
+       <MAPF <>
+             <FUNCTION (TREF) 
+                     <COND (<==? <XREF-INFO-POINT .TREF> .CODEPTR>
+                            <SET XREF .TREF>
+                            <MAPLEAVE>)>>
+             <LABEL-REF-XREFS .LREF>>
+       <OR .XREF
+           <ERROR "JUMP NOT FOUND" .LREF .CODEPTR .BYTEOFF PROCESS-BRANCH>>
+       <SET CDV <XREF-INFO-STACK-SAVE-CODE .XREF>>
+       <AND .CDV
+            <NOT <EMPTY? .CDV>>
+            <SET BYTEOFF <SCAN-PASS .BYTEOFF () .CDV <> <+ <LENGTH .CDV> 1>>>>
+       .BYTEOFF>
+
+<DEFINE PROCESS-BRANCH-2 (INST BYTEOFF CODEPTR INSC EAT
+                         "AUX" PTR LREF (XREF <>) ROFF CDV)
+       #DECL ((INSC EAT CODEPTR INST BYTEOFF PTR INITLEN) FIX (LREF) LABEL-REF
+              (XREF) <OR FALSE XREF-INFO> (CDV) <OR FALSE CODEVEC>)
+       <SET PTR <CHTYPE <ANDB .INST 65535> FIX>>
+       <SET LREF <NTH ,LABEL-TABLE .PTR>>
+       <MAPF <>
+             <FUNCTION (TREF) 
+                     <COND (<==? <XREF-INFO-POINT .TREF> .CODEPTR>
+                            <SET XREF .TREF>
+                            <MAPLEAVE>)>>
+             <LABEL-REF-XREFS .LREF>>
+       <OR .XREF
+           <ERROR "JUMP NOT FOUND" .LREF .CODEPTR .BYTEOFF PROCESS-BRANCH>>
+       <SET PTR <LABEL-REF-REL-ADDR .LREF>>
+       <COND (<==? .EAT ,OP-BW> <SET BYTEOFF <+ .BYTEOFF 2>>)
+             (ELSE
+              <SET ROFF <- .PTR .BYTEOFF 1>>
+              <COND (<OR <L? .PTR 0>
+                         <G? .ROFF 127>
+                         <L? .ROFF -127>
+                         <XREF-INFO-FORCE-LONG .XREF>>
+                     <PUT .XREF ,XREF-INFO-SHORT <>>
+                     <COND (<==? .INSC ,INST-BRB>
+                            <SET BYTEOFF <+ .BYTEOFF 2>>)
+                           (<OR <==? .INSC ,INST-SOBGEQ>
+                                <==? .INSC ,INST-SOBGTR>>
+                            <SET BYTEOFF <+ .BYTEOFF 5>>)
+                           (<OR <==? .INSC ,INST-AOBLSS>
+                                <==? .INSC ,INST-AOBLEQ>>
+                            <SET BYTEOFF <+ .BYTEOFF 6>>)
+                           (ELSE <SET BYTEOFF <+ .BYTEOFF 4>>)>)
+                    (ELSE
+                     <PUT .XREF ,XREF-INFO-SHORT T>
+                     <SET BYTEOFF <+ .BYTEOFF 1>>)>)>
+       .BYTEOFF>
+
+<DEFINE AGEN-BRANCH-1 (INST BYTEOFF CODEPTR INSCODE
+                      "AUX" PTR LREF XREF (SAVED-POINT 0) CDV ROFF)
+       #DECL ((CODEPTR INST BYTEOFF INSCODE) FIX)
+       <SET PTR <CHTYPE <ANDB .INST 65535> FIX>>
+       <SET LREF <NTH ,LABEL-TABLE .PTR>>
+       <SET PTR <LABEL-REF-REL-ADDR .LREF>>
+       <MAPF <>
+             <FUNCTION (TREF) 
+                     <COND (<==? <XREF-INFO-POINT .TREF> .CODEPTR>
+                            <SET XREF .TREF>
+                            <MAPLEAVE>)>>
+             <LABEL-REF-XREFS .LREF>>
+       <SET CDV <XREF-INFO-STACK-SAVE-CODE .XREF>>
+       <AND .CDV
+            <NOT <EMPTY? .CDV>>
+            <SET BYTEOFF
+                 <OUTPUT-PASS .BYTEOFF () .CDV <+ <LENGTH .CDV> 1> <>>>>
+       .BYTEOFF>
+
+<DEFINE AGEN-BRANCH-2 (INST BYTEOFF CODEPTR INSCODE WHERE EAT
+                      "AUX" PTR LREF XREF ROFF SAVED-P)
+       #DECL ((BYTEOFF INSCODE WHERE EAT ROFF PTR) FIX)
+       <SET PTR <CHTYPE <ANDB .INST 65535> FIX>>
+       <SET LREF <NTH ,LABEL-TABLE .PTR>>
+       <SET PTR <LABEL-REF-REL-ADDR .LREF>>
+       <MAPF <>
+             <FUNCTION (TREF) 
+                     <COND (<==? <XREF-INFO-POINT .TREF> .CODEPTR>
+                            <SET XREF .TREF>
+                            <MAPLEAVE>)>>
+             <LABEL-REF-XREFS .LREF>>
+       <SET BYTEOFF <+ .BYTEOFF 1>>
+       <SET ROFF <- .PTR .BYTEOFF>>
+       <SET SAVED-P ,FBYTE-OFFSET>
+       <COND (<XREF-INFO-SHORT .XREF>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .ROFF 255> FIX>>
+              <PUT .XREF ,XREF-INFO-SHORT T>)
+             (<==? .EAT ,OP-BW>
+              <SET ROFF <- .ROFF 1>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .ROFF 255> FIX>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .ROFF -8> 255> FIX>>
+              <SET BYTEOFF <+ .BYTEOFF 1>>
+              <PUT .XREF ,XREF-INFO-SHORT <>>)
+             (<OR <==? .INSCODE ,INST-SOBGEQ> <==? .INSCODE ,INST-SOBGTR>>
+              <PUT-FCODE .WHERE ,INST-DECL>
+              <ADD-BYTE-TO-FCODE <COND (<==? .INSCODE ,IST-SOBGEQ> ,INST-BGEQ)
+                                       (ELSE ,INST-BGTR)>>
+              <ADD-BYTE-TO-FCODE 3>
+              <ADD-BYTE-TO-FCODE ,INST-BRW>
+              <SET SAVED-P ,FBYTE-OFFSET>
+              <SET BYTEOFF <+ .BYTEOFF 4>>
+              <SET ROFF <- .ROFF 4>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .ROFF 255> FIX>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .ROFF -8> 255> FIX>>
+              <PUT .XREF ,XREF-INFO-SHORT <>>)
+             (<OR <==? .INSCODE ,INST-SOBGEQ> <==? .INSCODE ,INST-AOBLSS>>
+              <SET ROFF <- .ROFF 5>>
+              <ADD-BYTE-TO-FCODE 2>
+              <ADD-BYTE-TO-FCODE ,INST-BRB>
+              <ADD-BYTE-TO-FCODE 3>
+              <ADD-BYTE-TO-FCODE ,INST-BRW>
+              <SET SAVED-P ,FBYTE-OFFSET>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .ROFF 255> FIX>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .ROFF -8> 255> FIX>>
+              <SET BYTEOFF <+ .BYTEOFF 5>>
+              <PUT .XREF ,XREF-INFO-SHORT <>>)
+             (<N==? .INSCODE ,INST-BRB>
+              <PUT-FCODE .WHERE <INS-INVERT .INSCODE>>
+              <SET ROFF <- .ROFF 3>>
+              <ADD-BYTE-TO-FCODE 3>
+              <ADD-BYTE-TO-FCODE ,INST-BRW>
+              <SET SAVED-P ,FBYTE-OFFSET>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .ROFF 255> FIX>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .ROFF -8> 255> FIX>>
+              <SET BYTEOFF <+ .BYTEOFF 3>>
+              <PUT .XREF ,XREF-INFO-SHORT <>>)
+             (ELSE
+              <PUT-FCODE .WHERE ,INST-BRW>
+              <SET BYTEOFF <+ .BYTEOFF 1>>
+              <SET ROFF <- .ROFF 1>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .ROFF 255> FIX>>
+              <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .ROFF -8> 255> FIX>>
+              <PUT .XREF ,XREF-INFO-SHORT <>>)>
+       <PUT .XREF ,XREF-INFO-ADDR .BYTEOFF>
+       <PUT .XREF ,XREF-INFO-POINT .SAVED-P>
+       .BYTEOFF>
+
+<DEFINE INS-INVERT (INS) #DECL ((INS) FIX)
+       <CHTYPE <XORB .INS 1> FIX>>
+
+"PASS TO FIXUP THE LABELS IN THE FINAL CODE"
+
+<DEFINE FIXUP-PASS ("AUX" (LABELS ,LABEL-TABLE) POINT ADDR) 
+       <MAPF <>
+        <FCN (LREF)
+             <SET ADDR <LABEL-REF-REL-ADDR .LREF>>
+             <MAPF <>
+                   <FCN (XREF "AUX" DADDR)
+                        <SET POINT <XREF-INFO-POINT .XREF>>
+                        <SET DADDR <- .ADDR <XREF-INFO-ADDR .XREF>>>
+                        <AND <XREF-INFO-SHORT .XREF>
+                             <G? <ABS .DADDR> 127>
+                             <ERROR "CANT FIT OFFSET" FIXUP-PASS>>
+                        <COND (<XREF-INFO-SHORT .XREF>
+                               <PUT-FCODE .POINT
+                                          <CHTYPE <ANDB .DADDR 255> FIX>>)
+                              (ELSE
+                               <PUT-FCODE .POINT
+                                          <CHTYPE <ANDB .DADDR 255> FIX>>
+                               <PUT-FCODE <+ .POINT 1>
+                                          <CHTYPE <ANDB <LSH .DADDR -8> 255>
+                                                  FIX>>)>>
+                   <LABEL-REF-XREFS .LREF>>
+             <COND (<SET POINT <LABEL-REF-PUSH-POINTER .LREF>>
+                    <PUT-FCODE .POINT <CHTYPE <ANDB .ADDR 255> FIX>>
+                    <PUT-FCODE <+ .POINT 1> <CHTYPE <ANDB <LSH .ADDR -8> 255>
+                                                    FIX>>
+                    <PUT-FCODE <+ .POINT 2> <CHTYPE <ANDB <LSH .ADDR -16> 255>
+                                                    FIX>>
+                    <PUT-FCODE <+ .POINT 3> <CHTYPE <ANDB <LSH .ADDR -24> 255>
+                                                    FIX>>)>>
+        .LABELS>>
+
+<DEFINE CLEAR-CONSTANT-TABLE-FOR-SCAN () 
+       <REPEAT ((PTR ,CONSTANT-TABLE) (MCNT ,CONSTANT-POINTER))
+               <COND (<==? <2 .PTR> -1> <PUT .PTR 2 0>)>
+               <COND (<L=? <SET MCNT <- .MCNT 2>> 0> <RETURN>)>
+               <SET PTR <REST .PTR 2>>>>
+
+<DEFINE CHECK-CONSTANT-TABLE (PTR BYTEOFF "AUX" (TAB ,CONSTANT-TABLE)) 
+       #DECL ((PTR BYTEOFF) FIX)
+       <SET PTR <+ .PTR 1>>
+       <COND (<0? <NTH .TAB .PTR>> <PUT .TAB .PTR -1> T)
+             (<==? <NTH .TAB .PTR> -1> <>)
+             (ELSE
+              <SET BYTEOFF <- .BYTEOFF <NTH .TAB .PTR>>>
+              <COND (<G? .BYTEOFF ,JUMP-EXTENT> <PUT .TAB .PTR -1> T)
+                    (ELSE <>)>)>>
+
+<DEFINE ASSEMBLE-CODE (SBYTEOFF FNAME "AUX" EBYTEOFF CE) 
+       #DECL ((SBYTEOFF EBYTEOFF) FIX (FNAME) ATOM)
+       <PROG ((LBYTEOFF <>))
+             <INIT-LABEL-CHECK>
+             <CLEAR-CONSTANT-TABLE-FOR-SCAN>
+             <SET EBYTEOFF <SCAN-PASS .SBYTEOFF>>
+             <COND (<AND <NOT .LBYTEOFF> ,GLUE>
+                    <SET LBYTEOFF
+                         <CHECK-UNRESOLVED-CALLS .EBYTEOFF .SBYTEOFF>>
+                    <COND (<N==? .LBYTEOFF .SBYTEOFF>
+                           <SET SBYTEOFF .LBYTEOFF>
+                           <AGAIN>)>)>>
+       <REPEAT (NEBYTEOFF (NPASSES ,MAX-NUMBER-PASSES))
+               <COND (<0? .NPASSES> <RETURN>)>
+               <CLEAR-CONSTANT-TABLE-FOR-SCAN>
+               <INIT-LABEL-CHECK>
+               <SET NEBYTEOFF <SCAN-PASS .SBYTEOFF>>
+               <COND (<0? <- .NEBYTEOFF .EBYTEOFF>> <RETURN>)>
+               <SET EBYTEOFF .NEBYTEOFF>
+               <SET NPASSES <- .NPASSES 1>>>
+       <CLEAR-CONSTANT-TABLE-FOR-SCAN>
+       <INIT-LABEL-CHECK>
+       <SET EBYTEOFF <OUTPUT-PASS .SBYTEOFF>>
+       <FIXUP-PASS>
+       <COND (,GLUE
+              <SET CE <UPDATE-CALL-ENTRY-TABLE .FNAME>>
+              <ADD-UNRESOLVED-CALLS>
+              <FIXUP-UNRESOLVED-CALLS .CE>)>
+       (.SBYTEOFF .EBYTEOFF)>
+
+<DEFINE SCAN-PASS (BYTEOFF
+                  "OPTIONAL" (CL ,CODE-LIST) (CV <1 .CL>) (CLABELS T)
+                             (MAXPTR ,CODE-COUNT))
+   #DECL ((BYTEOFF VALUE MAXPTR) FIX (CL) LIST (CV) CODEVEC)
+   <OR <EMPTY? .CL> <SET CL <REST .CL>>>
+   <REPEAT ((PTR 1) INS INSCODE EAT AFLG OP-INF NUM-OPS (IN-CASE? <>)
+           CB)
+     #DECL ((CB PTR INS INSCODE EAT NUM-OPS) FIX
+           (OP-INF) <UVECTOR [REST FIX]>
+           (IN-CASE?) <OR FALSE FIX>)
+     <SET AFLG T>
+     <COND (.CLABELS <CHECK-LABEL .BYTEOFF .PTR>)>
+     <SET INS <1 .CV>>
+     <SET INSCODE <CHTYPE <LSH .INS -24> FIX>>
+     <COND (<EMPTY? <SET CV <REST .CV>>>
+           <COND (<EMPTY? .CL> <SET AFLG <>>)
+                 (ELSE <SET CV <1 .CL>> <SET CL <REST .CL>>)>)>
+     <SET PTR <+ .PTR 1>>
+     <COND (.IN-CASE?
+           <COND (<L? <SET IN-CASE? <- .IN-CASE? 1>> 0>
+                  <SET IN-CASE? <>>)>
+           <SET BYTEOFF <+ .BYTEOFF 2>>
+           <AGAIN>)>
+     <SET OP-INF <GET-INST-INFO .INSCODE>>
+     <SET NUM-OPS <CHTYPE <LSH <2 .OP-INF> <- ,INIT-SHIFT>> FIX>>
+     <COND
+      (<MEMQ .INSCODE ,SPECIAL-OPS>
+       <SET BYTEOFF <SCAN-SPECIAL-CODE .INS .BYTEOFF>>)
+      (ELSE
+       <COND (<MEMQ .INSCODE ,BRANCH-INS>
+             <SET BYTEOFF <PROCESS-BRANCH-1 .INS .BYTEOFF <- .PTR 1>>>)>
+       <COND (<MEMQ .INSCODE ,CASE-INS> <SET IN-CASE? 0>)>
+       <SET BYTEOFF <+ .BYTEOFF 1>>
+       <COND
+       (<NOT <0? .NUM-OPS>>
+        <REPEAT ((SHFT -24) (FNUM 1) EAC R-OR-L ADR (SIZ 1) (DO-IMM <>))
+          #DECL ((DO-IMM) <OR FIX FALSE>)
+          <COND (<L? <SET NUM-OPS <- .NUM-OPS 1>> 0> <SET SIZ <- .SIZ 1>>)>
+          <REPEAT ((CNT -8))
+                  <COND (<L? <SET SIZ <- .SIZ 1>> 0>
+                         <COND (<AND .IN-CASE? .DO-IMM>
+                                <COND (<L=? .NUM-OPS 0>
+                                       <SET IN-CASE? .DO-IMM>)
+                                      (<1? .NUM-OPS>
+                                       <SET CB .DO-IMM>)>)>
+                         <SET DO-IMM <>>
+                         <RETURN>)>
+                  <COND
+                   (<G? <SET SHFT <+ .SHFT 8>> 0>
+                    <SET SHFT -24>
+                    <SET PTR <+ .PTR 1>>
+                    <OR .AFLG <ERROR ACCESS-BEYOND-END-OF-CODE!-ERRORS>>
+                    <SET INS <1 .CV>>
+                    <COND (<EMPTY? <SET CV <REST .CV>>>
+                           <COND (<EMPTY? .CL> <SET AFLG <>>)
+                                 (ELSE
+                                  <SET CV <1 .CL>>
+                                  <SET CL <REST .CL>>)>)>)>
+                  <SET CNT <+ .CNT 8>>
+                  <SET ADR <CHTYPE <ANDB <LSH .INS .SHFT> 255> FIX>>
+                  <COND (.DO-IMM
+                         <SET DO-IMM <ORB .DO-IMM <LSH .ADR .CNT>>>)>>
+          <COND (<L? .NUM-OPS 0> <RETURN>)>
+          <SET EAC <CHTYPE <ANDB .ADR 240> FIX>>
+          <SET R-OR-L <CHTYPE <ANDB .ADR 15> FIX>>
+          <SET SIZ
+               <CHTYPE <ANDB <SET EAT <GET-OP-INFO .FNUM .OP-INF>> 7> FIX>>
+          <SET FNUM <+ .FNUM 1>>
+          <COND (<OR <==? .EAT ,OP-BB> <==? .EAT ,OP-BW>>
+                 <SET BYTEOFF
+                      <PROCESS-BRANCH-2 .INS
+                                        .BYTEOFF
+                                        <- .PTR 1>
+                                        .INSCODE
+                                        .EAT>>
+                 <SET SIZ 1>)
+                (<L? .EAC ,AM-INX>
+                 <SET SIZ 1>
+                 <SET BYTEOFF <+ .BYTEOFF 1>>
+                 <COND (.IN-CASE?
+                        <COND (<0? .NUM-OPS> <SET IN-CASE? .R-OR-L>)
+                              (<1? .NUM-OPS> <SET CB .R-OR-L>)>)>)
+                (<==? .EAC ,AM-INX>
+                 <SET FNUM <- .FNUM 1>>
+                 <SET NUM-OPS <+ .NUM-OPS 1>>
+                 <SET BYTEOFF <+ .BYTEOFF 1>>
+                 <SET SIZ 1>)
+                (<OR <==? .EAC ,AM-REG>
+                     <==? .EAC ,AM-REGD>
+                     <==? .EAC ,AM-ADEC>>
+                 <SET SIZ 1>
+                 <SET BYTEOFF <+ .BYTEOFF 1>>)
+                (<OR <==? .EAC ,AM-AINC> <==? .EAC ,AM-AINCD>>
+                 <COND (<==? .R-OR-L ,NAC-PC>
+                        <COND (<==? .EAC ,AM-AINCD> <SET SIZ 5>)
+                              (<OR <==? .SIZ ,SZ-L> <==? .SIZ ,SZ-F>>
+                               <SET SIZ 5>)
+                              (<==? .SIZ ,SZ-W> <SET SIZ 3>)
+                              (ELSE <SET SIZ 2>)>
+                        <COND (<AND .IN-CASE? <L=? .NUM-OPS 1>>
+                               <SET DO-IMM 0>)>
+                        <SET BYTEOFF <+ .BYTEOFF .SIZ>>)
+                       (ELSE <SET BYTEOFF <+ .BYTEOFF 1>> <SET SIZ 1>)>)
+                (ELSE
+                 <COND (<OR <==? .EAC ,AM-BDD> <==? .EAC ,AM-BD>> <SET SIZ 2>)
+                       (<OR <==? .EAC ,AM-WDD> <==? .EAC ,AM-WD>> <SET SIZ 3>)
+                       (<OR <==? .EAC ,AM-LDD> <==? .EAC ,AM-LD>>
+                        <SET SIZ 5>)>
+                 <SET BYTEOFF <+ .BYTEOFF .SIZ>>)>>)>)>
+     <OR .AFLG <RETURN .BYTEOFF>>
+     <COND (<EMPTY? .CV>
+           <COND (<EMPTY? .CL> <RETURN .BYTEOFF>)>
+           <SET CV <1 .CL>>
+           <SET CL <REST .CL>>)>
+     <COND (<G=? .PTR .MAXPTR> <RETURN .BYTEOFF>)>>>
+
+<DEFINE SCAN-SPECIAL-CODE (INST BYTEOFF
+                          "AUX" (OFFS
+                                 <CHTYPE <ANDB .INST 65535> FIX>)
+                                (CODE <CHTYPE <LSH .INST -24> FIX>) PSAVE
+                                PATCH)
+       #DECL ((BYTEOFF INST) FIX)
+       <COND (<==? .CODE ,INST-PATCH>
+              <COND (<NOT <0? .OFFS>>
+                     <SET PATCH <PATCH-CODE <GET-PATCH .OFFS>>>
+                     <OR <EMPTY? .PATCH>
+                         <SET BYTEOFF
+                              <SCAN-PASS .BYTEOFF
+                                         ()
+                                         .PATCH
+                                         <>
+                                         <+ <LENGTH .PATCH> 1>>>>)>)
+             (<==? .CODE ,INST-PSTORE>
+              <SET PSAVE <GET-PTNS .OFFS>>
+              <COND (<PTNS-USE .PSAVE>
+                     <SET PATCH <PTNS-CODE .PSAVE>>
+                     <OR <EMPTY? .PATCH>
+                         <SET BYTEOFF
+                              <SCAN-PASS .BYTEOFF
+                                         ()
+                                         .PATCH
+                                         <>
+                                         <+ <LENGTH .PATCH> 1>>>>)>)
+             (<==? .CODE ,INST-CALL> <SET BYTEOFF <SCAN-CALL .OFFS .BYTEOFF>>)
+             (<==? .CODE ,INST-PUSHLAB> <SET BYTEOFF <+ .BYTEOFF 7>>)
+             (<==? .CODE ,INST-MOVELAB> <SET BYTEOFF <+ .BYTEOFF 7>>)>
+       .BYTEOFF>
+
+<DEFINE SCAN-CALL (OFF BYTEOFF "AUX" REF CBOFF) 
+       #DECL ((OFF BYTEOFF) FIX (CBOFF) <OR FALSE FIX>)
+       <SET REF <NTH ,CALL-TABLE .OFF>>
+       <COND (<SET CBOFF
+                   <FIND-CALL-POINT <UC-NAME .REF> <UC-NUMBER-ARGS .REF>>>
+              <COND (<G? <ABS <- <+ .BYTEOFF 2> .CBOFF>> ,JUMP-EXTENT>
+                     <SET BYTEOFF <+ .BYTEOFF 6>>)
+                    (<SET BYTEOFF <+ .BYTEOFF 3>>)>)
+             (<SET BYTEOFF <+ .BYTEOFF 3>>)>
+       .BYTEOFF>
+
+<DEFINE OUTPUT-CALL (BYTEOFF OFF "AUX" REF CBOFF AINST PNT) 
+   #DECL ((OFF BYTEOFF) FIX)
+   <SET REF <NTH ,CALL-TABLE .OFF>>
+   <COND
+    (<SET CBOFF <FIND-CALL-POINT <UC-NAME .REF> <UC-NUMBER-ARGS .REF>>>
+     <PUT .REF ,UC-CODE-PTR -1>
+     <COND (<G? <ABS <SET OFF <- <+ .BYTEOFF 3> .CBOFF>>> ,JUMP-EXTENT>
+           <SET OFF <+ .OFF 3>>
+           <ADD-BYTE-TO-FCODE ,INST-JMP>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ORB ,AM-LD <AC-NUMBER ,AC-PC>> FIX>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <SET OFF <- .OFF>> 255> FIX>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .OFF -8> 255> FIX>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .OFF -16> 255> FIX>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .OFF -24> 255> FIX>>
+           <SET BYTEOFF <+ .BYTEOFF 6>>)
+          (ELSE
+           <ADD-BYTE-TO-FCODE ,INST-BRW>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <SET OFF <- .OFF>> 255> FIX>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .OFF -8> 255> FIX>>
+           <SET BYTEOFF <+ .BYTEOFF 3>>)>)
+    (ELSE
+     <SET PNT <ADD-BYTE-TO-FCODE ,INST-BRW>>
+     <PUT .REF ,UC-CALL-BYTEOFF <+ .BYTEOFF 3>>
+     <PUT .REF ,UC-CODE-PTR <+ .PNT 1>>
+     <ADD-BYTE-TO-FCODE 0>
+     <ADD-BYTE-TO-FCODE 0>
+     <SET BYTEOFF <+ .BYTEOFF 3>>)>
+   .BYTEOFF>
+
+<DEFINE GEN-SPECIAL-CODE (INST BYTEOFF
+                         "AUX" (OFFS <CHTYPE <ANDB .INST 65535> FIX>)
+                               (CODE <CHTYPE <LSH .INST -24> FIX>) PSAVE
+                               PATCH)
+       #DECL ((BYTEOFF INST) FIX)
+       <COND (<==? .CODE ,INST-PATCH>
+              <COND (<NOT <0? .OFFS>>
+                     <SET PATCH <PATCH-CODE <GET-PATCH .OFFS>>>
+                     <OR <EMPTY? .PATCH>
+                         <SET BYTEOFF
+                              <OUTPUT-PASS
+                               .BYTEOFF
+                               ()
+                               .PATCH
+                               <+ <LENGTH .PATCH> 1>
+                               <>>>>)>)
+             (<==? .CODE ,INST-PSTORE>
+              <SET PSAVE <GET-PTNS .OFFS>>
+              <COND (<PTNS-USE .PSAVE>
+                     <SET PATCH <PTNS-CODE .PSAVE>>
+                     <OR <EMPTY? .PATCH>
+                         <SET BYTEOFF
+                              <OUTPUT-PASS
+                               .BYTEOFF
+                               ()
+                               .PATCH
+                               <+ <LENGTH .PATCH> 1>
+                               <>>>>)>)
+             (<==? .CODE ,INST-CALL>
+              <SET BYTEOFF <OUTPUT-CALL .BYTEOFF .OFFS>>)
+             (<==? .CODE ,INST-PUSHLAB>
+              <OUTPUT-PUSHLAB .OFFS .BYTEOFF>
+              <SET BYTEOFF <+ .BYTEOFF 7>>)
+             (<==? .CODE ,INST-MOVELAB>
+              <OUTPUT-MOVELAB .INST .OFFS .BYTEOFF>
+              <SET BYTEOFF <+ .BYTEOFF 7>>)>
+       .BYTEOFF>
+
+<DEFINE OUTPUT-PUSHLAB (OFF BYTEOFF "AUX" AINST LREF) 
+       #DECL ((OFF) FIX)
+       <SET LREF <NTH ,PUSH-LABEL-TABLE .OFF>>
+       <ADD-BYTE-TO-FCODE ,INST-MOVL>
+       <ADD-BYTE-TO-FCODE <CHTYPE <LSH <MA-AINC ,AC-PC> -24> FIX>>
+       <SET AINST <ADD-BYTE-TO-FCODE 0>>
+       <ADD-BYTE-TO-FCODE 0>
+       <ADD-BYTE-TO-FCODE 0>
+       <ADD-BYTE-TO-FCODE 0>
+       <ADD-BYTE-TO-FCODE <CHTYPE <LSH <MA-AINC ,AC-TP> -24> FIX>>
+       <PUT .LREF ,LABEL-REF-PUSH-POINTER .AINST>>
+
+<DEFINE OUTPUT-MOVELAB (INST OFF BYTEOFF "AUX" LREF AINST) 
+       #DECL ((OFF) FIX)
+       <SET LREF <NTH ,MOVE-LABEL-TABLE .OFF>>
+       <ADD-BYTE-TO-FCODE ,INST-MOVL>
+       <ADD-BYTE-TO-FCODE <CHTYPE <LSH <MA-AINC ,AC-PC> -24> FIX>>
+       <SET AINST <ADD-BYTE-TO-FCODE 0>>
+       <ADD-BYTE-TO-FCODE 0>
+       <ADD-BYTE-TO-FCODE 0>
+       <ADD-BYTE-TO-FCODE 0>
+       <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .INST -16> 255> FIX>>
+       <PUT .LREF ,LABEL-REF-PUSH-POINTER .AINST>>
+
+<DEFINE INIT-LABEL-CHECK ("AUX" (LREF <1 ,LABEL-TABLE>)) 
+       <SETG LABEL-POINTER ,LABEL-TABLE>
+       <SETG LABEL-OFFSET <LABEL-REF-CODE-PTR .LREF>>>
+
+<DEFINE CHECK-LABEL (BYTEOFF PTR "AUX" LABEL RPTR) 
+       #DECL ((BYTEOFF PTR) FIX (LABEL) LABEL-REF)
+       <PROG ()
+             <COND (<==? .PTR ,LABEL-OFFSET>
+                    <SET RPTR ,LABEL-POINTER>
+                    <SET LABEL <1 .RPTR>>
+                    <PUT .LABEL ,LABEL-REF-REL-ADDR .BYTEOFF>
+                    <COND (<EMPTY? <SET RPTR <REST .RPTR>>>
+                           <SETG LABEL-POINTER .RPTR>
+                           <SETG LABEL-OFFSET -1>)
+                          (ELSE
+                           <SETG LABEL-OFFSET <LABEL-REF-CODE-PTR <1 .RPTR>>>
+                           <SETG LABEL-POINTER .RPTR>
+                           <AGAIN>)>)>>>
+
+<DEFINE OUTPUT-PASS (BYTEOFF
+                    "OPTIONAL" (CL ,CODE-LIST) (CV <1 .CL>)
+                               (MAXPTR ,CODE-COUNT) (CLABELS T))
+   #DECL ((BYTEOFF VALUE MAXPTR) FIX (CL) LIST (CV) CODEVEC)
+   <OR <EMPTY? .CL> <SET CL <REST .CL>>>
+   <REPEAT ((PTR 1) INSCODE SAVED-CV INS AFLG OP-INF NUM-OPS EAT XREF
+           LREF LB (IN-CASE? <>) START-CASE)
+     #DECL ((LB PTR INSCODE INS NUM-OPS EAT) FIX (OP-INF) UVECTOR
+           (IN-CASE?) <OR FALSE FIX>)
+     <SET AFLG T>
+     <COND (.CLABELS <CHECK-LABEL .BYTEOFF .PTR>)>
+     <SET INS <1 .CV>>
+     <SET INSCODE <CHTYPE <LSH .INS -24> FIX>>
+     <COND (<EMPTY? <SET CV <REST .CV>>>
+           <COND (<EMPTY? .CL> <SET AFLG <>>)
+                 (ELSE <SET CV <1 .CL>> <SET CL <REST .CL>>)>)>
+     <SET PTR <+ .PTR 1>>
+     <COND (.IN-CASE?
+           <SET BYTEOFF <+ .BYTEOFF 2>>
+           <SET INSCODE
+                <LABEL-REF-REL-ADDR
+                 <SET LREF <NTH ,LABEL-TABLE <CHTYPE .INS FIX>>>>>
+           <MAPF <>
+                 <FUNCTION (TREF) 
+                         <COND (<==? <XREF-INFO-POINT .TREF> <- .PTR 1>>
+                                <SET XREF .TREF>
+                                <MAPLEAVE>)>>
+                 <LABEL-REF-XREFS .LREF>>
+           <PUT .XREF ,XREF-INFO-ADDR .START-CASE>
+           <PUT .XREF ,XREF-INFO-POINT ,FBYTE-OFFSET>
+           <SET INSCODE <- .INSCODE .START-CASE>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB .INSCODE 255> FIX>>
+           <ADD-BYTE-TO-FCODE <CHTYPE <ANDB <LSH .INSCODE -8> 255> FIX>>
+           <COND (<L? <SET IN-CASE? <- .IN-CASE? 1>> 0> <SET IN-CASE? <>>)>
+           <AGAIN>)>
+     <SET OP-INF <GET-INST-INFO .INSCODE>>
+     <SET NUM-OPS <CHTYPE <LSH <2 .OP-INF> <- ,INIT-SHIFT>> FIX>>
+     <COND
+      (<MEMQ .INSCODE ,SPECIAL-OPS>
+       <SET BYTEOFF <GEN-SPECIAL-CODE .INS .BYTEOFF>>)
+      (ELSE
+       <COND (<MEMQ .INSCODE ,CASE-INS> <SET IN-CASE? 0>)>
+       <COND (<MEMQ .INSCODE ,BRANCH-INS>
+             <SET BYTEOFF <AGEN-BRANCH-1 .INS .BYTEOFF <- .PTR 1> .INSCODE>>)>
+       <SET SAVED-CV <ADD-BYTE-TO-FCODE .INSCODE>>
+       <SET BYTEOFF <+ .BYTEOFF 1>>
+       <COND
+       (<NOT <0? .NUM-OPS>>
+        <REPEAT ((SHFT -24) (FNUM 1) EAC R-OR-L ADR SIZ)
+          #DECL ((SHFT FNUM EAC R-OR-L ADR SIZ) FIX)
+          <COND (<L? <SET NUM-OPS <- .NUM-OPS 1>> 0> <RETURN>)>
+          <COND (<G? <SET SHFT <+ .SHFT 8>> 0>
+                 <SET SHFT -24>
+                 <SET PTR <+ .PTR 1>>
+                 <OR .AFLG <ERROR ACCESS-BEYOND-END-OF-CODE!-ERRORS>>
+                 <SET INS <1 .CV>>
+                 <COND (<EMPTY? <SET CV <REST .CV>>>
+                        <COND (<EMPTY? .CL> <SET AFLG <>>)
+                              (ELSE <SET CV <1 .CL>> <SET CL <REST .CL>>)>)>)>
+          <SET ADR <CHTYPE <ANDB <LSH .INS .SHFT> 255> FIX>>
+          <SET EAC <CHTYPE <ANDB .ADR 240> FIX>>
+          <SET R-OR-L <CHTYPE <ANDB .ADR 15> FIX>>
+          <SET SIZ
+               <CHTYPE <ANDB <SET EAT <GET-OP-INFO .FNUM .OP-INF>> 7> FIX>>
+          <SET FNUM <+ .FNUM 1>>
+          <COND
+           (<OR <==? .EAT ,OP-BB> <==? .EAT ,OP-BW>>
+            <SET BYTEOFF
+                 <AGEN-BRANCH-2 .INS
+                                .BYTEOFF
+                                <- .PTR 1>
+                                .INSCODE
+                                .SAVED-CV
+                                .EAT>>)
+           (<L? .EAC ,AM-INX>
+            <ADD-BYTE-TO-FCODE .ADR>
+            <SET BYTEOFF <+ .BYTEOFF 1>>
+            <COND (.IN-CASE?
+                   <COND (<0? .NUM-OPS> <SET IN-CASE? .ADR>)
+                         (<1? .NUM-OPS> <SET LB .ADR>)>)>)
+           (<==? .EAC ,AM-INX>
+            <SET FNUM <- .FNUM 1>>
+            <SET NUM-OPS <+ .NUM-OPS 1>>
+            <ADD-BYTE-TO-FCODE .ADR>
+            <SET BYTEOFF <+ .BYTEOFF 1>>)
+           (<OR <==? .EAC ,AM-REG> <==? .EAC ,AM-REGD> <==? .EAC ,AM-ADEC>>
+            <ADD-BYTE-TO-FCODE .ADR>
+            <SET BYTEOFF <+ .BYTEOFF 1>>)
+           (<OR <==? .EAC ,AM-AINC> <==? .EAC ,AM-AINCD>>
+            <COND
+             (<==? .R-OR-L ,NAC-PC>
+              <ADD-BYTE-TO-FCODE .ADR>
+              <SET BYTEOFF <+ .BYTEOFF 1>>
+              <COND (<==? .EAC ,AM-AINCD> <SET SIZ 4>)
+                    (<OR <==? .SIZ ,SZ-L> <==? .SIZ ,SZ-F>> <SET SIZ 4>)
+                    (<==? .SIZ ,SZ-W> <SET SIZ 2>)
+                    (ELSE <SET SIZ 1>)>
+              <REPEAT ((CNT -8) (IMM 0))
+                <COND (<L? <SET SIZ <- .SIZ 1>> 0>
+                       <COND (.IN-CASE?
+                              <COND (<L=? .NUM-OPS 0>
+                                     <SET IN-CASE? .IMM>)
+                                    (<1? .NUM-OPS> <SET LB .IMM>)>)>
+                       <RETURN>)>
+                <COND (<G? <SET SHFT <+ .SHFT 8>> 0>
+                       <SET SHFT -24>
+                       <SET PTR <+ .PTR 1>>
+                       <OR .AFLG <ERROR ACCESS-BEYOND-END-OF-CODE!-ERRORS>>
+                       <SET INS <1 .CV>>
+                       <COND (<EMPTY? <SET CV <REST .CV>>>
+                              <COND (<EMPTY? .CL> <SET AFLG <>>)
+                                    (ELSE
+                                     <SET CV <1 .CL>>
+                                     <SET CL <REST .CL>>)>)>)>
+                <SET CNT <+ .CNT 8>>
+                <SET ADR <CHTYPE <ANDB <LSH .INS .SHFT> 255> FIX>>
+                <SET IMM <ORB .IMM <LSH .ADR .CNT>>>
+                <ADD-BYTE-TO-FCODE .ADR>
+                <SET BYTEOFF <+ .BYTEOFF 1>>>)
+             (ELSE <ADD-BYTE-TO-FCODE .ADR> <SET BYTEOFF <+ .BYTEOFF 1>>)>)
+           (ELSE
+            <ADD-BYTE-TO-FCODE .ADR>
+            <SET BYTEOFF <+ .BYTEOFF 1>>
+            <COND (<OR <==? .EAC ,AM-BDD> <==? .EAC ,AM-BD>> <SET SIZ 1>)
+                  (<OR <==? .EAC ,AM-WDD> <==? .EAC ,AM-WD>> <SET SIZ 2>)
+                  (<OR <==? .EAC ,AM-LDD> <==? .EAC ,AM-LD>> <SET SIZ 4>)>
+            <REPEAT ()
+              <COND (<L? <SET SIZ <- .SIZ 1>> 0> <RETURN>)>
+              <COND (<G? <SET SHFT <+ .SHFT 8>> 0>
+                     <SET SHFT -24>
+                     <SET PTR <+ .PTR 1>>
+                     <OR .AFLG <ERROR ACCESS-BEYOND-END-OF-CODE!-ERRORS>>
+                     <SET INS <1 .CV>>
+                     <COND (<EMPTY? <SET CV <REST .CV>>>
+                            <COND (<EMPTY? .CL> <SET AFLG <>>)
+                                  (ELSE
+                                   <SET CV <1 .CL>>
+                                   <SET CL <REST .CL>>)>)>)>
+              <SET ADR <CHTYPE <ANDB <LSH .INS .SHFT> 255> FIX>>
+              <ADD-BYTE-TO-FCODE .ADR>
+              <SET BYTEOFF <+ .BYTEOFF 1>>>)>>)>)>
+     <COND (.IN-CASE? <SET START-CASE .BYTEOFF>)>
+     <OR .AFLG <RETURN .BYTEOFF>>
+     <COND (<EMPTY? .CV>
+           <COND (<EMPTY? .CL> <RETURN .BYTEOFF>)>
+           <SET CV <1 .CL>>
+           <SET CL <REST .CL>>)>
+     <COND (<G=? .PTR .MAXPTR> <RETURN .BYTEOFF>)>>
+   <COND (.CLABELS <+ .BYTEOFF <FORCE-OUT-FCODE>>) (.BYTEOFF)>>
+
+<DEFINE SWAP-MODE (MODEA "AUX" LOW HIGH) 
+       #DECL ((MODEA) FIX)
+       <SET LOW <GETBITS .MODEA <BITS 3 0>>>
+       <SET HIGH <GET-FIELD .MODEA <BITS 3 3>>>
+       <PUTBITS .HIGH <BITS 3 3> .LOW>>
+
+<DEFINE GENEA (EA BYTEOFF DISP SZ "AUX" WD AMODE (RES .EA) TAB) 
+       #DECL ((DISP EA SZ BYTEOFF) FIX (VALUE) FIX)
+       <COND (<AND <==? .EA ,ADDRESS-IMM> <==? .SZ ,LENGTH-LONG>>
+              <SET TAB ,CONSTANT-TABLE>
+              <COND (<0? <SET WD <NTH .TAB <+ .DISP 1>>>>
+                     <SET WD <NTH .TAB .DISP>>
+                     <PUT .TAB <+ .DISP 1> .BYTEOFF>
+                     <ADD-WORD-TO-FCODE <LHW .WD>>
+                     <ADD-WORD-TO-FCODE .WD>
+                     <SET BYTEOFF <+ .BYTEOFF 4>>)
+                    (ELSE
+                     <SET RES ,ADDRESS-PCDISP>
+                     <ADD-WORD-TO-FCODE <- .WD .BYTEOFF>>
+                     <SET BYTEOFF <+ .BYTEOFF 2>>)>)
+             (ELSE
+              <SET AMODE <GET-FIELD .EA <BITS 3 3>>>
+              <COND (<G? .AMODE 4>
+                     <SET BYTEOFF <+ .BYTEOFF 2>>
+                     <ADD-WORD-TO-FCODE .DISP>)>)>
+       <PUT-LHW .RES .BYTEOFF>>
+
+<DEFINE EXTEND (X) 
+       #DECL ((X) FIX)
+       <COND (<1? <GET-FIELD .X <BITS 1 15>>> <ORB .X <LSH -1 16>>)
+             (.X)>>
+
+<DEFINE EXTEND-BYTE (X) 
+       #DECL ((X) FIX)
+       <COND (<1? <GET-FIELD .X <BITS 1 7>>> <ORB .X <LSH -1 8>>)
+             (.X)>>
+
+<DEFINE FORCE-OUT-FCODE ("AUX" (SHFT ,FSHIFT)) 
+       #DECL ((SHFT) FIX)
+       <REPEAT ((I 0))
+               <COND (<L=? <SET SHFT <- .SHFT 8>> 0> <RETURN .I>)>
+               <ADD-BYTE-TO-FCODE 0>
+               <SET I <+ .I 1>>>>
+
+<DEFINE INIT-UNRESOLVED-CALLS () <SETG UNRESOLVED-CALLS-TABLE ()>>
+
+<DEFINE CHECK-UNRESOLVED-CALLS (EBYTEOFF SBYTEOFF) 
+       #DECL ((SBYTEOFF EBYTEOFF) FIX)
+       <MAPF <>
+             <FCN (UCALL "AUX" NPTR TEM)
+                  <COND (<G? <- .EBYTEOFF <UC-CALL-BYTEOFF .UCALL>>
+                             ,JUMP-EXTENT>
+                         <COND (<G?
+                                 <SET TEM <- .SBYTEOFF <UC-CALL-BYTEOFF .UCALL>>>
+                                 ,JUMP-EXTENT>
+                                <ERROR CANT-JUMP-FAR-ENOUGH
+                                       .UCALL .SBYTEOFF .EBYTEOFF
+                                       CHECK-UNRESOLVED-CALLS>)>
+                         <PUT-FCODE <UC-CODE-PTR .UCALL>
+                                    <CHTYPE <ANDB .TEM 255> FIX>>
+                         <PUT-FCODE <+ <UC-CODE-PTR .UCALL> 1>
+                                    <CHTYPE <ANDB <LSH .TEM -8> 255> FIX>>
+                         <PUT .UCALL ,UC-CALL-BYTEOFF <+ .SBYTEOFF 3>>
+                         <ADD-BYTE-TO-FCODE ,INST-BRW>
+                         <SET NPTR <ADD-BYTE-TO-FCODE 0>>
+                         <ADD-BYTE-TO-FCODE 0>
+                         <PUT .UCALL ,UC-CODE-PTR .NPTR>
+                         <SET SBYTEOFF <+ .SBYTEOFF 3>>)>>
+             ,UNRESOLVED-CALLS-TABLE>
+       .SBYTEOFF>
+
+<DEFINE ADD-UNRESOLVED-CALLS ("AUX" (TAB ,UNRESOLVED-CALLS-TABLE)) 
+       <MAPF <>
+             <FCN (UCALL)
+                  <OR .UCALL <MAPLEAVE>>
+                  <COND (<G? <UC-CODE-PTR .UCALL> 0>
+                         <COND (<EMPTY? .TAB>
+                                <SET TAB (.UCALL)>)
+                               (T
+                                ; "Try a little harder to keep calls in the
+                                   right order, avoiding fencepost death
+                                   in check-unresolved-calls"
+                                <PUTREST <REST .TAB <- <LENGTH .TAB> 1>>
+                                         (.UCALL)>)>)>>
+             ,CALL-TABLE>
+       <SETG UNRESOLVED-CALLS-TABLE .TAB>>
+
+<DEFINE FIXUP-UNRESOLVED-CALLS (CE "AUX" (NAME <CET-MSUBR-NAME .CE>)) 
+   #DECL ((CE) CALL-ENTRY)
+   <REPEAT ((PTR ,UNRESOLVED-CALLS-TABLE) (PPTR .PTR) UCALL OFF)
+          #DECL ((OFF) <OR FALSE FIX>)
+          <COND (<EMPTY? .PTR> <RETURN>)>
+          <SET UCALL <1 .PTR>>
+          <COND (<SAME-NAME? <UC-NAME .UCALL> .NAME>
+                 <OR <SET OFF <FIND-ENTRY-LOC .CE <UC-NUMBER-ARGS .UCALL>>>
+                     <ERROR "CANT JUMP" FIXUP-UNRESOLVED-CALLS>>
+                 <SET OFF <- .OFF <UC-CALL-BYTEOFF .UCALL>>>
+                 <AND <G? <ABS .OFF> ,JUMP-EXTENT>
+                      <ERROR "CANT JUMP" FIXUP-UNRESOLVED-CALLS>>
+                 <PUT-FCODE <UC-CODE-PTR .UCALL> <CHTYPE <ANDB .OFF 255> FIX>>
+                 <PUT-FCODE <+ <UC-CODE-PTR .UCALL> 1>
+                            <CHTYPE <ANDB <LSH .OFF -8> 255> FIX>>
+                 <COND (<==? .PTR .PPTR>
+                        <SETG UNRESOLVED-CALLS-TABLE <REST .PTR>>
+                        <SET PPTR <REST .PTR>>)
+                       (<PUTREST .PPTR <REST .PTR>>)>)
+                (<SET PPTR .PTR>)>
+          <SET PTR <REST .PTR>>>>