Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / mimc / mimc-grdump.mud
diff --git a/mim/development/mim/mimc/mimc-grdump.mud b/mim/development/mim/mimc/mimc-grdump.mud
new file mode 100644 (file)
index 0000000..8874161
--- /dev/null
@@ -0,0 +1,562 @@
+
+<PACKAGE "MIMC-GRDUMP">
+
+<ENTRY MIMC-GROUP-DUMP DUMP-CODE>
+
+<USE "COMFIL" "COMPDEC" "HASH">
+
+<MSETG M$$PRINT 5>
+
+<MSETG M$$OFF-FIX 1>
+
+<MSETG M$$OFF-DCL 2>
+
+<MSETG M$$OFF-ELT 3>
+
+<MSETG M$$NTYPE 1>
+
+<MSETG M$$PTYPE 2>
+
+<MSETG M$$TYOFF 6>
+
+<MSETG M$$TYPE-INFO-SIZE 1024>
+
+<MSETG TUP-CHAN 1>
+
+<MSETG TUP-OBL 2>
+
+<MSETG TUP-BUF 3>
+
+<MSETG TUP-BUFL 4>
+
+<MSETG BUFLNT 1024>
+
+<MSETG BACK-SLASH <ASCII 92>>
+
+
+; "PRINT's magic finite-state machine for atoms"
+
+<SETG M$$FS-NSTATE 9>  ; "# states, not counting terminals"
+<SETG M$$FS-NOSLASH <+ ,M$$FS-NSTATE 1>>       ; "No initial \ needed"
+<SETG M$$FS-SLASH1 <+ ,M$$FS-NSTATE 2>>        ; "Initial \ needed"
+<SETG M$$FS-SLASH2 <+ ,M$$FS-NSTATE 3>>        ; "Initial \ needed, done otherwise"
+<SETG M$$END-STATE 6>  ; "Slot in state for end of string"
+<MANIFEST M$$FS-NSTATE M$$FS-NOSLASH M$$FS-SLASH1 M$$FS-SLASH2 M$$END-STATE>
+<GDECL (BUFFER) STRING (I$FLOAT-TABLE!-INTERNAL) <VECTOR [REST FLOAT]>
+       (M$$TYPE-INFO!-INTERNAL) <VECTOR [REST <OR TYPE-ENTRY FALSE>]>>
+
+<SETG M$$R-BACKS 15>
+<SETG M$$R-MIN-NUM-PART 17>
+<SETG M$$R-MAX-ATM-BRK 13>
+<MANIFEST M$$R-MAX-ATM-BRK M$$R-BACKS M$$R-MIN-NUM-PART>
+
+<SETG BUFFER <ISTRING ,BUFLNT>>
+
+<SETG ROOT-OBL <ROOT>>
+
+<DEFINE MIMC-GROUP-DUMP (STR NAM TEMPCH
+                      "AUX" OUTCHAN BKS POS TEM
+                            (OBL <COND (<EMPTY? .OBLIST> FULL-OBL) (BLOCK)>)
+                            (OOBLIST .OBLIST) (GROUP-INDICATOR DEFINE)
+                            (IOTUP <TUPLE 0 0 ,BUFFER 0>)
+                            IOB MACRO-NAME FUNC TEMP GOODS THIS-FORM)
+   #DECL ((STR) STRING (POS) <PRIMTYPE LIST> (OUTCHAN) <OR FALSE <CHANNEL 'DISK>>
+         (NAM OBL GROUP-INDICATOR) ATOM (GOODS) LIST (THIS-FORM) FORM)
+   <UNWIND
+    <PROG ()
+      <COND (<NOT <SET OUTCHAN <OPEN "PRINT" .STR>>>
+            <RETURN .OUTCHAN>)>
+      <SET IOB <GETPROP .NAM .OBL '.OOBLIST>>
+      <PUT .IOTUP ,TUP-CHAN .OUTCHAN>
+      <PUT .IOTUP ,TUP-OBL .IOB>
+      <SET GOODS ..NAM>
+      <REPEAT (TEM CH)
+       <COND (<EMPTY? .GOODS> <RETURN>)>
+       <SET MACRO-NAME <>>
+       <COND
+        (<AND <TYPE? <1 .GOODS> FORM>
+              <SET THIS-FORM <1 .GOODS>>
+              <G? <LENGTH .THIS-FORM> 1>
+              <OR <==? DEFINE <1 .THIS-FORM>>
+                  <AND <==? DEFMAC <1 .THIS-FORM>>
+                       <SET MACRO-NAME <2 .THIS-FORM>>>>
+              <TYPE? <SET FUNC <GETPROP <2 .THIS-FORM> VALUE '<2 .THIS-FORM>>>
+                     ATOM>>
+         <COND (<NOT <GASSIGNED? .FUNC>>)
+               (ELSE
+                <COND (<TYPE? <SET TEM ,.FUNC> FUNCTION>
+                       <PUTREST <REST .THIS-FORM> .TEM>
+                       <MIMC-PRINT .THIS-FORM .IOTUP>
+                       <MIMC-CRLF .IOTUP>)
+                      (<AND <TYPE? .TEM MACRO>
+                            <NOT <EMPTY? .TEM>>
+                            <TYPE? <1 .TEM> FUNCTION>>
+                       <PUTREST <REST .THIS-FORM> <1 .TEM>>
+                       <MIMC-PRINT .THIS-FORM .IOTUP>
+                       <MIMC-CRLF .IOTUP>)
+                      (<TYPE? .TEM INS-LIST ACCESS-LIST>
+                       <COND (<TYPE? .TEM ACCESS-LIST>
+                              <ACCESS <SET CH <1 .TEM>> <2 .TEM>>
+                              <MIMC-PRINT <CHTYPE <4 .TEM> WORD> .IOTUP>
+                              <MIMC-CRLF .IOTUP>
+                              <CHANNEL-OP .OUTCHAN WRITE-BUFFER
+                                          <TUP-BUF .IOTUP> <TUP-BUFL .IOTUP>>
+                              <TUP-BUFL .IOTUP 0>
+                              <REPEAT ((SIZ <- <3 .TEM> <2 .TEM>>)
+                                       (BUF <TUP-BUF .IOTUP>))
+                                 #DECL ((SIZ) FIX)
+                                 <COND (<G? .SIZ ,BUFLNT>
+                                        <CHANNEL-OP .CH READ-BUFFER .BUF>
+                                        <CHANNEL-OP .OUTCHAN
+                                                    WRITE-BUFFER .BUF>)
+                                       (ELSE
+                                        <CHANNEL-OP .CH READ-BUFFER .BUF .SIZ>
+                                        <CHANNEL-OP .OUTCHAN
+                                                    WRITE-BUFFER .BUF .SIZ>
+                                        <COND (<G? <LENGTH .TEM> 4>
+                                               <SET TEM <5 .TEM>>
+                                               <SET SIZ <- <3 .TEM>
+                                                           <2 .TEM> -1>>
+                                               <ACCESS <SET CH <1 .TEM>>
+                                                       <2 .TEM>>
+                                               <AGAIN>)
+                                              (ELSE <RETURN>)>)>
+                                 <SET SIZ <- .SIZ ,BUFLNT>>>)
+                             (ELSE
+                              <MIMC-PRINT <CHTYPE <1 .TEM> WORD> .IOTUP>
+                              <MIMC-CRLF .IOTUP>
+                              <IDUMP-CODE <REST .TEM> .IOTUP>)>
+                       <COND (.MACRO-NAME
+                              <MIMC-OUTS "<COND (<AND <GASSIGNED? " .IOTUP>
+                              <MIMC-PRIN-ATOM .FUNC .IOTUP>
+                              <MIMC-OUTS "> <NOT <TYPE? ," .IOTUP>
+                              <MIMC-PRIN-ATOM .FUNC .IOTUP>
+                              <MIMC-OUTS " MACRO>>> <SETG " .IOTUP> 
+                              <MIMC-PRIN-ATOM .FUNC .IOTUP>
+                              <MIMC-OUTS " <CHTYPE (," .IOTUP>
+                              <MIMC-PRIN-ATOM .FUNC .IOTUP>
+                              <MIMC-OUTS ") MACRO>>)>" .IOTUP>
+                              <MIMC-CRLF .IOTUP>)>)
+                      (ELSE
+                       <SET THIS-FORM
+                            <FORM SETG
+                                  <2 .THIS-FORM>
+                                  <FORM QUOTE ,.FUNC>>>
+                       <MIMC-PRINT .THIS-FORM .IOTUP>
+                       <MIMC-CRLF .IOTUP>)>)>)
+        (T
+         <COND (<MONAD? <1 .GOODS>>
+                <MIMC-PRINT <1 .GOODS> .IOTUP>
+                <MIMC-CRLF .IOTUP>)
+               (T
+                <MIMC-PRINT <1 .GOODS> .IOTUP>
+                <MIMC-CRLF .IOTUP>)>)>
+       <PUT .IOTUP ,TUP-OBL <SET IOB <GETPROP .GOODS .OBL '.IOB>>>
+       <SET GOODS <REST .GOODS>>>
+      <COND (<N==? <TUP-BUFL .IOTUP> 0>
+            <CHANNEL-OP .OUTCHAN WRITE-BUFFER <TUP-BUF .IOTUP>
+                        <TUP-BUFL .IOTUP>>)>
+      <CLOSE <TUP-CHAN .IOTUP>>
+      .NAM>
+    <PROG ()
+         <AND <ASSIGNED? OUTCHAN>
+              <TYPE? .OUTCHAN CHANNEL>
+              <CLOSE .OUTCHAN>>>>>
+
+<DEFINE MIMC-PRINT (OBJ IOTUP)
+       <MIMC-CRLF .IOTUP>
+       <MIMC-PRIN1 .OBJ .IOTUP>>
+
+<DEFINE MIMC-PRIN1 (DATA IOTUP
+                   "AUX" (TYP <CALL TYPE .DATA>)
+                         FROB (TYOFF <LSH .TYP -6>)
+                         (INFO <NTH ,M$$TYPE-INFO!-INTERNAL <+ .TYOFF 1>>)
+                         (PTYPE <M$$PRINT .INFO>) (CHN <TUP-CHAN .IOTUP>) LST)
+       #DECL ((DATA) ANY (BREAK TYP TYSAT TYOFF) FIX (CHAN) CHANNEL
+              (INFO) TYPE-ENTRY (PTYPE) <OR ATOM APPLICABLE FALSE>
+              (LST) <PRIMTYPE LIST> (CHN) <CHANNEL 'DISK>
+              (IOTUP) <TUPLE <CHANNEL 'DISK> LIST STRING FIX>)
+       <COND (<AND .PTYPE
+                   <NOT <TYPE? .PTYPE ATOM>>
+                   <NOT <AND <TYPE? .DATA ATOM> <SET PTYPE ATOM>>>
+                   <NOT <AND <TYPE? .DATA FCN-ATOM> <SET PTYPE ATOM>>>>
+              <CHANNEL-OP .CHN
+                          WRITE-BUFFER
+                          <TUP-BUF .IOTUP>
+                          <TUP-BUFL .IOTUP>>
+              <CHANNEL-OP .CHN BUFOUT>
+              <PUT .IOTUP ,TUP-BUFL 0>
+              <PROG ((OUTCHAN .CHN))
+                    #DECL ((OUTCHAN) <SPECIAL CHANNEL>)
+                    <APPLY .PTYPE .DATA>
+                    <CHANNEL-OP .CHN BUFOUT>>)
+             (<==? .PTYPE ATOM>
+              <COND (<AND <TYPE? .DATA FCN-ATOM>
+                          <GASSIGNED? CTLZ-PRINT>
+                          ,CTLZ-PRINT>
+                     <MIMC-OUTC <ASCII 26> .IOTUP>)>
+              <MIMC-PRIN-ATOM <CHTYPE .DATA ATOM> .IOTUP>)
+             (<==? .PTYPE FIX> <I$PRIN-FIX .DATA .IOTUP>)
+             (<==? .PTYPE FLOAT> <I$PRIN-FLOAT .DATA .IOTUP>)
+             (<==? .PTYPE STRING>
+              <MIMC-OUTC !\" .IOTUP>
+              <MAPF <>
+                    <FUNCTION (CHR)
+                         <COND (<OR <==? .CHR !\"> <==? .CHR ,BACK-SLASH>>
+                                <MIMC-OUTC ,BACK-SLASH .IOTUP>)>
+                         <MIMC-OUTC .CHR .IOTUP>>
+                    <CHTYPE .DATA STRING>>
+              <MIMC-OUTC !\" .IOTUP>)
+             (<==? .PTYPE BYTES>
+              <MIMC-OUTS "!{" .IOTUP>
+              <MAPR <>
+                    <FUNCTION (BP "AUX" (BY <1 .BP>)) 
+                            #DECL ((BP) BYTES)
+                            <I$PRIN-FIX .BY .IOTUP>
+                            <COND (<NOT <EMPTY? <REST .BP>>>
+                                   <MIMC-OUTC <ASCII 32> .IOTUP>)>>
+                    <CHTYPE .DATA BYTES>>
+              <MIMC-OUTS "!}" .IOTUP>)
+             (<==? .PTYPE CHARACTER>
+              <COND (<OR <G? <CHTYPE .DATA FIX> *177*>
+                         <L? <CHTYPE .DATA FIX> 0>>
+                     <MIMC-OUTS "#CHARACTER *" .IOTUP>
+                     <MIMC-PRIN-OCT <CHTYPE .DATA FIX> .IOTUP>
+                     <MIMC-OUTC !\* .IOTUP>)
+                    (ELSE
+                     <MIMC-OUTS "!\\" .IOTUP>
+                     <MIMC-OUTC .DATA .IOTUP>)>)
+             (<==? .PTYPE ADECL>
+              <MIMC-PRIN1 <1 <CHTYPE .DATA VECTOR>> .IOTUP>
+              <MIMC-OUTC !\: .IOTUP>
+              <MIMC-PRIN1 <2 <CHTYPE .DATA VECTOR>> .IOTUP>)
+             (<AND <OR <==? .PTYPE FORM> <==? .PTYPE SEGMENT>>
+                   <==? <LENGTH <CHTYPE .DATA LIST>> 2>
+                   <OR <AND <==? <SET FROB <1 <CHTYPE .DATA LIST>>> LVAL>
+                            <SET FROB !\.>>
+                       <AND <==? .FROB GVAL> <SET FROB !\,>>
+                       <AND <==? .FROB QUOTE> <SET FROB !\'>>>>
+              <COND (<==? .PTYPE SEGMENT> <MIMC-OUTC !\! .IOTUP>)>
+              <MIMC-OUTC .FROB .IOTUP>
+              <MIMC-PRIN1 <2 <CHTYPE .DATA LIST>> .IOTUP>)
+             (<OR <AND <==? .PTYPE FORM> <MIMC-OUTC !\< .IOTUP>>
+                  <AND <==? .PTYPE LIST> <MIMC-OUTC !\( .IOTUP>>
+                  <AND <==? .PTYPE SEGMENT> <MIMC-OUTS "!<" .IOTUP>>>
+              <MAPR <>
+                    <FUNCTION (LP "AUX" (OBJ <1 .LP>)) 
+                            #DECL ((LP) LIST)
+                            <MIMC-PRIN1 .OBJ .IOTUP>
+                            <COND (<NOT <EMPTY? <REST .LP>>>
+                                   <MIMC-OUTC <ASCII 32> .IOTUP>)>>
+                    <CHTYPE .DATA LIST>>
+              <COND (<N==? .PTYPE LIST> <MIMC-OUTC !\> .IOTUP>)
+                    (ELSE <MIMC-OUTC !\) .IOTUP>)>)
+             (<==? .PTYPE OFFSET>
+              <MIMC-OUTS "%<OFFSET " .IOTUP>
+              <I$PRIN-FIX <M$$OFF-FIX <CHTYPE .DATA VECTOR>> .IOTUP>
+              <COND (<TYPE? <SET FROB <M$$OFF-DCL <CHTYPE .DATA VECTOR>>>
+                            ATOM>
+                     <MIMC-OUTC <ASCII 32> .IOTUP>
+                     <MIMC-PRIN-ATOM .FROB .IOTUP>)
+                    (ELSE <MIMC-OUTS " '" .IOTUP> <MIMC-PRIN1 .FROB .IOTUP>)>
+              <COND (<TYPE? <SET FROB <M$$OFF-ELT <CHTYPE .DATA VECTOR>>>
+                            ATOM>
+                     <MIMC-OUTC <ASCII 32> .IOTUP>
+                     <MIMC-PRIN-ATOM .FROB .IOTUP>)
+                    (.FROB <MIMC-OUTS " '" .IOTUP> <MIMC-PRIN1 .FROB .IOTUP>)>
+              <MIMC-OUTC !\> .IOTUP>)
+             (<==? .PTYPE TYPE-C> <I$PRIN-TYPE-W-C .DATA <> .IOTUP>)
+             (<==? .PTYPE TYPE-W> <I$PRIN-TYPE-W-C .DATA T .IOTUP>)
+             (<==? .PTYPE UVECTOR>
+              <MIMC-OUTS "![" .IOTUP>
+              <MAPR <>
+                    <FUNCTION (NP "AUX" (N <1 .NP>)) 
+                            #DECL ((NP) UVECTOR)
+                            <I$PRIN-FIX .N .IOTUP>
+                            <COND (<NOT <EMPTY? <REST .NP>>>
+                                   <MIMC-OUTC <ASCII 32> .IOTUP>)>>
+                    <CHTYPE .DATA UVECTOR>>
+              <MIMC-OUTS "!]" .IOTUP>)
+             (<==? .PTYPE VECTOR>
+              <MIMC-OUTC !\[ .IOTUP>
+              <MAPR <>
+                    <FUNCTION (NP "AUX" (N <1 .NP>)) 
+                            #DECL ((NP) VECTOR)
+                            <MIMC-PRIN1 .N .IOTUP>
+                            <COND (<NOT <EMPTY? <REST .NP>>>
+                                   <MIMC-OUTC <ASCII 32> .IOTUP>)>>
+                    <CHTYPE .DATA VECTOR>>
+              <MIMC-OUTC !\] .IOTUP>)
+             (<==? .DATA <>>
+              <MIMC-OUTS "%<>" .IOTUP>)
+             (<==? .PTYPE GVAL>
+              <MIMC-OUTC !\, .IOTUP>
+              <MIMC-PRIN-ATOM <CHTYPE .DATA ATOM> .IOTUP>)
+             (<==? .PTYPE LVAL>
+              <MIMC-OUTC !\. .IOTUP>
+              <MIMC-PRIN-ATOM <CHTYPE .DATA ATOM> .IOTUP>)
+             (<TYPE? .DATA WORD>
+              <MIMC-OUTS "#WORD *" .IOTUP>
+              <MIMC-PRIN-OCT <CHTYPE .DATA FIX> .IOTUP>
+              <MIMC-OUTC !\* .IOTUP>)
+             (<==? <M$$NTYPE .INFO> <M$$PTYPE .INFO>>
+              <CHANNEL-OP .CHN
+                          WRITE-BUFFER
+                          <TUP-BUF .IOTUP>
+                          <TUP-BUFL .IOTUP>>
+              <CHANNEL-OP .CHN BUFOUT>
+              <PUT .IOTUP ,TUP-BUFL 0>
+              <PROG ((OUTCHAN .CHN))
+                    #DECL ((OUTCHAN) <SPECIAL CHANNEL>)
+                    <PRIN1 .DATA>>)
+             (ELSE
+              <MIMC-OUTC !\# .IOTUP>
+              <MIMC-PRIN-ATOM <M$$NTYPE .INFO> .IOTUP>
+              <MIMC-OUTC <ASCII 32> .IOTUP>
+              <MIMC-PRIN1 <CHTYPE .DATA <M$$PTYPE .INFO>> .IOTUP>)>>
+
+<DEFINE I$PRIN-TYPE-W-C (DATA W-C IOTUP "AUX" ENTRY TYOFF)
+       #DECL ((DATA) ANY (BREAK TYOFF) FIX (CHAN) CHANNEL (RTRN) FRAME
+              (ENTRY) <OR TYPE-ENTRY FALSE>
+              (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (.W-C <SET TYOFF <LSH <CALL TYPEWC .DATA> <- %,M$$TYOFF>>>)
+             (ELSE <SET TYOFF <LSH .DATA %<- ,M$$TYOFF>>>)>
+       <COND (<AND <G=? .TYOFF 0>
+                   <L=? .TYOFF ,M$$TYPE-INFO-SIZE>
+                   <SET ENTRY <NTH ,M$$TYPE-INFO!-INTERNAL <+ .TYOFF 1>>>>
+              <COND (.W-C <MIMC-OUTS "%<TYPE-W " .IOTUP>)
+                    (ELSE <MIMC-OUTS "%<TYPE-C " .IOTUP>)>
+              <MIMC-PRIN-ATOM <M$$NTYPE .ENTRY> .IOTUP>
+              <MIMC-OUTC <ASCII 32> .IOTUP>
+              <MIMC-PRIN-ATOM <M$$PTYPE .ENTRY> .IOTUP>
+              <MIMC-OUTC !\> .IOTUP>)
+             (<ERROR BAD-TYPE-CODE!-ERRORS .TYOFF PRINT>)>>
+
+<DEFINE MIMC-PRIN-OCT (NUM IOTUP)
+       #DECL ((NUM) FIX (IOTUP)  <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (<0? .NUM> <MIMC-OUTC !\0 .IOTUP>)
+             (ELSE
+              <MIMC-POCT .NUM .IOTUP>)>>
+
+<DEFINE MIMC-POCT (X IOTUP)
+       #DECL ((X) FIX (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (<N==? .X 0>
+              <MIMC-POCT <LSH .X -3> .IOTUP>
+              <MIMC-OUTC <ASCII <+ <ANDB .X 7> <ASCII !\0>>> .IOTUP>)>>
+
+<DEFINE I$PRIN-FIX (NUM IOTUP)
+       #DECL ((NUM) FIX (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (<==? .NUM <CHTYPE <MIN> FIX>>
+              <MIMC-OUTS "%<CHTYPE <MIN> FIX>" .IOTUP>)
+             (<==? .NUM <CHTYPE <MAX> FIX>>
+              <MIMC-OUTS "%<CHTYPE <MAX> FIX>" .IOTUP>)
+             (<==? .NUM -0>
+              <MIMC-OUTS "-0" .IOTUP>)
+             (<L? .NUM 0>
+              <MIMC-OUTC !\- .IOTUP>
+              <I$PRIN-INT <- 0 .NUM> .IOTUP>)
+             (<0? .NUM> <MIMC-OUTC !\0 .IOTUP>)
+             (ELSE <I$PRIN-INT .NUM .IOTUP>)>>
+
+<DEFINE I$PRIN-INT (NUM IOTUP)
+       #DECL ((NUM) FIX (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (<NOT <0? .NUM>> 
+              <I$PRIN-INT </ .NUM 10> .IOTUP>
+              <MIMC-OUTC <ASCII <+ %<ASCII !\0> <MOD .NUM 10>>> .IOTUP>)>>
+
+<DEFINE I$PRIN-FLOAT (NUM IOTUP
+                     "AUX" (MANT .NUM) (EXP 0) DIG (SIGD 7) (OFFSET 1))
+       #DECL ((NUM MANT) FLOAT (EXP DIG SIGD) FIX
+              (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (<==? .NUM ,MINFL> <MIMC-OUTS "%,MINFL" .IOTUP>)
+             (<==? .NUM ,MAXFL> <MIMC-OUTS "%,MAXFL" .IOTUP>)
+             (ELSE
+              <COND (<L? .NUM 0.0>
+                     <MIMC-OUTC !\- .IOTUP>
+                     <SET MANT <SET NUM <- 0.0 .NUM>>>)>
+              <COND (<G=? .NUM 10.0>
+                     <REPEAT ()
+                             <SET MANT </ .MANT 10.0>>
+                             <SET EXP <+ .EXP 1>>
+                             <COND (<L? .MANT 10.0>  <RETURN>)>>)
+                    (<0? .NUM> <SET EXP -1>)
+                    (<L? .NUM 1.0>
+                     <REPEAT ()
+                             <SET MANT <* .MANT 10.0>>
+                             <SET EXP <- .EXP 1>>
+                             <COND (<G=? .MANT 1.0> <RETURN>)>>)>
+              <COND (<OR <G? .EXP 7> <L? .EXP -2>>
+                     <I$PRIN-INT <SET DIG <FIX .MANT>> .IOTUP>
+                     <I$PRIN-DEC <- .MANT .DIG> .SIGD .IOTUP .OFFSET>
+                     <MIMC-OUTC !\E .IOTUP>
+                     <COND (<G? .EXP .SIGD>
+                            <MIMC-OUTC !\+ .IOTUP>
+                            <I$PRIN-INT .EXP .IOTUP>)
+                           (ELSE
+                            <SET OFFSET 8>
+                            <MIMC-OUTC !\- .IOTUP>
+                            <I$PRIN-INT <- 0 .EXP> .IOTUP>)>)
+                    (<G=? .EXP 0>
+                     <COND (<L=? .EXP 7> <SET OFFSET <- 8 .EXP>>)>
+                     ; "This may cause rounding to the next integer, so must do
+                           addition BEFORE calling FIX"
+                     <COND (<G? <FIX <+ <NTH ,I$FLOAT-TABLE!-INTERNAL .OFFSET>
+                                        .NUM>>
+                                <FIX .NUM>>
+                            <SET NUM <+ <NTH ,I$FLOAT-TABLE!-INTERNAL .OFFSET>
+                                        .NUM>>
+                            <SET OFFSET 1>)>
+                     <I$PRIN-INT <SET DIG <FIX .NUM>> .IOTUP>
+                     <I$PRIN-DEC <- .NUM .DIG> <- .SIGD .EXP> .IOTUP .OFFSET>)
+                    (ELSE
+                     <COND (<NOT <0? .NUM>>
+                            <SET NUM <+ .NUM <8 ,I$FLOAT-TABLE!-INTERNAL>>>)>
+                     <SET OFFSET 1>
+                     <COND (<G=? .NUM 1.0>
+                            <MIMC-OUTC !\1 .IOTUP>
+                            <SET NUM <- .NUM 1.0>>)
+                           (T
+                            <MIMC-OUTC !\0 .IOTUP>)>
+                     <I$PRIN-DEC .NUM .SIGD .IOTUP .OFFSET>)>)>>
+
+<DEFINE I$PRIN-DEC (NUM MIN IOTUP OFFSET "AUX" (Z-COUNT 0))
+       #DECL ((NUM) FLOAT (MIN OFF Z-COUNT) FIX (BUF) STRING
+              (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <MIMC-OUTC !\. .IOTUP>
+       <COND (<0? .NUM>
+              <MIMC-OUTC !\0 .IOTUP>)
+             (ELSE <SET NUM <+ .NUM <NTH ,I$FLOAT-TABLE!-INTERNAL .OFFSET>>>
+              <REPEAT (DIG) #DECL ((DIG) FIX)
+                      <SET DIG <FIX <SET NUM <* .NUM 10.0>>>>
+                      <COND (<0? .DIG>
+                             <SET Z-COUNT <+ .Z-COUNT 1>>)
+                            (ELSE <SET Z-COUNT 0>)>             
+                      <MIMC-OUTC <ASCII <+ %<ASCII !\0> .DIG>> .IOTUP>
+                      <COND (<OR <0? <SET NUM <- .NUM .DIG>>>
+                                 <L=? <SET MIN <- .MIN 1>> 0>>
+                             <RETURN>)>>)>>
+
+
+<DEFINE MIMC-CRLF (IOTUP) 
+       <MAPF <> <FUNCTION (CH) <MIMC-OUTC .CH .IOTUP>> ,CRLF-STRING!-INTERNAL>>
+
+<DEFINE MIMC-PRIN-ATOM (ATM IOTUP "AUX" (SP <SPNAME .ATM>) (O? <OBLIST? .ATM>)
+                                       (OB <TUP-OBL .IOTUP>))
+       #DECL ((CHAN) CHANNEL (ATM) ATOM (OB) <LIST [REST OBLIST]>
+              (O?) <OR FALSE OBLIST>
+              (IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <PROG ()
+             <MIMC-PRIN-ATM .SP .IOTUP>
+             <COND (<AND .O?
+                         <N==? .O? ,MIM-OBL>
+                         <N==? .O? ,TMP-OBL>
+                         <N==? .O? ,ROOT-OBL>
+                         <NOT <MEMQ .O? .OB>>>
+                    <MIMC-OUTS "!-" .IOTUP>
+                    <SET SP <SPNAME <SET ATM <CHTYPE .O? ATOM>>>>
+                    <SET O? <OBLIST? .ATM>>
+                    <AGAIN>)
+                   (<NOT .O?>
+                    <ERROR CANT-PRINT-ATOM!-ERRORS .ATM>)>>>
+
+<DEFINE MIMC-PRIN-ATM (STR IOTUP "AUX" (FSM ,I$ATM-FSM!-INTERNAL)
+                    (CSTATE <1 .FSM>) CTRANS (TR-TABLE ,I$TRANS-TABLE!-INTERNAL)
+                    TN)
+       #DECL ((STR) STRING (TN) FIX (FSM) <VECTOR [REST BYTES]>
+              (CSTATE) BYTES (CTRANS) FIX (TR-TABLE) BYTES)
+       ; "Run FSM to decide if initial backslash needed.  If any character
+          that can't be part of number is encountered, exit immediately,
+          don't put  backslash in.  Other transitions out of states are
+          E, ., 0-9, +/-, *, and end of string.  This is basically ripped
+          off from old muddle."
+       <COND (<NOT
+               <MAPF <>
+                <FUNCTION (CHR)
+                  #DECL ((CHR) CHARACTER)
+                  <COND (<L? <SET CTRANS <NTH .TR-TABLE <+ <ASCII .CHR> 1>>>
+                             ,M$$R-MIN-NUM-PART>
+                         ; "Not part of number, so done."
+                         <MAPLEAVE>)
+                        (<SET TN <+ <- .CTRANS ,M$$R-MIN-NUM-PART> 1>>)>
+                  <COND (<L=? <SET TN <NTH .CSTATE .TN>> ,M$$FS-NSTATE>
+                         ; "Legal state number, go to it"
+                         <SET CSTATE <NTH .FSM .TN>>
+                         <>)
+                        (<N==? .TN ,M$$FS-NOSLASH>
+                         ; "Leading ., so always need backslash"
+                         <MAPLEAVE <>>)
+                        (T
+                         ; "Thing can't be number, so leave"
+                         <MAPLEAVE>)>>
+                .STR>>
+              <COND (<OR <G? .TN ,M$$FS-NSTATE>        
+                         <N==? <M$$END-STATE .CSTATE> ,M$$FS-NOSLASH>>
+                     ; "Put in \ if hit terminal state before end of string
+                        or if current-state's end-state calls for it."
+                     <MIMC-OUTC <ASCII 92> .IOTUP>)>)>
+       <MAPF <>
+             <FUNCTION (CHAR) #DECL ((CHAR) CHARACTER)
+              <SET CTRANS <NTH .TR-TABLE <+ <ASCII .CHAR> 1>>>
+              <COND (<OR <L=? .CTRANS ,M$$R-MAX-ATM-BRK>
+                         <==? .CTRANS ,M$$R-BACKS>>
+                     <MIMC-OUTC <ASCII 92> .IOTUP>)>
+              <MIMC-OUTC .CHAR .IOTUP>>
+             .STR>>
+
+<DEFINE MIMC-OUTC (CHR IOTUP "AUX" LNT) 
+       #DECL ((IOTUP) <TUPLE CHANNEL LIST STRING FIX>)
+       <COND (<G? <SET LNT <+ <TUP-BUFL .IOTUP> 1>> ,BUFLNT>
+              <CHANNEL-OP <TUP-CHAN .IOTUP>:<CHANNEL 'DISK>
+                          WRITE-BUFFER <TUP-BUF .IOTUP>>
+              <SET LNT 1>)>
+       <PUT .IOTUP ,TUP-BUFL .LNT>
+       <PUT <TUP-BUF .IOTUP> .LNT .CHR>>
+
+<DEFINE MIMC-OUTS (STR IOTUP
+                "AUX" (LNT <TUP-BUFL .IOTUP>) (BUF <TUP-BUF .IOTUP>))
+       #DECL ((IOTUP) <TUPLE CHANNEL LIST STRING FIX> (LNT) FIX
+              (BUF) STRING)
+       <REPEAT ()
+               <COND (<EMPTY? .STR> <PUT .IOTUP ,TUP-BUFL .LNT> <RETURN>)>
+               <COND (<G? <SET LNT <+ .LNT 1>> ,BUFLNT>
+                      <CHANNEL-OP <TUP-CHAN .IOTUP>:<CHANNEL 'DISK>
+                                  WRITE-BUFFER .BUF>
+                      <SET LNT 1>)>
+               <PUT .BUF .LNT <1 .STR>>
+               <SET STR <REST .STR>>>>
+
+
+<DEFINE IDUMP-CODE (L IOTUP) #DECL ((L) LIST (IOTUP) TUPLE)
+       <MAPF <>
+             <FUNCTION (X)
+                  #DECL ((X) <OR ATOM FORM>)
+                  <COND
+                   (<TYPE? .X ATOM>
+                    <MIMC-PRIN-ATOM .X .IOTUP>
+                    <MIMC-CRLF .IOTUP>)
+                   (ELSE
+                    <MIMC-OUTS "                   " .IOTUP>
+                    <MIMC-OUTC !\< .IOTUP>
+                    <MAPR <>
+                          <FUNCTION (YP "AUX" (Y <1 .YP>) O)
+                               #DECL ((YP) <LIST ANY>)
+                               <COND (<TYPE? .Y ATOM>
+                                      <MIMC-PRIN-ATOM .Y .IOTUP>)
+                                     (ELSE
+                                      <MIMC-PRIN1 .Y .IOTUP>)>
+                               <COND (<NOT <EMPTY? <REST .YP>>>
+                                      <MIMC-OUTC <ASCII 32>
+                                                 .IOTUP>)>>
+                          .X>
+                    <MIMC-OUTC !\> .IOTUP>
+                    <MIMC-CRLF .IOTUP>)>>
+             .L>>
+
+<DEFINE DUMP-CODE (L CH OBL "AUX" (IOTUP <TUPLE .CH .OBL ,BUFFER 0>))
+       <IDUMP-CODE .L .IOTUP>
+       <CHANNEL-OP <TUP-CHAN .IOTUP>:<CHANNEL 'DISK>
+                   WRITE-BUFFER <TUP-BUF .IOTUP> <TUP-BUFL .IOTUP>>
+       T>
+
+<ENDPACKAGE>