18baa828ae040e8d8a09599cd17abe640cebd681
[its.git] / system / t20mac.1
1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
2 ;;;
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 2 of the
6 ;;; License, or (at your option) any later version.
7 ;;;
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 ;;; General Public License for more details.
12 ;;;
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
17 ;Random useful coding macros. GZ@OZ developed MACSYM.MID based on the
18 ;Twenex monitor macro collection MACSYM.MAC - this is a non-Twenex-specific
19 ;subset of that.
20
21 ;Stuff supported (will add more stuff as need arises):
22 ; FLD(VAL,MSK) & BIT(n) & POINT SIZE,ADDR,OFFSET
23 ; MOVX AC,MASK & TXxx AC,MASK & JXx AC,MASK,ADDR & LOAD/STOR AC,MASK,ADDR
24 ; DO./ENDDO. macros (and related stuff)
25 ; IFxxx/ANxxx macros
26 ; SAVEACS [A,B,C,D] & SAVE. [LOC,LOC,LOC]
27
28 \f
29 .KILL  ..XX,..TXZ,..TXO,..TXC,..X0,..X1,..X2,..X3,TOP.
30 .XCREF ..XX,..TXZ,..TXO,..TXC,..X0,..X1,..X2,..X3
31 .XCREF ..DX,..IX,..EX,.SAVX1,.SAVX2
32
33 IF2,.INEOF                      ;Don't bother if no code
34
35 ;.NSTGW                         ;No storage words in this part
36
37 DEFINE FLD (VAL,MASK)
38 <.DPB <VAL>,<.BP <MASK>,>,0>TERMIN
39
40 DEFINE BIT (N)
41 <1_<35.-<N>>>TERMIN
42
43 DEFINE POINT SIZE=7,ADDR=0,COUNT=0
44 RADIX 8+2
45 ..X1==SIZE
46 ..X2==COUNT
47 RADIX 8
48 ..XX==<..X2-1>/<36./..X1>
49 ..X2==..X2-..XX*<36./..X1>
50 <<<36.-<..X1*..X2>>_30.>+<..X1_24.>+<ADDR>+..X1>
51 TERMIN
52
53 ;MOVX - LOAD AC WITH CONSTANT
54
55 DEFINE MOVX AC,#MSK
56    IFE <-1,,0>&MSK,[MOVEI AC,MSK]
57    .ELSE [IFE <0,,-1>&MSK,[MOVSI AC,(MSK)]
58           .ELSE [IFE <<-1,,0>&MSK>-<-1,,0>,[HRROI AC,MSK]
59                  .ELSE [IFE <<0,,-1>&MSK>-<0,,-1>,[HRLOI AC,(MSK&.LHALF)]
60                         .ELSE [MOVE AC,[MSK]]]]]
61 TERMIN
62
63 ;TX - TEST MASK
64
65 IRP OP,,[N,NA,OE,ON,OA,ZE,ZN,ZA,CE,CN,CA]
66   DEFINE TX!OP AC,#MSK
67     IFE <-1,,0>&MSK,[TR!OP AC,MSK]
68     .ELSE [IFE <0,,-1>&MSK,[TL!OP AC,(MSK)]
69            .ELSE [TD!OP AC,[MSK]]]
70   TERMIN
71 TERMIN
72
73 IRP OP,,[N,E]
74   DEFINE TXN!OP AC,#MSK
75     IFE <-1,,0>&MSK,[TRN!OP AC,MSK]
76     .ELSE [IFE <0,,-1>&MSK,[TLN!OP AC,(MSK)]
77            .ELSE [IFE MSK+1,[CAI!OP AC,0]
78                   .ELSE [TDN!OP AC,[MSK]]]]
79   TERMIN
80 TERMIN
81
82 ..TXZ==ANDI
83 ..TXO==ORCMI
84 ..TXC==EQVI
85 IRP OP,,[Z,O,C]
86   DEFINE TX!OP AC,#MSK
87     IFE <-1,,0>&MSK,[TR!OP AC,MSK]
88     .ELSE [IFE <0,,-1>&MSK,[TL!OP AC,(MSK)]
89            .ELSE [IFE <<-1,,0>&MSK>-<-1,,0>,[..TX!OP AC,-1#MSK]
90                   .ELSE [TD!OP AC,[MSK]]]]
91   TERMIN
92 TERMIN
93
94 EQUALS IORX,TXO
95 EQUALS XORX,TXC
96
97 DEFINE ANDX AC,#MSK
98 TXZ AC,-1#MSK
99 TERMIN
100
101         SUBTTL JX -- JUMP ON MASK
102
103 ;JXE -- JUMP IF MASKED BITS ARE EQUAL TO 0
104 ;JXN -- JUMP IF MASKED BITS ARE NOT EQUAL TO 0
105 ;JXO -- JUMP IF MASKED BITS ARE ALL ONES
106 ;JXF -- JUMP IF MASKED BITS ARE NOT ALL ONES (FALSE)
107
108 DEFINE JXE AC,#MSK,?ADR
109  IFE MSK-.MINFI,[JUMPGE AC,ADR]
110  .ELSE [IFE MSK+1,[JUMPE AC,ADR]
111         .ELSE [TXNN AC,MSK
112                 JRST ADR]]
113 TERMIN
114
115 DEFINE JXN AC,#MSK,?ADR
116  IFE MSK-.MINFI,[JUMPL AC,ADR]
117  .ELSE [IFE MSK+1,[JUMPN AC,ADR]
118         .ELSE [TXNE AC,MSK
119                 JRST ADR]]
120 TERMIN
121
122 DEFINE JXO AC,#MSK,?ADR
123  IFE <.LZ MSK,>+<.TZ MSK,>-35.,[JXN AC,MSK,ADR]
124  .ELSE [TXC AC,MSK
125         TXCN AC,MSK
126           JRST ADR]
127 TERMIN
128
129 DEFINE JXF AC,#MSK,?ADR
130 IFE <.LZ MSK,>+<.TZ MSK,>-35.,[JXE AC,MSK,ADR]
131 .ELSE [TXC AC,MSK
132        TXCE AC,MSK
133         JRST ADR]
134 TERMIN
135 \f
136 ;LOAD, STOR
137 DEFINE LOAD AC,#MSK,?LOCN
138   IFE MSK+1,[MOVE AC,LOCN]
139   .ELSE [IFE MSK-777777,[HRRZ AC,LOCN]
140         .ELSE [IFE MSK-<-1,,0>,[HLRZ AC,LOCN]
141                 .ELSE [LDB AC,[.BP MSK,LOCN]]]]
142 TERMIN
143
144 DEFINE STOR AC,#MSK,?LOCN
145  IFE MSK+1,[MOVEM AC,LOCN]
146  .ELSE [IFE MSK-777777,[HRRM AC,LOCN]
147         .ELSE [IFE MSK-<-1,,0>,[HRLM AC,LOCN]
148                 .ELSE [DPB AC,[.BP MSK,LOCN]]]]
149 TERMIN
150 \f
151         SUBTTL BLOCK MACROS
152
153 ;MACROS TO PROVIDE SOME BLOCK HANDLING OF CODE
154
155 ;DO. - LOOP STRUCTURE, DECLARES TOP OF LOOP
156 ; LOOP. - JUMPS TO TOP OF LOOP
157 ; EXIT. - EXITS LOOP
158 ; TOP. - TAG AT TOP OF LOOP FOR JUMPS, E.G. SOJG T4,TOP.
159 ; ENDLP. - TAG AT END OF LOOP FOR JUMPS, E.G. SOJL T4,ENDLP.
160
161 DEFINE DO.
162    ..DX
163 TERMIN
164
165 DEFINE ..DX \%TGE,%SV1,%SV2,%SV3
166         EQUALS %SV1,TOP. ? EQUALS %SV2,ENDDO. ? EQUALS %SV3,ENDLP.
167         .KILL %SV1
168         TOP.==.
169         DEFINE ENDDO.
170          %TGE::EQUALS TOP.,%SV1 ? EQUALS ENDDO.,%SV2 ? EQUALS ENDLP.,%SV3
171          .KILL %TGE
172         TERMIN
173         DEFINE ENDLP.
174 %TGE!!TERMIN
175 TERMIN
176
177 DEFINE ENDDO.
178 .ERR ENDDO. outside loop
179 TERMIN
180 DEFINE ENDLP.
181 .ERR ENDLP. outside loop
182 TERMIN
183 TOP.==-1
184
185 DEFINE OD.
186 ENDDO.!TERMIN
187
188 DEFINE LOOP.
189 JRST TOP.!TERMIN
190
191 DEFINE EXIT.
192 JRST ENDLP.!TERMIN
193
194 \f
195 ;Conditionals
196
197 DEFINE IFSKP.
198 ..IX [JRST ]
199 TERMIN
200
201 DEFINE IFNSK.
202 TRNA
203  ..IX [JRST ]
204 TERMIN
205
206 DEFINE IFXN. AC,#MASK
207  IFE 1_35.-MASK,..IX [JUMPGE AC,]
208  .ELSE [IFE MASK+1,..IX [JUMPE AC,]
209        .ELSE [TXNN AC,MASK
210                 ..IX [JRST ]
211              ]]
212 TERMIN
213
214 DEFINE IFXE. AC,#MASK
215  IFE 1_35.-MASK,..IX [JUMPL AC,]
216  .ELSE [IFE MASK+1,..IX [JUMPN AC,]
217        .ELSE [TXNE AC,MASK
218                 ..IX [JRST ]
219              ]]
220 TERMIN
221
222 DEFINE IFE. AC
223 ..IX [JUMPN AC,]
224 TERMIN
225
226 DEFINE IFN. AC
227 ..IX [JUMPE AC,]
228 TERMIN
229
230 DEFINE IFG. AC
231 ..IX [JUMPLE AC,]
232 TERMIN
233
234 DEFINE IFGE. AC
235 ..IX [JUMPL AC,]
236 TERMIN
237
238 DEFINE IFLE. AC
239 ..IX [JUMPG AC,]
240 TERMIN
241
242 DEFINE IFL. AC
243 ..IX [JUMPGE AC,]
244 TERMIN
245
246 DEFINE ..IX OP,\%TAG,%SV1,%SV2
247         OP!%TAG
248         EQUALS %SV1,..TG ? EQUALS %SV2,ENDIF.
249         DEFINE ..TG LBL
250         %TAG!!LBL!TERMIN
251         DEFINE ENDIF.
252         ..TG [::]
253         .KILL ..TG
254          EQUALS ..TG,%SV1 ? EQUALS ENDIF.,%SV2
255         TERMIN
256 TERMIN
257
258 DEFINE ELSE.
259 ..EX
260 TERMIN
261
262 DEFINE ..EX \%TAG
263         JRST %TAG
264         ..TG [::]
265         DEFINE ..TG LBL
266           %TAG!!LBL!TERMIN
267 TERMIN
268
269 DEFINE ..TG LBL
270  .ERR Conditional construct outside a conditional
271 TERMIN
272
273 DEFINE ENDIF.
274  .ERR ENDIF. outside a conditional
275 TERMIN
276
277
278 ;GENERAL CASES WITHIN CONDITIONALS
279
280 DEFINE ANSKP.
281   JRST ..TG
282 TERMIN
283
284 DEFINE ANNSK.
285         TRNA
286           JRST ..TG
287 TERMIN
288
289 DEFINE ANDXN. AC,#MASK
290 IFE 1_35.-MASK,JUMPGE AC,..TG
291 .ELSE [IFE MASK+1,JUMPE AC,..TG
292        .ELSE [TXNN AC,MASK
293                 JRST ..TG
294              ]]
295 TERMIN
296
297 DEFINE ANDXE. AC,#MASK
298 IFE 1_35.-MASK,JUMPL AC,..TG
299 .ELSE [IFE MASK+1,JUMPN AC,..TG
300        .ELSE [TXNE AC,MASK
301                 JRST ..TG
302              ]]
303 TERMIN
304
305 DEFINE ANDE. AC
306         JUMPN AC,..TG
307 TERMIN
308
309 DEFINE ANDN. AC
310         JUMPE AC,..TG
311 TERMIN
312
313 DEFINE ANDG. AC
314         JUMPLE AC,..TG
315 TERMIN
316
317 DEFINE ANDGE. AC
318         JUMPL AC,..TG
319 TERMIN
320
321 DEFINE ANDLE. AC
322         JUMPG AC,..TG
323 TERMIN
324
325 DEFINE ANDL. AC
326         JUMPGE AC,..TG
327 TERMIN
328
329 \f
330
331 ; SAVEAC [A,B,C]
332 ; Supports +1/+2 returns.
333 ; Unlike macro version, supports arbitrary locations (not just AC's)
334 ; and doesn't clobber AC16. Assumes stack in P, though.
335
336 DEFINE SAVEAC ACS
337         IRP AC,,[ACS]
338           PUSH P,AC
339           ..XX==.IRPCNT
340         TERMIN
341         .SAVX1 ..XX+1,[ACS]
342 TERMIN
343
344 EQUALS SAVE.,SAVEAC             ;Not in MACRO version...
345
346 DEFINE .SAVX1 #N#,ACS
347         PUSH P,[[CAIA
348                    AOS -N(P)
349                  .SAVX2 [ACS]
350                  POPJ P,
351                 ]]
352 TERMIN
353
354 DEFINE .SAVX2 ACS
355         IRP AC,REST,[ACS]
356           .SAVX2 [REST]
357           POP P,AC
358           .ISTOP
359         TERMIN
360 TERMIN
361 \f