TITLE MUDITS -- ITS DEPENDANT MUDDLE CODE RELOCATABLE .INSRT MUDDLE > .GLOBAL %SSNAM,%RSNAM,%KILLM,%LOGOU,%SLEEP,%VALRE,NOTTY,DEMFLG,MSGTYP .GLOBAL %UNAM,%JNAM,%XUNA,%XJNA,%RUNAM,%RJNAM,%RXUNA,%RXJNA,%GCJB1,%VALFI .GLOBAL %GCJOB,%SHWND,%GETIP,%INFMP .GLOBAL GCHN,WNDP,FRNP,FRONT,MESSAG,INITFL,6TOCHS,SGSNAM,MTYO,PGINT,WHOAMI .GLOBAL %TOPLQ,IPCINI,IPCBLS,%HANG,CTIME,BFLOAT,GCRSET,%MPINT,%GBINT,%SAVIN .GLOBAL %MPIN,%MPINX,%CLSMP,%CLSM1,%MPIN1,%IMSAV,%IMSV1,%PURIF,PSHGCF .GLOBAL %CLSJB,%KILJB,%IFMP1,%OPGFX,%SAVRP,%RSTRP,%CWINF,%FDBUF,BUFGC,P.TOP,P.CORE .GLOBAL PURBOT,SQUPNT,GETSQU,DIR,%LDRDO,%MPRDO,%IFMP2,SQBLK,SQDIR .GLOBAL CERR1,CERR2,CERR3,COMPERR,CALER,CALER1,SQLOD,SQKIL,SLEEPR,GETBUF,KILBUF GCHN==0 CWTP==1000,,4000 RDTP==1000,,200000 WRTP==1000,,100000 GCHI==1000,,GCHN CRJB==1000,,400001 FME==1000,,-1 FLS==1000,, %RSTRP: %OPGFX: %SAVRP: POPJ P, SQLOD: MOVEI A,1 ; NUMBER OF PAGES OF BUFFER PUSHJ P,GETBUF HRRM B,SQUPNT ASH B,-10. ; TO PAGES .SUSET [.RSNAM,,A] ; OPEN FILE TO SQUOZE TABLE .SUSET [.SSNAM,,SQDIR] ; SET SNAME .OPEN GCHN,SQBLK FATAL SQUOZE TABLE NON EXISTANT .SUSET [.SSNAM,,A] MOVEI A,0 DOTCAL CORBLK,[[RDTP],[FME],B,[GCHI],A] PUSHJ P,SLEEPR .CLOSE GCHN, MOVE A,B ; GET B ASH A,10. POPJ P, SQKIL: PUSHJ P,KILBUF HLLZS SQUPNT POPJ P, GETSQU: HRRZ 0,SQUPNT JUMPN 0,ATSQ10 JRST SQLOD ATSQ10: POPJ P, CTIME: .SUSET [.RRUNT,,B] ; Get user's run time in 4.069 microsecond units IDIVI B,400000 FSC C,233 FSC B,254 FADR B,C FDVR B,[250000.00] ; Change to units of seconds MOVSI A,TFLOAT POPJ P, ; SET THE SNAME GLOBALLY %SSNAM: .SUSET [.SSNAM,,A] POPJ P, ; READ THE GLOBAL SNAME %RSNAM: .SUSET [.RSNAM,,A] POPJ P, ; KILL THE CURRENT JOB/LOGOUT %LOGOU: %KILLM: .LOGOUT 1, POPJ P, ; PASS STRING TO SUPERIOR (MONITOR?) %VALRE: .VALUE (A) POPJ P, ; DO 'KILL' %VALFI: .BREAK 16,(A) POPJ P, ; GO TO SLEEP A WHILE %SLEEP: .SLEEP A, POPJ P, ; HANG FOREVER %HANG: SKIP .HANG ; READ JNAME %RJNAM: .SUSET [.RJNAM,,%JNAM] MOVE A,%JNAM POPJ P, ; READ XJNAME %RXJNA: .SUSET [.RXJNA,,%XJNA] MOVE A,%XJNA POPJ P, ; READ UNAME %RUNAM: .SUSET [.RUNAM,,%UNAM] MOVE A,%UNAM POPJ P, ; READ XUNAME %RXUNA: .SUSET [.RXUNA,,%XUNA] MOVE A,%XUNA POPJ P, ; HERE TO SEE IF WE ARE A TOP LEVEL JOB %TOPLQ: PUSH P,A .SUSET [.RSUPPR,,A] ; READ SUPERIOR SKIPGE A ; SKIP IF IT EXISTS AOS -1(P) ; CAUSE SKIP RET POP P,A POPJ P, ; ERRORS IN COMPILED CODE MAY END UP HERE CERR1: MOVE A,EQUOTE NTH-BY-A-NEGATIVE-NUMBER .SUSET [.RJPC,,B] JRST CERR CERR2: MOVE A,EQUOTE NTH-REST-PUT-OUT-OF-RANGE .SUSET [.RJPC,,B] JRST CERR CERR3: MOVE A,EQUOTE UVECTOR-PUT-TYPE-VIOLATION .SUSET [.RJPC,,B] COMPERR: MOVE A,EQUOTE ERROR-IN-COMPILED-CODE .SUSET [.RJPC,,B] CERR: PUSH TP,$TATOM PUSH TP,A PUSH TP,$TWORD PUSH TP,B MOVEI A,2 JRST CALER ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR %GCJB1: %GCJOB: PUSH P,A PUSH P,D MOVEI 0,(SIXBIT /USR/) MOVEI A,0 ; USE SAME UNAME MOVSI B,(SIXBIT /AGC/) ; IDENTIFY ; ROUTINE TO SEE WHETHER MAPCHN IS ALREADY OPEN .STATUS GCHN,D ANDI D,77 MOVEM D,PSHGCF POP P,D SKIPN PSHGCF ; SKIP IF OPEN JRST TRYOPN .IOPUSH GCHN ; PUSH THE CHANNEL MOVSI B,(SIXBIT /AGE/) TRYOPN: HRLI 0,7 ; READ BLOCK OUTPUT .OPEN GCHN,0 ; TRY IT JRST .+2 JRST GCJB1 ; OK, GET A PAGE HRLI 0,6 .OPEN GCHN,0 ; AND TRY AGAIN AOJA B,TRYOPN ; TRY A NEW NAME .UCLOSE GCHN, ; FLUSH JOB .CLOSE GCHN, ; AND CHANNEL AOJA B,TRYOPN GCJB1: HRLI 0,6 ; REOPEN IN READ .OPEN GCHN,0 FATAL CAN'T REOPEN INFERIOR IN READ POP P,A ; RET PAGE TO MAP AS 1ST MOVEI B,FRNP ; SET UP FRONTEIR PUSHJ P,%GETIP ; GET IT THERE PUSHJ P,%SHWND POPJ P, ; HERE TO WAIT A WHILE FOR CORE ; HERE TO GET A PAGE FOR THE INFERIOR %GETIP: DOTCAL CORBLK,[[WRTP],[GCHI],A,[CRJB]] PUSHJ P,SLEEPR POPJ P, ; HERE TO PURIFY A STRUCTURE %PURIF: DOTCAL CORBLK,[[RDTP],[FME],A,[FME],A] FATAL UNABLE TO PURIFY STRUCTURE POPJ P, ; HERE TO SHARE WINDOW %SHWND: DOTCAL CORBLK,[[WRTP],[FME],B,[GCHI],A] FATAL CANT SHARE INFERIOR PAGE POPJ P, ; HERE TO CAUSE INFERIOR TO HOLD ONTO PURE CORE BEING FLUSHED %MPINT: PUSH P,B MOVE B,A ; COPY PAGE POINTER DOTCAL CORBLK,[[RDTP],[GCHI],A,[FME],B] FATAL CANT CAUSE INFERIOR TO SHARE ME POP P,B POPJ P, ; HERE TO GET BACK WHAT INFERIOR NOW HAS %GBINT: PUSH P,B MOVE B,A DOTCAL CORBLK,[[RDTP],[FME],A,[GCHI],B] FATAL CANT GET STUFF BACK POP P,B POPJ P, ; HERE TO MAP FROM AN INFERIOR TO A NEW BLOCK IN CORE %MPINX: %MPIN1: PUSH P,B EXCH A,B DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]] PUSHJ P,SLEEPR POP P,A ; HERE TO MAP FROM THE INFERIOR TO THE CORE IMAGE %MPIN: DOTCAL CORBLK,[[WRTP],[FME],A,[GCHI],B] FATAL CANT GET INFERIOR CORE BACK POPJ P, ; HERE TO PROTECT CORE IMAGE %SAVIN: PUSH P,A MOVEI 0,(SIXBIT /USR/) MOVEI A,0 ; USE SAME UNAME MOVSI B,(SIXBIT /AGD/) ; IDENTIFY TRYOP1: HRLI 0,7 ; WRITE BLOCK OUTPUT .OPEN GCHN,0 ; TRY IT JRST .+2 JRST GCJB2 ; OK, GET A PAGE HRLI 0,6 ; CHANGE TO READ OPEN .OPEN GCHN,0 ; AND TRY AGAIN AOJA B,TRYOP1 ; TRY A NEW NAME .UCLOSE GCHN, ; FLUSH JOB .CLOSE GCHN, ; AND CHANNEL AOJA B,TRYOP1 GCJB2: MOVEM B,SAVNAM POP P,A %IMSAV: HRRZ 0,A ; SEE IF 0 CAIE 0,0 JRST IMSAV1 ADD A,[1,,1] ; TO NEXT PAGE .ACCESS GCHN,[20] ; ACCESS IN INF PUSH P,B PUSH P,A MOVEI A,0 PUSHJ P,%GETIP ; GET AROUND SYSTEM LOSSAGE CONCERNING THE FIRST PAGE MOVE B,[-1760,,20] ; IOT INTO INFERIOR .IOT GCHN,B POP P,A POP P,B IMSAV1: MOVE M,A DOTCAL CORBLK,[[WRTP],[GCHI],A,[FME],A] FATAL UNABLE TO PROTECT CORE IMAGE IMSAV2: ; MAKE CORE IMAGE READ ONLY MOVE A,M ; RESTORE A DOTCAL CORBLK,[[RDTP],[FME],A,[FME],A] FATAL CORBLK FAILED POPJ P, ; MAP A PAGE INTO AGD INFERIOR IN READ ONLY MODE ; PAGE NUMBER IS IN A %MPRDO: DOTCAL CORBLK,[[RDTP],[GCHI],A,[FME],A] FATAL CORBLK FAILED POPJ P, ; HERE TO FIND A BUFFER PAGE FOR C/W HACK %FDBUF: HRRZ A,PURBOT SUB A,P.TOP ; CALCULATE ROOM FOR PROSPECTIVE BUFFER CAIG A,2000 ; SEE IF ROOM JRST FDBUF1 MOVE A,P.TOP ; START OF BUFFER HRRM A,BUFGC POPJ P, FDBUF1: SETOM BUFGC ; INDICATE NO BUFFER FOUND POPJ P, ; HERE TO SIMULATE COPY ON WRITE. THIS ROUTINE TAKES A SOURCE PAGE IN A ; AND A BUFFER PAGE IN B %CWINF: PUSH P,A ; SAVE SOURCE ADDRESS PUSH P,B ; SAVE BUFFER ADDRESS ASH B,-10. ; TO PAGES ASH A,-10. DOTCAL CORBLK,[[RDTP],[FME],B,[FME],A] FATAL COPY-WRITE CORBLK FAILED DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]] PUSHJ P,SLEEPR HRLZ A,(P) ; GET START OF BUFFER HRR A,-1(P) ; GET START OF SOURCE PAGE EXCH B,-1(P) ; GET BEGINNING OF SOURCE PAGE BLT A,1777(B) MOVE B,-1(P) DOTCAL CORBLK,[[FLS],[FME],B] FATAL CANT FLUSH BUFFER SUB P,[2,,2] ; CLEAN OFF STACK POPJ P, ; EXIT ; HERE TO PROTECT MUDDLES PURE SPACE %IMSV1: MOVE M,A PUSHJ P,%MPINT POPJ P, ; HERE TO CLOSE THE IMAGE SAVING INFERIOR WITHOUT KILLING IT %CLSJB: .CLOSE GCHN, POPJ P, ; HERE TO OPEN AGD INFERIOR IN ORDER TO RESTORE CORE-IMAGE %IFMP1: .IOPUSH GCHN ; PUSH CURRENT CONTENTS OF CHANNEL PUSH P,A ; SAVE AC'S PUSH P,B MOVEI 0,(SIXBIT /USR/) MOVEI A,0 MOVE B,SAVNAM HRLI 0,6 .OPEN GCHN,0 FATAL AGD INFERIOR LOST POP P,A POP P,B POPJ P, ; HERE TO MAP IN A PURE PAGE FROM THE AGD INFERIOR %LDRDO: DOTCAL CORBLK,[[RDTP],[FME],A,[GCHI],A] FATAL CORBLK FAILED POPJ P, ; HERE TO MAP IN FROM AGD INFERIOR AND KILL CORE IMAGE AS WELL ; A HAS SOURCE PAGES AND B DESTINATION PAGES %IFMP2: PUSHJ P,%INFMP .IOPOP GCHN POPJ P, ;HERE TO KILL AN IMAGE SAVING INFERIOR %KILJB: .IOPUSH GCHN PUSH P,0 PUSH P,B PUSH P,C PUSH P,A MOVEI 0,(SIXBIT /USR/) MOVE B,SAVNAM HRLI 0,6 MOVEI A,0 .OPEN GCHN,0 FATAL AGD INFERIOR LOST CKPGU: HRRZ A,(P) DOTCAL CORTYP,[A,,[2000,,B]] FATAL CORBLK TO UNPURE PAGES FAILED JUMPL B,PGW DOTCAL CORBLK,[[WRTP],[FME],A,[GCHI],A] FATAL CORBLK TO UNPURE PAGES FAILED PGW: POP P,A ADD A,[1,,1] SKIPL A JRST KILIT PUSH P,A ; REPUSH A JRST CKPGU KILIT: .UCLOS GCHN, .CLOSE GCHN, POP P,C POP P,B POP P,0 .IOPOP GCHN POPJ P, ; HERE TO MAP INFERIOR BACK AND KILL SAME %INFMP: PUSHJ P,%MPIN ; MAP IN IMAGE .UCLOSE GCHN, .CLOSE GCHN, SKIPE PSHGCF ; SKIP IF CHANNEL IS NOT PUSHED JRST INFMPX POPJ P, INFMPX: .IOPOP GCHN ; HAVE MORE THAN ONE GC-INF OPEN IOPOP SETZM PSHGCF POPJ P, ; USED TO MAP INFERIOR CONTAINING CORE IMAGE BACK IN AND KILL SAVE %CLSMP: PUSHJ P,%GBINT %CLSM1: .UCLOSE GCHN, .CLOSE GCHN, POPJ P, ; HACK TO PRINT MESSAGE OF INTEREST TO USER MESOUT: MOVSI A,(JFCL) MOVEM A,MESSAG ; DO ONLY ONCE MOVE A,P.TOP ADDI A,1777 ; MAKE SURE ON PAGE BOUNDRY ASH A,-10. ; TO PAGES MOVE B,VECTOP ; GET VECTOR ADDI B,1777 ; PAGE AND ROUND ANDCMI B,1777 MOVEM B,P.TOP PUSHJ P,P.CORE ; GET CORE JFCL SETZB SP,FRM ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP FIRST TIME PUSHJ P,PGINT ; INITIALIZE PAGE MAP PUSHJ P,GCRSET PUSHJ P,%RSNAM ; GET SAVED SNAME PUSH P,A ; SAVE IT SKIPE NOTTY ; HAVE A TTY? JRST RESNM ; NO, SKIP THIS STUFF MOVE A,[SIXBIT /MUDSYS/] PUSHJ P,%SSNAM MOVEI A,(SIXBIT /DSK/) SKIPN B,WHOAMI MOVE B,[SIXBIT /MUDDLE/] MOVE C,[SIXBIT /MESSAG/] .OPEN 0,A JRST RESNM MESSI: .IOT 0,A ; READ A CHAR JUMPL A,MESCLS ; DONE, QUIT CAIE A,14 ; DONT TYPE FF PUSHJ P,MTYO ; AND TYPE IT OUT JRST MESSI ; UNTIL DONE MESCLS: .CLOSE 0, RESNM: POP P,A ; GET SAVED SNAME BACK PUSHJ P,%SSNAM ; AND SET IT BACK RESNM1: POPJ P, MUDINT: MOVSI 0,(JFCL) ; CLOBBER MUDDLE INIT SWITCH MOVEM 0,INITFL PUSHJ P,%RSNAM ; GET SNAME CAMN A,[-1] ; NO SNAME ? MOVE A,[SIXBIT /MUDSUB/] ; FOR DEMONS AND THE LIKE PUSHJ P,6TOCHS ; TO STRING PUSH TP,$TATOM PUSH TP,IMQUOTE SNM PUSH TP,A PUSH TP,B MCALL 2,SETG PUSHJ P,SGSNAM ; SET TO GLOBAL MOVE E,A ; SAVE IN E MOVEI A,(SIXBIT /DSK/) MOVE C,[SIXBIT /INIT/] SKIPN B,WHOAMI ; SKIP IF NOT A STRAIGHT MUDDLE JRST STMUDL .OPEN 0,A SKIPA D,E JRST MUDIN1 CAMN D,[SIXBIT /MUDSUB/] POPJ P, .SUSET [.SSNAM,,[SIXBIT /MUDSUB/]] MUDIN2: .OPEN 0,A POPJ P, MUDIN1: .CLOSE 0, PUSH TP,$TCHSTR ; ATTEMPT TO LOAD A MUDDLE INIT FILE PUSH TP,CHQUOTE READ MOVE A,B PUSHJ P,6TOCHS PUSH TP,A PUSH TP,B PUSH TP,$TCHSTR PUSH TP,CHQUOTE INIT PUSH TP,$TCHSTR PUSH TP,CHQUOTE DSK .SUSET [.RSNAM,,A] ; USE SNAME AROUND PUSHJ P,6TOCHS PUSH TP,A PUSH TP,B MCALL 5,FOPEN GETYP 0,A CAIE 0,TCHAN ; DID THE CHANNEL OPEN ? POPJ P, ; NO, RETURN PUSH TP,A PUSH TP,B MOVEI B,INITSTR ; TELL USER WHAT'S HAPPENING SKIPE WHOAMI JRST .+3 SKIPN NOTTY PUSHJ P,MSGTYP MCALL 1,MLOAD POPJ P, ; BLOCK TO OPEN SQUOZE TABLE SQDIR: SIXBIT /MUDSAV/ SQBLK: SIXBIT / &DSK/ SIXBIT /SQUOZE/ SIXBIT /TABLE/ STMUDL: MOVE B,[SIXBIT /MUDDLE/] JRST MUDIN2 IPCINI: PUSHJ P,IPCBLS INITSTR: ASCIZ /MUDDLE INIT/ IMPURE SAVNAM: 0 ; SAVED AGD INFERIOR NAME DEMFLG: 0 MESSAG: PUSHJ P,MESOUT ; MESSAGE SWITCH INITFL: PUSHJ P,MUDINT ; MUDDLE INIT SWITCH PURE END