Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / 20c / strman.mud
diff --git a/mim/development/mim/20c/strman.mud b/mim/development/mim/20c/strman.mud
new file mode 100644 (file)
index 0000000..631a716
--- /dev/null
@@ -0,0 +1,2240 @@
+
+<COND (<NOT <GASSIGNED? WIDTH-MUNG>> <FLOAD "MIMOC20DEFS.MUD">)>
+
+<NEWTYPE XTYPE-W ATOM>
+
+<NEWTYPE LOCAL-NAME FIX>
+
+<NEWTYPE LOCAL VECTOR>
+
+<NEWTYPE XGLOC ATOM>
+
+<SETG PRIM-FIX 0>
+
+<SETG PRIM-LIST 1>
+
+<MANIFEST PRIM-LIST PRIM-FIX>
+
+;"LIST manipulation"
+
+<DEFINE NTHL!-MIMOC (L
+                    "OPT" (AOS <>) (NOT-DEAD? T) LEN-VAR
+                    "AUX" (LST <1 .L>) (AMT <2 .L>) (VAL <4 .L>)
+                          (LOOP <GENLBL "LOOP">) (END <GENLBL "END">) (TAC <>)
+                          CNT-AC (AHEAD <>) AC NAC (RES-TYP <EXTRAMEM TYPE .L>))
+       #DECL ((LST) <OR LIST ATOM> (AMT) <OR FIX ATOM> (NAC LOOP END) ATOM
+              (AC) <OR AC ATOM FALSE> (MIML L) LIST (AHEAD) <OR AC FALSE>)
+       <COND (<AND <NOT .AOS> <NTH-PUT-LOOK-AHEAD .L "PUTL" .LST .AMT .VAL>>)
+             (ELSE
+              <COND (<AND <ASSIGNED? LEN-VAR> .NOT-DEAD?> <SET VAL .LEN-VAR>)>
+              <COND (<AND <NOT <AND <SET TAC <IN-AC? .LST BOTH>>
+                                    <SET AC <NEXT-AC .TAC>>>>
+                          <NOT <SET AC <IN-AC? .LST VALUE>>>>
+                     <COND (<AND <OR <NOT .AOS> .NOT-DEAD?>
+                                 <N==? .LST .VAL>
+                                 <SET AHEAD
+                                      <LOOK-AHEAD <REST .MIML> .VAL BOTH>>>
+                            <AC-TIME .AHEAD <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                            <AC-TIME <GET-AC <NEXT-AC .AHEAD>> ,AC-STAMP>)>
+                     <SET AC <NEXT-AC <SET TAC <LOAD-AC .LST BOTH>>>>)>
+              <COND (<AND <NOT <WILL-DIE? .LST>>
+                          <N==? .LST .VAL>
+                          <N==? .AMT 1>>
+                     <COND (.TAC <FLUSH-AC .TAC T>) (ELSE <FLUSH-AC .AC>)>)>
+              <COND (<AND <==? .AMT .VAL>
+                          <SET NAC
+                               <OR <IN-AC? .VAL BOTH> <IN-AC? .VAL VALUE>>>>
+                     <FLUSH-AC .NAC T>)>
+              <COND (<AND <OR <NOT .AOS> .NOT-DEAD?> <N==? .VAL STACK>>
+                     <SET NAC <LOAD-AC .VAL BOTH T T .AHEAD>>
+                                                        ;"Really an ASSIGN-AC"
+                     <COND (<AND <==? .NAC .TAC> <==? .LST .VAL>>
+                            <AC-TYPE <GET-AC .NAC> <>>)>)>
+              <COND (<==? .AMT 1>)
+                    (ELSE
+                     <COND
+                      (<AND <TYPE? .AMT ATOM>
+                            <OR <AND <SET CNT-AC <IN-AC? .AMT BOTH>>
+                                     <OR <AND <WILL-DIE? .AMT>
+                                              <DEAD!-MIMOC (.AMT) T>>
+                                         <NOT <AC-UPDATE
+                                               <GET-AC <NEXT-AC .CNT-AC>>>>>
+                                     <PROG ()
+                                           <MUNGED-AC .CNT-AC T>
+                                           <SET CNT-AC <NEXT-AC .CNT-AC>>>>
+                                <AND <SET CNT-AC <IN-AC? .AMT VALUE>>
+                                     <OR <AND <WILL-DIE? .AMT>
+                                              <DEAD!-MIMOC (.AMT) T>>
+                                         <NOT <AC-UPDATE <GET-AC .CNT-AC>>>>
+                                     <PROG ()
+                                           <MUNGED-AC .CNT-AC T>>>>>)
+                      (ELSE
+                       <OCEMIT MOVE <SET CNT-AC O*> !<OBJ-VAL .AMT>>)>
+                     <SETG LOOPTAGS (.LOOP !,LOOPTAGS)>
+                    <LABEL .LOOP>
+                     <OCEMIT SOJE .CNT-AC <XJUMP .END>>
+                     <OCEMIT MOVE .AC (.AC)>
+                     <OCEMIT JRST <XJUMP .LOOP>>
+                     <LABEL .END>
+                     <COND (<N==? .LST .VAL>
+                            <COND (.TAC <MUNGED-AC .TAC T>)
+                                  (ELSE <MUNGED-AC .AC>)>)>)>
+              <COND (.AOS
+                     <COND (<==? .VAL STACK>
+                            <OCEMIT .AOS
+                                    O1*
+                                    <COND (<==? .AOS HRRZ> 1) (ELSE 2)>
+                                    (.AC)>
+                            <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+                            <OCEMIT PUSH TP* O1*>
+                            <COND (,WINNING-VICTIM
+                                   <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                           (.NOT-DEAD?
+                            <OCEMIT .AOS
+                                    <NEXT-AC .NAC>
+                                    <COND (<==? .AOS HRRZ> 1) (ELSE 2)>
+                                    (.AC)>
+                            <AC-TYPE <GET-AC .NAC> FIX>)
+                           (<TYPE? .AOS FORM>
+                            <COND (<=? <SPNAME <1 .AOS>> "VEQUAL?">
+                                   <VEQUAL?!-MIMOC <REST .AOS> .AC <> 2>)
+                                  (<=? <SPNAME <1 .AOS>> "TYPE?">
+                                   <VEQUAL?!-MIMOC <REST .AOS 3> .AC <> 2
+                                                   <2 .AOS>>)
+                                  (ELSE
+                                   <EQUAL?!-MIMOC <REST .AOS> .AC <> 1>)>)
+                           (ELSE
+                            <OCEMIT .AOS
+                                    <COND (<==? .AOS HRRZ> 1) (ELSE 2)>
+                                    (.AC)>)>)
+                    (<==? .VAL STACK>
+                     <OCEMIT PUSH TP* 1 (.AC)>
+                     <OCEMIT PUSH TP* 2 (.AC)>
+                     <COND (,WINNING-VICTIM
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                    (T <OCEMIT DMOVE .NAC 1 (.AC)>)>)>>
+
+<DEFINE RESTL!-MIMOC (L
+                     "AUX" (LST <1 .L>) (AMT <2 .L>) (VAL <4 .L>) AC NAC
+                           (TAC <>) (END <GENLBL "END">)
+                           (LOOP <GENLBL "LOOP">)
+                           (LV
+                            <OR <LMEMQ .VAL ,LOCALS>
+                                <AND ,ICALL-FLAG <LMEMQ .VAL ,ICALL-TEMPS>>>)
+                           (VD <COND (.LV <LDECL .LV>)>))
+       #DECL ((LST) <OR LIST ATOM> (AMT) <OR FIX ATOM> (NAC END LOOP) ATOM
+              (AC) <OR ATOM FALSE> (L) LIST)
+       <COND (<OR <==? .AMT 1> <==? .AMT 2>>
+              <OR <AND <SET TAC <IN-AC? .LST BOTH>> <SET AC <NEXT-AC .TAC>>>
+                  <SET AC <IN-AC? .LST VALUE>>>)
+             (<AND <NOT <AND <SET AC <IN-AC? .LST BOTH>>
+                             <SET TAC .AC>
+                             <SET AC <NEXT-AC .AC>>>>
+                   <NOT <SET AC <IN-AC? .LST VALUE>>>>
+              <SET AC <NEXT-AC <SET TAC <LOAD-AC .LST BOTH>>>>)>
+       <COND (<AND <==? .AMT .VAL> <SET NAC <IN-AC? .AMT BOTH>>>
+              <FLUSH-AC .NAC T>)>
+       <COND (<N==? .VAL .LST> <CLEAN-ACS .VAL>)>
+       <COND (<AND .TAC <OR <==? .LST .VAL> <WILL-DIE? .LST>>> <SET NAC .TAC>)
+             (<AND .AC
+                   <OR <==? .LST .VAL> <WILL-DIE? .LST>>
+                   <SET TAC <GET-AC <GETPROP .AC AC-PAIR>>>
+                   <==? <NEXT-AC <AC-NAME .TAC>> .AC>>
+              <SET NAC <AC-NAME .TAC>>
+              <AC-CODE .TAC TYPE>
+              <AC-ITEM .TAC .LST>
+              <SET TAC <>>
+              <FLUSH-AC .NAC>)
+             (ELSE <SET NAC <ASSIGN-AC .VAL BOTH T>>)>
+       <COND (<==? .AMT 1>
+              <COND (.AC <OCEMIT MOVE <NEXT-AC .NAC> (.AC)>)
+                    (ELSE <OCEMIT MOVE <NEXT-AC .NAC> @ !<OBJ-VAL .LST>>)>)
+             (<==? .AMT 2>
+              <COND (.AC <OCEMIT MOVE <NEXT-AC .NAC> @ (.AC)>)
+                    (ELSE
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ !<OBJ-VAL .LST>>
+                     <OCEMIT MOVE <NEXT-AC .NAC> (<NEXT-AC .NAC>)>)>)
+             (<==? .AMT 3>
+              <COND (.AC
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ (.AC)>
+                     <OCEMIT MOVE <NEXT-AC .NAC> (<NEXT-AC .NAC>)>)
+                    (ELSE
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ !<OBJ-VAL .LST>>
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ (<NEXT-AC .NAC>)>)>)
+             (<==? .AMT 4>
+              <COND (.AC
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ (.AC)>
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ (<NEXT-AC .NAC>)>)
+                    (ELSE
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ !<OBJ-VAL .LST>>
+                     <OCEMIT MOVE <NEXT-AC .NAC> @ (<NEXT-AC .NAC>)>
+                     <OCEMIT MOVE <NEXT-AC .NAC> (<NEXT-AC .NAC>)>)>)
+             (T
+              <COND (<N==? .AC <NEXT-AC .NAC>>
+                     <OCEMIT MOVE <NEXT-AC .NAC> .AC>)>
+              <SMASH-AC O* .AMT VALUE <N==? .AMT .VAL>>
+              <COND (<==? .AMT 0>)
+                    (T
+                     <COND (<TYPE? .AMT ATOM> <OCEMIT JUMPE O* <XJUMP .END>>)>
+                     <SETG LOOPTAGS (.LOOP !,LOOPTAGS)>
+                     <LABEL .LOOP>
+                     <OCEMIT MOVE <NEXT-AC .NAC> (<NEXT-AC .NAC>)>
+                     <OCEMIT SOJN O* <XJUMP .LOOP>>
+                     <LABEL .END>
+                     <AC-ITEM <GET-AC O*> 0>)>)>
+       <COND (<AND <==? .AC <NEXT-AC .NAC>>
+                   <N==? .VAL .LST> <N==? .VAL STACK>>
+              <AC-CODE <AC-ITEM <GET-AC .NAC> .VAL> TYPE>
+              <AC-CODE <AC-ITEM <GET-AC <NEXT-AC .NAC>> .VAL> VALUE>)>
+       <COND (.VD <AC-UPDATE <GET-AC .NAC> <>>)
+             (ELSE <AC-UPDATE <GET-AC .NAC> T>)>
+       <AC-UPDATE <GET-AC <NEXT-AC .NAC>> T>
+       <COND (<==? .VAL STACK>
+              <OCEMIT PUSH TP* !<TYPE-WORD LIST>>
+              <OCEMIT PUSH TP* <NEXT-AC .NAC>>
+              <COND (,WINNING-VICTIM
+                     <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+             (ELSE
+              <COND (<N==? .NAC .TAC> <AC-TYPE <GET-AC .NAC> LIST>)>
+              <COND (.VD <AC-UPDATE <GET-AC .NAC> <>>)
+                    (ELSE <AC-UPDATE <GET-AC .NAC> T>)>)>>
+
+<DEFINE EMPL?!-MIMOC (L
+                     "AUX" (LST <1 .L>) (FLAG <2 .L>) (TAG <3 .L>)
+                           (JUMP JUMPE) (SKIP SKIPN) AC NEW (AC-T <>)
+                           (LV
+                            <OR <LMEMQ .LST ,LOCALS>
+                                <AND ,ICALL-FLAG <LMEMQ .LST ,ICALL-TEMPS>>>)
+                           TAC (AC-T-2 <>)
+                           (VD
+                            <COND (.LV <LDECL .LV>)
+                                  (ELSE <EXTRAMEM TYPE .L>)>))
+       #DECL ((LST) <OR LIST ATOM> (FLAG TAG SKIP JUMP) ATOM
+              (AC) <OR FALSE ATOM> (L) LIST)
+       <COND (<==? .FLAG -> <SET JUMP JUMPN> <SET SKIP SKIPE>)>
+       <COND (<OR <AND <SET TAC <IN-AC? .LST BOTH>>
+                       <SET AC <NEXT-AC .TAC>>
+                       <SET NEW
+                            <LABEL-UPDATE-ACS .TAG <> T .TAC .AC>>>
+                  <AND <SET AC <IN-AC? .LST VALUE>>
+                       <SET NEW
+                            <LABEL-UPDATE-ACS .TAG <> T .AC>>>>
+              <COND (.TAC
+                     <SET AC-T-2 <AC-TIME <GET-AC <SET TAC <1 .NEW>>>>>
+                     <COND (<N==? .AC <2 .NEW>>
+                            <SET AC-T
+                                 <AC-TIME <GET-AC <SET AC <2 .NEW>>>>>)>)
+                    (<N==? .AC <1 .NEW>>
+                     <SET AC-T <AC-TIME <GET-AC <SET AC <1 .NEW>>>>>)>
+              <OCEMIT .JUMP .AC <XJUMP .TAG>>
+              <COND (.AC-T <AC-TIME <GET-AC .AC> .AC-T>)>
+              <COND (.AC-T-2 <AC-TIME <GET-AC .TAC> .AC-T-2>)>)
+             (T
+              <COND (<OR <AND <SET TAC <LABEL-PREF .TAG .LST BOTH>>
+                              <SET AC <NEXT-AC <SET TAC <AC-NAME .TAC>>>>>
+                         <AND <SET TAC <LABEL-PREF .TAG .LST VALUE>>
+                              <SET AC <AC-NAME .TAC>>
+                              <SET TAC <GETPROP .TAC AC-PAIR>>>>
+                     <LOAD-AC .LST BOTH T T <GET-AC .TAC> <GET-AC .AC>>)
+                    (ELSE
+                     <SET AC <NEXT-AC <SET TAC <ASSIGN-AC .LST BOTH>>>>)>
+              <AC-UPDATE <GET-AC .AC> <>>
+              <AC-ITEM <GET-AC .AC> .LST>
+              <AC-CODE <GET-AC .AC> VALUE>
+              <MUNGED-AC .TAC>
+              <SETG ACA-AC <>>
+              <LABEL-UPDATE-ACS .TAG <>>
+              <OCEMIT .SKIP .AC !<OBJ-LOC .LST 1>>
+              <OCEMIT JRST <XJUMP .TAG>>)>>
+
+<DEFINE PUTREST!-MIMOC (L "AUX" (L1 <1 .L>) (L2 <2 .L>) AC NAC) 
+       #DECL ((L) LIST (L1 L2) <OR LIST ATOM> (AC NAC) <OR FALSE ATOM>)
+       <COND (<SET AC <IN-AC? .L1 VALUE>>
+              <SETG FIRST-AC <>>
+              <AC-TIME <GET-AC .AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)>
+       <COND (<==? .L2 ()>
+              <COND (.AC <OCEMIT SETZM 0 (.AC)>)
+                    (ELSE <OCEMIT SETZM @ !<OBJ-VAL .L1>>)>)
+             (ELSE
+              <COND (<SET NAC <IN-AC? .L2 VALUE>>)
+                    (<AND <TYPE? .L2 ATOM> <NOT <WILL-DIE? .L2>>>
+                     <SET NAC <NEXT-AC <LOAD-AC .L2 BOTH>>>)
+                    (T <SMASH-AC O* .L2 VALUE> <SET NAC O*>)>
+              <COND (.AC <OCEMIT MOVEM .NAC (.AC)>)
+                    (ELSE <OCEMIT MOVEM .NAC @ !<OBJ-VAL .L1>>)>)>>
+
+<DEFINE CONS!-MIMOC (L "AUX" (L1 <1 .L>) (L2 <2 .L>) (VAL <4 .L>)) 
+       #DECL ((L) LIST (L1) ANY (L1) <OR LIST ATOM> (VAL) ATOM)
+       <COND (<OR <==? .L1 .VAL> <AND <TYPE? .L1 ATOM> <WILL-DIE? .L1>>>
+              <DEAD!-MIMOC (.L1) T>)>
+       <COND (<OR <==? .L2 .VAL> <AND <TYPE? .L2 ATOM> <WILL-DIE? .L2>>>
+              <DEAD!-MIMOC (.L2) T>)>
+       <UPDATE-ACS>
+       <GET-INTO-ACS .L1 BOTH B1* .L2 VALUE C1*>
+       <PUSHJ CONS .VAL>>
+
+<DEFINE GET-INTO-ACS ("TUPLE" PTRNS "AUX" (FIRSTS ()) (LASTS ()) (OTHERS ())) 
+   #DECL ((PTRNS) TUPLE (FIRSTS LASTS OTHERS) LIST)
+   <REPEAT ((P .PTRNS) (WIN T) (CHANGE <>) AC ITM DAC KIND RAC)
+     <COND (<AND <EMPTY? .P> .WIN> <RETURN>)>
+     <COND
+      (<EMPTY? .P>
+       <COND
+       (<NOT .CHANGE>
+        <PROG ((BOTH T))
+          <MAPF <>
+           <FUNCTION (ONE) 
+                   #DECL ((ONE) !<LIST [3 ATOM] TUPLE>)
+                   <COND (<AND <OR <AND <NOT .BOTH> <N==? <2 .ONE> BOTH>>
+                                   <AND .BOTH <==? <2 .ONE> BOTH>>>
+                               <N==? <1 .ONE> <3 .ONE>>>
+                          <OCEMIT EXCH <1 .ONE> <3 .ONE>>
+                          <FIXUP-ACS .FIRSTS <1 .ONE> <3 .ONE> .ONE <2 .ONE>>
+                          <COND (<==? <2 .ONE> BOTH>
+                                 <OCEMIT EXCH
+                                         <NEXT-AC-FUNNY <1 .ONE>>
+                                         <NEXT-AC-FUNNY <3 .ONE>>>)>
+                          <PUT <4 .ONE> 2 <>>)
+                         (<==? <1 .ONE> <3 .ONE>> <PUT <4 .ONE> 2 <>>)>>
+           .FIRSTS>
+          <COND (.BOTH <SET BOTH <>> <AGAIN>)>>
+        <SET FIRSTS ()>)>
+       <SET WIN T>
+       <SET P .PTRNS>
+       <AGAIN>)>
+     <COND (<NOT <2 .P>>)
+          (<NOT <TYPE? <SET ITM <1 .P>> ATOM>>
+           <SET LASTS ((.ITM <2 .P> <3 .P>) !.LASTS)>
+           <PUT .P 2 <>>)
+          (<SET AC <IN-AC? .ITM <SET KIND <2 .P>>>>
+           <COND (<==? .AC <SET DAC <3 .P>>>
+                  <COND (<AND <N==? .KIND VALUE>
+                              <SET RAC <GETPROP .DAC AC>>
+                              <AC-TYPE .RAC>>
+                         <LOAD-TYPE-IN-AC .DAC <AC-TYPE .RAC>>
+                         <AC-TYPE .RAC <>>)>)
+                 (<OR <AND <==? .KIND BOTH>
+                           <OR <AC-MEMQ .DAC .PTRNS>
+                               <AC-MEMQ <NEXT-AC-FUNNY .DAC> .PTRNS>>>
+                      <AND <N==? .KIND BOTH> <AC-MEMQ .DAC .PTRNS>>>
+                  <SET WIN <>>
+                  <SET FIRSTS ((.AC .KIND .DAC .P) !.FIRSTS)>)
+                 (ELSE
+                  <SET WIN <>>
+                  <SET CHANGE T>
+                  <COND (<GETPROP .DAC AC>
+                         <AC-TYPE <GET-AC .DAC> <>>
+                         <COND (<==? .KIND BOTH>
+                                <AC-TYPE <GET-AC <NEXT-AC .DAC>> <>>)>)>
+                  <COND (<==? .KIND BOTH>
+                         <OCEMIT DMOVE .DAC .AC>)
+                        (ELSE <OCEMIT MOVE .DAC .AC>)>
+                  <PUT .P 2 <>>)>)
+          (ELSE
+           <SET CHANGE T>
+           <PUT .P 2 <>>
+           <SET OTHERS ((.ITM .KIND <3 .P>) !.OTHERS)>)>
+     <SET P <REST .P 3>>>
+   <MAPF <>
+        <FUNCTION (ONE) 
+                #DECL ((ONE) !<LIST ATOM ATOM ATOM>)
+                <COND (<GETPROP <3 .ONE> AC>
+                       <AC-TYPE <GET-AC <3 .ONE>> <>>
+                       <COND (<==? <2 .ONE> BOTH>
+                              <AC-TYPE <GET-AC <NEXT-AC <3 .ONE>>> <>>)>)>
+                <COND (<==? <2 .ONE> BOTH>
+                       <OCEMIT DMOVE <3 .ONE> !<OBJ-LOC <1 .ONE> 0>>)
+                      (<==? <2 .ONE> VALUE>
+                       <OCEMIT MOVE <3 .ONE> !<OBJ-LOC <1 .ONE> 1>>)
+                      (ELSE <OCEMIT MOVE <3 .ONE> !<OBJ-LOC <1 .ONE> 0>>)>>
+        .OTHERS>
+   <MAPF <>
+        <FUNCTION (ONE "AUX" (AC <3 .ONE>) (TYP <2 .ONE>) (V <1 .ONE>)) 
+                #DECL ((ONE) !<LIST ANY ATOM ATOM>)
+                <COND (<GETPROP .AC AC> <MUNGED-AC .AC <==? .TYP BOTH>>)>
+                <COND (<AND <N==? .TYP TYPE>
+                            <OR <MEMQ <PRIMTYPE .V> '[WORD FIX]>
+                                <AND <==? <PRIMTYPE .V> LIST>
+                                     <EMPTY? <CHTYPE .V LIST>>>>>
+                       <COND (<==? .TYP BOTH>
+                              <OCEMIT MOVSI .AC !<TYPE-CODE <TYPE .V> T>>
+                              <SET AC <NEXT-AC-FUNNY .AC>>)>
+                       <COND (<==? <PRIMTYPE .V> LIST> <SET V 0>)
+                             (ELSE <SET V <CHTYPE .V FIX>>)>
+                       <COND (<AND <G=? .V 0> <L=? .V ,MAX-IMMEDIATE>>
+                              <OCEMIT MOVEI .AC .V>)
+                             (<0? <ANDB .V 262143>>
+                              <OCEMIT MOVSI .AC <LSH .V -18>>)
+                             (<AND <L? .V 0> <L=? <ABS .V> ,MAX-IMMEDIATE>>
+                              <OCEMIT MOVNI .AC <- .V>>)
+                             (ELSE <OCEMIT MOVE .AC !<OBJ-LOC .V 1>>)>)
+                      (<==? .TYP BOTH> <OCEMIT DMOVE .AC !<OBJ-LOC .V 0>>)
+                      (<==? .TYP VALUE> <OCEMIT MOVE .AC !<OBJ-LOC .V 1>>)
+                      (ELSE <OCEMIT MOVE .AC !<OBJ-LOC .V 0>>)>>
+        .LASTS>>
+
+<DEFINE AC-MEMQ (AC P) 
+       #DECL ((AC) ATOM (P) <PRIMTYPE VECTOR>)
+       <REPEAT ()
+               <COND (<EMPTY? .P> <RETURN <>>)>
+               <COND (<AND <2 .P>
+                           <OR <==? <IN-AC? <1 .P> <2 .P>> .AC>
+                               <AND <==? <2 .P> BOTH>
+                                    <OR <==? <IN-AC? <1 .P> TYPE> .AC>
+                                        <==? <IN-AC? <1 .P> VALUE> .AC>>>>>
+                      <RETURN T>)>
+               <SET P <REST .P 3>>>>
+
+<DEFINE NEXT-AC-FUNNY (AC:ATOM)
+       <OR <NEXT-AC .AC>
+           <AND <==? .AC O1*> O2*>
+           <AND <==? .AC O*> A1*>
+           <ERROR NEXT-AC-LOSSAGE!-ERRORS>>>
+
+<DEFINE FIXUP-ACS (L ACA ACB NOT-ME KIND "AUX" AC2A AC2B) 
+       #DECL ((L) LIST)
+       <SET AC2B <COND (<==? .KIND BOTH> <NEXT-AC-FUNNY .ACB>)>>
+       <SET AC2A <COND (<==? .KIND BOTH> <NEXT-AC-FUNNY .ACA>)>>
+       <MAPF <>
+             <FUNCTION (LL "AUX" TAC) 
+                     #DECL ((LL) !<LIST ATOM ATOM ATOM TUPLE>)
+                     <COND (<AND <N==? .LL .NOT-ME>
+                                 <OR <AND <==? .ACB <SET TAC <1 .LL>>>
+                                          <SET TAC .ACA>>
+                                     <AND <==? .ACA .TAC> <SET TAC .ACB>>
+                                     <AND <==? .AC2A .TAC> <SET TAC .AC2B>>
+                                     <AND <==? .AC2B .TAC> <SET TAC .AC2A>>>>
+                            <PUT .LL 1 .TAC>)>>
+             .L>>
+
+<DEFINE PUTL!-MIMOC (L "AUX" (LST <1 .L>) (AMT <2 .L>) (VAL <3 .L>)
+                            (LOOP <GENLBL "LOOP">) (END <GENLBL "END">)
+                            (TAC <>) AC NAC (PUT-TYP <EXTRAMEM TYPE .L>)
+                            CNT-AC)
+       #DECL ((LST) <OR LIST ATOM>
+              (AMT) <OR FIX ATOM>
+              (LOOP) ATOM (NAC AC TAC) <OR ATOM FALSE>
+              (L) LIST)
+       <COND (<AND <NOT <AND <SET AC <IN-AC? .LST BOTH>>
+                             <SET TAC .AC>
+                             <SET AC <NEXT-AC .AC>>>>
+                   <NOT <SET AC <IN-AC? .LST VALUE>>>>
+              <SET AC <NEXT-AC <SET TAC <LOAD-AC .LST BOTH>>>>)
+             (ELSE
+              <SETG FIRST-AC <>>
+              <AC-TIME <GET-AC .AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)>
+       <COND (<==? .AMT 1>)
+             (<TYPE? .AMT FIX>
+              <COND (.TAC <FLUSH-AC .TAC T>)
+                    (ELSE <FLUSH-AC .AC>)>
+              <COND (<L? <SET AMT <- .AMT 1>> 3>
+                     <REPEAT ()
+                             <OCEMIT MOVE .AC (.AC)>
+                             <COND (<0? <SET AMT <- .AMT 1>>> <RETURN>)>>)
+                    (ELSE
+                     <SMASH-AC O* .AMT VALUE>
+                     <SETG LOOPTAGS (.LOOP !,LOOPTAGS)>
+                     <LABEL .LOOP>
+                     <OCEMIT MOVE .AC (.AC)>
+                     <OCEMIT SOJN O* <XJUMP .LOOP>>)>)
+             (T
+              <COND (.TAC <FLUSH-AC .TAC T>)
+                    (ELSE <FLUSH-AC .AC>)>
+              <COND (<OR <AND <SET CNT-AC <IN-AC? .AMT BOTH>>
+                              <OR <AND <WILL-DIE? .AMT> <DEAD!-MIMOC (.AMT) T>>
+                                  <NOT <AC-UPDATE <GET-AC <NEXT-AC .CNT-AC>>>>>
+                              <PROG ()
+                                    <MUNGED-AC .CNT-AC T>
+                                    <SET CNT-AC <NEXT-AC .CNT-AC>>>>
+                         <AND <SET CNT-AC <IN-AC? .AMT VALUE>>
+                              <OR <AND <WILL-DIE? .AMT> <DEAD!-MIMOC (.AMT) T>>
+                                  <NOT <AC-UPDATE <GET-AC .CNT-AC>>>>
+                              <PROG ()
+                                    <MUNGED-AC .CNT-AC T>>>>)
+                    (ELSE
+                     <OCEMIT MOVE <SET CNT-AC O*> !<OBJ-VAL .AMT>>)>
+              <OCEMIT SOJE .CNT-AC <XJUMP .END>>
+              <SETG LOOPTAGS (.LOOP !,LOOPTAGS)>
+              <LABEL .LOOP>
+              <OCEMIT MOVE .AC (.AC)>
+              <OCEMIT SOJN .CNT-AC <XJUMP .LOOP>>
+              <LABEL .END>)>
+       <DO-PUT .PUT-TYP .AC .VAL 1>
+       <COND (<N==? .AMT 1>
+              <COND (.TAC <MUNGED-AC .TAC T>)
+                    (ELSE <MUNGED-AC .AC>)>)>>
+
+<DEFINE DO-PUT (PUT-TYP AC VAL OFFS "AUX" NAC) 
+       #DECL ((OFFS) FIX)
+       <COND (.PUT-TYP <SET PUT-TYP <DECL-HACK <COND (<TYPE? .PUT-TYP LIST>
+                                                      <2 .PUT-TYP>)
+                                                     (ELSE .PUT-TYP)>>>)>
+       <COND (<AND .PUT-TYP
+                   <OR <NOT <TYPE? .VAL ATOM>> <SET NAC <IN-AC? .VAL VALUE>>>>
+              <COND (<TYPE? .VAL ATOM> <OCEMIT MOVEM .NAC <+ .OFFS 1> (.AC)>)
+                    (<OR <AND <==? <PRIMTYPE .VAL> LIST> <EMPTY? .VAL>>
+                         <AND <==? <PRIMTYPE .VAL> FIX>
+                              <==? <CHTYPE .VAL FIX> 0>>>
+                     <OCEMIT SETZM <+ .OFFS 1> (.AC)>)
+                    (<AND <==? <PRIMTYPE .VAL> FIX>
+                          <==? <CHTYPE .VAL FIX> -1>>
+                     <OCEMIT SETOM <+ .OFFS 1> (.AC)>)
+                    (ELSE
+                     <FLUSH-AC O*>
+                     <MUNGED-AC O*>
+                     <GET-INTO-ACS .VAL VALUE O*>
+                     <OCEMIT MOVEM O* <+ .OFFS 1> (.AC)>)>)
+             (.PUT-TYP
+              <COND (<SET NAC <IN-AC? .VAL VALUE>>)
+                    (<OR <NOT <TYPE? .VAL ATOM>> <WILL-DIE? .VAL>>
+                     <GET-INTO-ACS .VAL VALUE <SET NAC O*>>)
+                    (ELSE
+                     <SET NAC <NEXT-AC <LOAD-AC .VAL BOTH>>>)>
+              <OCEMIT MOVEM .NAC <+ .OFFS 1> (.AC)>)
+             (ELSE
+              <COND (<SET NAC <IN-AC? .VAL BOTH>>)
+                    (<OR <NOT <TYPE? .VAL ATOM>> <WILL-DIE? .VAL>>
+                     <GET-INTO-ACS .VAL BOTH <SET NAC O1*>>)
+                    (ELSE
+                     <SET NAC <LOAD-AC .VAL BOTH>>)>
+              <OCEMIT DMOVEM .NAC .OFFS (.AC)>)>>
+
+<DEFINE LENL!-MIMOC (L
+                    "AUX" (LST <1 .L>) (VAL <3 .L>) NAC AC TAC
+                          (END <GENLBL "END">) (LOOP <GENLBL "LOOP">))
+       #DECL ((L) LIST (VAL AC NAC END LOOP) ATOM)
+       <FLUSH-AC T*>
+       <MUNGED-AC T*>
+       <COND (<SET TAC <IN-AC? .LST VALUE>>
+              <SETG FIRST-AC <>>
+              <AC-TIME <GET-AC .TAC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+              <OCEMIT MOVEI T* .TAC>)
+             (ELSE <OCEMIT XMOVEI T* !<OBJ-VAL .LST>>)>
+       <SET NAC <NEXT-AC <SET AC <ASSIGN-AC .VAL BOTH>>>>
+       <COND (<==? .VAL STACK> <SET NAC O*>)
+             (<==? .LST .VAL> <SET NAC O*> <AC-TYPE <GET-AC .AC> FIX>)
+             (T <AC-TYPE <GET-AC .AC> FIX>)>
+       <OCEMIT MOVSI .NAC 131072>
+       <SETG LOOPTAGS (.LOOP !,LOOPTAGS)>
+       <LABEL .LOOP>
+       <OCEMIT SKIPE T* '(T*)>
+       <OCEMIT AOBJN .NAC <XJUMP .LOOP>>
+       <LABEL .END>
+       <COND (<==? .VAL STACK>
+              <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+              <OCEMIT ANDI O* *777777*>
+              <OCEMIT PUSH TP* O*>
+              <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+             (<==? .VAL .LST> <OCEMIT HRRZ <NEXT-AC .AC> O*>)
+             (ELSE <OCEMIT MOVEI .NAC (.NAC)>)>>
+
+\\r 
+
+;"UBLOCK manipulation"
+
+<DEFINE NTHU!-MIMOC (L "AUX" (L1 <1 .L>))
+       #DECL ((L) LIST (L1) ANY)
+       <UPDATE-ACS>
+       <SMASH-AC A1* .L1 TYPE>
+       <OCEMIT MOVE O1* !<OBJ-VAL .L1>>
+       <OCEMIT MOVE O2* !<OBJ-VAL <2 .L>>>
+       <PUSHJ NTHU <4 .L>>>
+
+<DEFINE RESTU!-MIMOC (L)
+       #DECL ((L) LIST)
+       <UPDATE-ACS>
+       <SMASH-AC A1* <1 .L> BOTH>
+       <OCEMIT MOVE O2* !<OBJ-VAL <2 .L>>>
+       <PUSHJ RESTU <4 .L>>>
+
+<DEFINE BACKU!-MIMOC (L)
+       #DECL ((L) LIST)
+       <UPDATE-ACS>
+       <SMASH-AC A1* <1 .L> BOTH>
+       <OCEMIT MOVE O2* !<OBJ-VAL <2 .L>>>
+       <PUSHJ BACKU <4 .L>>>
+
+<DEFINE TOPU!-MIMOC (L)
+       #DECL ((L) LIST)
+       <UPDATE-ACS>
+       <SMASH-AC A1* <1 .L> BOTH>
+       <PUSHJ TOPU <3 .L>>>
+
+<SETG TOPUV!-MIMOC ,TOPU!-MIMOC>
+
+<SETG TOPUS!-MIMOC ,TOPU!-MIMOC>
+
+<SETG TOPUB!-MIMOC ,TOPU!-MIMOC>
+
+<DEFINE PUTU!-MIMOC (L)
+       #DECL ((L) LIST)
+       <UPDATE-ACS>
+       <SMASH-AC A1* <1 .L> BOTH>
+       <SMASH-AC B1* <3 .L> BOTH>
+       <OCEMIT MOVE O2* !<OBJ-VAL <2 .L>>>
+       <PUSHJ PUTU>>
+
+;"VECTOR manipulation"
+
+<DEFINE NTHUU!-MIMOC (L) #DECL ((L) LIST)
+       <NTHUV!-MIMOC .L T>>
+
+
+<DEFINE NTHUV!-MIMOC (L
+                     "OPT" (UV? <>) (AOS <>) (NOT-DEAD? T) LEN-VAR
+                     "AUX" (V <1 .L>) (AMT <2 .L>) AM-AC (TAC <>) (VAL <4 .L>)
+                           AC NAC NUM (AHEAD <>))
+   #DECL ((L) LIST (V) <OR VECTOR ATOM> (AMT) <OR FIX ATOM> (VAL NAC) ATOM
+         (NUM) FIX (AC TAC) <OR ATOM FALSE>)
+   <COND
+    (<AND <NOT .AOS>
+         <NTH-PUT-LOOK-AHEAD .L
+                             <COND (.UV? "PUTUU") ("PUTUV")>
+                             .V
+                             .AMT
+                             .VAL>>)
+    (ELSE
+     <COND (<AND <ASSIGNED? LEN-VAR> .NOT-DEAD?> <SET VAL .LEN-VAR>)>
+     <COND (<AND <NOT <AND <SET TAC <IN-AC? .V BOTH>> <SET AC <NEXT-AC .TAC>>>>
+                <NOT <SET AC <IN-AC? .V VALUE>>>
+                <OR <N==? .AMT 1>
+                    <AND <OR .AOS <==? .VAL STACK>> <NOT .UV?> <N==? .AOS HRRZ>>>
+                <TYPE? .AMT FIX>>
+           <COND (<AND <NOT .AOS>
+                       <N==? .V .VAL>
+                       <SET AHEAD <LOOK-AHEAD <REST .MIML> .VAL BOTH>>>
+                  <AC-TIME .AHEAD <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                  <AC-TIME <GET-AC <NEXT-AC .AHEAD>> ,AC-STAMP>)>
+           <SET AC <NEXT-AC <SET TAC <LOAD-AC .V BOTH>>>>)
+          (.AC
+           <SETG FIRST-AC <>>
+           <AC-TIME <GET-AC .AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)>
+     <COND
+      (<TYPE? .AMT FIX>
+       <COND (<AND .NOT-DEAD? <N==? .VAL STACK>>
+             <SET NAC <LOAD-AC .VAL BOTH T T .AHEAD>> ;"Really an ASSIGN-AC")>
+       <COND (.UV? <SET NUM <- .AMT 1>>) (ELSE <SET NUM <* <- .AMT 1> 2>>)>
+       <COND (<==? .AOS HRRZ>
+             <OCEMIT HRRZ
+                     <COND (<OR <NOT .NOT-DEAD?> <==? .VAL STACK>> O*)
+                           (ELSE <AC-TYPE <GET-AC .NAC> FIX> <NEXT-AC .NAC>)>
+                     !<COND (.AC (.NUM (.AC))) (ELSE (@ !<OBJ-VAL .V>))>>
+             <COND (<==? .VAL STACK>
+                    <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+                    <OCEMIT PUSH TP* O*>
+                    <COND (,WINNING-VICTIM
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)>)
+            (<TYPE? .AOS FORM>
+             <COND (<=? <SPNAME <1 .AOS>> "VEQUAL?">
+                    <VEQUAL?!-MIMOC <REST .AOS>
+                                    .AC <> <COND (<NOT .UV?> <+ .NUM 1>)
+                                                 (.AC .NUM)
+                                                 (ELSE (@ !<OBJ-VAL .V>))>>)
+                   (<=? <SPNAME <1 .AOS>> "TYPE?">
+                    <VEQUAL?!-MIMOC <REST .AOS 3>
+                                    .AC <> <COND (<NOT .UV?> <+ .NUM 1>)
+                                                 (.AC .NUM)
+                                                 (ELSE (@ !<OBJ-VAL .V>))>
+                                    <2 .AOS>>)
+                   (ELSE
+                    <EQUAL?!-MIMOC <REST .AOS> .AC <> .NUM>)>)
+            (.AOS
+             <OCEMIT .AOS
+                     <COND (.NOT-DEAD? <NEXT-AC .NAC>) (ELSE O*)>
+                     !<COND (<NOT .UV?> (<+ .NUM 1> (.AC)))
+                            (.AC (.NUM (.AC)))
+                            (ELSE (@ !<OBJ-VAL .V>))>>
+             <COND (.NOT-DEAD? <AC-TYPE <GET-AC .NAC> FIX>)>)
+            (<AND <==? .VAL STACK> <NOT .UV?>>
+             <OCEMIT PUSH TP* .NUM (.AC)>
+             <OCEMIT PUSH TP* <+ .NUM 1> (.AC)>
+             <COND (,WINNING-VICTIM
+                    <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+            (<==? .VAL STACK>
+             <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+             <COND (,WINNING-VICTIM
+                    <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)> 
+             <COND (.AC <OCEMIT PUSH TP* .NUM (.AC)>)
+                   (ELSE <OCEMIT PUSH TP* @ !<OBJ-VAL .V>>)>
+             <COND (,WINNING-VICTIM
+                    <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>)
+            (<NOT .AC>
+             <COND (.UV?
+                    <OCEMIT MOVE <NEXT-AC .NAC> @ !<OBJ-VAL .V>>
+                    <AC-TYPE <GET-AC .NAC> FIX>)
+                   (ELSE <OCEMIT DMOVE .NAC @ !<OBJ-VAL .V>>)>)
+            (.UV?
+             <OCEMIT MOVE <NEXT-AC .NAC> .NUM (.AC)>
+             <AC-TYPE <GET-AC .NAC> FIX>)
+            (T <OCEMIT DMOVE .NAC .NUM (.AC)>)>)
+      (T
+       <COND
+       (<OR <AND <SET AM-AC <IN-AC? .AMT VALUE>>
+                 <OR <NOT <AC-UPDATE <GET-AC .AM-AC>>> <WILL-DIE? .AMT>>>
+            <AND <==? .AMT .VAL>
+                 <OR .AM-AC
+                     <AND .NOT-DEAD?
+                          <SET NAC <LOAD-AC .VAL BOTH T T .AHEAD>>>>>>
+        <COND
+         (<NOT .AM-AC>
+          <OCEMIT MOVE <SET AM-AC <NEXT-AC .NAC>> !<OBJ-VAL .AMT>>)
+         (<AND <MEMQ .AM-AC '[A2* B2* C2*]> <N==? .VAL STACK>>
+          <SET NAC <GETPROP .AM-AC AC-PAIR>>
+          <CLEAN-ACS .VAL>
+          <AC-CODE <AC-ITEM <AC-UPDATE <AC-TYPE <GET-AC .NAC> <>> T> .VAL>
+                   TYPE>
+          <AC-CODE <AC-ITEM <AC-UPDATE <AC-TYPE <GET-AC .AM-AC> <>> T> .VAL>
+                   VALUE>)
+         (ELSE
+          <COND (<N==? .AMT .VAL> <MUNGED-AC .AM-AC>)>
+          <FLUSH-AC .AM-AC>
+          <COND (.NOT-DEAD? <SET NAC <LOAD-AC .VAL BOTH T T .AHEAD>>)>)>)
+       (ELSE
+        <COND (.AM-AC <OCEMIT MOVE T* .AM-AC> <SET AM-AC T*>)
+              (ELSE <SMASH-AC <SET AM-AC T*> .AMT VALUE>)>
+        <COND (.NOT-DEAD? <SET NAC <LOAD-AC .VAL BOTH T T .AHEAD>>)>)>
+       <COND (<AND <N==? .VAL STACK> <ASSIGNED? NAC>>
+             <AC-TYPE <GET-AC .NAC> <>>)>
+       <COND (<NOT .UV?> <OCEMIT LSH .AM-AC 1>)>
+       <COND (.AC <OCEMIT ADD .AM-AC .AC>)
+            (ELSE <OCEMIT ADD .AM-AC !<OBJ-LOC .V 1>>)>
+       <COND (<==? .AOS HRRZ>
+             <OCEMIT HRRZ
+                     <COND (<OR <NOT .NOT-DEAD?> <==? .VAL STACK>> O*)
+                           (ELSE <AC-TYPE <GET-AC .NAC> FIX> <NEXT-AC .NAC>)>
+                     -2
+                     (.AM-AC)>
+             <COND (<==? .VAL STACK>
+                    <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+                    <OCEMIT PUSH TP* O*>)>)
+            (<TYPE? .AOS FORM>
+             <COND (<=? <SPNAME <1 .AOS>> "VEQUAL?">
+                    <VEQUAL?!-MIMOC <REST .AOS> .AM-AC <> -1>)
+                   (<=? <SPNAME <1 .AOS>> "TYPE?">
+                    <VEQUAL?!-MIMOC <REST .AOS 3> .AM-AC <> -2 <2 .AOS>>)
+                   (ELSE
+                    <EQUAL?!-MIMOC <REST .AOS> .AM-AC <> -2>)>)
+            (.AOS
+             <OCEMIT .AOS
+                     <COND (.NOT-DEAD?
+                            <AC-TYPE <GET-AC .NAC> FIX>
+                            <NEXT-AC .NAC>)
+                           (ELSE O*)>
+                     -1
+                     (.AM-AC)>)
+            (<AND <==? .VAL STACK> <NOT .UV?>>
+             <OCEMIT PUSH TP* -2 (.AM-AC)>
+             <OCEMIT PUSH TP* -1 (.AM-AC)>
+             <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+            (<==? .VAL STACK>
+             <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+             <OCEMIT PUSH TP* -1 (.AM-AC)>
+             <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+            (.UV?
+             <OCEMIT MOVE <NEXT-AC .NAC> -1 (.AM-AC)>
+             <AC-TYPE <GET-AC .NAC> FIX>)
+            (T <OCEMIT DMOVE .NAC -2 (.AM-AC)>)>
+       <AC-CODE <GET-AC T*> DUMMY>)>)>>
+
+<DEFINE PUTUU!-MIMOC (L) #DECL ((L) LIST)
+       <PUTUV!-MIMOC .L T>>
+
+<DEFINE PUTUV!-MIMOC (L
+                     "OPT" (UV? <>)
+                     "AUX" (V <1 .L>) (AMT <2 .L>) (TAC <>) (VAL <3 .L>) AC
+                           AMT-AC NAC (PUT-TYP <EXTRAMEM TYPE .L>))
+       #DECL ((L) LIST (V) <OR VECTOR ATOM> (AMT) <OR FIX ATOM> (NAC) ATOM
+              (VAL) ANY (AC TAC) <OR ATOM FALSE>)
+       <COND (<AND <NOT <AND <SET TAC <IN-AC? .V BOTH>>
+                             <SET AC <NEXT-AC .TAC>>>>
+                   <NOT <SET AC <IN-AC? .V VALUE>>>
+                   <N==? .AMT 1>
+                   <TYPE? .AMT FIX>>
+              <SET AC <NEXT-AC <SET TAC <LOAD-AC .V BOTH>>>>)
+             (.AC
+              <SETG FIRST-AC <>>
+              <AC-TIME <GET-AC .AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)>
+       <COND (<AND <TYPE? .AMT FIX> .UV?>
+              <COND (.AC <DO-PUT FIX .AC .VAL <- .AMT 2>>)
+                    (<OR <AND <==? <PRIMTYPE .VAL> LIST> <EMPTY? .VAL>>
+                         <AND <==? <PRIMTYPE .VAL> WORD>
+                              <==? <CHTYPE .VAL FIX> 0>>>
+                     <OCEMIT SETZM @ !<OBJ-VAL .V>>)
+                    (<AND <==? <PRIMTYPE .VAL> WORD>
+                          <==? <CHTYPE .VAL FIX> -1>>
+                     <OCEMIT SETOM @ !<OBJ-VAL .V>>)
+                    (<TYPE? .VAL ATOM>
+                     <SET NAC <NEXT-AC <LOAD-AC .VAL BOTH>>>
+                     <OCEMIT MOVEM .NAC @ !<OBJ-VAL .V>>)
+                    (ELSE
+                     <GET-INTO-ACS .VAL VALUE O*>
+                     <OCEMIT MOVEM O* @ !<OBJ-VAL .V>>)>)
+             (<TYPE? .AMT FIX>
+              <COND (.AC <DO-PUT .PUT-TYP .AC .VAL <* <- .AMT 1> 2>>)
+                    (ELSE
+                     <SET NAC <LOAD-AC .VAL BOTH>>
+                     <OCEMIT DMOVEM .NAC @ !<OBJ-VAL .V>>)>)
+             (T
+              <COND (<AND <SET AMT-AC <IN-AC? .AMT VALUE>>
+                          <WILL-DIE? .AMT>>
+                     <SETG FIRST-AC <>>
+                     <DEAD!-MIMOC (.AMT) T>
+                     <AC-TIME <GET-AC .AMT-AC> ,AC-STAMP>
+                     <AC-TIME <GET-AC <GETPROP .AMT-AC AC-PAIR>> ,AC-STAMP>)
+                    (ELSE
+                     <GET-INTO-ACS .AMT VALUE <SET AMT-AC T*>>)>
+              <COND (<NOT .UV?> <OCEMIT LSH .AMT-AC 1>)>
+              <COND (.AC <OCEMIT ADD .AMT-AC .AC>)
+                    (ELSE <OCEMIT ADD .AMT-AC !<OBJ-VAL .V>>)>
+              <COND (.UV? <DO-PUT FIX .AMT-AC .VAL -2>)
+                    (ELSE <DO-PUT .PUT-TYP .AMT-AC .VAL -2>)>
+              <AC-CODE <GET-AC .AMT-AC> DUMMY>)>>
+
+<DEFINE RESTUU!-MIMOC (L) #DECL ((L) LIST)
+       <RESTUV!-MIMOC .L T>>
+
+<DEFINE RESTUV!-MIMOC (L
+                      "OPT" (UV? <>)
+                      "AUX" (V <1 .L>) (AMT <2 .L>) (VAL <4 .L>) AC NAC
+                            (RES-TYP <EXTRAMEM TYPE .L>))
+       #DECL ((L) LIST (V) <OR VECTOR ATOM> (AMT) <OR ATOM FIX> (VAL) ATOM
+              (AC NAC) <OR ATOM FALSE>)
+       <COND (<TYPE? .AMT FIX>
+              <COND (<AND <==? .AMT 1> <==? .V .VAL>>
+                     <SET AC <IN-AC? .V BOTH>>)
+                    (ELSE <SET AC <LOAD-AC .V BOTH>>)>
+              <COND (.AC
+                     <COND (<AND <N==? .V .VAL>
+                                 <NOT <WILL-DIE? .V>>
+                                 <AC-UPDATE <GET-AC .AC>>>
+                            <CLEAN-ACS .VAL>
+                            <SET NAC <ASSIGN-AC .VAL BOTH T>>
+                            <OCEMIT DMOVE .NAC .AC>)
+                           (ELSE
+                            <CLEAN-ACS .VAL>
+                            <COND (<N==? .VAL STACK> <ALTER-AC .AC .VAL>)
+                                  (ELSE <MUNGED-AC .AC T>)>
+                            <SET NAC .AC>)>
+                     <OCEMIT ADDI
+                             <NEXT-AC .NAC>
+                             <COND (.UV? .AMT) (T <* .AMT 2>)>>
+                     <OCEMIT SUBI .NAC .AMT>)
+                    (ELSE
+                     <SET NAC <ASSIGN-AC .VAL BOTH T>>
+                     <OCEMIT SOS .NAC !<OBJ-LOC .V 0>>
+                     <COND (.UV? <OCEMIT AOS <NEXT-AC .NAC> !<OBJ-LOC .V 1>>)
+                           (ELSE
+                            <OCEMIT MOVEI <NEXT-AC .NAC> 2>
+                            <OCEMIT ADDB <NEXT-AC .NAC> !<OBJ-LOC .V 1>>)>
+                     <AC-UPDATE <GET-AC .NAC> <>>
+                     <AC-UPDATE <GET-AC <NEXT-AC .NAC>> <>>
+                     <AC-ITEM <GET-AC .NAC> .V>
+                     <AC-ITEM <GET-AC <NEXT-AC .NAC>> .V>
+                     <AC-CODE <GET-AC .NAC> TYPE>
+                     <AC-CODE <GET-AC <NEXT-AC .NAC>> VALUE>)>)
+             (<==? .V .VAL>
+              <SET NAC <LOAD-AC .V BOTH>>
+              <COND (<AND <SET AC <IN-AC? .AMT VALUE>>
+                          <OR <AND <WILL-DIE? .AMT> <DEAD!-MIMOC (.AMT) T>>
+                              <NOT <AC-UPDATE <GET-AC .AC>>>>>)
+                    (ELSE <SET AC <>>)>
+              <OCEMIT SUB .NAC !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>
+              <COND (<AND <NOT .UV?> .AC> <OCEMIT LSH .AC 1>)
+                    (<NOT .UV?>
+                     <OCEMIT ADD
+                             <NEXT-AC .NAC>
+                             !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>)>
+              <OCEMIT ADD
+                      <NEXT-AC .NAC>
+                      !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>
+              <AC-UPDATE <GET-AC .NAC> T>
+              <AC-UPDATE <GET-AC <NEXT-AC .NAC>> T>)
+             (<==? .VAL .AMT>
+              <SET AC <IN-AC? .AMT VALUE>>
+              <SETG FIRST-AC <>>
+              <SET NAC <LOAD-AC .V BOTH>>
+              <FLUSH-AC .NAC T>
+              <MUNGED-AC .NAC T>
+              <CLEAN-ACS .AMT>
+              <OCEMIT SUB .NAC !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>
+              <COND (<AND <NOT .UV?> .AC> <OCEMIT LSH .AC 1>)
+                    (<NOT .UV?>
+                     <OCEMIT ADD
+                             <NEXT-AC .NAC>
+                             !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>)>
+              <OCEMIT ADD
+                      <NEXT-AC .NAC>
+                      !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>
+              <ALTER-AC .NAC .VAL>)
+             (T
+              <SET NAC <LOAD-AC .V BOTH>>
+              <FLUSH-AC .NAC T>
+              <MUNGED-AC .NAC T>
+              <COND (<AND <SET AC <IN-AC? .AMT VALUE>>
+                          <OR <AND <WILL-DIE? .AMT> <DEAD!-MIMOC (.AMT) T>>
+                              <NOT <AC-UPDATE <GET-AC .AC>>>
+                              .UV?>>)
+                    (ELSE <SET AC <>>)>
+              <OCEMIT SUB .NAC !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>
+              <COND (<AND <NOT .UV?> .AC> <OCEMIT LSH .AC 1>)
+                    (<NOT .UV?>
+                     <OCEMIT ADD
+                             <NEXT-AC .NAC>
+                             !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>)>
+              <OCEMIT ADD
+                      <NEXT-AC .NAC>
+                      !<COND (.AC (.AC)) (ELSE <OBJ-VAL .AMT>)>>
+              <COND (<N==? .VAL STACK> <ALTER-AC .NAC .VAL>)>)>
+       <COND (<==? .VAL STACK>
+              <OCEMIT PUSH TP* .NAC>
+              <OCEMIT PUSH TP* <NEXT-AC .NAC>>
+              <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)>>
+
+<DEFINE EMPUV?!-MIMOC (L "AUX" (V <1 .L>) (TAG <3 .L>) (JUMP JUMPE) 
+                              (TRN TRNN) AC)
+       #DECL ((L) LIST (V) <OR VECTOR ATOM> (JUMP TRN TAG) ATOM
+              (AC) <OR FALSE ATOM>)
+       <COND (<==? <2 .L> -> <SET JUMP JUMPN> <SET TRN TRNE>)>
+       <LABEL-UPDATE-ACS .TAG <>>
+       <COND (<SET AC <IN-AC? .V TYPE>>
+              <OCEMIT .TRN .AC *777777*>
+              <OCEMIT JRST <XJUMP .TAG>>)
+             (T
+              <OCEMIT HRRZ O* !<OBJ-TYP .V>>
+              <OCEMIT .JUMP O* <XJUMP .TAG>>)>>
+
+<DEFINE LENUV!-MIMOC (L "AUX" (V <1 .L>) (VAL <3 .L>) AC)
+       #DECL ((L) LIST (V) <OR VECTOR ATOM> (VAL AC) ATOM)
+       <COND (<==? .VAL STACK>
+              <OCEMIT PUSH TP* !<TYPE-WORD FIX>>
+              <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>
+              <OCEMIT HRRZ O* !<OBJ-TYP .V>>
+              <OCEMIT PUSH TP* O*>
+              <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>)
+             (T
+              <SET AC <ASSIGN-AC .VAL BOTH>>
+              <OCEMIT HRRZ <NEXT-AC .AC> !<OBJ-TYP .V>>
+              <AC-TYPE <GET-AC .AC> FIX>)>>
+
+\f
+;"STRING and BYTES manipulation"
+
+<DEFINE NTHUB!-MIMOC (L)
+  <NTHUS!-MIMOC .L T>>
+
+<DEFINE NTHUS!-MIMOC (L
+                     "OPTIONAL" (BYTES? <>)
+                     "AUX" (V <1 .L>) (AMT <2 .L>) (VAL <4 .L>) AC NUM
+                           (NAC <PUTPROP .L DONE>))
+       #DECL ((L) LIST (V) <OR BYTES STRING ATOM> (AMT) <OR FIX ATOM>
+              (VAL) ATOM (NUM) FIX (AC BYTES?) <OR ATOM FALSE>)
+       <SETG DIE-LATER <SETG REMEMBER-STRING <>>>
+       <COND (<AND <NOT .NAC> <N==? .VAL .V> <TYPE? .AMT FIX>>
+              <SET NAC <STRING-PUT-NTH-LOOK-AHEAD .V NTH .VAL .BYTES? .AMT>>)>
+       <COND (<NOT .NAC>
+              <COND (<SET AC <IN-AC? .V FUNNY-VALUE>>
+                     <AC-CODE <GET-AC .AC> VALUE>
+                     <SET AMT 1>
+                     <SETG FIRST-AC <>>
+                     <AC-TIME <GET-AC .AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)
+                    (<AND <N==? .AMT 1> <N==? .AMT 2>>
+                     <SET AC <LOAD-AC .AMT VALUE>>
+                     <FLUSH-AC .AC>
+                     <MUNGED-AC .AC>
+                     <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                                   (T ADJBP)>
+                             .AC !<OBJ-VAL .V>>)
+                    (<AND <SET AC <IN-AC? .V VALUE>>
+                          <OR <WILL-DIE? .V>
+                              <NOT <AC-UPDATE <GET-AC .AC>>>
+                              <==? .V .VAL>
+                              ,DIE-LATER>>
+                     <MUNGED-AC .AC>
+                     <SETG FIRST-AC <>>
+                     <AC-TIME <GET-AC .AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)
+                    (,REMEMBER-STRING
+                     <COND (.AC
+                            <FLUSH-AC .AC>
+                            <SETG FIRST-AC <>>
+                            <AC-TIME <GET-AC .AC>
+                                     <SETG AC-STAMP <+ ,AC-STAMP 1>>>)
+                           (ELSE
+                            <SETG FIRST-AC <>>
+                            <SET AC <NEXT-AC <LOAD-AC .V BOTH>>>)>
+                     <MUNGED-AC .AC>)
+                    (ELSE <SET AC <>>)>
+              <COND (<==? .VAL STACK>
+                     <COND (.BYTES? <OCEMIT PUSH TP* !<TYPE-WORD FIX>>)
+                           (T <OCEMIT PUSH TP* !<TYPE-WORD CHARACTER>>)>
+                     <COND (,WINNING-VICTIM
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>
+                     <COND (<NOT .AC>
+                            <OCEMIT MOVE O* !<OBJ-VAL .V>>
+                            <SET AC O*>)>
+                     <DNTH O* .AC .AMT>
+                     <OCEMIT PUSH TP* O*>
+                     <COND (,WINNING-VICTIM
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>
+                     <AC-CODE <GET-AC .AC> DUMMY>)
+                    (T
+                     <SET NAC <ASSIGN-AC .VAL BOTH>>
+                     <COND (<NOT .AC>
+                            <OCEMIT MOVE
+                                    <SET AC <NEXT-AC .NAC>>
+                                    !<OBJ-VAL .V>>)>
+                     <DNTH <NEXT-AC .NAC> .AC .AMT>
+                     <COND (.BYTES? <AC-TYPE <GET-AC .NAC> FIX>)
+                           (T <AC-TYPE <GET-AC .NAC> CHARACTER>)>)>
+              <COND (<AND .AC
+                          <OR <NOT .NAC>
+                              <AND <N==? .AC .NAC>
+                                   <N==? .AC <NEXT-AC .NAC>>>>>
+                     <COND (,REMEMBER-STRING
+                            <AC-UPDATE <AC-CODE <AC-ITEM <GET-AC .AC> .V>
+                                                FUNNY-VALUE> <>>)
+                           (ELSE
+                            <AC-CODE <GET-AC .AC> DUMMY>)>)>)>>
+
+<DEFINE DNTH (AC1 AC2 AMT)
+       #DECL ((AC1 AC2) ATOM (AMT) <OR ATOM FIX>)
+       <COND (<OR <==? .AMT 1><==? .AMT 2>>
+              <COND (<==? .AMT 2>
+                     <OCEMIT IBP O* .AC2>)>
+              <OCEMIT ILDB .AC1 .AC2>)
+             (ELSE
+              <OCEMIT LDB .AC1 .AC2>)>>
+
+<DEFINE PUTUS!-MIMOC (L
+                     "OPT" (BYTES? <>)
+                     "AUX" (V <1 .L>) (AMT <2 .L>) (VAL <3 .L>) (AC <>) NAC
+                           (DONE <PUTPROP .L DONE>) TAC)
+       #DECL ((L) LIST (V) <OR BYTES STRING ATOM> (AMT) <OR FIX ATOM>
+              (NAC) <OR ATOM FALSE> (VAL) ANY (TAC AC) <OR ATOM FALSE>)
+       <SETG DIE-LATER <SETG REMEMBER-STRING <>>>
+       <COND (<AND <NOT .DONE> <TYPE? .AMT FIX>>
+              <SET DONE <STRING-PUT-NTH-LOOK-AHEAD
+                         .V PUT .VAL .BYTES? .AMT>>)>
+       <COND (<NOT .DONE>
+              <COND (<OR <SET AC <IN-AC? .V FUNNY-VALUE>>
+                         <==? .AMT 1>
+                         <==? .AMT 2>>
+                     <COND (.AC
+                            <AC-CODE <GET-AC .AC> VALUE>
+                            <SET AMT 1>
+                            <SETG FIRST-AC <>>
+                            <AC-TIME <GET-AC .AC>
+                                     <SETG AC-STAMP <+ ,AC-STAMP 1>>>)
+                           (<AND <SET AC <IN-AC? .V VALUE>>
+                                 <OR <WILL-DIE? .V> ,DIE-LATER>>
+                            <SETG FIRST-AC <>>
+                            <AC-TIME <GET-AC .AC>
+                                     <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                            <FLUSH-AC .AC>
+                            <MUNGED-AC .AC>)
+                           (,REMEMBER-STRING
+                            <SETG FIRST-AC <>>
+                            <SET AC <NEXT-AC <SET TAC <LOAD-AC .V BOTH>>>>
+                            <COND (<NOT <OR ,DIE-LATER <WILL-DIE? .V>>>
+                                   <FLUSH-AC .TAC T>)>
+                            <MUNGED-AC .TAC T>)
+                           (ELSE
+                            <OCEMIT MOVE <SET AC O*> !<OBJ-VAL .V>>)>
+                     <COND (<==? .AMT 2>
+                            <OCEMIT IBP O* .AC>)>
+                     <COND (<SET NAC <IN-AC? .VAL VALUE>>)
+                           (<AND <TYPE? .VAL ATOM>
+                                 <NOT <WILL-DIE? .VAL>>>
+                            <SET NAC <NEXT-AC <LOAD-AC .VAL BOTH>>>)
+                           (ELSE
+                            <GET-INTO-ACS .VAL VALUE <SET NAC O1*>>)>
+                     <OCEMIT IDPB .NAC .AC>
+                     <COND (,REMEMBER-STRING
+                            <AC-CODE <AC-ITEM <AC-UPDATE <GET-AC .AC> <>>
+                                              .V> FUNNY-VALUE>)
+                           (ELSE
+                            <AC-CODE <GET-AC .AC> DUMMY>)>)
+                    (ELSE
+                     <COND (<OR <AND <SET TAC <IN-AC? .AMT BOTH>>
+                                     <SET AC <NEXT-AC .TAC>>>
+                                <SET AC <IN-AC? .AMT VALUE>>>
+                            <SETG FIRST-AC <>>
+                            <COND (<WILL-DIE? .AMT>
+                                   <DEAD!-MIMOC (.AMT) T>)
+                                  (<AC-UPDATE <GET-AC .AC>>
+                                   <OCEMIT MOVE O1* .AC>
+                                   <SET AC O1*>)>
+                            <COND (<N==? .AC O1*>
+                                   <COND (.TAC
+                                          <AC-TIME <GET-AC .TAC>
+                                                   ,AC-STAMP>
+                                          <FLUSH-AC .TAC T>)
+                                         (ELSE <FLUSH-AC .AC>)>
+                                   <AC-TIME <GET-AC .AC> ,AC-STAMP>)>)
+                           (,REMEMBER-STRING
+                            <SET AC <LOAD-AC .AMT VALUE>>)
+                           (ELSE
+                            <GET-INTO-ACS .AMT VALUE <SET AC O1*>>)>
+                     <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                                   (T ADJBP)> .AC !<OBJ-VAL .V>>
+                     <COND (<AND <TYPE? .VAL ATOM>
+                                 <NOT <WILL-DIE? .VAL>>>
+                            <SET NAC <NEXT-AC <LOAD-AC .VAL BOTH>>>)
+                           (ELSE
+                            <GET-INTO-ACS .VAL VALUE <SET NAC O*>>)>
+                     <OCEMIT DPB .NAC .AC>
+                     <COND (<N==? .AC O1*>
+                            <COND (.TAC <MUNGED-AC .TAC T>)
+                                  (ELSE <MUNGED-AC .AC>)>
+                            <COND (,REMEMBER-STRING
+                                   <AC-CODE <AC-ITEM <AC-UPDATE <GET-AC .AC>
+                                                                <>> .V>
+                                            FUNNY-VALUE>)>)>)>)>>
+
+<DEFINE PUTUB!-MIMOC (L) <PUTUS!-MIMOC .L T>>
+
+<DEFINE RESTUS!-MIMOC (L
+                      "OPTIONAL" (BYTES? <>) (OTH-VAL <>) OP DEAD?
+                      "AUX" (STR <1 .L>) (AMT <2 .L>) (VAL <4 .L>) AC
+                            (OTH-AC <>) (NAC <PUTPROP .L DONE>))
+   #DECL ((L) LIST (STR) ATOM (AMT) <OR FIX ATOM> (VAL) ATOM
+         (AC NAC) <OR ATOM FALSE> (BYTES?) <OR ATOM FALSE>)
+   <COND
+    (<AND <NOT .NAC> <==? .AMT 1> <N==? .STR .VAL> <NOT .OTH-VAL>>
+     <SET NAC <STRING-REST-LOOK-AHEAD .L .STR .VAL .BYTES?>>)
+    (.OTH-VAL
+     <COND (<==? .OP PUT>
+           <COND (<SET OTH-AC <IN-AC? .OTH-VAL BOTH>>
+                  <AC-TIME <GET-AC .OTH-AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                  <AC-TIME <GET-AC <SET OTH-AC <NEXT-AC .OTH-AC>>> ,AC-STAMP>)
+                 (<SET OTH-AC <IN-AC? .OTH-VAL VALUE>>
+                  <AC-TIME <GET-AC .OTH-AC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>)
+                 (<TYPE? .OTH-VAL ATOM>
+                  <OCEMIT MOVE <SET OTH-AC O*> !<OBJ-VAL .OTH-VAL>>)
+                 (ELSE
+                  <OCEMIT MOVEI <SET OTH-AC O*> <CHTYPE .OTH-VAL FIX>>)>)>)>
+   <COND
+    (.NAC <SET VAL T>)
+    (<AND <==? .AMT 1> <NOT <IN-AC? .STR BOTH>> <==? .STR .VAL>>
+     <COND (<AND <SET NAC <IN-AC? .STR TYPE>> <NOT <AC-UPDATE <GET-AC .NAC>>>>
+           <MUNGED-AC .NAC>)>
+     <COND (<AND <SET NAC <IN-AC? .STR VALUE>> <NOT <AC-UPDATE <GET-AC .NAC>>>>
+           <MUNGED-AC .NAC>)>
+     <OCEMIT SOS O* !<OBJ-TYP .STR>>
+     <COND (.OTH-VAL
+           <COND (<==? .OP PUT> <OCEMIT IDPB .OTH-AC !<OBJ-VAL .STR>>)
+                 (<==? .OTH-VAL STACK>
+                  <OCEMIT ILDB O* !<OBJ-VAL .STR>>
+                  <OCEMIT PUSH
+                          TP*
+                          !<TYPE-WORD <COND (.BYTES? FIX) (ELSE CHARACTER)>>>
+                  <OCEMIT PUSH TP* O*>
+                  <COND (,WINNING-VICTIM
+                         <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                 (ELSE
+                  <SET OTH-AC <ASSIGN-AC .OTH-VAL BOTH>>
+                  <AC-TYPE <GET-AC .OTH-AC>
+                           <COND (.BYTES? FIX) (ELSE CHARACTER)>>
+                  <OCEMIT ILDB <NEXT-AC .OTH-AC> !<OBJ-VAL .STR>>)>)
+          (ELSE <OCEMIT IBP O* !<OBJ-VAL .STR>>)>)
+    (<TYPE? .AMT FIX>
+     <COND (<==? .AMT 1>
+           <SET NAC <LOAD-AC .STR BOTH>>
+           <COND (<OR <NOT .OTH-VAL> <==? .OP PUT> <==? .OTH-VAL STACK>>
+                  <COND (<NOT <OR <AND <ASSIGNED? DEAD?> .DEAD?>
+                                  <AND <NOT <ASSIGNED? DEAD?>>
+                                       <WILL-DIE? .STR>>
+                                  <==? .STR .VAL>>>
+                         <FLUSH-AC .NAC T>)>
+                  <MUNGED-AC .NAC T>)>)
+          (ELSE
+           <SET NAC <LOAD-AC .STR TYPE>>
+           <COND (<NOT <WILL-DIE? .STR>> <FLUSH-AC .NAC>)>
+           <MUNGED-AC .NAC>)>
+     <OCEMIT SUBI .NAC .AMT>
+     <COND
+      (<==? .AMT 1>
+       <COND (.OTH-VAL
+             <COND (<==? .OP PUT> <OCEMIT IDPB .OTH-AC <NEXT-AC .NAC>>)
+                   (<==? .OTH-VAL STACK>
+                    <OCEMIT ILDB O* <NEXT-AC .NAC>>
+                    <OCEMIT PUSH
+                            TP*
+                            !<TYPE-WORD <COND (.BYTES? FIX)
+                                              (ELSE CHARACTER)>>>
+                    <OCEMIT PUSH TP* O*>
+                    <COND (,WINNING-VICTIM
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                   (ELSE
+                    <COND (<NOT <OR <AND <ASSIGNED? DEAD?> .DEAD?>
+                                    <AND <NOT <ASSIGNED? DEAD?>>
+                                         <WILL-DIE? .STR>>
+                                    <==? .STR .VAL>>>
+                           <FLUSH-AC .NAC T>)>
+                    <MUNGED-AC .NAC T>
+                    <SET OTH-AC <ASSIGN-AC .OTH-VAL BOTH>>
+                    <AC-TYPE <GET-AC .OTH-AC>
+                             <COND (.BYTES? FIX) (ELSE CHARACTER)>>
+                    <OCEMIT ILDB <NEXT-AC .OTH-AC> <NEXT-AC .NAC>>)>)
+            (ELSE <OCEMIT IBP O* <NEXT-AC .NAC>>)>)
+      (<AND <==? <IN-AC? .STR VALUE> <NEXT-AC .NAC>>
+           <AC-UPDATE <GET-AC <NEXT-AC .NAC>>>>
+       <SMASH-AC O* .STR VALUE>
+       <MUNGED-AC O*>
+       <OCEMIT MOVEI <NEXT-AC .NAC> .AMT>
+       <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                    (T ADJBP)> <NEXT-AC .NAC> O*>)
+      (ELSE
+       <FLUSH-AC <NEXT-AC .NAC>>
+       <MUNGED-AC <NEXT-AC .NAC>>
+       <OCEMIT MOVEI <NEXT-AC .NAC> .AMT>
+       <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                    (T ADJBP)> <NEXT-AC .NAC> !<OBJ-VAL .STR>>)>
+     <CLEAN-ACS .VAL>
+     <AC-CODE <AC-ITEM <AC-UPDATE <GET-AC .NAC> T> .VAL> TYPE>
+     <AC-CODE <AC-ITEM <AC-UPDATE <GET-AC <NEXT-AC .NAC>> T> .VAL> VALUE>)
+    (<==? .AMT .VAL>
+     <COND (<SET AC <IN-AC? .AMT VALUE>>) (ELSE <SET AC <LOAD-AC .AMT VALUE>>)>
+     <SET NAC <GETPROP .AC AC-PAIR>>
+     <OCEMIT MOVE .NAC !<OBJ-TYP .STR>>
+     <OCEMIT SUB .NAC !<OBJ-VAL .AMT>>
+     <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                  (T ADJBP)> .AC !<OBJ-VAL .STR>>
+     <AC-CODE <AC-ITEM <AC-UPDATE <GET-AC .NAC> T> .VAL> TYPE>
+     <AC-ITEM <AC-UPDATE <GET-AC .AC> T> .VAL>)
+    (<==? .VAL .STR>
+     <SET NAC <LOAD-AC .STR TYPE>>
+     <OCEMIT SUB .NAC !<OBJ-VAL .AMT>>
+     <FLUSH-AC <NEXT-AC .NAC>>
+     <MUNGED-AC <NEXT-AC .NAC>>
+     <OCEMIT MOVE <NEXT-AC .NAC> !<OBJ-VAL .AMT>>
+     <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                  (T ADJBP)> <NEXT-AC .NAC> !<OBJ-VAL .STR>>
+     <AC-ITEM <AC-UPDATE <GET-AC .NAC> T> .VAL>
+     <AC-TIME <AC-CODE <AC-ITEM <AC-UPDATE <GET-AC <NEXT-AC .NAC>> T> .VAL>
+                      VALUE>
+             ,AC-STAMP>)
+    (T
+     <SET NAC <ASSIGN-AC .VAL BOTH T>>
+     <COND (<N==? <IN-AC? .STR TYPE> .NAC>
+           <OCEMIT MOVE .NAC !<OBJ-TYP .STR>>)>
+     <OCEMIT SUB .NAC !<OBJ-VAL .AMT>>
+     <OCEMIT MOVE <NEXT-AC .NAC> !<OBJ-VAL .AMT>>
+     <OCEMIT <COND (,ADJBP-HACK MADJBP)
+                  (T ADJBP)> <NEXT-AC .NAC> !<OBJ-VAL .STR>>)>
+   <COND (<==? .VAL STACK>
+         <OCEMIT PUSH TP* .NAC>
+         <OCEMIT PUSH TP* <NEXT-AC .NAC>>
+         <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)>>
+
+<DEFINE RESTUB!-MIMOC (L)
+  <RESTUS!-MIMOC .L T>>
+
+<SETG LENU!-MIMOC ,LENUV!-MIMOC>
+
+<SETG LENUS!-MIMOC ,LENUV!-MIMOC>
+
+<SETG LENUB!-MIMOC ,LENUV!-MIMOC>
+
+<SETG LENUU!-MIMOC ,LENUV!-MIMOC>
+
+<SETG EMPU?!-MIMOC ,EMPUV?!-MIMOC>
+
+<SETG EMPUU?!-MIMOC ,EMPUV?!-MIMOC>
+
+<SETG EMPUS?!-MIMOC ,EMPUV?!-MIMOC>
+
+<SETG EMPUB?!-MIMOC ,EMPUV?!-MIMOC>
+
+<SETG LENR!-MIMOC ,LENUV!-MIMOC>
+
+<DEFINE EMPR?!-MIMOC (L) T ;"NO CODE">
+
+\f
+;"RECORD manipulation"
+
+<DEFINE GVAL!-MIMOC (L "AUX" (ATM <1 .L>) (VAL <3 .L>) AC NAC (XGL <>)
+                            (RATM .ATM))
+       #DECL ((L) LIST (ATM) <OR ATOM <FORM ATOM ATOM>> (VAL AC) ATOM)
+       <COND (<TYPE? .ATM FORM> 
+              <SET XGL <CHTYPE <2 .ATM> XGLOC>>
+              <SET RATM <1 .ATM>>)>
+       <COND (<AND ,GVAL-CAREFUL <N=? <SPNAME .RATM> "M$$BINDID">>
+              <COND (.XGL
+                     <SAVE-ACS>
+                     <OCEMIT SKIPN @ !<OBJ-VAL .XGL>>
+                     <OCEMIT GVERR !<OBJ-VAL .XGL>>
+                     <OCEMIT DMOVE A1* @ !<OBJ-VAL .XGL>>)
+                    (<SET NAC <IN-AC? .ATM VALUE>>
+                     <COND (<OR <==? .VAL .ATM> <WILL-DIE? .ATM>>
+                            <DEAD!-MIMOC (.ATM) T>)>
+                     <SAVE-ACS>
+                     <OCEMIT SKIPE (.NAC)>
+                     <OCEMIT SKIPN @ (.NAC)>
+                     <OCEMIT GVERR .NAC>
+                     <OCEMIT DMOVE A1* @ (.NAC)>) 
+                    (ELSE
+                     <SAVE-ACS>
+                     <OCEMIT SKIPE T* @ !<OBJ-VAL .ATM>>
+                     <OCEMIT SKIPN '(T*)>
+                     <OCEMIT GVERR !<OBJ-VAL .ATM>>
+                     <OCEMIT DMOVE A1* '(T*)>)>
+              <PUSHJ-VAL .VAL>) 
+             (<==? .VAL STACK>
+              <COND (<AND .XGL <NOT ,BOOT-MODE>>
+                     <SMASH-AC <SET NAC T*> .XGL VALUE>)
+                    (<SET NAC <IN-AC? .ATM VALUE>>)
+                    (ELSE
+                     <SET NAC <NEXT-AC <LOAD-AC .ATM BOTH>>>)>
+              <COND (<OR ,BOOT-MODE <NOT .XGL>>
+                     <OCEMIT MOVE T* (.NAC)>
+                     <MUNGED-AC T*>)>
+              <OCEMIT PUSH TP* '(T*)>
+              <OCEMIT PUSH TP* 1 '(T*)>
+              <COND (,WINNING-VICTIM
+                     <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+             (T
+              <COND (,BOOT-MODE
+                     <SMASH-AC T* .ATM VALUE>
+                     <SET AC <ASSIGN-AC .VAL BOTH>>
+                     <OCEMIT DMOVE .AC @ '(T*)>
+                     <AC-CODE <GET-AC T*> DUMMY>)
+                    (.XGL
+                     <SET AC <ASSIGN-AC .VAL BOTH>>
+                     <OCEMIT DMOVE .AC @ !<OBJ-VAL .XGL>>)
+                    (ELSE
+                     <SET NAC <OR <IN-AC? .ATM VALUE>
+                                  <NEXT-AC <LOAD-AC .ATM BOTH>>>>
+                     <SET AC <ASSIGN-AC .VAL BOTH>>
+                     <OCEMIT DMOVE .AC @ (.NAC)>)>)>>
+
+<DEFINE SETG!-MIMOC (L "AUX" (ATM <1 .L>) (VAL <2 .L>) AC)
+       #DECL ((L) LIST (ATM) <FORM ATOM ATOM> (AC) ATOM (VAL) ANY)
+       <SET AC <LOAD-AC .VAL BOTH>>
+       <COND (,BOOT-MODE
+              <SMASH-AC T* .ATM VALUE>
+              <OCEMIT DMOVEM .AC @ '(T*)>
+              <AC-CODE <GET-AC T*> DUMMY>)
+             (T
+              <OCEMIT DMOVEM .AC @ !<OBJ-VAL <CHTYPE <2 .ATM> XGLOC>>>)>> 
+
+<GDECL (NTHR-TABLE PUTR-TABLE) <VECTOR [REST ATOM]>>
+
+<SETG NTHR-TABLE
+      '[LBIND
+       LBIND-NTH
+       T$LBIND
+       LBIND-NTH
+       GBIND
+       LBIND-NTH
+       T$GBIND
+       LBIND-NTH
+       ATOM
+       ATOM-NTH
+       T$ATOM
+       ATOM-NTH
+       LVAL
+       ATOM-NTH
+       GVAL
+       ATOM-NTH
+       OBLIST
+       ATOM-NTH
+       T$OBLIST
+       ATOM-NTH
+       T$FRAME
+       FRAME-NTH
+       FRAME
+       FRAME-NTH]>
+
+<SETG PUTR-TABLE
+      '[LBIND
+       LBIND-PUT
+       T$LBIND
+       LBIND-PUT
+       GBIND
+       LBIND-PUT
+       T$GBIND
+       LBIND-PUT
+       ATOM
+       ATOM-PUT
+       T$ATOM
+       ATOM-PUT
+       LVAL
+       ATOM-PUT
+       GVAL
+       ATOM-PUT
+       OBLIST
+       ATOM-PUT
+       T$OBLIST
+       ATOM-PUT
+       T$FRAME
+       FRAME-PUT
+       FRAME
+       FRAME-PUT]>
+
+<DEFINE FRAME-PUT (L "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) (VAL <3 .L>) AC NAC)
+       #DECL ((L) LIST)
+       <COND (<N==? .ARG2 1>
+              <PUTR!-MIMOC .L T>)
+             (ELSE
+              <SET NAC <COND (<IN-AC? .ARG1 VALUE>)
+                             (<NOT <WILL-DIE? .ARG1>>
+                              <NEXT-AC <LOAD-AC .ARG1 BOTH>>)
+                             (T <SMASH-AC T* .ARG1 VALUE>)>>
+              <SET AC <COND (<IN-AC? .VAL VALUE>)
+                            (<OR <WILL-DIE? .VAL>
+                                 <NOT <TYPE? .VAL ATOM>>>
+                             <SMASH-AC O* .VAL VALUE>)
+                            (ELSE
+                             <SETG FIRST-AC <>>
+                             <AC-TIME <GET-AC .NAC>
+                                      <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                             <NEXT-AC <LOAD-AC .VAL BOTH>>)>>
+              <OCEMIT MOVEM .AC 0 (.NAC)>
+              <COND (<==? .NAC T*> <AC-CODE <GET-AC T*> DUMMY>)>)>>
+
+<DEFINE FRAME-NTH (L "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) (VAL <4 .L>) AC NAC XAC)
+       #DECL ((L) LIST (ARG1) ANY (ARG2) FIX (AC NAC VAL) ATOM
+              (XAC) <OR FALSE ATOM> (EX) <OR FALSE <LIST ATOM ATOM ATOM>>)
+       <COND (<AND <N==? .ARG2 1> <N==? .ARG2 5> <N==? .ARG2 7>>
+              <NTHR!-MIMOC .L T>)
+             (T
+              <SET NAC <COND (<AND <SET XAC <IN-AC? .ARG1 VALUE>>
+                                   <N==? .XAC O*>>
+                              <AC-TIME <GET-AC .XAC>
+                                       <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                              <SETG FIRST-AC <>>
+                              .XAC)
+                             (<NOT <WILL-DIE? .ARG1>>
+                              <NEXT-AC <LOAD-AC .ARG1 BOTH>>)
+                             (T <SMASH-AC T* .ARG1 VALUE>)>>
+              <SET AC <ASSIGN-AC .VAL BOTH T>>
+              <COND (<==? .ARG2 1>             ;"The frames MSUBR"
+                     <AC-TYPE <GET-AC .AC> MSUBR>
+                     <OCEMIT MOVE <NEXT-AC .AC> 0 (.NAC)>)
+                    (<==? .ARG2 5>             ;"The previous 'frame'"
+                     <AC-TYPE <GET-AC .AC> FRAME>
+                     <OCEMIT MOVE <NEXT-AC .AC> 3 (.NAC)>
+                     <OCEMIT SKIPL (<NEXT-AC .AC>)>
+                      <OCEMIT ADDI <NEXT-AC .AC> 4>)
+                    (ELSE
+                     <AC-TYPE <GET-AC .AC> LBIND>
+                     <OCEMIT HRRZ <NEXT-AC .AC> 4 (.NAC)>
+                     <OCEMIT HLLI <NEXT-AC .AC> (.NAC)>)>
+              <COND (<==? .NAC T*> <AC-CODE <GET-AC T*> DUMMY>)>
+              <COND (<==? .VAL STACK>
+                     <OCEMIT PUSH TP* !<TYPE-WORD <AC-TYPE <GET-AC .AC>>>>
+                     <OCEMIT PUSH TP* <NEXT-AC .AC>>
+                     <COND (,WINNING-VICTIM
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)>)>>
+
+<DEFINE LBIND-NTH (L
+                  "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) (VAL <4 .L>) AC NAC XAC
+                        EX)
+       #DECL ((L) LIST (ARG1) ANY (ARG2) FIX (AC VAL) ATOM
+              (XAC) <OR FALSE ATOM> (EX) <OR FALSE <LIST ATOM ATOM ATOM>>)
+       <COND (<OR <G? .ARG2 6> <L? .ARG2 1>>
+              <MIMOCERR OUT-OF-BOUNDS!-ERRORS NTHR LBIND .ARG2>)
+             (T
+              <SET NAC
+                   <COND (<AND <SET XAC <IN-AC? .ARG1 VALUE>>
+                               <N==? .XAC O*>>
+                          <AC-TIME <GET-AC .XAC>
+                                   <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                          <SETG FIRST-AC <>>
+                          .XAC)
+                         (<AND <==? .ARG2 1> <N==? .VAL STACK>> <>)
+                         (<NOT <WILL-DIE? .ARG1>>
+                          <NEXT-AC <LOAD-AC .ARG1 BOTH>>)
+                         (T
+                          <SMASH-AC T* .ARG1 VALUE>
+                          <FLUSH-AC T*>
+                          <MUNGED-AC T*>
+                          T*)>>
+              <COND (<N==? .VAL STACK>
+                     <SET AC <ASSIGN-AC .VAL BOTH T>>
+                     <COND (<AND <==? <NEXT-AC .AC> .NAC>
+                                 <==? .VAL .ARG1>>
+                            <AC-TYPE <GET-AC .AC> <>>)>)>
+              <COND (<==? .ARG2 1>
+                     <COND (<==? .VAL STACK>
+                            <OCEMIT PUSH TP* (.NAC)>
+                            <OCEMIT PUSH TP* 1 (.NAC)>
+                            <COND (,WINNING-VICTIM
+                                   <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                           (.NAC <OCEMIT DMOVE .AC (.NAC)>)
+                           (ELSE <OCEMIT DMOVE .AC @ !<OBJ-VAL .ARG1>>)>)
+                    (<==? .ARG2 3>
+                     <COND (<==? .VAL STACK>
+                            <OCEMIT PUSH TP* 3 (.NAC)>
+                            <OCEMIT PUSH TP* 4 (.NAC)>
+                            <COND (,WINNING-VICTIM
+                                   <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                           (ELSE <OCEMIT DMOVE .AC 3 (.NAC)>)>)
+                    (<MEMQ .ARG2 '[2 6]>
+                     <COND (<==? .VAL STACK>
+                            <OCEMIT PUSH
+                                    TP*
+                                    !<TYPE-WORD <NTH '[#FALSE ()
+                                                       ATOM
+                                                       #FALSE ()
+                                                       #FALSE ()
+                                                       #FALSE ()
+                                                       FIX]
+                                                     .ARG2>>>
+                            <OCEMIT PUSH
+                                    TP*
+                                    <NTH '[#FALSE ()
+                                           2
+                                           #FALSE ()
+                                           #FALSE ()
+                                           #FALSE ()
+                                           7]
+                                         .ARG2>
+                                    (.NAC)>
+                            <COND (,WINNING-VICTIM
+                                   <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+                           (ELSE
+                            <AC-TYPE <GET-AC .AC>
+                                     <NTH '[#FALSE ()
+                                            ATOM
+                                            #FALSE ()
+                                            #FALSE ()
+                                            #FALSE ()
+                                            FIX]
+                                          .ARG2>>
+                            <OCEMIT MOVE
+                                    <NEXT-AC .AC>
+                                    <NTH '[#FALSE ()
+                                           2
+                                           #FALSE ()
+                                           #FALSE ()
+                                           #FALSE ()
+                                           7]
+                                         .ARG2>
+                                    (.NAC)>)>)
+                    (T
+                     <COND (<==? .VAL STACK>
+                            <SET AC <ASSIGN-AC .VAL BOTH T>>)>
+                     <COND (<SET EX <EXTRAMEM BRANCH-FALSE .L>>
+                            <LABEL-UPDATE-ACS <3 .EX> <>>)>
+                     <OCEMIT MOVE .AC !<TYPE-WORD T$LBIND>>
+                     <COND (.EX
+                            <OCEMIT <COND (<==? <2 .EX> +> SKIPN) (T SKIPE)>
+                                    <NEXT-AC .AC>
+                                    <NTH '[#FALSE ()
+                                           #FALSE ()
+                                           #FALSE ()
+                                           5
+                                           6
+                                           #FALSE ()]
+                                         .ARG2>
+                                    (.NAC)>
+                            <OCEMIT JRST <XJUMP <3 .EX>>>
+                            <SETG NEXT-FLUSH 1>)
+                           (T
+                            <OCEMIT SKIPN
+                                    <NEXT-AC .AC>
+                                    <NTH '[#FALSE ()
+                                           #FALSE ()
+                                           #FALSE ()
+                                           5
+                                           6
+                                           #FALSE ()]
+                                         .ARG2>
+                                    (.NAC)>
+                            <OCEMIT MOVE .AC !<TYPE-WORD FALSE>>)>
+                     <COND (<==? .VAL STACK>
+                            <OCEMIT PUSH TP* .AC>
+                            <OCEMIT PUSH TP* <NEXT-AC .AC>>
+                            <COND (,WINNING-VICTIM
+                                   <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)>)>)>>
+
+<DEFINE LBIND-PUT (L "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) (VAL <3 .L>) AC NAC XAC)
+       #DECL ((L) LIST (ARG1 VAL) ANY (ARG2) FIX (AC) ATOM)
+       <COND (<OR <G? .ARG2 6> <L? .ARG2 1>>
+              <MIMOCERR OUT-OF-BOUNDS!-ERRORS NTHR LBIND .ARG2>)
+             (T
+              <SET AC <COND (<MEMQ .ARG2 '[1 3]>
+                             <LOAD-AC .VAL BOTH>)
+                            (<SET XAC <IN-AC? .VAL VALUE>>
+                             <AC-TIME <GET-AC .XAC>
+                                      <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                             <SETG FIRST-AC <>>
+                             .XAC)
+                            (<OR <NOT <TYPE? .VAL ATOM>>
+                                 <WILL-DIE? .VAL>>
+                             <SMASH-AC O* .VAL VALUE>)
+                            (ELSE <NEXT-AC <LOAD-AC .VAL BOTH>>)>>
+              <SET NAC <COND (<IN-AC? .ARG1 VALUE>)
+                             (<==? .ARG1 1> <>)
+                             (T
+                              <SMASH-AC T* .ARG1 VALUE>
+                              <AC-CODE <GET-AC T*> DUMMY>
+                              T*)>>
+              <COND (<==? .ARG2 1>
+                     <COND (.NAC <OCEMIT DMOVEM .AC (.NAC)>)
+                           (ELSE <DMOVEM .AC @ !<OBJ-VAL .ARG1>>)>)
+                    (<==? .ARG2 3>
+                     <OCEMIT DMOVEM .AC 3 (.NAC)>)
+                    (T
+                     <OCEMIT MOVEM
+                             .AC
+                             <NTH '[%<> 2 %<> 5 6 7] .ARG2>
+                             (.NAC)>)>)>>
+
+<DEFINE ATOM-NTH (L
+                 "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) (VAL <4 .L>) AC NAC XAC EX
+                       (LAB <>) TY LBL (TEX <>) (WD <>) TG (AC-T1 <>)
+                       NEW (WD1 <>) (AC-T2 <>))
+   #DECL ((L) LIST (ARG1) ANY (ARG2) FIX (NAC VAL SKIP) ATOM
+         (AC-T1 AC-T2) <OR FALSE FIX>
+         (AC XAC) <OR FALSE ATOM> (EX) <OR FALSE <LIST ATOM ATOM ATOM>>)
+   <COND
+    (<OR <G? .ARG2 5> <L? .ARG2 1>>
+     <MIMOCERR OUT-OF-BOUNDS!-ERRORS NTHR ATOM .ARG2>)
+    (T
+     <SET NAC
+         <COND (<AND <SET XAC <IN-AC? .ARG1 VALUE>>
+                     <N==? .XAC O*>>
+                <AC-TIME <GET-AC .XAC> <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                <SETG FIRST-AC <>>
+                .XAC)
+               (<NOT <WILL-DIE? .ARG1>>
+                <NEXT-AC <LOAD-AC .ARG1 BOTH>>)
+               (T
+                <SMASH-AC T* .ARG1 VALUE>
+                <FLUSH-AC T*>
+                <MUNGED-AC T*>
+                T*)>>
+     <COND
+      (<==? .ARG2 3>
+       <COND (<==? .VAL STACK>
+             <OCEMIT PUSH TP* 2 (.NAC)>
+             <SMASH-AC O* <TYPE-CODE STRING> VALUE>
+             <OCEMIT HRLM O* '(TP*)>
+             <OCEMIT PUSH TP* 3 (.NAC)>
+             <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)
+            (ELSE
+             <SET AC <ASSIGN-AC .VAL BOTH T>>
+             <OCEMIT DMOVE .AC 2 (.NAC)>
+             <OCEMIT HRLI .AC <TYPE-CODE STRING>>)>)
+      (T
+       <COND (<SET EX <EXTRAMEM BRANCH-FALSE .L>>
+             <SET LAB <3 .EX>>
+             <SET WD <AND <SET WD1 <WILL-DIE? .VAL <REST .MIML>>>
+                          <WILL-DIE? .VAL <LAB-CODE-PNTR ,.LAB>>>>)>
+       <SET TEX <EXTRAMEM TYPE .L>>
+       <COND (<NOT .WD>
+             <SET AC <ASSIGN-AC .VAL BOTH T>>)
+            (ELSE <SET AC <>>)>
+       <COND (<AND <NOT .WD> <==? .ARG2 5>>
+             <COND (<NOT .EX>
+                    <OCEMIT MOVSI .AC <TYPE-CODE TYPE-C>>)>)
+            (<AND <NOT .WD> <NOT .EX> <NOT .TEX>>
+             <OCEMIT MOVE
+                     .AC
+                     !<TYPE-WORD <NTH '[GBIND LBIND #FALSE () OBLIST]
+                                      .ARG2>>>)>
+       <COND (<AND .EX <OR .WD <N==? .ARG2 5> <==? <2 .EX> +>>>
+             <SET NEW <LABEL-UPDATE-ACS .LAB <> <> .NAC>>
+             <AC-UPDATE <GET-AC .AC> T>
+             <AC-UPDATE <GET-AC <NEXT-AC .AC>> T>
+             <COND (<N==? .NAC <1 .NEW>>
+                    <SET AC-T1 <AC-TIME <GET-AC <SET NAC <1 .NEW>>>>>)>
+             <OCEMIT <COND (<==? <2 .EX> +>
+                            <COND (<==? .ARG2 5> SKIPGE) (ELSE SKIPN)>)
+                           (<==? .ARG2 5> SKIPL)
+                           (T SKIPE)>
+                     <COND (.WD O*) (ELSE <NEXT-AC .AC>)>
+                     <NTH '[0 1 #FALSE () 4 2] .ARG2>
+                     (.NAC)>
+             <COND (<==? .ARG2 5>
+                    <OCEMIT JRST <XJUMP .LAB>>
+                    <COND (<NOT .WD1>
+                           <COND (<==? <2 .EX> +>
+                                  <OCEMIT HLRZS O* <NEXT-AC .AC>>)>)>)
+                   (ELSE <OCEMIT JRST <XJUMP .LAB>>)>
+             <COND (.AC-T1
+                    <AC-TIME <GET-AC .NAC> .AC-T1>)>
+             <COND (<NOT .WD1>
+                    <COND (<==? <2 .EX> +>
+                           <AC-TYPE <GET-AC .AC>
+                                    <NTH '[GBIND LBIND T OBLIST TYPE-C]
+                                         .ARG2>>)
+                          (ELSE
+                           <AC-TYPE <GET-AC .AC> FALSE>)>)>
+             <SETG NEXT-FLUSH 1>)
+            (<==? .ARG2 5>
+             <OCEMIT HLRE <NEXT-AC .AC> 2 (.NAC)>
+             <COND (.EX
+                    <AC-ITEM <GET-AC .AC> .VAL>
+                    <AC-ITEM <GET-AC <NEXT-AC .AC>> .VAL>
+                    <COND (.WD1 <AC-TYPE <GET-AC .AC> TYPE-C>)
+                          (ELSE <OCEMIT MOVSI .AC <TYPE-CODE TYPE-C>>)>
+                    <SET NEW <LABEL-UPDATE-ACS .LAB <> <> .NAC .AC>>
+                    <COND (<N==? .NAC <1 .NEW>>
+                           <SET AC-T1 <AC-TIME <GET-AC <SET NAC <1 .NEW>>>>>)>
+                    <COND (<N==? .AC <2 .NEW>>
+                           <SET AC-T2 <AC-TIME <GET-AC <SET AC <2 .NEW>>>>>)>
+                    <SETG NEXT-FLUSH 1>)>
+             <COND (<NOT .TEX>
+                    <OCEMIT JUMPGE
+                            <NEXT-AC .AC>
+                            <XJUMP <COND (.EX .LAB)
+                                         (ELSE <SET LBL <GENLBL "FOO">>)>>>
+                    <COND (<NOT .WD1>
+                           <OCEMIT MOVEI <NEXT-AC .AC> 0>
+                           <OCEMIT MOVSI .AC <TYPE-CODE FALSE>>)>
+                    <COND (<NOT .EX> <LABEL .LBL>)>)>
+             <COND (.AC-T1
+                    <AC-TIME <GET-AC .NAC> .AC-T1>)>
+             <COND (.AC-T2
+                    <AC-TIME <GET-AC .AC> .AC-T2>
+                    <AC-TIME <GET-AC <NEXT-AC .AC>> .AC-T2>)>)
+            (.TEX
+             <OCEMIT MOVE <NEXT-AC .AC> <NTH '[0 1 #FALSE () 4] .ARG2>
+                     (.NAC)>
+             <AC-TYPE <GET-AC .AC> <2 .TEX>>)
+            (T
+             <OCEMIT SKIPN
+                     <NEXT-AC .AC>
+                     <NTH '[0 1 #FALSE () 4] .ARG2>
+                     (.NAC)>
+             <OCEMIT MOVSI .AC <TYPE-CODE FALSE>>)>
+       <COND (<==? .VAL STACK>
+             <OCEMIT PUSH TP* .AC>
+             <OCEMIT PUSH TP* <NEXT-AC .AC>>
+             <COND (,WINNING-VICTIM <SETG STACK-DEPTH <+ ,STACK-DEPTH 2>>)>)>)>)>>
+
+<DEFINE EXTRAMEM (NAM LST)
+       #DECL ((NAM) ATOM (LST) LIST)
+       <MAPF <>
+             <FUNCTION (ITM)
+                  #DECL ((ITM) ANY)
+                  <COND (<AND <TYPE? .ITM LIST>
+                              <G? <LENGTH .ITM> 1>
+                              <==? <1 .ITM> .NAM>>
+                         <MAPLEAVE .ITM>)>>
+             .LST>>
+
+<DEFINE ATOM-PUT (L "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) (V <3 .L>) AC NAC AC1)
+       #DECL ((L) LIST (ARG1) ANY (ARG2) FIX (AC NAC) ATOM
+              (AC1) <OR ATOM FALSE>)
+       <COND (<OR <G? .ARG2 5> <L? .ARG2 1>>
+              <MIMOCERR OUT-OF-BOUNDS!-ERRORS NTHR LBIND .ARG2>)
+             (T
+              <SET NAC <COND (<SET AC1 <IN-AC? .ARG1 VALUE>>
+                              <AC-TIME <GET-AC .AC1>
+                                       <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                              <SETG FIRST-AC <>>
+                              .AC1)
+                             (T
+                              <SMASH-AC T* .ARG1 VALUE>
+                              <FLUSH-AC T*>
+                              <MUNGED-AC T*>
+                              T*)>>
+              <COND (<==? .ARG2 3>
+                     <SET AC <LOAD-AC .V BOTH>>
+                     <OCEMIT HRRM .AC 2 (.NAC)>
+                     <OCEMIT MOVEM <NEXT-AC .AC> 3 (.NAC)>)
+                    (<==? .ARG2 5>
+                     <COND (<OR <==? <PRIMTYPE .V> WORD>
+                                <==? <PRIMTYPE .V> FIX>>
+                            <SET AC <COND (<IN-AC? .V VALUE>)
+                                          (T <SMASH-AC O* .V VALUE>)>>
+                            <OCEMIT HRLM .AC 2 (.NAC)>)
+                           (<TYPE? .V FALSE>
+                            <OCEMIT HRROS O* 2 (.NAC)>)
+                           (ELSE
+                            <SET AC <COND (<IN-AC? .V VALUE>)
+                                          (T <SMASH-AC O* .V VALUE>)>>
+                            <OCEMIT HRLM .AC 2 (.NAC)>
+                            <COND (<SET AC1 <IN-AC? .V TYPE>>
+                                   <LOAD-TYPE O* (.AC1)>
+                                   <MUNGED-AC O*>)
+                                  (T <SMASH-AC O* .V TYPECODE>)>
+                            <OCEMIT CAIN O* <TYPE-CODE FALSE>>
+                            <OCEMIT HRROS O* 2 (.NAC)>)>)
+                    (T
+                     <SET AC <COND (<IN-AC? .V VALUE>)
+                                   (<OR <NOT <TYPE? .V ATOM>>
+                                        <WILL-DIE? .V>>
+                                    <SMASH-AC O* .V VALUE>)
+                                   (ELSE
+                                    <SETG FIRST-AC <>>
+                                    <AC-TIME <GET-AC .NAC>
+                                             <SETG AC-STAMP <+ ,AC-STAMP 1>>>
+                                    <NEXT-AC <LOAD-AC .V BOTH>>)>>
+                     <OCEMIT MOVEM
+                             .AC
+                             <NTH '[0 1 %<> 4] .ARG2>
+                             (.NAC)>)>)>>
+                                      
+<DEFINE NTHR!-MIMOC (L  "OPT" (NOGP <>) "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) T M)
+       #DECL ((L) LIST (ARG1 T) ANY (M) <OR FALSE VECTOR>
+              (ARG2) <OR ATOM FIX>)
+       <COND (<AND <NOT .NOGP>
+                   <TYPE? .ARG2 FIX>
+                   <G? <LENGTH .L> 4>
+                   <TYPE? <SET T <5 .L>> LIST>
+                   <==? <1 .T> RECORD-TYPE>
+                   <SET M <MEMQ <2 .T> ,NTHR-TABLE>>>
+              <APPLY ,<2 .M> .L>)
+             (T
+              <UPDATE-ACS>
+              <OCEMIT MOVE O1* !<OBJ-VAL .ARG1>>
+              <OCEMIT MOVE O2* !<OBJ-VAL .ARG2>>
+              <OCEMIT HLRZ A1* !<OBJ-TYP .ARG1>>
+              <OCEMIT ANDI A1* *177777*>
+              <OCEMIT LSH A1* -6>
+              <PUSHJ NTHR <4 .L>>)>>
+
+<DEFINE PUTR!-MIMOC (L "OPT" (NOGP <>) "AUX" (ARG1 <1 .L>) (ARG2 <2 .L>) T M)
+       #DECL ((L) LIST (ARG1 T) ANY (M) <OR FALSE VECTOR>
+              (ARG2) <OR ATOM FIX>)
+       <COND (<AND <NOT .NOGP>
+                   <TYPE? .ARG2 FIX>
+                   <G? <LENGTH .L> 3>
+                   <TYPE? <SET T <4 .L>> LIST>
+                   <==? <1 .T> RECORD-TYPE>
+                   <SET M <MEMQ <2 .T> ,PUTR-TABLE>>>
+              <APPLY ,<2 .M> .L>)
+             (T
+              <UPDATE-ACS>
+              <SMASH-AC C1* <3 .L> BOTH>
+              <OCEMIT MOVE O1* !<OBJ-VAL .ARG1>>
+              <OCEMIT MOVE O2* !<OBJ-VAL .ARG2>>
+              <OCEMIT HLRZ A1* !<OBJ-TYP .ARG1>>
+              <OCEMIT ANDI A1* *177777*>
+              <OCEMIT LSH A1* -6>
+              <OCEMIT MOVEI B2* C1*>
+              <PUSHJ PUTR>)>>
+
+\f
+;"Structure creation"
+
+<DEFINE LIST!-MIMOC (L)
+       #DECL ((L) <LIST ANY ANY ANY>)
+       <UPDATE-ACS>
+       <COND (<AND <TYPE? <1 .L> FIX> <L=? <1 .L> *777777*>>
+              <COND (,WINNING-VICTIM <SETG STACK-DEPTH <- ,STACK-DEPTH
+                                                          <* <1 .L> 2>>>)>
+              <OCEMIT MOVEI O1* <1 .L>>)
+             (ELSE
+              <OCEMIT MOVE O1* !<OBJ-VAL <1 .L>>>)>
+       <PUSHJ LIST <3 .L>>>
+
+<DEFINE UBLOCK!-MIMOC (L) <DO-UBLOCK UBLOCK .L <> T>>
+
+<DEFINE UUBLOCK!-MIMOC (L) <DO-UBLOCK UUBLOCK .L <> <>>>
+
+<DEFINE SBLOCK!-MIMOC (L) <DO-UBLOCK SBLOCK .L T T>>
+
+<DEFINE USBLOCK!-MIMOC (L) <DO-UBLOCK USBLOCK .L T <>>>
+
+<DEFINE DO-UBLOCK (NAM L STACK? INIT? "AUX" ATM NITMS NWRDS)
+       #DECL ((L) LIST (NITMS NWRDS) FIX)
+       <UPDATE-ACS>
+       <COND (<AND <TYPE? <SET ATM <1 .L>> FIX> <L=? .ATM *777777*>>
+              <OCEMIT MOVEI O1* .ATM>)
+             (<OR <TYPE? .ATM ATOM>
+                  <AND <TYPE? .ATM FORM>
+                       <NOT <EMPTY? .ATM>>
+                       <==? <1 .ATM> QUOTE>
+                       <TYPE? <SET ATM <2 .ATM>> ATOM>>>
+              <OCEMIT MOVEI O1* !<TYPE-CODE .ATM T>>)
+             (ELSE
+              <OCEMIT MOVE O1* !<OBJ-VAL .ATM>>)>
+       <COND (<AND <TYPE? <2 .L> FIX> <L=? <SET NITMS <2 .L>> *777777*>>
+              <COND (<TYPE? .ATM ATOM> <SET ATM <CHTYPE <TYPE-C .ATM> FIX>>)>
+              <SET ATM <ANDB .ATM 7>>  ;"Get SAT"
+              <COND (<==? .ATM 4> ;"BYTES"
+                     <SET NWRDS </ <+ .NITMS 3> 4>>)
+                    (<==? .ATM 5> ;"STRING"
+                     <SET NWRDS </ <+ .NITMS 4> 5>>)
+                    (<==? .ATM 6>
+                     <SET NWRDS .NITMS>)
+                    (ELSE <SET NWRDS <* .NITMS 2>>)>
+              <COND (,WINNING-VICTIM
+                     <COND (<AND <NOT .STACK?> .INIT?>
+                            <SETG STACK-DEPTH <- ,STACK-DEPTH
+                                                 <* .NITMS 2>>>)
+                           (<AND .STACK? <NOT .INIT?>>
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH
+                                                 .NWRDS
+                                                 2>>)
+                           (.STACK?
+                            <SETG STACK-DEPTH <+ ,STACK-DEPTH
+                                                 .NWRDS
+                                                 2
+                                                 <- .NITMS>>>)>)>
+              <OCEMIT MOVEI O2* .NITMS>)
+             (ELSE
+              <OCEMIT MOVE O2* !<OBJ-VAL <2 .L>>>)>
+       <PUSHJ .NAM <4 .L>>>
+
+<DEFINE RECORD!-MIMOC (L "AUX" (TYP <1 .L>) TYP1)
+       #DECL ((L) LIST (TYP) ANY)
+       <UPDATE-ACS>
+       <PROG ()
+             <COND (<AND <TYPE? .TYP FORM>
+                         <G? <LENGTH .TYP> 1>
+                         <==? <1 .TYP> QUOTE>>
+                    <COND (<OR <==? <SET TYP1 <2 .TYP>> ATOM>
+                               <==? .TYP1 LBIND>
+                               <==? .TYP1 GBIND>>
+                           <EXPLICIT-MAKE-RECORD .TYP1 .L>
+                           <RETURN>)>
+                    <OCEMIT MOVEI O1* !<TYPE-CODE <2 .TYP> T>>)
+             (<AND <TYPE? .TYP FIX> <L=? .TYP *777777*>>
+              <OCEMIT MOVEI O1* .TYP>)
+             (ELSE
+              <OCEMIT MOVE O1* !<OBJ-VAL .TYP>>)>
+       <REPEAT ((LL <REST .L>) (CNT 0) ITM (WV ,WINNING-VICTIM)
+                (SD <AND .WV ,STACK-DEPTH>))
+               #DECL ((LL) LIST (CNT SD) FIX (ITM) ANY (SD WV) <OR FALSE FIX>)
+               <COND (<==? <SET ITM <1 .LL>> =>
+                      <OCEMIT MOVEI O2* .CNT>
+                      <SETG STACK-DEPTH .SD>
+                      <RETURN>)
+                     (T
+                      <OCEMIT PUSH TP* !<OBJ-TYP .ITM>>
+                      <COND (.WV <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>
+                      <OCEMIT PUSH TP* !<OBJ-VAL .ITM>>
+                      <COND (.WV <SETG STACK-DEPTH <+ ,STACK-DEPTH 1>>)>
+                      <SET CNT <+ .CNT 1>>
+                      <SET LL <REST .LL>>)>>
+       <PUSHJ RECORD <NTH .L <LENGTH .L>>>>>
+
+<DEFINE EXPLICIT-MAKE-RECORD (TYP L)
+       <COND (<==? .TYP ATOM>
+              <OCEMIT MOVEI O1* !<TYPE-CODE ATOM T>>
+              <OCEMIT MOVEI O2* 5>  ;"Length of atom in words"
+              <OCEMIT MOVEI C1* 10>  ;"LH of atom pointer"
+              <PUSHJ IRECORD>
+              <PUT-ELEMENTS .L 0 1 '(2 3) 4 -2>)
+             (<==? .TYP GBIND>
+              <OCEMIT MOVEI O1* !<TYPE-CODE GBIND T>>
+              <OCEMIT MOVEI O2* 5>  ;"Length of GBIND in words"
+              <OCEMIT MOVEI C1* 10>  ;"LH of GBIND pointer"
+              <PUSHJ IRECORD>
+              <PUT-ELEMENTS .L '(0 1) 2 '(3 4)>)
+             (<==? .TYP LBIND>
+              <OCEMIT MOVEI O1* !<TYPE-CODE LBIND T>>
+              <OCEMIT MOVEI O2* 8>  ;"Length of LBIND in words"
+              <OCEMIT MOVEI C1* 16>  ;"LH of LBIND pointer"
+              <PUSHJ IRECORD>
+              <PUT-ELEMENTS .L '(0 1) 2 '(3 4) 5 6 7>)>>
+
+<DEFINE PUT-ELEMENTS (L "TUPLE" TUP "AUX" (VAL <NTH .L <LENGTH .L>>)
+                                         (B-USED <>) (C-USED <>))
+       #DECL ((L) LIST (TUP) <TUPLE [REST <OR FIX <LIST FIX FIX>>]>)
+       <MAPF <>
+             <FUNCTION (ITM OFFS "AUX" ACS)
+                  <COND (<TYPE? .ITM ATOM>
+                         <COND (<AND <NOT <OR <==? .ITM .VAL> <WILL-DIE? .ITM>>>
+                                     <OR <AND <NOT .B-USED> <SET B-USED T>>
+                                         <AND <NOT .C-USED> <SET C-USED T>>>>
+                                <COND (.C-USED
+                                       <LOAD-AC .ITM BOTH <> <>
+                                                <GET-AC <SET ACS C1*>>
+                                                <GET-AC C2*>>)
+                                      (ELSE
+                                       <LOAD-AC .ITM BOTH <> <>
+                                                <GET-AC <SET ACS B1*>>
+                                                <GET-AC B2*>>)>
+                                <COND (<TYPE? .OFFS FIX>
+                                       <COND (<L? .OFFS 0>
+                                              <OCEMIT HRLM <NEXT-AC .ACS>
+                                                      <- .OFFS>
+                                                      '(A2*)>
+                                              <OCEMIT CAMN .ACS
+                                                      !<TYPE-WORD FALSE>>
+                                              <OCEMIT HRROS <- .OFFS> '(A2*)>)
+                                             (ELSE
+                                              <OCEMIT MOVEM <NEXT-AC .ACS>
+                                                      .OFFS '(A2*)>
+                                              <OCEMIT CAMN .ACS
+                                                      !<TYPE-WORD FALSE>>
+                                              <OCEMIT SETZM .OFFS '(A2*)>)>)
+                                      (ELSE
+                                       <OCEMIT DMOVEM .ACS <1 .OFFS>
+                                               '(A2*)>)>)
+                               (<TYPE? .OFFS FIX>
+                                <OCEMIT DMOVE O1* !<OBJ-TYP .ITM>>
+                                <COND (<L? .OFFS 0>
+                                       <OCEMIT HRLM O2* <- .OFFS> '(A2*)>
+                                       <OCEMIT CAMN O1*
+                                               !<TYPE-WORD FALSE>>
+                                       <OCEMIT HRROS <- .OFFS> '(A2*)>)
+                                      (ELSE
+                                       <OCEMIT MOVEM O2* .OFFS '(A2*)>
+                                       <OCEMIT CAMN O1*
+                                               !<TYPE-WORD FALSE>>
+                                       <OCEMIT SETZM .OFFS '(A2*)>)>)
+                               (ELSE
+                                <OCEMIT DMOVE O1* !<OBJ-TYP .ITM>>
+                                <OCEMIT DMOVEM O1* <1 .OFFS> '(A2*)>)>)
+                        (<TYPE? .OFFS FIX>
+                         <COND (<NOT .ITM>
+                                <COND (<L? .OFFS 0>
+                                       <OCEMIT HRROS <- .OFFS> '(A2*)>)
+                                      (ELSE
+                                       <OCEMIT SETZM .OFFS '(A2*)>)>)
+                               (ELSE
+                                <GET-INTO-ACS .ITM VALUE O*>
+                                <COND (<L? .OFFS 0>
+                                       <OCEMIT HRLM O* <- .OFFS> '(A2*)>)
+                                      (ELSE
+                                       <OCEMIT MOVEM O* .OFFS '(A2*)>)>)>)
+                        (ELSE
+                         <OCEMIT DMOVE O1* !<OBJ-TYP .ITM>>
+                         <OCEMIT DMOVEM O1* <1 .OFFS> '(A2*)>)>>
+             <REST .L> .TUP>
+       <PUSHJ-VAL .VAL>>
+
+<DEFINE NTH-PUT-LOOK-AHEAD (OL INS STRUC AMT VAL
+                           "AUX" (AC <>) (L <REST .MIML>) NXT INS-A (DEAD? <>)
+                                 THE-TY ITM FOO INSC NXT2 LBL)
+   #DECL ((INS) STRING (L MIML OL) LIST)
+   <COND (<AND <G=? <LENGTH .L> 4>
+              <TYPE? <SET NXT <1 .L>> FORM>
+              <G=? <LENGTH .NXT> 5>
+              <OR <=? <SET INS-A <SPNAME <1 .NXT>>> "ADD"> <=? .INS-A "SUB">>
+              <==? <2 .NXT> .VAL>
+              <==? <3 .NXT> 1>
+              <==? <5 .NXT> .VAL>
+              <TYPE? <SET NXT <2 .L>> FORM>
+              <G=? <LENGTH .NXT> 4>
+              <=? <SPNAME <1 .NXT>> .INS>
+              <==? <2 .NXT> .STRUC>
+              <==? <3 .NXT> .AMT>
+              <==? <4 .NXT> .VAL>>
+         <SETG NEXT-FLUSH 2>
+         <COND (<AND <TYPE? <SET NXT <3 .L>> FORM>
+                     <G=? <LENGTH .NXT> 2>
+                     <=? <SPNAME <1 .NXT>> "DEAD">
+                     <MEMQ .VAL <REST .NXT>>>
+                <SET DEAD? T>)>
+         <COND (<=? .INS "PUTL">
+                <NTHL!-MIMOC .OL
+                             <COND (<=? .INS-A "ADD"> AOS) (ELSE SOS)>
+                             <NOT .DEAD?>>)
+               (ELSE
+                <NTHUV!-MIMOC .OL
+                              <=? .INS "PUTUU">
+                              <COND (<=? .INS-A "ADD"> AOS) (ELSE SOS)>
+                              <NOT .DEAD?>>)>
+         T)
+        (<AND <G=? <LENGTH .L> 4>
+              <TYPE? <SET NXT <1 .L>> FORM>
+              <G=? <LENGTH .NXT> 4>
+              <OR <AND <==? <LENGTH <SET INS-A <SPNAME <1 .NXT>>>> 5>
+                       <MEMBER "LENU" .INS-A>
+                       <==? <2 .NXT> .VAL>
+                       <OR <==? <4 .NXT> .VAL> <WILL-DIE? .VAL .L>>
+                       <COND (<AND <TYPE? <SET FOO <2 .L>> FORM>
+                                   <G=? <LENGTH .FOO> 5>
+                                   <MEMQ <LOOKUP <SPNAME <1 .FOO>>
+                                                 ,MIMOC-OBLIST>
+                                         ,COMPARERS>
+                                   <MEMQ <4 .NXT> <REST .FOO>>
+                                   <WILL-DIE? <4 .NXT> <REST .L>>
+                                   ;"Check for death at branch"
+                                   <WILL-DIE?
+                                    <4 .NXT>
+                                    <LAB-CODE-PNTR
+                                     ,<MAPR <> ;"Find label"
+                                            <FUNCTION (FOOL:LIST "AUX" X)
+                                              <COND
+                                               (<OR <==? <SET X <1 .FOOL>> +>
+                                                    <==? .X ->>
+                                                <MAPLEAVE <2 .FOOL>>)
+                                               (<EMPTY? <REST .FOOL>>
+                                                <ERROR HUH?!-ERRORS>)>>
+                                            .FOO>>>
+                                   >
+                              <COND (<=? .INS "PUTL">
+                                     <NTHL!-MIMOC .OL HRRZ <>>
+                                     <SETG NEXT-FLUSH 1>)
+                                    (ELSE
+                                     <NTHUV!-MIMOC .OL <> HRRZ <>>
+                                     <SETG NEXT-FLUSH 1>)>
+                              <AC-ITEM <AC-CODE <GET-AC O*> VALUE> <4 .NXT>>)
+                             (ELSE
+                              <COND (<=? .INS "PUTL">
+                                     <NTHL!-MIMOC .OL HRRZ T <4 .NXT>>
+                                     <SETG NEXT-FLUSH 1>)
+                                    (ELSE
+                                     <NTHUV!-MIMOC .OL <> HRRZ T <4 .NXT>>
+                                     <SETG NEXT-FLUSH 1>)>)>>
+                  <AND <==? <LENGTH .INS-A> 6>
+                       <MEMBER "EMPU" .INS-A>
+                       <==? <2 .NXT> .VAL>
+                       <WILL-DIE? .VAL .L>
+                       <OR <==? <4 .NXT> COMPERR>
+                           <AND <SET FOO <MEMQ <4 .NXT> <REST .L>>>
+                                <WILL-DIE? .VAL .FOO>>>
+                       <PROG ()
+                             <COND (<=? .INS "PUTL">
+                                    <NTHL!-MIMOC .OL HRRZ <>>
+                                    <SETG NEXT-FLUSH 1>)
+                                   (ELSE
+                                    <NTHUV!-MIMOC .OL <> HRRZ <>>
+                                    <SETG NEXT-FLUSH 1>)>
+                             <LABEL-UPDATE-ACS <4 .NXT> <>>
+                             <OCEMIT <COND (<==? <3 .NXT> +> JUMPE)
+                                           (ELSE JUMPN)>
+                                     O*
+                                     <XJUMP <4 .NXT>>>
+                             T>>>>
+         T)
+        (<AND <G=? <LENGTH .L> 4>
+              <TYPE? <SET NXT <1 .L>> FORM>
+              <G=? <LENGTH .NXT> 5>
+              <OR <=? <SET INS-A <SPNAME <1 .NXT>>> "VEQUAL?">
+                  <=? .INS-A "EQUAL?">>
+              <OR <==? <2 .NXT> .VAL>
+                  <AND <==? <3 .NXT> .VAL>
+                       <SET NXT <FORM <1 .NXT> .VAL <2 .NXT> !<REST .NXT 3>>>>>
+              <PROG () <SET ITM <3 .NXT>> <SET DIR <4 .NXT>> T>
+              <OR <AND <COND (<=? .INS-A "VEQUAL?">
+                              <SET AC <IN-AC? .ITM VALUE>>)
+                             (ELSE
+                              <SET AC <IN-AC? .ITM BOTH>>)>>
+                  <AND <=? .INS-A "VEQUAL?">
+                       <OR <AND <==? <PRIMTYPE .ITM> FIX>
+                                <==? <CHTYPE .ITM FIX> 0>>
+                           <AND <==? <PRIMTYPE .ITM> LIST>
+                                <EMPTY? <CHTYPE .ITM LIST>>>>>>
+              <WILL-DIE? .VAL .L>
+              <WILL-DIE? .VAL <LAB-CODE-PNTR <FIND-LABEL <5 .NXT>>>>>
+         <COND (<=? .INS "PUTL">
+                <NTHL!-MIMOC .OL .NXT <>>
+                <SETG NEXT-FLUSH 1>)
+               (ELSE
+                <NTHUV!-MIMOC .OL <=? .INS "PUTUU"> .NXT <>>
+                <SETG NEXT-FLUSH 1>)>
+         T)
+        (<AND <G=? <LENGTH .L> 4>
+              <TYPE? <SET NXT <1 .L>> FORM>
+              <G=? <LENGTH .NXT> 5>
+              <=? <SPNAME <1 .NXT>> "TYPE?">
+              <==? <2 .NXT> .VAL>
+              <TYPE? <SET THE-TY <3 .NXT>> FIX>
+              <==? <4 .NXT> ->
+              <SET LBL <5 .NXT>>
+              <TYPE? <SET NXT <2 .L>> FORM>
+              <G=? <LENGTH .NXT> 5>
+              <=? <SPNAME <1 .NXT>> "VEQUAL?">
+              <OR <==? <2 .NXT> .VAL>
+                  <AND <==? <3 .NXT> .VAL>
+                       <SET NXT <FORM <1 .NXT> .VAL <2 .NXT> !<REST .NXT 3>>>>>
+              <PROG () <SET ITM <3 .NXT>> <==? <4 .NXT> +>>
+              <OR <AND <TYPE? .ITM ATOM>
+                       <IN-AC? .ITM VALUE>
+                       <WILL-DIE? .VAL <REST .L>>
+                       <WILL-DIE? .VAL <LAB-CODE-PNTR <FIND-LABEL <5 .NXT>>>>>
+                  <AND <OR <AND <==? <PRIMTYPE .ITM> FIX>
+                                <==? <CHTYPE .ITM FIX> 0>>
+                           <AND <==? <PRIMTYPE .ITM> LIST>
+                                <EMPTY? <CHTYPE .ITM LIST>>>>>>
+              <OR <==? <3 .L> .LBL>
+                  <AND <TYPE? <3 .L> FORM>
+                       <=? <SPNAME <1 <3 .L>>> "DEAD">
+                       <==? <4 .L> .LBL>>>>
+         <SETG NEXT-FLUSH 2>
+         <SET NXT <CHTYPE (TYPE? .THE-TY !.NXT) FORM>>
+         <COND (<=? .INS "PUTL">
+                <NTHL!-MIMOC .OL .NXT <>>)
+               (ELSE
+                <NTHUV!-MIMOC .OL <=? .INS "PUTUU"> .NXT <>>)>
+         T)>>
+
+<DEFINE STRING-PUT-NTH-LOOK-AHEAD (STR PUT-OR-NTH VAL BYTES? AMT
+                                  "AUX" (STACK-OK? T) (L <REST .MIML>))
+   #DECL ((STR PUT-OR-NTH) ATOM (L MIML) LIST (AMT) FIX)
+   <MAPR <>
+        <FUNCTION (LL "AUX" (INS <1 .LL>) NM X) 
+                #DECL ((INS) <OR ATOM <FORM ANY>> (NM) STRING)
+                <COND (<TYPE? .INS ATOM> <MAPLEAVE <>>)>
+                <COND (<OR <=? <SET NM <SPNAME <1 .INS>>> "CALL">
+                           <=? .NM "FRAME">
+                           <=? .NM "SFRAME">
+                           <=? .NM "SCALL">
+                           <=? .NM "ACALL">
+                           <=? .NM "PUSH">
+                           <=? .NM "ADJ">>
+                       <SET STACK-OK? <>>)>
+                <COND (<AND <OR <AND <=? <SET NM <SPNAME <1 .INS>>> "RESTUS">
+                                     <NOT .BYTES?>>
+                                <AND .BYTES? <=? .NM "RESTUB">>>
+                            <==? .AMT 1>
+                            <==? <2 .INS> .STR>
+                            <==? <3 .INS> 1>>
+                       <COND (<AND <NOT .STACK-OK?>
+                                   <MEMQ STACK .INS>>
+                              <MAPLEAVE <>>)>
+                       <RESTUS!-MIMOC <REST .INS> .BYTES? .VAL .PUT-OR-NTH
+                                      <WILL-DIE? .STR .LL>>
+                       <PUTPROP <REST .INS> DONE T>
+                       <MAPLEAVE T>)
+                      (<AND <=? .NM <OR <AND <==? .PUT-OR-NTH PUT>
+                                             <OR <AND .BYTES? "PUTUB">
+                                                 "PUTUS">>
+                                        <AND .BYTES? "NTHUB">
+                                        "NTHUS">>
+                            <==? <2 .INS> .STR>
+                            <==? <3 .INS> <+ .AMT 1>>>
+                       <COND (<AND <NOT .STACK-OK?>
+                                   <MEMQ STACK .INS>>
+                              <MAPLEAVE <>>)>
+                       <SETG REMEMBER-STRING T>
+                       <COND (<WILL-DIE? .STR .LL>
+                              <SETG DIE-LATER T>)>
+                       <MAPLEAVE <>>)
+                      (<OR <MEMQ .STR .INS>
+                           <MEMQ + .INS>
+                           <MEMQ - .INS>
+                           <AND <TYPE? <SET X <NTH .INS <LENGTH .INS>>> LIST>
+                                <OR <MEMQ + .X> <MEMQ - .X>>>>
+                       <MAPLEAVE <>>)
+                      (<MEMQ STACK .INS>
+                       <SET STACK-OK? <>>)>>
+        .L>>
+
+<DEFINE STRING-REST-LOOK-AHEAD (RINS STR VAL BYTES?
+                               "AUX" (L <REST .MIML>) (PUT? <>)) 
+   #DECL ((STR) ATOM (L MIML) LIST)
+   <MAPR <>
+        <FUNCTION (LL "AUX" (INS <1 .LL>) NM X DST) 
+                #DECL ((INS) <OR ATOM <FORM ANY>> (NM) STRING)
+                <COND (<TYPE? .INS ATOM> <MAPLEAVE <>>)>
+                <COND (<AND <OR <=? <SET NM <SPNAME <1 .INS>>> "NTHUS">
+                                <AND <=? .NM "PUTUS"> <SET PUT? T>>>
+                            <==? <2 .INS> .STR>
+                            <==? <3 .INS> 1>
+                            <PROG ()
+                                  <SET DST <COND (.PUT? <4 .INS>)
+                                                 (ELSE <5 .INS>)>>
+                                  <MAPF <>
+                                        <FUNCTION (I) #DECL ((I) FORM)
+                                             <COND (<==? .I .INS>
+                                                    <MAPLEAVE>)>
+                                             <COND (<MEMQ .DST <REST .I>>
+                                                    <MAPLEAVE <>>)>>
+                                        .L>>>
+                       <RESTUS!-MIMOC .RINS
+                                      .BYTES?
+                                      <5 .INS>
+                                      <COND (<=? .NM "PUTUS"> PUT) (NTH)>
+                                      <WILL-DIE? .STR .LL>>
+                       <PUTPROP <REST .INS> DONE T>
+                       <MAPLEAVE T>)
+                      (<OR <MEMQ .STR .INS>
+                           <MEMQ + .INS>
+                           <MEMQ - .INS>
+                           <AND <TYPE? <SET X <NTH .INS <LENGTH .INS>>> LIST>
+                                <OR <MEMQ + .X> <MEMQ - .X>>>>
+                       <MAPLEAVE <>>)>>
+        .L>>
\ No newline at end of file