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
45 DOTCAL CORBLK,[[RDTP],[FME],B,[GCHI],A]
62 CTIME: .SUSET [.RRUNT,,B] ; Get user's run time in 4.069 microsecond units
67 FDVR B,[250000.00] ; Change to units of seconds
71 ; SET THE SNAME GLOBALLY
73 %SSNAM: .SUSET [.SSNAM,,A]
76 ; READ THE GLOBAL SNAME
78 %RSNAM: .SUSET [.RSNAM,,A]
81 ; KILL THE CURRENT JOB/LOGOUT
87 ; PASS STRING TO SUPERIOR (MONITOR?)
108 %RJNAM: .SUSET [.RJNAM,,%JNAM]
114 %RXJNA: .SUSET [.RXJNA,,%XJNA]
120 %RUNAM: .SUSET [.RUNAM,,%UNAM]
126 %RXUNA: .SUSET [.RXUNA,,%XUNA]
130 ; HERE TO SEE IF WE ARE A TOP LEVEL JOB
133 .SUSET [.RSUPPR,,A] ; READ SUPERIOR
134 SKIPGE A ; SKIP IF IT EXISTS
135 AOS -1(P) ; CAUSE SKIP RET
139 ; ERRORS IN COMPILED CODE MAY END UP HERE
141 CERR1: MOVE A,EQUOTE NTH-BY-A-NEGATIVE-NUMBER
145 CERR2: MOVE A,EQUOTE NTH-REST-PUT-OUT-OF-RANGE
149 CERR3: MOVE A,EQUOTE UVECTOR-PUT-TYPE-VIOLATION
153 MOVE A,EQUOTE ERROR-IN-COMPILED-CODE
163 ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR
167 MOVEI 0,(SIXBIT /USR/)
168 MOVEI A,0 ; USE SAME UNAME
169 MOVSI B,(SIXBIT /AGC/) ; IDENTIFY
171 ; ROUTINE TO SEE WHETHER MAPCHN IS ALREADY OPEN
177 SKIPN PSHGCF ; SKIP IF OPEN
179 .IOPUSH GCHN ; PUSH THE CHANNEL
180 MOVSI B,(SIXBIT /AGE/)
182 TRYOPN: HRLI 0,7 ; READ BLOCK OUTPUT
183 .OPEN GCHN,0 ; TRY IT
185 JRST GCJB1 ; OK, GET A PAGE
188 .OPEN GCHN,0 ; AND TRY AGAIN
189 AOJA B,TRYOPN ; TRY A NEW NAME
191 .UCLOSE GCHN, ; FLUSH JOB
192 .CLOSE GCHN, ; AND CHANNEL
196 GCJB1: HRLI 0,6 ; REOPEN IN READ
198 FATAL CAN'T REOPEN INFERIOR IN READ
199 POP P,A ; RET PAGE TO MAP AS 1ST
200 MOVEI B,FRNP ; SET UP FRONTEIR
201 PUSHJ P,%GETIP ; GET IT THERE
205 ; HERE TO WAIT A WHILE FOR CORE
209 ; HERE TO GET A PAGE FOR THE INFERIOR
211 %GETIP: DOTCAL CORBLK,[[WRTP],[GCHI],A,[CRJB]]
215 ; HERE TO PURIFY A STRUCTURE
217 %PURIF: DOTCAL CORBLK,[[RDTP],[FME],A,[FME],A]
218 FATAL UNABLE TO PURIFY STRUCTURE
221 ; HERE TO SHARE WINDOW
223 %SHWND: DOTCAL CORBLK,[[WRTP],[FME],B,[GCHI],A]
224 FATAL CANT SHARE INFERIOR PAGE
227 ; HERE TO CAUSE INFERIOR TO HOLD ONTO PURE CORE BEING FLUSHED
230 MOVE B,A ; COPY PAGE POINTER
231 DOTCAL CORBLK,[[RDTP],[GCHI],A,[FME],B]
232 FATAL CANT CAUSE INFERIOR TO SHARE ME
236 ; HERE TO GET BACK WHAT INFERIOR NOW HAS
240 DOTCAL CORBLK,[[RDTP],[FME],A,[GCHI],B]
241 FATAL CANT GET STUFF BACK
245 ; HERE TO MAP FROM AN INFERIOR TO A NEW BLOCK IN CORE
250 DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
254 ; HERE TO MAP FROM THE INFERIOR TO THE CORE IMAGE
256 %MPIN: DOTCAL CORBLK,[[WRTP],[FME],A,[GCHI],B]
257 FATAL CANT GET INFERIOR CORE BACK
260 ; HERE TO PROTECT CORE IMAGE
263 MOVEI 0,(SIXBIT /USR/)
264 MOVEI A,0 ; USE SAME UNAME
265 MOVSI B,(SIXBIT /AGD/) ; IDENTIFY
267 TRYOP1: HRLI 0,7 ; WRITE BLOCK OUTPUT
268 .OPEN GCHN,0 ; TRY IT
270 JRST GCJB2 ; OK, GET A PAGE
272 HRLI 0,6 ; CHANGE TO READ OPEN
273 .OPEN GCHN,0 ; AND TRY AGAIN
274 AOJA B,TRYOP1 ; TRY A NEW NAME
276 .UCLOSE GCHN, ; FLUSH JOB
277 .CLOSE GCHN, ; AND CHANNEL
281 GCJB2: MOVEM B,SAVNAM
283 %IMSAV: HRRZ 0,A ; SEE IF 0
286 ADD A,[1,,1] ; TO NEXT PAGE
287 .ACCESS GCHN,[20] ; ACCESS IN INF
291 PUSHJ P,%GETIP ; GET AROUND SYSTEM LOSSAGE CONCERNING THE FIRST PAGE
292 MOVE B,[-1760,,20] ; IOT INTO INFERIOR
297 DOTCAL CORBLK,[[WRTP],[GCHI],A,[FME],A]
298 FATAL UNABLE TO PROTECT CORE IMAGE
300 ; MAKE CORE IMAGE READ ONLY
303 DOTCAL CORBLK,[[RDTP],[FME],A,[FME],A]
307 ; MAP A PAGE INTO AGD INFERIOR IN READ ONLY MODE
308 ; PAGE NUMBER IS IN A
310 %MPRDO: DOTCAL CORBLK,[[RDTP],[GCHI],A,[FME],A]
315 ; HERE TO FIND A BUFFER PAGE FOR C/W HACK
317 %FDBUF: HRRZ A,PURBOT
318 SUB A,P.TOP ; CALCULATE ROOM FOR PROSPECTIVE BUFFER
319 CAIG A,2000 ; SEE IF ROOM
321 MOVE A,P.TOP ; START OF BUFFER
324 FDBUF1: SETOM BUFGC ; INDICATE NO BUFFER FOUND
327 ; HERE TO SIMULATE COPY ON WRITE. THIS ROUTINE TAKES A SOURCE PAGE IN A
328 ; AND A BUFFER PAGE IN B
330 %CWINF: PUSH P,A ; SAVE SOURCE ADDRESS
331 PUSH P,B ; SAVE BUFFER ADDRESS
332 ASH B,-10. ; TO PAGES
334 DOTCAL CORBLK,[[RDTP],[FME],B,[FME],A]
335 FATAL COPY-WRITE CORBLK FAILED
336 DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
338 HRLZ A,(P) ; GET START OF BUFFER
339 HRR A,-1(P) ; GET START OF SOURCE PAGE
340 EXCH B,-1(P) ; GET BEGINNING OF SOURCE PAGE
343 DOTCAL CORBLK,[[FLS],[FME],B]
344 FATAL CANT FLUSH BUFFER
345 SUB P,[2,,2] ; CLEAN OFF STACK
350 ; HERE TO PROTECT MUDDLES PURE SPACE
355 ; HERE TO CLOSE THE IMAGE SAVING INFERIOR WITHOUT KILLING IT
360 ; HERE TO OPEN AGD INFERIOR IN ORDER TO RESTORE CORE-IMAGE
362 %IFMP1: .IOPUSH GCHN ; PUSH CURRENT CONTENTS OF CHANNEL
365 MOVEI 0,(SIXBIT /USR/)
370 FATAL AGD INFERIOR LOST
375 ; HERE TO MAP IN A PURE PAGE FROM THE AGD INFERIOR
377 %LDRDO: DOTCAL CORBLK,[[RDTP],[FME],A,[GCHI],A]
383 ; HERE TO MAP IN FROM AGD INFERIOR AND KILL CORE IMAGE AS WELL
384 ; A HAS SOURCE PAGES AND B DESTINATION PAGES
386 %IFMP2: PUSHJ P,%INFMP
390 ;HERE TO KILL AN IMAGE SAVING INFERIOR
396 MOVEI 0,(SIXBIT /USR/)
401 FATAL AGD INFERIOR LOST
403 DOTCAL CORTYP,[A,,[2000,,B]]
404 FATAL CORBLK TO UNPURE PAGES FAILED
406 DOTCAL CORBLK,[[WRTP],[FME],A,[GCHI],A]
407 FATAL CORBLK TO UNPURE PAGES FAILED
422 ; HERE TO MAP INFERIOR BACK AND KILL SAME
424 %INFMP: PUSHJ P,%MPIN ; MAP IN IMAGE
427 SKIPE PSHGCF ; SKIP IF CHANNEL IS NOT PUSHED
430 INFMPX: .IOPOP GCHN ; HAVE MORE THAN ONE GC-INF OPEN IOPOP
435 ; USED TO MAP INFERIOR CONTAINING CORE IMAGE BACK IN AND KILL SAVE
437 %CLSMP: PUSHJ P,%GBINT
438 %CLSM1: .UCLOSE GCHN,
442 ; HACK TO PRINT MESSAGE OF INTEREST TO USER
444 MESOUT: MOVSI A,(JFCL)
445 MOVEM A,MESSAG ; DO ONLY ONCE
447 ADDI A,1777 ; MAKE SURE ON PAGE BOUNDRY
448 ASH A,-10. ; TO PAGES
449 MOVE B,VECTOP ; GET VECTOR
450 ADDI B,1777 ; PAGE AND ROUND
453 PUSHJ P,P.CORE ; GET CORE
455 SETZB SP,FRM ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP FIRST TIME
456 PUSHJ P,PGINT ; INITIALIZE PAGE MAP
458 PUSHJ P,%RSNAM ; GET SAVED SNAME
460 SKIPE NOTTY ; HAVE A TTY?
461 JRST RESNM ; NO, SKIP THIS STUFF
462 MOVE A,[SIXBIT /MUDSYS/]
464 MOVEI A,(SIXBIT /DSK/)
466 MOVE B,[SIXBIT /MUDDLE/]
467 MOVE C,[SIXBIT /MESSAG/]
470 MESSI: .IOT 0,A ; READ A CHAR
471 JUMPL A,MESCLS ; DONE, QUIT
472 CAIE A,14 ; DONT TYPE FF
473 PUSHJ P,MTYO ; AND TYPE IT OUT
474 JRST MESSI ; UNTIL DONE
478 RESNM: POP P,A ; GET SAVED SNAME BACK
479 PUSHJ P,%SSNAM ; AND SET IT BACK
482 MUDINT: MOVSI 0,(JFCL) ; CLOBBER MUDDLE INIT SWITCH
484 PUSHJ P,%RSNAM ; GET SNAME
485 CAMN A,[-1] ; NO SNAME ?
486 MOVE A,[SIXBIT /MUDSUB/] ; FOR DEMONS AND THE LIKE
487 PUSHJ P,6TOCHS ; TO STRING
493 PUSHJ P,SGSNAM ; SET TO GLOBAL
495 MOVEI A,(SIXBIT /DSK/)
496 MOVE C,[SIXBIT /INIT/]
497 SKIPN B,WHOAMI ; SKIP IF NOT A STRAIGHT MUDDLE
504 CAMN D,[SIXBIT /MUDSUB/]
506 .SUSET [.SSNAM,,[SIXBIT /MUDSUB/]]
510 PUSH TP,$TCHSTR ; ATTEMPT TO LOAD A MUDDLE INIT FILE
520 .SUSET [.RSNAM,,A] ; USE SNAME AROUND
526 CAIE 0,TCHAN ; DID THE CHANNEL OPEN ?
530 MOVEI B,INITSTR ; TELL USER WHAT'S HAPPENING
539 ; BLOCK TO OPEN SQUOZE TABLE
541 SQDIR: SIXBIT /MUDSAV/
543 SQBLK: SIXBIT / &DSK/
547 STMUDL: MOVE B,[SIXBIT /MUDDLE/]
550 IPCINI: PUSHJ P,IPCBLS
552 INITSTR: ASCIZ /MUDDLE INIT/
555 SAVNAM: 0 ; SAVED AGD INFERIOR NAME
559 MESSAG: PUSHJ P,MESOUT ; MESSAGE SWITCH
561 INITFL: PUSHJ P,MUDINT ; MUDDLE INIT SWITCH