2 TITLE MUDITS -- ITS DEPENDANT MUDDLE CODE
9 .GLOBAL %SSNAM,%RSNAM,%KILLM,%LOGOU,%SLEEP,%VALRE,NOTTY,DEMFLG,MSGTYP
10 .GLOBAL %UNAM,%JNAM,%XUNA,%XJNA,%RUNAM,%RJNAM,%RXUNA,%RXJNA,%GCJB1,%VALFI
11 .GLOBAL %GCJOB,%SHWND,%GETIP,%INFMP
12 .GLOBAL GCHN,WNDP,FRNP,FRONT,MESSAG,INITFL,6TOCHS,SGSNAM,MTYO,PGINT,WHOAMI
13 .GLOBAL %TOPLQ,IPCINI,IPCBLS,%HANG,CTIME,BFLOAT,GCRSET,%MPINT,%GBINT,%SAVIN
14 .GLOBAL %MPIN,%MPINX,%CLSMP,%CLSM1,%MPIN1,%IMSAV,%IMSV1,%PURIF,PSHGCF
15 .GLOBAL %CLSJB,%KILJB,%IFMP1,%OPGFX,%SAVRP,%RSTRP,%CWINF,%FDBUF,BUFGC,P.TOP,P.CORE
16 .GLOBAL PURBOT,SQUPNT,GETSQU,DIR,%LDRDO,%MPRDO,%IFMP2,SQBLK,SQDIR
17 .GLOBAL CERR1,CERR2,CERR3,COMPERR,CALER,CALER1,SQLOD,SQKIL,SLEEPR,GETBUF,KILBUF
35 SQLOD: MOVEI A,1 ; NUMBER OF PAGES OF BUFFER
39 .SUSET [.RSNAM,,A] ; OPEN FILE TO SQUOZE TABLE
40 .SUSET [.SSNAM,,SQDIR] ; SET SNAME
42 FATAL SQUOZE TABLE NON EXISTANT
44 DOTCAL FILLEN,[[GCHI],[2000,,A]]
45 .LOSE %LSFIL ;PRESUMABLY LOSSAGE MATTERS
49 DOTCAL CORBLK,[[RDTP],[FME],B,[GCHI],A]
66 CTIME: .SUSET [.RRUNT,,B] ; Get user's run time in 4.069 microsecond units
71 FDVR B,[250000.00] ; Change to units of seconds
75 ; SET THE SNAME GLOBALLY
77 %SSNAM: .SUSET [.SSNAM,,A]
80 ; READ THE GLOBAL SNAME
82 %RSNAM: .SUSET [.RSNAM,,A]
85 ; KILL THE CURRENT JOB/LOGOUT
91 ; PASS STRING TO SUPERIOR (MONITOR?)
100 ; GO TO SLEEP A WHILE
112 %RJNAM: .SUSET [.RJNAM,,%JNAM]
118 %RXJNA: .SUSET [.RXJNA,,%XJNA]
124 %RUNAM: .SUSET [.RUNAM,,%UNAM]
130 %RXUNA: .SUSET [.RXUNA,,%XUNA]
134 ; HERE TO SEE IF WE ARE A TOP LEVEL JOB
137 .SUSET [.RSUPPR,,A] ; READ SUPERIOR
138 SKIPGE A ; SKIP IF IT EXISTS
139 AOS -1(P) ; CAUSE SKIP RET
143 ; ERRORS IN COMPILED CODE MAY END UP HERE
145 CERR1: MOVE A,EQUOTE NTH-BY-A-NEGATIVE-NUMBER
149 CERR2: MOVE A,EQUOTE NTH-REST-PUT-OUT-OF-RANGE
153 CERR3: MOVE A,EQUOTE UVECTOR-PUT-TYPE-VIOLATION
157 MOVE A,EQUOTE ERROR-IN-COMPILED-CODE
167 ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR
171 MOVEI 0,(SIXBIT /USR/)
172 MOVEI A,0 ; USE SAME UNAME
173 MOVSI B,(SIXBIT /AGC/) ; IDENTIFY
175 ; ROUTINE TO SEE WHETHER MAPCHN IS ALREADY OPEN
181 SKIPN PSHGCF ; SKIP IF OPEN
183 .IOPUSH GCHN ; PUSH THE CHANNEL
184 MOVSI B,(SIXBIT /AGE/)
186 TRYOPN: HRLI 0,7 ; READ BLOCK OUTPUT
187 .OPEN GCHN,0 ; TRY IT
189 JRST GCJB1 ; OK, GET A PAGE
192 .OPEN GCHN,0 ; AND TRY AGAIN
193 AOJA B,TRYOPN ; TRY A NEW NAME
195 .UCLOSE GCHN, ; FLUSH JOB
196 .CLOSE GCHN, ; AND CHANNEL
200 GCJB1: HRLI 0,6 ; REOPEN IN READ
202 FATAL CAN'T REOPEN INFERIOR IN READ
203 POP P,A ; RET PAGE TO MAP AS 1ST
204 MOVEI B,FRNP ; SET UP FRONTEIR
205 PUSHJ P,%GETIP ; GET IT THERE
209 ; HERE TO WAIT A WHILE FOR CORE
213 ; HERE TO GET A PAGE FOR THE INFERIOR
215 %GETIP: DOTCAL CORBLK,[[WRTP],[GCHI],A,[CRJB]]
219 ; HERE TO PURIFY A STRUCTURE
221 %PURIF: DOTCAL CORBLK,[[RDTP],[FME],A,[FME],A]
222 FATAL UNABLE TO PURIFY STRUCTURE
225 ; HERE TO SHARE WINDOW
227 %SHWND: DOTCAL CORBLK,[[WRTP],[FME],B,[GCHI],A]
228 FATAL CANT SHARE INFERIOR PAGE
231 ; HERE TO CAUSE INFERIOR TO HOLD ONTO PURE CORE BEING FLUSHED
234 MOVE B,A ; COPY PAGE POINTER
235 DOTCAL CORBLK,[[RDTP],[GCHI],A,[FME],B]
236 FATAL CANT CAUSE INFERIOR TO SHARE ME
240 ; HERE TO GET BACK WHAT INFERIOR NOW HAS
244 DOTCAL CORBLK,[[RDTP],[FME],A,[GCHI],B]
245 FATAL CANT GET STUFF BACK
249 ; HERE TO MAP FROM AN INFERIOR TO A NEW BLOCK IN CORE
254 DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
258 ; HERE TO MAP FROM THE INFERIOR TO THE CORE IMAGE
260 %MPIN: DOTCAL CORBLK,[[WRTP],[FME],A,[GCHI],B]
261 FATAL CANT GET INFERIOR CORE BACK
264 ; HERE TO PROTECT CORE IMAGE
267 MOVEI 0,(SIXBIT /USR/)
268 MOVEI A,0 ; USE SAME UNAME
269 MOVSI B,(SIXBIT /AGD/) ; IDENTIFY
271 TRYOP1: HRLI 0,7 ; WRITE BLOCK OUTPUT
272 .OPEN GCHN,0 ; TRY IT
274 JRST GCJB2 ; OK, GET A PAGE
276 HRLI 0,6 ; CHANGE TO READ OPEN
277 .OPEN GCHN,0 ; AND TRY AGAIN
278 AOJA B,TRYOP1 ; TRY A NEW NAME
280 .UCLOSE GCHN, ; FLUSH JOB
281 .CLOSE GCHN, ; AND CHANNEL
285 GCJB2: MOVEM B,SAVNAM
287 %IMSAV: HRRZ 0,A ; SEE IF 0
290 ADD A,[1,,1] ; TO NEXT PAGE
291 .ACCESS GCHN,[20] ; ACCESS IN INF
295 PUSHJ P,%GETIP ; GET AROUND SYSTEM LOSSAGE CONCERNING THE FIRST PAGE
296 MOVE B,[-1760,,20] ; IOT INTO INFERIOR
301 DOTCAL CORBLK,[[WRTP],[GCHI],A,[FME],A]
302 FATAL UNABLE TO PROTECT CORE IMAGE
304 ; MAKE CORE IMAGE READ ONLY
307 DOTCAL CORBLK,[[RDTP],[FME],A,[FME],A]
311 ; MAP A PAGE INTO AGD INFERIOR IN READ ONLY MODE
312 ; PAGE NUMBER IS IN A
314 %MPRDO: DOTCAL CORBLK,[[RDTP],[GCHI],A,[FME],A]
319 ; HERE TO FIND A BUFFER PAGE FOR C/W HACK
321 %FDBUF: HRRZ A,PURBOT
322 SUB A,P.TOP ; CALCULATE ROOM FOR PROSPECTIVE BUFFER
323 CAIG A,2000 ; SEE IF ROOM
325 MOVE A,P.TOP ; START OF BUFFER
328 FDBUF1: SETOM BUFGC ; INDICATE NO BUFFER FOUND
331 ; HERE TO SIMULATE COPY ON WRITE. THIS ROUTINE TAKES A SOURCE PAGE IN A
332 ; AND A BUFFER PAGE IN B
334 %CWINF: PUSH P,A ; SAVE SOURCE ADDRESS
335 PUSH P,B ; SAVE BUFFER ADDRESS
336 ASH B,-10. ; TO PAGES
338 DOTCAL CORBLK,[[RDTP],[FME],B,[FME],A]
339 FATAL COPY-WRITE CORBLK FAILED
340 DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
342 HRLZ A,(P) ; GET START OF BUFFER
343 HRR A,-1(P) ; GET START OF SOURCE PAGE
344 EXCH B,-1(P) ; GET BEGINNING OF SOURCE PAGE
347 DOTCAL CORBLK,[[FLS],[FME],B]
348 FATAL CANT FLUSH BUFFER
349 SUB P,[2,,2] ; CLEAN OFF STACK
354 ; HERE TO PROTECT MUDDLES PURE SPACE
359 ; HERE TO CLOSE THE IMAGE SAVING INFERIOR WITHOUT KILLING IT
364 ; HERE TO OPEN AGD INFERIOR IN ORDER TO RESTORE CORE-IMAGE
366 %IFMP1: .IOPUSH GCHN ; PUSH CURRENT CONTENTS OF CHANNEL
369 MOVEI 0,(SIXBIT /USR/)
374 FATAL AGD INFERIOR LOST
379 ; HERE TO MAP IN A PURE PAGE FROM THE AGD INFERIOR
381 %LDRDO: DOTCAL CORBLK,[[RDTP],[FME],A,[GCHI],A]
387 ; HERE TO MAP IN FROM AGD INFERIOR AND KILL CORE IMAGE AS WELL
388 ; A HAS SOURCE PAGES AND B DESTINATION PAGES
390 %IFMP2: PUSHJ P,%INFMP
394 ;HERE TO KILL AN IMAGE SAVING INFERIOR
400 MOVEI 0,(SIXBIT /USR/)
405 FATAL AGD INFERIOR LOST
407 DOTCAL CORTYP,[A,,[2000,,B]]
408 FATAL CORBLK TO UNPURE PAGES FAILED
410 DOTCAL CORBLK,[[WRTP],[FME],A,[GCHI],A]
411 FATAL CORBLK TO UNPURE PAGES FAILED
426 ; HERE TO MAP INFERIOR BACK AND KILL SAME
428 %INFMP: PUSHJ P,%MPIN ; MAP IN IMAGE
431 SKIPE PSHGCF ; SKIP IF CHANNEL IS NOT PUSHED
434 INFMPX: .IOPOP GCHN ; HAVE MORE THAN ONE GC-INF OPEN IOPOP
439 ; USED TO MAP INFERIOR CONTAINING CORE IMAGE BACK IN AND KILL SAVE
441 %CLSMP: PUSHJ P,%GBINT
442 %CLSM1: .UCLOSE GCHN,
446 ; HACK TO PRINT MESSAGE OF INTEREST TO USER
448 MESOUT: MOVSI A,(JFCL)
449 MOVEM A,MESSAG ; DO ONLY ONCE
451 ADDI A,1777 ; MAKE SURE ON PAGE BOUNDRY
452 ASH A,-10. ; TO PAGES
453 MOVE B,VECTOP ; GET VECTOR
454 ADDI B,1777 ; PAGE AND ROUND
457 PUSHJ P,P.CORE ; GET CORE
459 SETZB SP,FRM ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP FIRST TIME
460 PUSHJ P,PGINT ; INITIALIZE PAGE MAP
462 PUSHJ P,%RSNAM ; GET SAVED SNAME
464 SKIPE NOTTY ; HAVE A TTY?
465 JRST RESNM ; NO, SKIP THIS STUFF
466 MOVE A,[SIXBIT /MUDSYS/]
468 MOVEI A,(SIXBIT /DSK/)
470 MOVE B,[SIXBIT /MUDDLE/]
471 MOVE C,[SIXBIT /MESSAG/]
474 MESSI: .IOT 0,A ; READ A CHAR
475 JUMPL A,MESCLS ; DONE, QUIT
476 CAIE A,14 ; DONT TYPE FF
477 PUSHJ P,MTYO ; AND TYPE IT OUT
478 JRST MESSI ; UNTIL DONE
482 RESNM: POP P,A ; GET SAVED SNAME BACK
483 PUSHJ P,%SSNAM ; AND SET IT BACK
486 MUDINT: MOVSI 0,(JFCL) ; CLOBBER MUDDLE INIT SWITCH
488 PUSHJ P,%RSNAM ; GET SNAME
489 CAMN A,[-1] ; NO SNAME ?
490 MOVE A,[SIXBIT /MUDSUB/] ; FOR DEMONS AND THE LIKE
491 PUSHJ P,6TOCHS ; TO STRING
497 PUSHJ P,SGSNAM ; SET TO GLOBAL
499 MOVEI A,(SIXBIT /DSK/)
500 MOVE C,[SIXBIT /INIT/]
501 SKIPN B,WHOAMI ; SKIP IF NOT A STRAIGHT MUDDLE
508 CAMN D,[SIXBIT /MUDSUB/]
510 .SUSET [.SSNAM,,[SIXBIT /MUDSUB/]]
514 PUSH TP,$TCHSTR ; ATTEMPT TO LOAD A MUDDLE INIT FILE
524 .SUSET [.RSNAM,,A] ; USE SNAME AROUND
530 CAIE 0,TCHAN ; DID THE CHANNEL OPEN ?
534 MOVEI B,INITSTR ; TELL USER WHAT'S HAPPENING
543 ; BLOCK TO OPEN SQUOZE TABLE
545 SQDIR: SIXBIT /MUDSAV/
547 SQBLK: SIXBIT / &DSK/
551 STMUDL: MOVE B,[SIXBIT /MUDDLE/]
554 IPCINI: PUSHJ P,IPCBLS
556 INITSTR: ASCIZ /MUDDLE INIT/
559 SAVNAM: 0 ; SAVED AGD INFERIOR NAME
563 MESSAG: PUSHJ P,MESOUT ; MESSAGE SWITCH
565 INITFL: PUSHJ P,MUDINT ; MUDDLE INIT SWITCH