1 TITLE PROCESS-HACKER FOR MUDDLE
\r
7 .GLOBAL ICR,NAPT,IGVAL,CHKARG,RESFUN,RETPROC,SWAP,MAINPR,PROCHK,NOTRES
\r
8 .GLOBAL PSTAT,LSTRES,TOPLEV,MAINPR,1STEPR,INCONS
\r
11 MFUNCTION PROCESS,SUBR
\r
14 GETYP A,(AB) ;GET TYPE OF ARG
\r
15 ;MUST BE SOME APPLIABLE TYPE
\r
17 JRST NAPT ;NO, ERROR - NON-APPLIABLE TYPE
\r
20 PUSHJ P,ICR ;CREATE A NEW PROCESS
\r
21 MOVE C,TPSTO+1(B) ;GET ITS SRTACK
\r
22 PUSH C,[TENTRY,,TOPLEV]
\r
29 PUSH C,D ;SAVED STACK POINTER
\r
31 MOVEM C,TPSTO+1(B) ;STORE NEW TP
\r
32 HRRI D,1(C) ;MAKE A TB
\r
33 HRLI D,2 ;WITH A TIME
\r
35 MOVEM D,TBSTO+1(B) ;SAVE ALSO FOR SIMULATED START
\r
36 MOVE C,(AB) ;STORE ARG
\r
37 MOVEM C,RESFUN(B) ;INTO PV
\r
45 MFUNCTION RETPROC,SUBR
\r
46 ; WHO KNOWS WHAT THIS SHOULD REALLY DO
\r
47 ;PROBABLY, JUST AN EXIT
\r
48 ;FOR NOW, PRINT OUT AN ERROR MESSAGE
\r
50 PUSH TP,EQUOTE ATTEMPT-TO-RETURN-OUT-OF-PROCESS
\r
59 MFUNCTION RESUME,FSUBR
\r
60 ;RESUME IS CALLED WITH TWO ARGS
\r
61 ;THE FIRST IS A PROCESS FORM OF THE PROCESS TO BE RESUMED
\r
62 ;THE SECOND IS A FUNCTION TO BE CALLED WHEN THIS PROCESS
\r
63 ; (THE PARENT) IS ITSELF RESUMED
\r
64 ;IF THE FUNCTION IS NOT GIVEN SOME STANDARD FUNCTION IS
\r
67 ; NOTE - TYPE AND NUMBER OF ARGS CHECKS MUST BE ADDED TO BOTH RESUME AND CREATE
\r
70 HRRZ C,@1(AB) ;GET CDR ADDRESS
\r
71 JUMPE C,NOFUN ;IF NO SECOND ARG, SUPPLY STANDARD
\r
72 HLLZ A,(C) ;GET CDR TYPE
\r
73 CAME A,$TATOM ;ATOMIC?
\r
74 JRST RES2 ;NO, MUST EVAL TO GET FUNCTION
\r
76 PUSHJ P,IGVAL ;TRY TO GET GLOBAL VALUE
\r
77 CAMN A,$TUNBOUND ;GLOBALLY UNBOUND?
\r
78 JRST LFUN ;YES, TRY FOR LOCAL VALUE
\r
79 RES1: MOVEM A,RESFUN(PVP) ;STORE IN THIS PROCESS
\r
80 MOVEM B,RESFUN+1(PVP)
\r
82 HRRZ C,1(AB) ;GET CAR ADDRESS
\r
83 PUSH TP,(C) ;PUSH PROCESS FORM
\r
85 JSP E,CHKARG ;CHECK FOR DEFERED TYPE
\r
86 ;INSERT CHECKS FOR PROCESS FORM
\r
87 MCALL 1,EVAL ;EVAL PROCESS FORM WHICH WILL SWITCH
\r
91 RES2: PUSH TP,(C) ;PUSH FUNCTION ARG
\r
93 JSP E,CHKARG ;CHECK FOR DEFERED
\r
94 MCALL 1,EVAL ;EVAL TO GET FUNCTION
\r
97 LFUN: HRRZ C,1(AB) ;GET CDR ADDRESS
\r
100 MCALL 1,VALUE ;GET LOCAL VALUE OF ATOM FOR FUNCTION
\r
103 NOFUN: MOVSI A,TUNBOUND ;MAKE RESUME FUNCTION UNBOUND
\r
107 ; PROCHK - SETUP LAST RESUMER SLOT
\r
109 PROCHK: CAME B,MAINPR ; MAIN PROCESS?
\r
110 MOVEM PVP,LSTRES+1(B)
\r
113 ; THIS FUNCTION RESUMES A PROCESS, CALLED WITH ONE OR TWO ARGS
\r
114 ; THE FIRST IS A VALUE TO RETURN TO THE OTHER PROCESS OR PASS TO ITS
\r
116 ; THE SECOND IS THE PROCESS TO RESUME (IF NOT SUPPLIED, USE THE LSTRES)
\r
119 MFUNCTION RESUME,SUBR
\r
126 JRST CHPROC ; VALIDITY CHECK ON PROC
\r
127 SKIPN B,LSTRES+1(PVP) ; ANY RESUMERS?
\r
128 JRST NORES ; NO, COMPLAIN
\r
130 CAMN B,PVP ; DO THEY DIFFER?
\r
132 MOVE A,PSTAT+1(B) ; CHECK STATE
\r
133 CAIE A,RUNABL ; MUST BE RUNABL
\r
134 CAIN A,RESMBL ; OR RESUMABLE
\r
137 NOTRUN: PUSH TP,$TATOM
\r
138 PUSH TP,EQUOTE PROCESS-NOT-RUNABLE-OR-RESUMABLE
\r
141 RESUM1: PUSHJ P,PROCHK ; FIX LISTS UP
\r
142 MOVEI A,RESMBL ; GET NEW STATE
\r
143 MOVE D,B ; FOR SWAP
\r
144 STRTN: JSP C,SWAP ; SWAP THEM
\r
145 MOVEM A,PSTAT+1(E) ; CLOBBER OTHER STATE
\r
146 MOVE A,PSTAT+1(PVP) ; DECIDE HOW TO PROCEED
\r
148 MOVEM 0,PSTAT+1(PVP) ; NEW STATE
\r
149 MOVE C,ABSTO+1(E) ; OLD ARGS
\r
151 JRST DORUN ; THEY DO RUN RUN, THEY DO RUN RUN
\r
153 MOVE B,1(C) ; RETURN
\r
156 DORUN: PUSH TP,RESFUN(PVP)
\r
157 PUSH TP,RESFUN+1(PVP)
\r
161 PUSH TP,A ; CALL SUICIDE WITH THESE ARGS
\r
163 MCALL 1,SUICID ; IF IT RETURNS, KILL IT
\r
166 CHPROC: GETYP A,2(AB)
\r
172 NORES: PUSH TP,$TATOM
\r
173 PUSH TP,EQUOTE NO-PROCESS-TO-RESUME
\r
176 ; FUNCTION TO CAUSE PROCESSES TO SELF DESTRUCT
\r
178 MFUNCTION SUICIDE,SUBR
\r
184 ASH A,-1 ; DIV BY 2
\r
185 AOJE A,NOPROC ; NO PROCESS GIVEN
\r
187 GETYP A,2(AB) ; MAKE SURE OF PROCESS
\r
193 NOPROC: SKIPN C,LSTRES+1(PVP) ; MAKE SURE OF EDLIST
\r
194 MOVE C,MAINPR ; IF NOT DEFAULT TO MAIN
\r
195 SUIC2: CAMN C,PVP ; DONT SUICIDE TO SELF
\r
204 MOVE D,B ; RESTORE NEWPROCESS
\r
208 SUSELF: PUSH TP,$TATOM
\r
209 PUSH TP,EQUOTE ATTEMPT-TO-SUICIDE-TO-SELF
\r
213 MFUNCTION RESER,SUBR,RESUMER
\r
221 GETYP A,(AB) ; CHECK FOR PROCESS
\r
224 MOVE B,1(AB) ; GET PROCESS
\r
225 GTLAST: MOVSI A,TFALSE ; ASSUME NONE
\r
226 SKIPN B,LSTRES+1(B) ; GET IT IF IT EXISTS
\r
228 MOVSI A,TPVP ; GET TYPE
\r
231 ; FUNCTION TO PUT AN EVAL CALL ON ANOTHER PROCESSES STACK
\r
233 MFUNCTION BREAKSEQ,SUBR,BREAK-SEQ
\r
237 GETYP A,2(AB) ; 2D ARG MUST BE PROCESS
\r
241 MOVE B,3(AB) ; GET PROCESS
\r
242 CAMN B,PVP ; SKIP IF NOT ME
\r
244 MOVE A,PSTAT+1(B) ; CHECK STATE
\r
245 CAIE A,RESMBL ; BEST BE RESUMEABLE
\r
247 MOVE C,TBSTO+1(B) ; GET SAVE ACS TO BUILD UP A DUMMY FRAME
\r
248 MOVE D,TPSTO+1(B) ; STACK POINTER
\r
249 MOVE E,SPSTO+1(B) ; FIX UP OLD FRAME
\r
251 MOVEI E,CALLEV ; FUNNY PC
\r
253 MOVE E,PSTO+1(B) ; SET UP P,PP AND TP SAVES
\r
255 PUSH D,[0] ; ALLOCATES SOME SLOTS
\r
257 PUSH D,(AB) ; NOW THAT WHIC IS TO BE EVALLED
\r
260 HRRI E,-1(D) ; BUILD UP ARG POINTER
\r
262 PUSH D,[TENTRY,,BREAKE]
\r
264 PUSH D,E ; NEW ARG POINTER
\r
265 REPEAT 4,PUSH D,[0] ; OTHER SLOTS
\r
267 MOVEI C,(D) ; BUILD NEW AB
\r
269 MOVEM C,TBSTO+1(B) ; STORE IT
\r
270 MOVE A,2(AB) ; RETURN PROCESS
\r
277 CALLEV: MOVEM A,-3(TP) ; HERE TO EVAL THE GOODIE (SAVE REAL RESULT)
\r
284 BREAKM: PUSH TP,$TATOM
\r
285 PUSH TP,EQUOTE ATTEMPT-TO-BREAK-OWN-SEQUENCE
\r
288 ; FUNCTION TOP PUT PROCESS IN 1 STEP MODE
\r
290 MFUNCTION 1STEP,SUBR
\r
292 MOVEM PVP,1STEPR+1(B) ; CLOBBER TARGET PROCESS
\r
295 ; FUNCTION TO UNDO ABOVE
\r
297 MFUNCTION %%FREE,SUBR,FREE-RUN
\r
299 CAME PVP,1STEPR+1(B)
\r
304 FNDBND: SKIPE 1STEPR+1(B) ; DOES IT HAVE ANY 1STEPPER?
\r
305 JRST NOTMIN ; YES, COMPLAIN
\r
306 MOVE D,B ; COPY PROCESS
\r
307 ADD D,[1STEPR,,1STEPR] ; POINTER FOR SEARCH
\r
308 HRRZ C,SPSTO+1(B) ; GET THIS BINDING STACK
\r
310 FNDLP: GETYP 0,(C) ; IS THIS A TBVL?
\r
312 CAME D,1(C) ; SKIP IF THIS IS SAVED 1STEP SLOT
\r
314 SKIPN 3(C) ; IS IT SAVING A REAL 1STEPPER?
\r
316 CAME PVP,3(C) ; IS IT ME?
\r
318 SETZM 3(C) ; CLEAR OUT SAVED 1STEPPER
\r
320 FNDNXT: HRRZ C,(C) ; NEXT BINDING
\r
323 NOTMIN: MOVE C,$TCHSTR
\r
324 MOVE D,CHQUOTE NOT-YOUR-1STEPEE
\r
337 ; FUNCTION TO RETRUN THE MAIN PROCESS
\r
339 MFUNCTION MAIN%%,SUBR,MAIN
\r
343 MAIN1: MOVSI A,TPVP
\r
346 ; FUNCTION TO RETURN THE CURRENT PROCESS
\r
354 ; FUNCTION TO RETURN THE STATE OF A PROCESS
\r
356 MFUNCTION STATE,SUBR
\r
361 MOVE A,1(AB) ; GET PROCESS
\r
363 MOVE B,@STATES(A) ; GET STATE
\r
368 IRP A,,[ILLEGAL,RUNABLE,RESUMABLE,RUNNING,DEAD,BLOCKED]
\r