Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / expose.mud
diff --git a/mim/development/mim/vax/mimlib/expose.mud b/mim/development/mim/vax/mimlib/expose.mud
new file mode 100644 (file)
index 0000000..dbd1785
--- /dev/null
@@ -0,0 +1,518 @@
+<PACKAGE "EXPOSE">
+
+<INCLUDE-WHEN <COMPILING? "EXPOSE"> "EXPOSE-DEFS">
+
+<INCLUDE "EXPOSE-DATA">
+
+<ENTRY EXPOSE VAX-NOVICE>
+
+<GDECL (KERNEL-TABLE) <<PRIMTYPE VECTOR> [REST LIST]>>
+
+<GDECL (REGISTER-NAMES) <VECTOR STRING>>
+
+<DEFINE EXPOSE (MSB "OPT" (OUTCHAN .OUTCHAN))
+   #DECL ((MSB) MSUBR (OUTCHAN) <SPECIAL CHANNEL>)
+   <PRINTSTRING "Exposing ">
+   <PRINTSTRING <SPNAME <2 .MSB>>>
+   <CRLF> <CRLF>
+   <BIND ((IMSB-ATM <1 .MSB>)
+         (IMSB ,.IMSB-ATM)
+         (START <4 .MSB>)
+         (END <FIND-END .MSB>)
+         (LABEL-TABLE <STACK <IVECTOR ,LABEL-TABLE-LENGTH ()>>))
+      <PARSE-CODE .IMSB .START .END .LABEL-TABLE>
+      <PRINT-CODE .IMSB .START .END .LABEL-TABLE>>
+   <CRLF>
+   T>
+
+<SETG VAX-NOVICE %<>>
+
+<DEFINE PARSE-CODE (IMSB START END LABEL-TABLE "AUX" (CODE <1 .IMSB>))
+   #DECL ((START END) FIX (IMSB) IMSUBR 
+         (LABEL-TABLE) <<PRIMTYPE VECTOR> [REST LIST]>
+         (CODE) <<PRIMTYPE UVECTOR> [REST FIX]>)
+   <SETG TAG-COUNT 0>
+   <SETG LOOP-COUNT 0>
+   <REPEAT ((I .START) NUM OP)
+      #DECL ((NUM I) FIX (OP) <OR FALSE VECTOR OPCODE-TABLE>)
+      <COND (<G=? .I .END> <RETURN>)>
+      <REPEAT ()
+        <SET NUM <GET-BYTE .CODE .I>>
+        <SET I <+ .I 1>>
+        <SET OP <NTH ,OPCODE-TABLE <+ .NUM 1>>>
+        <COND (<NOT <TYPE? .OP OPCODE-TABLE>> <RETURN>)>>
+      <COND (.OP
+            <MAPF %<>
+                  <FUNCTION (LEN)
+                     <SET I <PARSE-OPERAND .CODE .I .LEN .LABEL-TABLE 
+                                           .START .END>>>
+                  <2 .OP>:<VECTOR [REST FIX]>>)>>>
+
+<DEFINE PRINT-CODE (IMSB START END LABEL-TABLE "AUX" NUM 
+                   (CODE <1 .IMSB>)
+                   (COMMENTS <STACK <IVECTOR 10>>))
+   #DECL ((IMSB) IMSUBR (START END NUM) FIX 
+         (LABEL-TABLE) <<PRIMTYPE VECTOR> [REST LIST]>)
+   <REPEAT ((I .START) FIRST OP)
+      #DECL ((I) FIX (OP) <OR FALSE OPCODE-TABLE VECTOR>)
+      <COND (<G=? .I .END> <RETURN>)>
+      <1 .COMMENTS 1>  ;"reset number of comments to 'zero'"
+      <COND (<PRINT-LABEL .LABEL-TABLE .I> <PRINTSTRING ":">)>
+      <REPEAT ()
+        <SET NUM <GET-BYTE .CODE .I>>
+        <SET I <+ .I 1>>
+        <SET OP <NTH ,OPCODE-TABLE <+ .NUM 1>>>
+        <COND (<NOT <TYPE? .OP OPCODE-TABLE>>
+               <RETURN>)>>
+      <INDENT-TO ,OP-COLUMN>
+      <COND (.OP
+            <PRINTSTRING <1 .OP>>
+            <INDENT-TO ,ARG-COLUMN>
+            <SET FIRST T>
+            <MAPF %<>
+                  <FUNCTION (LEN)
+                     <COND (.FIRST <SET FIRST %<>>)
+                           (ELSE <PRINTSTRING ",">)>
+                     <SET I <PRINT-OPERAND .IMSB .I .LEN .LABEL-TABLE 
+                                           .COMMENTS>>>
+                  <2 .OP>:<VECTOR [REST FIX]>>
+            <COND (,VAX-NOVICE
+                   <INDENT-TO ,COMMENT-COLUMN>
+                   <PRINTSTRING ";">
+                   <PRINTSTRING <3 .OP>>)>
+            <PRINT-COMMENTS .COMMENTS ,VAX-NOVICE>)
+           (ELSE
+            <PRINTSTRING ".byte">
+            <INDENT-TO ,ARG-COLUMN>
+            <PRINT-BYTE .NUM>)>
+      <CRLF>>>
+
+<DEFINE PARSE-OPERAND (MCODE I ORIGINAL-LEN LABEL-TABLE START END
+                      "AUX" (LEN <ANDB .ORIGINAL-LEN ,LENGTH-MASK>)
+                      ONE REG NUM VAL)
+   #DECL ((MCODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I ORIGINAL-LEN ONE REG) FIX)
+   <COND (<BRANCH? .ORIGINAL-LEN>
+         <SET NUM <SIGN-EXT <GET-N-BYTES .MCODE .I .LEN> .LEN>>
+         <SET I <+ .I .LEN>>
+         <ADD-LABEL .LABEL-TABLE .I .NUM .START .END>)
+        (<CASE? .ORIGINAL-LEN>
+         <SET ONE <GET-BYTE .MCODE .I>>
+         <SET I <+ .I 1>>
+         <SET VAL <+ <ANDB .ONE 63> 1>>
+         <PARSE-WORDS .MCODE .I .VAL .LABEL-TABLE .START .END>
+         <SET I <+ .I <* 2 .VAL>>>)
+        (ELSE
+         <SET ONE <GET-BYTE .MCODE .I>>
+         <SET I <+ .I 1>>
+         <SET REG <ANDB .ONE 15>>
+         <CASE ,==? <LSH .ONE -4>
+               (4
+                <SET I 
+                     <PARSE-OPERAND .MCODE .I .LEN .LABEL-TABLE .START .END>>)
+               (8
+                <COND (<==? .REG 15>
+                       <SET I <+ .I .LEN>>)>)
+               (9
+                <COND (<==? .REG 15>
+                       <SET I <+ .I 4>>)>)
+               (10
+                <SET I <+ .I 1>>)
+               (11
+                <SET I <+ .I 1>>)
+               (12
+                <SET I <+ .I 2>>)
+               (13
+                <SET I <+ .I 2>>)
+               (14
+                <SET I <+ .I 4>>)
+               (15
+                <SET I <+ .I 4>>)>)>
+   .I>
+
+<DEFINE PRINT-OPERAND (IMSB I LEN-CODE LABEL-TABLE COMMENTS
+                      "AUX" 
+                      (LEN <ANDB .LEN-CODE ,LENGTH-MASK>)
+                      (CODE <1 .IMSB>)
+                      ONE REG NUM VAL)
+   #DECL ((CODE) <<PRIMTYPE UVECTOR> [REST FIX]> (IMSB) IMSUBR
+         (I LEN-CODE ONE REG NUM VAL) FIX)
+   <COND (<BRANCH? .LEN-CODE>
+         <SET NUM <SIGN-EXT <GET-N-BYTES .CODE .I .LEN> .LEN>>
+         <SET I <+ .I .LEN>>
+         <COND (<NOT <PRINT-LABEL .LABEL-TABLE <+ .I .NUM>>>
+                <PRINTSTRING "#">
+                <PRINT-HEX .NUM .LEN>)>)
+        (<CASE? .LEN-CODE>
+         <SET ONE <GET-BYTE .CODE .I>>
+         <SET I <+ .I 1>>
+         <SET VAL <+ <ANDB .ONE 63> 1>>
+         <PRINTSTRING "S^#">
+         <PRINT-BYTE .VAL>
+         <PRINT-WORDS .CODE .I .VAL .LABEL-TABLE>
+         <SET I <+ .I <* 2 .VAL>>>)
+        (ELSE
+         <SET ONE <GET-BYTE .CODE .I>>
+         <SET I <+ .I 1>>
+         <SET REG <ANDB .ONE 15>>
+         <CASE ,==? <LSH .ONE -4>
+               (4
+                <SET I <PRINT-OPERAND .IMSB .I .LEN .LABEL-TABLE 
+                                      .COMMENTS>>
+                <PRINTSTRING "[">
+                <PRINT-REGISTER .REG>
+                <PRINTSTRING "]">)
+               (5 
+                <PRINT-REGISTER .REG>)
+               (6
+                <PRINTSTRING "(">
+                <PRINT-REGISTER .REG>
+                <PRINTSTRING ")">)
+               (7
+                <PRINTSTRING "-(">
+                <PRINT-REGISTER .REG>
+                <PRINTSTRING ")">)
+               (8
+                <COND (<==? .REG 15>
+                       <SET NUM <GET-N-BYTES .CODE .I .LEN>>
+                       <SET I <+ .I .LEN>>
+                       <PRINTSTRING "#">
+                       <PRINT-HEX .NUM .LEN>)
+                      (ELSE
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")+">)>)
+               (9
+                <COND (<==? .REG 15>
+                       <PRINTSTRING "@">
+                       <SET VAL <GET-LONG .CODE .I>>
+                       <SET I <+ .I 4>>
+                       <COND (<NOT <PRINT-KERNEL-LOCATION .VAL>>
+                              <PRINTSTRING "#">
+                              <PRINT-LONG .VAL>)>)
+                      (ELSE
+                       <PRINTSTRING "@(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")+">)>)
+               (10
+                <SET VAL <SIGN-EXT-BYTE <GET-BYTE .CODE .I>>>
+                <PRINT-BYTE .VAL>
+                <SET I <+ .I 1>>
+                <COND (<N==? .REG 15>
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")">)>
+                <COND (<==? .REG 11>
+                       <ADD-COMMENT .COMMENTS 
+                                    <NTH .IMSB <+ </ .VAL 8> 1>>>)>)
+               (11
+                <SET VAL <SIGN-EXT-BYTE <GET-BYTE .CODE .I>>>
+                <SET I <+ .I 1>>
+                <PRINTSTRING "@">
+                <PRINT-BYTE .VAL>
+                <COND (<N==? .REG 15>
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")">)>
+                <COND (<==? .REG 11>
+                       <ADD-COMMENT .COMMENTS 
+                                    <NTH .IMSB <+ </ .VAL 8> 1>>>)>)
+               (12
+                <SET VAL <SIGN-EXT-WORD <GET-WORD .CODE .I>>>
+                <SET I <+ .I 2>>
+                <PRINT-WORD .VAL>
+                <COND (<N==? .REG 15>
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")">)>
+                <COND (<==? .REG 11>
+                       <ADD-COMMENT .COMMENTS 
+                                    <NTH .IMSB <+ </ .VAL 8> 1>>>)>)
+               (13
+                <SET VAL <SIGN-EXT-WORD <GET-WORD .CODE .I>>>
+                <SET I <+ .I 2>>
+                <PRINTSTRING "@">
+                <PRINT-WORD .VAL>
+                <COND (<N==? .REG 15>
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")">)>
+                <COND (<==? .REG 11>
+                       <ADD-COMMENT .COMMENTS 
+                                    <NTH .IMSB <+ </ .VAL 8> 1>>>)>)
+               (14
+                <SET VAL <GET-LONG .CODE .I>>
+                <SET I <+ .I 4>>
+                <PRINT-LONG .VAL>
+                <COND (<N==? .REG 15>
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")">)>
+                <COND (<==? .REG 11>
+                       <ADD-COMMENT .COMMENTS 
+                                    <NTH .IMSB <+ </ .VAL 8> 1>>>)>)
+               (15
+                <SET VAL <GET-LONG .CODE .I>>
+                <PRINTSTRING "@">
+                <SET I <+ .I 4>>
+                <PRINT-LONG .VAL>
+                <COND (<N==? .REG 15>
+                       <PRINTSTRING "(">
+                       <PRINT-REGISTER .REG>
+                       <PRINTSTRING ")">)>
+                <COND (<==? .REG 11>
+                       <ADD-COMMENT .COMMENTS 
+                                    <NTH .IMSB <+ </ .VAL 8> 1>>>)>)
+               DEFAULT
+               (<PRINTSTRING "S^#">
+                <PRINT-BYTE <ANDB .ONE 63>>)>)>
+   .I>
+
+<DEFINE PARSE-WORDS (CODE ORIGINAL-I N LABEL-TABLE START END
+                    "AUX" (I .ORIGINAL-I) NUM)
+   #DECL ((CODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I N NUM) FIX)
+   <REPEAT ()
+      <COND (<0? .N> <RETURN>)>
+      <SET NUM <SIGN-EXT-WORD <GET-WORD .CODE .I>>>
+      <SET I <+ .I 2>>
+      <ADD-LABEL .LABEL-TABLE .ORIGINAL-I .NUM .START .END>
+      <SET N <- .N 1>>>
+   .I>
+
+<DEFINE PRINT-WORDS (CODE ORIGINAL-I N LABEL-TABLE "AUX" (I .ORIGINAL-I)
+                    NUM (OUTCHAN .OUTCHAN))
+   #DECL ((CODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I N NUM) FIX)
+   <REPEAT ()
+      <COND (<0? .N> <RETURN>)>
+      <CRLF>
+      <INDENT-TO ,OP-COLUMN>
+      <PRINTSTRING ".word">
+      <INDENT-TO ,ARG-COLUMN>
+      <SET NUM <SIGN-EXT-WORD <GET-WORD .CODE .I>>>
+      <SET I <+ .I 2>>
+      <COND (<NOT <PRINT-LABEL .LABEL-TABLE <+ .ORIGINAL-I .NUM>>>
+            <PRINT-WORD .NUM>)>
+      <SET N <- .N 1>>>
+   .I>
+
+<DEFINE PRINT-BYTE (NUM "AUX" (ANUM <ABS .NUM>) (STR <STACK <ISTRING 3 !\->>))
+   #DECL ((NUM) FIX (STR) STRING)
+   <2 .STR <HEX-CHAR <LSH .ANUM -4>>>
+   <3 .STR <HEX-CHAR .ANUM>>
+   <COND (<L? .NUM 0> <PRINTSTRING .STR>)
+        (ELSE <PRINTSTRING <REST .STR>>)>>
+
+<DEFINE PRINT-WORD (NUM "AUX" (ANUM <ABS .NUM>) (STR <STACK <ISTRING 5 !\->>))
+   #DECL ((NUM) FIX (STR) STRING)
+   <2 .STR <HEX-CHAR <LSH .ANUM -12>>>
+   <3 .STR <HEX-CHAR <LSH .ANUM -8>>>
+   <4 .STR <HEX-CHAR <LSH .ANUM -4>>>
+   <5 .STR <HEX-CHAR .ANUM>>
+   <COND (<L? .NUM 0> <PRINTSTRING .STR>)
+        (ELSE <PRINTSTRING <REST .STR>>)>>
+
+<DEFINE PRINT-TRIBYTE (NUM "AUX" (ANUM <ABS .NUM>) 
+                        (STR <STACK <ISTRING 7 !\->>))
+   #DECL ((NUM) FIX (STR) STRING)
+   <2 .STR <HEX-CHAR <LSH .ANUM -20>>>
+   <3 .STR <HEX-CHAR <LSH .ANUM -16>>>
+   <4 .STR <HEX-CHAR <LSH .ANUM -12>>>
+   <5 .STR <HEX-CHAR <LSH .ANUM -8>>>
+   <6 .STR <HEX-CHAR <LSH .ANUM -4>>>
+   <7 .STR <HEX-CHAR .ANUM>>
+   <COND (<L? .NUM 0> <PRINTSTRING .STR>)
+        (ELSE <PRINTSTRING <REST .STR>>)>>
+
+<DEFINE PRINT-LONG (NUM "AUX" (ANUM <ABS .NUM>) (STR <ISTRING 9 !\->))
+   #DECL ((NUM) FIX (STR) STRING)
+   <2 .STR <HEX-CHAR <LSH .ANUM -28>>>
+   <3 .STR <HEX-CHAR <LSH .ANUM -24>>>
+   <4 .STR <HEX-CHAR <LSH .ANUM -20>>>
+   <5 .STR <HEX-CHAR <LSH .ANUM -16>>>
+   <6 .STR <HEX-CHAR <LSH .ANUM -12>>>
+   <7 .STR <HEX-CHAR <LSH .ANUM -8>>>
+   <8 .STR <HEX-CHAR <LSH .ANUM -4>>>
+   <9 .STR <HEX-CHAR .ANUM>>
+   <COND (<L? .NUM 0> <PRINTSTRING .STR>)
+        (ELSE <PRINTSTRING <REST .STR>>)>>
+
+<DEFINE SIGN-EXT (NUM LEN)
+   <COND (<==? .LEN 1> <SIGN-EXT-BYTE .NUM>)
+        (<==? .LEN 2> <SIGN-EXT-WORD .NUM>)
+        (<==? .LEN 4> .NUM)
+        (ELSE <ERROR BAD-LENGTH!-ERRORS .LEN SIGN-EXT>)>>
+
+<DEFINE PRINT-HEX (NUM LEN)
+   <CASE ,==? .LEN
+        (1 <PRINT-BYTE .NUM>)
+        (2 <PRINT-WORD .NUM>)
+        (3 <PRINT-TRIBYTE .NUM>)
+        (4 <PRINT-LONG .NUM>)
+        DEFAULT
+        (<ERROR BAD-LENGTH!-ERRORS .LEN PRINT-HEX>)>>
+
+<DEFINE GET-BYTE (MCODE I)
+   #DECL ((MCODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I) FIX)
+   <GETBITS <NTH .MCODE <+ </ .I 4> 1>>
+           <BITS 8 <* <MOD .I 4> 8>>>>
+
+<DEFINE GET-WORD (MCODE I)
+   #DECL ((MCODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I) FIX)
+   <ORB <GET-BYTE .MCODE .I>
+       <LSH <GET-BYTE .MCODE <+ .I 1>> 8>>>
+
+<DEFINE GET-LONG (MCODE I)
+   #DECL ((MCODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I) FIX)
+   <ORB <GET-WORD .MCODE .I>
+       <LSH <GET-WORD .MCODE <+ .I 2>> 16>>>
+
+<DEFINE GET-N-BYTES (MCODE I N)
+   #DECL ((MCODE) <<PRIMTYPE UVECTOR> [REST FIX]> (I N) FIX)
+   <REPEAT ((RES 0) (LSH-AMT 0))
+      <COND (<==? .N 0> <RETURN .RES>)>
+      <SET RES <ORB .RES <LSH <GET-BYTE .MCODE .I> .LSH-AMT>>>
+      <SET I <+ .I 1>>
+      <SET N <- .N 1>>
+      <SET LSH-AMT <+ .LSH-AMT 8>>>>
+
+<DEFINE SIGN-EXT-BYTE (NUM)
+   <COND (<0? <ANDB .NUM %<LSH 1 7>>>
+         .NUM)
+        (ELSE
+         <- <ANDB .NUM %<LSH -1 <- 7 32>>> %<LSH 1 7>>)>>
+
+<DEFINE SIGN-EXT-WORD (NUM)
+   <COND (<0? <ANDB .NUM %<LSH 1 15>>>
+         .NUM)
+        (ELSE
+         <- <ANDB .NUM %<LSH -1 <- 15 32>>> %<LSH 1 15>>)>>
+
+<DEFINE ADD-COMMENT (COMMENTS OBJ "AUX" PLACE)
+   #DECL ((COMMENTS) <<PRIMTYPE VECTOR> FIX> (PLACE) FIX)
+   <1 .COMMENTS <SET PLACE <+ <1 .COMMENTS> 1>>>
+   <PUT .COMMENTS .PLACE .OBJ>>
+
+<DEFINE PRINT-COMMENTS (COMMENTS ALREADY-ONE "AUX" (PLACE <1 .COMMENTS>)
+                       (OUTCHAN .OUTCHAN))
+   #DECL ((COMMENTS) <<PRIMTYPE VECTOR> FIX> (PLACE) FIX)
+   <REPEAT ((N 2))
+      #DECL ((N) FIX)
+      <COND (<G? .N .PLACE> <RETURN>)>
+      <COND (.ALREADY-ONE <CRLF>)>
+      <INDENT-TO ,COMMENT-COLUMN>
+      <PRINTSTRING ";">
+      <&1 <NTH .COMMENTS .N>>
+      <SET ALREADY-ONE T>
+      <SET N <+ .N 1>>>>
+
+;"These numbers keep track of the last label used.  TAG-COUNT counts up."
+;"LOOP-COUNT counts down."
+
+<SETG TAG-COUNT 0>
+<SETG LOOP-COUNT 0>
+<GDECL (TAG-COUNT LOOP-COUNT) FIX>
+
+<DEFINE FIND-LABEL (LABEL-TABLE I "AUX" BKTNUM)
+   #DECL ((LABEL-TABLE) <<PRIMTYPE VECTOR> [REST LIST]> (I BKTNUM) FIX)
+   <SET BKTNUM <+ <MOD .I ,LABEL-TABLE-LENGTH> 1>>
+   <REPEAT ((BKT <NTH .LABEL-TABLE .BKTNUM>))
+      #DECL ((BKT) <LIST [REST FIX]>)
+      <COND (<EMPTY? .BKT> <RETURN %<>>)>
+      <COND (<==? .I <1 .BKT>> <RETURN <2 .BKT>>)>
+      <SET BKT <REST .BKT 2>>>>
+
+<DEFINE ADD-LABEL (LABEL-TABLE:<<PRIMTYPE VECTOR> [REST LIST]>
+                  I:FIX NUM:FIX START:FIX END:FIX
+                  "AUX" BKTNUM BKT (SUM <+ .I .NUM>))
+   #DECL ((BKTNUM SUM) FIX (BKT) <LIST [REST FIX]>)
+   <COND (<G=? .NUM 0>
+         <COND (<L? .SUM .END>
+                <SET BKTNUM <+ <MOD .SUM ,LABEL-TABLE-LENGTH> 1>>
+                <SET BKT <NTH .LABEL-TABLE .BKTNUM>>
+                <REPEAT ((B .BKT))
+                   <COND (<EMPTY? .B>
+                          <PUT .LABEL-TABLE .BKTNUM 
+                               (.SUM
+                                <SETG TAG-COUNT <+ ,TAG-COUNT 1>>
+                                !.BKT)>
+                          <RETURN>)>
+                   <COND (<==? .SUM <1 .B>> <RETURN>)>
+                   <SET B <REST .B 2>>>)>)
+        (ELSE
+         <COND (<G=? .SUM .START>
+                <SET BKTNUM <+ <MOD .SUM ,LABEL-TABLE-LENGTH> 1>>
+                <SET BKT <NTH .LABEL-TABLE .BKTNUM>>
+                <REPEAT ((B .BKT))
+                   <COND (<EMPTY? .B>
+                          <PUT .LABEL-TABLE .BKTNUM 
+                               (.SUM
+                                <SETG LOOP-COUNT <- ,LOOP-COUNT 1>>
+                                !.BKT)>
+                          <RETURN>)>
+                   <COND (<==? .SUM <1 .B>> 
+                          <COND (<G? <2 .B> 0>
+                                 <2 .B <SETG LOOP-COUNT <- ,LOOP-COUNT 1>>>)>
+                          <RETURN>)>
+                   <SET B <REST .B 2>>>)>)>>
+
+<DEFINE PRINT-LABEL (LABEL-TABLE I "AUX" LAB (OUTCHAN .OUTCHAN))
+   #DECL ((LAB) <OR FIX FALSE>)
+   <SET LAB <FIND-LABEL .LABEL-TABLE .I>>
+   <COND (.LAB 
+         <COND (<G? .LAB 0>
+                <PRINTSTRING "tag">
+                <PRIN1 .LAB>)
+               (ELSE
+                <PRINTSTRING "loop">
+                <PRIN1 <- .LAB>>)>)>>
+
+<DEFINE FIND-END (MSBR:MSUBR "AUX" 
+                 (START <4 .MSBR>)
+                 (IMSB-ATM <1 .MSBR>)
+                 (END <* 4 
+                         <LENGTH 
+                          <1 ,.IMSB-ATM:IMSUBR>:<PRIMTYPE UVECTOR>>>)) 
+   #DECL ((START) FIX (END) FIX)
+   <MAPF %<>
+        <FUNCTION (BKT:LIST)
+           <MAPF %<>
+                 <FUNCTION (ATM "AUX" VAL STRT)
+                    #DECL ((STRT) FIX)
+                    <COND (<AND <TYPE? .ATM ATOM>
+                                <GASSIGNED? .ATM>
+                                <TYPE? <SET VAL ,.ATM> MSUBR>
+                                <==? <1 .VAL> .IMSB-ATM>
+                                <G? <SET STRT <4 .VAL>> .START>
+                                <L? .STRT .END>>
+                           <SET END .STRT>)>>
+                 .BKT>>
+        ,ATOM-TABLE:VECTOR>
+   .END>
+
+;"Stuff to handle the horrendous opcode table.  There is a slot for each"
+;"possible opcode byte.  An entry of %<> means that the opcode is undefined."
+;"An entry of type OPCODE-TABLE means that the next byte must also be"
+;"inspected.  An entry of type vector specifies an instruction in the form:"
+;"[short-name:string operands:vector long-name:string]."
+
+<GDECL (OPCODE-TABLE) OPCODE-TABLE>
+
+;"Stuff to handle register names"
+
+<DEFINE PRINT-REGISTER (REG)
+   <PRINTSTRING <NTH ,REGISTER-NAMES <+ <ANDB .REG 15> 1>>>>
+
+;"Stuff to handle references to the kernel.  This is used whenever EXPOSE"
+;"encounters the '@#address' construct.  A hash table is used.  Each bucket"
+;"is a list of the form (loc1 name1 loc2 name2 ...)."
+
+;"PRINT-KERNEL-LOCATION is defined to return %<> if it couldn't find"
+;"an appropriate symbolic name."
+
+<DEFINE PRINT-KERNEL-LOCATION (LOC "AUX" BKTNUM BKT MEM)
+   #DECL ((LOC BKTNUM) FIX (BKT) LIST (MEM) <OR FALSE <LIST FIX STRING>>)
+   <SET BKTNUM <+ <MOD .LOC ,KERNEL-TABLE-LENGTH> 1>>
+   <SET BKT <NTH ,KERNEL-TABLE .BKTNUM>>
+   <SET MEM <MEMQ .LOC .BKT>>
+   <COND (.MEM <PRINTSTRING <2 .MEM>>)>>
+
+<ENDPACKAGE>