Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / opdefvax.mud
1
2 <MSETG BITS-PER-FIELD 8>
3
4 <MSETG FIELDS-PER-WORD 4>
5
6 <MSETG FIELDS-PER-OP <* ,FIELDS-PER-WORD 3>>
7
8 <MSETG WORDS-PER-OP 4>
9
10 <MSETG INIT-SHIFT <- <* ,BITS-PER-FIELD ,FIELDS-PER-WORD> ,BITS-PER-FIELD>>
11
12 <MSETG FIELD-MASK *377*>
13
14 <DEFINE DEFOP (STR CODE "TUPLE" MODES "AUX" STR-I (WD1 0) (SHFT ,INIT-SHIFT)) 
15    #DECL ((STR STR-I) STRING (MODES) <TUPLE [REST FIX]> (CODE SHFT WD1) FIX)
16    <MSETG <OR <LOOKUP <SET STR-I <STRING "INST-" .STR>> ,OP-OBLIST>
17               <INSERT .STR-I ,OP-OBLIST>>
18           .CODE>
19    <PUT ,OP-VECTOR <SET CODE <+ <* .CODE ,WORDS-PER-OP> 1>> <SQUOZE .STR>>
20    <SET WD1 <CHTYPE <LSH <LENGTH .MODES> .SHFT> FIX>>
21    <MAPF <>
22          <FUNCTION (FLD) 
23                  #DECL ((FLD) FIX)
24                  <SET WD1
25                       <CHTYPE <ORB .WD1
26                                    <LSH .FLD
27                                         <SET SHFT <- .SHFT ,BITS-PER-FIELD>>>>
28                               FIX>>
29                  <COND (<0? .SHFT>
30                         <SET SHFT <+ ,INIT-SHIFT ,BITS-PER-FIELD>>
31                         <PUT ,OP-VECTOR <+ .CODE 1> .WD1>
32                         <SET WD1 0>
33                         <SET CODE <+ .CODE 1>>)>>
34          .MODES>
35    <PUT ,OP-VECTOR <+ .CODE 1> .WD1>>
36
37 <DEFINE GET-INST-INFO (INST) #DECL ((INST) FIX)
38         <REST ,OP-VECTOR <* .INST ,WORDS-PER-OP>>>
39
40 <DEFINE GET-OP-INFO (FNUM OP-INF "AUX" WD)
41         #DECL ((WD FNUM) FIX (OP-INF) <UVECTOR [4 FIX]>)
42         <COND (<G=? .FNUM <* 2 ,FIELDS-PER-WORD>>
43                <SET FNUM <- .FNUM <* 2 ,FIELDS-PER-WORD> 1>>
44                <SET WD <4 .OP-INF>>)
45               (<G=? .FNUM ,FIELDS-PER-WORD>
46                <SET FNUM <- .FNUM ,FIELDS-PER-WORD 1>>
47                <SET WD <3 .OP-INF>>)
48               (ELSE
49                <SET WD <2 .OP-INF>>
50                <SET FNUM <+ .FNUM 1>>)>
51         <CHTYPE <ANDB <LSH .WD
52                            <* <- .FNUM ,FIELDS-PER-WORD> ,BITS-PER-FIELD>>
53                       ,FIELD-MASK> FIX>>
54
55 <DEFINE ADDRESS-MODES (MODES SIZES "AUX" (MODEN 0) (SIZEN 0))
56         #DECL ((MODES SIZES) STRING (MODEN SIZEN) FIX)
57         <MAPF <>
58               <FUNCTION (MODE)
59                    <SET SIZEN 0>
60                    <MAPF <>
61                          <FUNCTION (SIZE "AUX" ST)
62                               <MSETG <OR <LOOKUP <SET ST
63                                                       <STRING "OP-" .MODE
64                                                               .SIZE>>
65                                                  ,OP-OBLIST>
66                                          <INSERT .ST ,OP-OBLIST>>
67                                      <+ <CHTYPE <LSH .MODEN 3> FIX> .SIZEN>>
68                               <SET SIZEN <+ .SIZEN 1>>>
69                          .SIZES>
70                    <SET MODEN <+ .MODEN 1>>>
71               .MODES>
72         <SET SIZEN -1>
73         <MAPF <>
74               <FUNCTION (A "AUX" ST)
75                    <MSETG <OR <LOOKUP <SET ST
76                                            <STRING "SZ-" .A>>
77                                       ,OP-OBLIST>
78                               <INSERT .ST ,OP-OBLIST>>
79                           <SET SIZEN <+ .SIZEN 1>>> > .SIZES>>
80
81 <SETG OP-OBLIST <OBLIST? DEFOP>>
82
83 <DEFINE INIT-OP-DEFS ()
84         <SETG OP-VECTOR <IUVECTOR <* 256 ,WORDS-PER-OP> 0>>>
85
86 <GDECL (OP-VECTOR) <UVECTOR [REST FIX]>>
87
88 <MSETG SQUOZE-MULF <* 40 40 40 40 40>>
89
90 <DEFINE SQUOZE (STR "AUX" (VAL 0) (COUNT 6) C (TC 0) (MULF ,SQUOZE-MULF)) 
91         #DECL ((VAL COUNT TC MULF) FIX (C) CHARACTER (STR) STRING)
92         <REPEAT ()
93                 <COND (<OR <EMPTY? .STR> <L? .COUNT 1>> <RETURN .VAL>)>
94                 <SET TC <CHTYPE <SET C <1 .STR>> FIX>>
95                 <SET STR <REST .STR>>
96                 <COND (<AND <G=? .TC <ASCII !\0>> <L=? .TC <ASCII !\9>>>
97                        <SET TC <- .TC 47>>)
98                       (<AND <G=? .TC <ASCII !\A>> <L=? .TC <ASCII !\Z>>>
99                        <SET TC <- .TC 54>>)
100                       (<AND <G=? .TC <ASCII !\a>> <L=? .TC <ASCII !\z>>>
101                        <SET TC <- .TC 86>>)
102                       (<==? .C !\.> <SET TC 37>)
103                       (<==? .C !\$> <SET TC 38>)
104                       (<==? .C !\%> <SET TC 39>)
105                       (T <AGAIN>)>
106                 <SET COUNT <- .COUNT 1>>
107                 <SET VAL <+ .VAL <* .TC .MULF>>>
108                 <SET MULF </ .MULF 40>>>>
109
110 <MSETG SQUOZE-DIVF <* 40 40 40 40 40>>
111
112 <DEFINE PRINT-SQUOZE (NUM
113                       "OPTIONAL" (OUTCHAN .OUTCHAN)
114                       "AUX" (DIVF ,SQUOZE-DIVF))
115         #DECL ((NUM) FIX (OUTCHAN) <SPECIAL CHANNEL>)
116         <REPEAT (VAL)
117                 <SET VAL <MOD </ .NUM .DIVF> 40>>
118                 <COND (<AND <L? .NUM 0> <G? .VAL 0>>
119                        <SET VAL <+ .VAL 1>>
120                        <SET NUM <- .NUM <* .VAL .DIVF>>>)>
121                 <COND (<0? .VAL> <RETURN>)
122                       (<AND <G? .VAL 10> <L? .VAL 37>>
123                        <PRINC <CHTYPE <+ .VAL 54> CHARACTER>>)
124                       (<L=? .VAL 10> <PRINC <CHTYPE <+ .VAL 47> CHARACTER>>)
125                       (<==? .VAL 37> <PRINC !\.>)
126                       (<==? .VAL 38> <PRINC !\$>)
127                       (<==? .VAL 39> <PRINC !\%>)>
128                 <COND (<1? .DIVF> <RETURN>)>
129                 <SET DIVF </ .DIVF 40>>>>