1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
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.
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.
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.
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
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)
26 ; SAVEACS [A,B,C,D] & SAVE. [LOC,LOC,LOC]
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
33 IF2,.INEOF ;Don't bother if no code
35 ;.NSTGW ;No storage words in this part
38 <.DPB <VAL>,<.BP <MASK>,>,0>TERMIN
43 DEFINE POINT SIZE=7,ADDR=0,COUNT=0
48 ..XX==<..X2-1>/<36./..X1>
49 ..X2==..X2-..XX*<36./..X1>
50 <<<36.-<..X1*..X2>>_30.>+<..X1_24.>+<ADDR>+..X1>
53 ;MOVX - LOAD AC WITH CONSTANT
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]]]]]
65 IRP OP,,[N,NA,OE,ON,OA,ZE,ZN,ZA,CE,CN,CA]
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]]]
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]]]]
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]]]]
101 SUBTTL JX -- JUMP ON MASK
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)
108 DEFINE JXE AC,#MSK,?ADR
109 IFE MSK-.MINFI,[JUMPGE AC,ADR]
110 .ELSE [IFE MSK+1,[JUMPE AC,ADR]
115 DEFINE JXN AC,#MSK,?ADR
116 IFE MSK-.MINFI,[JUMPL AC,ADR]
117 .ELSE [IFE MSK+1,[JUMPN AC,ADR]
122 DEFINE JXO AC,#MSK,?ADR
123 IFE <.LZ MSK,>+<.TZ MSK,>-35.,[JXN AC,MSK,ADR]
129 DEFINE JXF AC,#MSK,?ADR
130 IFE <.LZ MSK,>+<.TZ MSK,>-35.,[JXE AC,MSK,ADR]
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]]]]
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]]]]
153 ;MACROS TO PROVIDE SOME BLOCK HANDLING OF CODE
155 ;DO. - LOOP STRUCTURE, DECLARES TOP OF LOOP
156 ; LOOP. - JUMPS TO TOP OF 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.
165 DEFINE ..DX \%TGE,%SV1,%SV2,%SV3
166 EQUALS %SV1,TOP. ? EQUALS %SV2,ENDDO. ? EQUALS %SV3,ENDLP.
170 %TGE::EQUALS TOP.,%SV1 ? EQUALS ENDDO.,%SV2 ? EQUALS ENDLP.,%SV3
178 .ERR ENDDO. outside loop
181 .ERR ENDLP. outside loop
206 DEFINE IFXN. AC,#MASK
207 IFE 1_35.-MASK,..IX [JUMPGE AC,]
208 .ELSE [IFE MASK+1,..IX [JUMPE AC,]
214 DEFINE IFXE. AC,#MASK
215 IFE 1_35.-MASK,..IX [JUMPL AC,]
216 .ELSE [IFE MASK+1,..IX [JUMPN AC,]
246 DEFINE ..IX OP,\%TAG,%SV1,%SV2
248 EQUALS %SV1,..TG ? EQUALS %SV2,ENDIF.
254 EQUALS ..TG,%SV1 ? EQUALS ENDIF.,%SV2
270 .ERR Conditional construct outside a conditional
274 .ERR ENDIF. outside a conditional
278 ;GENERAL CASES WITHIN CONDITIONALS
289 DEFINE ANDXN. AC,#MASK
290 IFE 1_35.-MASK,JUMPGE AC,..TG
291 .ELSE [IFE MASK+1,JUMPE AC,..TG
297 DEFINE ANDXE. AC,#MASK
298 IFE 1_35.-MASK,JUMPL AC,..TG
299 .ELSE [IFE MASK+1,JUMPN AC,..TG
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.
344 EQUALS SAVE.,SAVEAC ;Not in MACRO version...
346 DEFINE .SAVX1 #N#,ACS