Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / mudits.mcr130.1
diff --git a/<mdl.int>/mudits.mcr130.1 b/<mdl.int>/mudits.mcr130.1
new file mode 100644 (file)
index 0000000..055ee88
--- /dev/null
@@ -0,0 +1,566 @@
+
+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
+\f
+; 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
+\f\ 3\ 3\ 3
\ No newline at end of file