1 TITLE MAPS -- MAP FUNCTIONS FOR MUDDLE
\r
7 .GLOBAL TYPSEG,NXTLM,NAPT,APLQ,INCR1,SPECBI,FRMSTK,MAPPLY
\r
8 .GLOBAL CHFSWP,SSPEC1,ILVAL,CHUNW
\r
12 INCNT==0 ; INNER LOOP COUNT
\r
13 LISTNO==-1 ; ARG NUMBER BEING HACKED
\r
14 ARGCNT==-2 ; FINAL ARG COUNTER
\r
15 NARGS==-3 ; NUMBER OF STRUCTURES
\r
16 NTHRST==-4 ; 0=> MAP REST, OTHERWISE MAP FIRST
\r
18 ; MAP THE "CAR" OF EACH LIST
\r
22 PUSH P,. ; PUSH NON-ZERO
\r
25 ; MAP THE "CDR" OF EACH LIST
\r
32 HLRE C,AB ; HOW MANY ARGS
\r
33 ASH C,-1 ; TO # OF PAIRS
\r
34 ADDI C,3 ; AT LEAST 3
\r
35 JUMPG C,TFA ; NOT ENOUGH
\r
36 GETYP A,(AB) ; TYPE OF CONSTRUCTOR
\r
37 CAIN A,TFALSE ; ANY CONSING NEEDE?
\r
38 JRST MAP2 ; NO, SKIP CHECK
\r
39 PUSHJ P,APLQ ; CHECK IF APPLICABLE
\r
40 JRST NAPT ; NO, ERROR
\r
41 MAP2: MOVNS C ; POS NO. OF ARGS (-3)
\r
42 ADDI C,1 ; C/ NOW # OF LISTS...
\r
44 PUSH TP,[TATOM,,-1] ; ALL **GFP** INSTRUCTIONS ARE TO DO WITH MAPRET
\r
45 PUSH TP,MQUOTE LMAP,[LMAP ]INTRUP
\r
46 PUSHJ P,FRMSTK ; **GFP**
\r
47 PUSH TP,[0] ; **GFP**
\r
48 PUSH TP,[0] ; **GFP**
\r
49 PUSHJ P,SPECBIND ; **GFP**
\r
50 MOVE C,(P) ; RESTORE COUNT OF ARGS
\r
51 MOVE A,AB ; COPY ARG POINTER
\r
52 MOVSI 0,TAB ; CLOBBER A'S TYPE
\r
55 ARGLP: INTGO ; STACK MAY OVERFLOW
\r
56 PUSH TP,4(A) ; SKIP FCNS
\r
59 SOJG C,ARGLP ; ALL UP ON STACK
\r
61 ; ALL STRUCTURES ARE ON THE STACK, NOW PUSH THE CONSTRUCTOR
\r
63 PUSH TP,(AB) ; CONSTRUCTOR
\r
66 PUSH P,[-1] ; FUNNY TEMPS
\r
70 ; OUTER LOOP CDRING EACH STRUCTURE
\r
72 OUTRLP: SETZM LISTNO(P) ; START AT 0TH LIST
\r
73 MOVE 0,NARGS(P) ; TOTAL # OF STRUCS
\r
74 MOVEM 0,INCNT(P) ; AS COUNTER IN INNER LOOP
\r
75 PUSH TP,2(AB) ; PUSH THE APPLIER
\r
78 ; INNER LOOP, CONS UP EACH APPLICATION
\r
81 MOVEI E,2 ; READY TO BUMP LISTNO
\r
82 ADDB E,LISTNO(P) ; CURRENT STORED AND IN C
\r
83 ADDI E,(TB)4 ; POINT TO A STRUCTURE
\r
84 MOVE A,(E) ; PICK IT UP
\r
85 MOVE B,1(E) ; AND VAL
\r
86 PUSHJ P,TYPSEG ; SETUP TO REST IT ETC.
\r
87 SKIPL ARGCNT(P) ; DONT INCR THE 1ST TIME
\r
88 XCT INCR1(C) ; INCREMENT THE LOSER
\r
89 MOVE 0,DSTO(PVP) ; UPDATE THE LIST
\r
91 MOVEM D,1(E) ; CLOBBER AWAY
\r
92 PUSH TP,DSTO(PVP) ; FOR REST CASE
\r
94 PUSHJ P,NXTLM ; SKIP IF GOT ONE, ELSE DONT
\r
95 JRST DONEIT ; FINISHED
\r
97 SKIPN NTHRST(P) ; SKIP IF MAP REST
\r
99 MOVEM A,-1(TP) ; IUSE AS ARG
\r
101 INRLP1: SOSE INCNT(P) ; COUNT ARGS
\r
102 JRST INRLP ; MORE, GO DO THEM
\r
105 ; ALL ARGS PUSHED, APPLY USER FCN
\r
107 SKIPGE ARGCNT(P) ; UN NEGATE ARGCNT
\r
109 MOVE A,NARGS(P) ; GET # OF ARGS
\r
111 ACALL A,MAPPLY ; APPLY THE BAG BITER
\r
113 GETYP 0,(AB) ; GET TYPE OF CONSTRUCTOR
\r
114 CAIN 0,TFALSE ; SKIP IF ONE IS THERE
\r
121 OUTRL1: MOVEM A,-1(TP) ; SAVE PARTIAL VALUE
\r
125 ; HERE IF ALL FINISHED
\r
127 DONEIT: HRLS C,LISTNO(P) ; HOW MANY DONE
\r
128 SUB TP,[2,,2] ; FLUSH SAVED VAL
\r
129 SUB TP,C ; FLUSH TUPLE OF CRUFT
\r
130 DONEI1: SKIPGE ARGCNT(P)
\r
131 SETZM ARGCNT(P) ; IN CASE STILL NEGATIVE
\r
132 SETZM DSTO(PVP) ; UNSCREW
\r
133 GETYP 0,(AB) ; ANY CONSTRUCTOR
\r
135 JRST MFINIS ; NO, LEAVE
\r
136 AOS D,ARGCNT(P) ; IF NO ARGS
\r
137 ACALL D,APPLY ; APPLY IT
\r
141 ; HERE TO FINISH IF CONSTRUCTOR WAS #FALSE ()
\r
147 ; **GFP** FROM HERE TO THE END
\r
149 MFUNCTION MAPLEAVE,SUBR
\r
155 MOVE B,MQUOTE LMAP,[LMAP ]INTRUP
\r
158 CAIE 0,TFRAME ; MAKE SURE WINNER
\r
162 MOVEI B,-1(TP) ; POINT TO FRAME POINTER
\r
165 JUMPL C,MAPL1 ; RET VAL SUPPLIED
\r
174 MFUNCTION MAPSTOP,SUBR
\r
181 MFUNCTION MAPRET,SUBR
\r
186 MAPREC: MOVE B,MQUOTE LMAP,[LMAP ]INTRUP
\r
187 PUSHJ P,ILVAL ; GET VALUE
\r
194 POP P,0 ; RET/STOP SWITCH
\r
195 JUMPN 0,MAPRC1 ; JUMP IF STOP
\r
196 PUSHJ P,CHFSWP ; CHECK IT OUT (AND MAYBE SWAP)
\r
199 MAPRC1: PUSHJ P,CHFSWP
\r
201 MAPRC2: HRRZ E,SPSAV(B) ; UNBIND BEFORE RETURN
\r
204 ADDI E,1 ; FUDGE FOR UNBINDER
\r
205 PUSHJ P,SSPEC1 ; UNBINDER
\r
206 HLRE D,(TP) ; FIND NUMBER
\r
207 JUMPE D,MAPRE1 ; SKIP IF NONE TO MOVE
\r
208 MOVNS E,D ; AND PLUS IT
\r
209 HRLI E,(E) ; COMPUTE NEW TP
\r
210 ADD E,TPSAV(B) ; NEW TP
\r
211 HRRZ C,TPSAV(B) ; GET OLD TOP
\r
213 HRL C,(TP) ; AND NEW BOT
\r
215 BLT C,(E) ; BRING IT ALL DOWN
\r
216 MAPRE1: ASH D,-1 ; NO OF ARGS
\r
217 HRRI TB,(B) ; PREPARE TO FINIS
\r
220 POP P,0 ; GET PC TO GO TO
\r
222 JRST CONTIN ; BACK TO MAPPER
\r
224 NLOCR1: TDZA A,A ; ZER SW
\r
226 GETYP 0,(AB) ; CHECK IF BUILDING
\r
228 JRST FLUSHM ; REMOVE GOODIES
\r
229 ADDM B,ARGCNT(P) ; BUMP ARG COUNTER
\r
230 NLOCR2: JUMPE A,DONEI1
\r
233 FLUSHM: ASH B,1 ; FLUSH GOODIES DROPPED
\r
238 NOTM: PUSH TP,$TATOM
\r
239 PUSH TP,EQUOTE NOT-IN-MAP-FUNCTION
\r