TITLE NEWIML IF1,[PRINTC /2ND NAME OF TS FILE: / .TTYMAC A TS2NM=SIXBIT /A/ TERMIN PRINTC /SNAME OF TS FILE: / .TTYMAC A TSSNM=SIXBIT /A/ TERMIN ] .MLLIT=1 F=0 A=1 B=2 C=3 D=4 E=5 U=6 X=7 UIND=10 BUF=11 CNT=12 FROBOZ=13 RET=15 UP=16 P=17 .INSRT SYSENG;FSDEFS > TTYI==1 TTYO==2 TYOC==0 DSKI==3 DSKO==4 ; DECREMENT BYTE POINTER DEFINE DBP AC ADD AC,[70000,,] TLNE AC,400000 ADD AC,[347777,,-1] TERMIN DEFINE SYMS LIST IRPS FOOBAR,,[LIST] FOOBAR: 0 ZZZ==. LOC VARNAM SQUOZE 0,FOOBAR VARNAM==VARNAM+1 LOC ZZZ TERMIN TERMIN DEFINE MM,B MOVE A,[SIXBIT B] TERMIN DEFINE OSIX NAME MOVE NAME PUSHJ P,UOSIX TERMIN DEFINE OASCI CHR MOVEI FROBOZ,CHR JSP RET,IOTA TERMIN DEFINE ODEC NUM MOVE NUM PUSHJ P,UODEC TERMIN DEFINE OOCT NUM MOVE NUM PUSHJ P,UOOCT TERMIN LINELN==56. ZZZ==. LOC 41 JSR UUOH JSR TSINT LOC 50 PDL: BLOCK 20. -1 UPDL: BLOCK 4 LOC ZZZ BASE: 0 JCL: BLOCK 3 JCLINP: 0 ; SYSTEM MEMORY INST'S PSMEMB: MOVE A,@TRUMM SUB A,@AUSOPG ODEC A OASCI "/ ODEC @TRUMM OASCI 40 POPJ P, BLOCK 5 LINE: BLOCK LINELN DIRECT: 0 FNAME1: 0 FNAME2: 0 TTYFLG: 0 ; IF WATCHING A TTY WHOIND: 0 GETSW: 0 INCORE: -1 FILPRT: -1 SECPRT: 0 DATPRT: 0 INFER: 0 PRSIST: 0 FORGET: -1 TAAMOD: 0 SUBTTL SYSTEM VARIABLES VARNAM==4000 FLWDTS=VARNAM FLWDT: SYMS [LUBLK:NQCHN] LFWDT==.-FLWDT NXTABS=VARNAM NXTAB: SYMS [AUSOPG:RNABLU:TRUMM:USRHI:NPGSWO:TIME] LNXTAB==.-NXTAB USERTS=VARNAM USERT: SYMS [JNAME:USTP:UNAME:XUNAME:USYSNM:UTMPTR:UTRNTM:QSNUD:QSNLCN:IDF1: IDF2:USWST:USWSCD:FLSINS:UPC:JTMU:UUAC:LSCALL:SV40:RPCL:NMPGS:NSWPGS:PICLR APRC:TTYTBL:SUPPRO] LUSRT==.-USERT CXTABS=VARNAM CXTAB: SYMS [QUSR:QUDPR:QUDFPR:QSMPRP:QSMDN:QSBYTE:QDSKN:QFBLNO:QSCRW:QSRAC: AC0S:IOCHNM:CALSXB:IOTTB:DCHSTB:JBDEV:CLSTB:OPRSXB] LCXTAB==.-CXTAB DXTABS=VARNAM DXTAB: SYMS [TTYSTS:TTITM] LDXTAB==.-DXTAB SUBTTL INTERRUPT HANDLER TSINT: 0 ;HERE TO CATCH INTERRUPTS TSINTR: 0 EXCH A,TSINT TLNN A,400000 ; WORD ONE INTERRUPT? JRST [MOVE A,TSINTR TLNE A,%PC1PR .DISMIS A ; FLUSH IF BEING SINGLE-STEPPED EXCH A,TSINT .DISMIS [TSGPAG]] MOVEI A,TTYI .ITYIC A, ; GET CHARACTER JFCL EXCH A,TSINT .DISMIS TSINTR TSGPAG: SKIPE INCORE .DISMIS TSINTR .CALL [SETZ SIXBIT /OPEN/ [.BII,,DSKI] [SIXBIT /DSK/] [SIXBIT /TS/] [TS2NM] SETZ [TSSNM]] .VALUE .ACCESS DSKI,[4000] .CALL [SETZ SIXBIT /CORBLK/ MOVEI 104000 MOVEI %JSELF MOVEI 2 MOVEI DSKI SETZI 2] .VALUE SETOM INCORE .CLOSE DSKI, JRST INPUTS SUBTTL WHOIML INPEND: SETZM INCORE .CALL [SETZ SIXBIT /CORBLK/ MOVEI MOVEI %JSELF SETZI 2] .VALUE SKIPE FORGET JRST [.VALUE BYEFOR JRST CONTIN] .VALUE BYEBYE JRST CONTIN BYEFOR: ASCIZ \ :FORGET :VK \ BYEBYE: ASCIZ \ :VK \ ; COME HERE IF UFLG IS SET (LOOKING FOR U/JNAME) CONTN2: MOVE U,UIND IMUL U,LUBLK MOVE A,@UNAME CAME A,UNM' JRST JOBGON MOVE A,@JNAME CAME A,JNM' JRST JOBGON JRST CURTIM JOBMSG: OSIX UNM OASCI 40 OSIX JNM MOVE A PUSHJ P,UOASC PUSHJ P,OUTPUT POPJ P, ; FIRST CHECK IF IT REAPPEARED JOBGON: MOVE D,UNM MOVE E,JNM PUSHJ P,UJLKP JRST JOBGN1 SKIPN JOBLST JRST CURTIM MOVE A,[440700,,[ASCIZ / back/]] PUSHJ P,JOBMSG SETZM JOBLST JRST JOBGN2 JOBGN1: SKIPE JOBLST' JRST CONTN3 MOVE A,[440700,,[ASCIZ / gone/]] PUSHJ P,JOBMSG SETOM JOBLST JOBGN2: MOVEI A,30.*3. .SLEEP A, SKIPN PRSIST SETZM UFLG JRST CONTIN STPCHR: MOVE U,UIND IMUL U,LUBLK STPCHK: SKIPE @USTP ; HERE TO SEE IF JOB IS STOPPED/HUNG POPJ P, ; SKIP RETURN IF RUNNING - ELSE STOP/HUNG SKIPN @FLSINS ; SKIP IF NOT BLOCKED JRST POPJ1 HRRZ C,@SV40 ; GET OPER NUM MOVE B,CALSXB SUB B,OPRSXB CAML C,B MOVEI C,0 MOVE B,@OPRSXB ; CHECK SYMBOLIC UUO CALL CAME B,[SIXBIT /HANG/] ; AND WATCH FOR SLEEP AND HANG CAMN B,[SIXBIT /SLEEP/] SOS (P) ; SIGH. POPJ1: AOS (P) POPJ P, INFCHK: EXCH A,U ; HERE FOR CHECKING INFERIORS SETZ U, ; LOOK FOR AN INFERIOR INFLP: HRRZ B,@SUPPRO CAMN A,B ; IS IT FOR THIS INDEX? PUSHJ P,STPCHK ; AND IS IT NOT STOPPED/HUNG? JRST INFCH1 ; LOSE. CONTINUE CAMN U,WHOIND JRST INFCH1 PUSH UP,A IDIV U,LUBLK MOVEM U,UIND POPJ P, ; AND PROCEED WITH INFERIOR INFCH1: ADD U,LUBLK ; LOOP THROUGH JOBS CAMGE U,@USRHI ; IF NONE ARE RUNNING INFERIORS JRST INFLP EXCH A,U ; THEN RESTORE U AND RETURN POPJ P, LEDZER: OASCI "0 JRST (X) CONTIN: SKIPE JCLINP JRST INPUTS MOVE P,[-20.,,PDL-1] SKIPGE (UP) JRST CONTNI POP UP,UIND IDIV UIND,LUBLK CONTNI: MOVE BUF,[440700,,LINE] SETZM LINE MOVE A,[LINE,,LINE+1] BLT A,LINE+LINELN-1 SETZM INFER SKIPE UFLG JRST CONTN2 CONTN3: SKIPN D,TTYFLG CONTN4: .SUSET [.RCNSL,,D] JUMPL D,CURTIM HRRZ U,@TTYSTS SKIPN @UNAME JRST [SETZM TTYFLG JRST CONTN4] IDIV U,LUBLK MOVEM U,UIND CURTIM: PUSHJ P,STPCHR PUSHJ P,INFCHK .CALL [SETZ SIXBIT /RQDATE/ SETZM A] .LOSE SKIPN DATPRT JRST CURHOR LDB B,[270400,,A] ODEC B OASCI "/ LDB B,[220500,,A] ODEC B OASCI 40 CURHOR: HRRZS A IDIVI A,7200. CAIGE A,10. JSP X,LEDZER ODEC A OASCI ": IDIVI B,120. CAIGE B,10. JSP X,LEDZER ODEC B SKIPN SECPRT JRST PINDEX OASCI ": LSH C,-1 CAIGE C,10. JSP X,LEDZER ODEC C PINDEX: OASCI 40 MOVE A,UIND MOVE U,UIND IMUL U,LUBLK OOCT A OASCI 40 PUNAME: OSIX @UNAME OASCI 40 PJNAME: OSIX @JNAME OASCI 40 PSNAME: MOVE A,@USYSNM MOVEM A,CURUNM' CAMN A,@XUNAME JRST PSTATU OSIX A OASCI 40 PSTATU: SKIPN D,TTYFLG .SUSET [.RCNSL,,D] MOVE A,@TIME SUB A,@TTITM CAIG A,<30.*60.*10.> JRST PSTATX OASCI "& PSTATX: PUSHJ P,USTATU SKIPGE @APRC JRST [OSIX [SIXBIT /DSN/] JRST .+1] PTMPCT: MOVE A,@JTMU ADDI A,9830. IDIVI A,19661. PUSH P,A PSTIM: PUSH P,U SETZB U,B MOVE C,UIND IMUL C,LUBLK PSTIML: SKIPN A,@UNAME JRST PSTIM1 ADD B,@JTMU MOVE A,@SUPPRO CAIN C,(A) SETOM INFER PSTIM1: ADD U,LUBLK CAMGE U,@USRHI JRST PSTIML ADDI B,9830. IDIVI B,19661. MOVE A,-1(P) SKIPGE (UP) JRST PSTIM3 HLRZ C,UP PSTIM2: OASCI "^ SOJN C,PSTIM2 PSTIM3: SKIPN INFER JRST PSTIM4 OASCI "# PSTIM4: OASCI 40 ODEC A OASCI "% OASCI "/ ODEC B POP P,U OASCI "% OASCI 40 POP P,A MOVEM BUF,SAVBUF' MOVEM CNT,SAVCNT' PTMUSE: MOVE A,@UTRNTM ;GET TOTAL RUN TIME FOR THIS PROCEDURE PUSHJ P,TMPTH ;OUTPUT AMOUNT OF TIME USED BY PROCEDURE PMEM: MOVE A,@NMPGS SUB A,@NSWPGS ODEC A OASCI "/ ODEC @NMPGS OASCI 40 PUSHJ P,PSMEMB PCHAN: SKIPE FILPRT PUSHJ P,CHAN PUSHJ P,OUTPUT SLEEP: SKIPE INCORE JRST INPUT SETZ CNT, MOVEI A,30.*12. SKIPE MIDFLG MOVEI A,30.*4. .SLEEP A, SETZM MIDFLG JRST CONTIN MIDDLE: SETOM MIDFLG' MOVE [440700,,[ASCIZ /.../]] PUSHJ P,UOASC PUSH P,A PUSHJ P,OUTPUT MOVEI A,30.*8. SKIPE INCORE MOVEI A,30. .SLEEP A, POP P,A MOVE BUF,SAVBUF MOVE CNT,SAVCNT POPJ P, OUTPUT: OASCI ^B MOVE A,[440700,,LINE] .CALL [SETZ SIXBIT /SIOT/ [%TJSIO,,TYOC] A SETZ CNT] .LOSE 1000 POPJ P, TMPTH: IDIVI A,25000. ; NOW IN UNITS OF .1 SECONDS IDIVI A,36000. ; HOURS MOVEI D,0 MOVE C,B ; SAVE OTHER CRUFT JUMPE A,UTRNT1 ; DON'T OUTPUT IF THERE AREN'T ANY ODEC A MOVNI D,1 OASCI ": UTRNT1: MOVE A,C IDIVI A,600. ; MINUTES MOVE C,B ; SAVE SECONDS AND TENTHS JUMPE D,[JUMPE A,UTRNT2 JRST .+1] JUMPN D,[CAIL A,10. JRST .+1 OASCI "0 JRST .+1] MOVNI D,1 ODEC A OASCI ": UTRNT2: MOVE A,B IDIVI A,10. ; SECONDS MOVE C,B ; SAVE TENTHS JUMPN D,[CAIL A,10. JRST .+1 OASCI "0 JRST .+1] ODEC A OASCI ". OASCI (C)"0 OASCI 40 POPJ P, ;OUTPUT THE "STATUS" OF THE JOB IN U. USTATU: MOVEI A,40 ;LOAD WITH CODE FOR SPACE SKIPN @PICLR ;SKIP IF PROCEDURE NOT PROCESSING INTERRUPT MOVEI A,"* ;REPLACE SPACE WITH * IF INTERRUPTED SKIPN @IDF1 SKIPE @IDF2 MOVEI A,"* SKIPGE B,@USWST MOVEI A,"_ ;USER DESIRED OUT SKIPGE @USWSCD MOVEI A,"> ;SWAP-BLOCKED CAIE A,40 JRST [OASCI (A) ;OUTPUT JRST .+1] SKIPE A,@USTP ;SKIP IF RUNNING JRST URUN1 ;NOT RUNNING, OUTPUT STOP WORD SKIPE @FLSINS ;SKIP IF NOT BLOCKED JRST HAIR2 ;BLOCKED, OUTPUT MNEMONIC FOR HUNG OPERATION MOVE B,@UPC ;GET USER PC TLNN B,10000 ;SKIP IF USER MODE JRST EHAIR ;EXEC MODE, OUTPUT + AND MNEMONIC MOVE A,@JTMU ADDI A,9830. IDIVI A,19661. MOVEI B,0 CAIL A,1 MOVEI B,1 CAIL A,2 MOVEI B,2 CAIL A,10. MOVEI B,3 CAIL A,49. MOVEI B,4 CAIL A,79. MOVEI B,5 CAIL A,89. MOVEI B,6 OSIX RUNTBL(B) USTAT2: SKIPN A,@RPCL ;SKIP IF RPCLSR'ING GOING ON POPJ P, SKIPL A OASCI "> ;RPCLSR'ING (STOPPING <'ED PROCEDURE) SKIPG A OASCI "< ;BEING RPCLSR'ED (STOPPED BY >'ED PROCEDURE) ANDI A,-1 ;GET USER INDEX IDIV A,LUBLK ;GET USER # OF OBJECT OR SOURCE OF RPCLSR'ING OOCT A ;OUTPUT USER NUM POPJ P, ;NOT RUNNING (.USTP NONZERO). URUN1: LSHC A,-30. ;RIGHT JUSTIFY LEFT TWO DIGITS OF .USTP. OOCT A ;OUTPUT LEFT TWO DIGITS OASCI "! ;OUTPUT "!" LSH B,-6 ;RIGHT JUSTIFY REMAINDER OOCT B ;OUTPUT COUNT OF TRANSIENT REASONS TO BE STOPPED JRST USTAT2 HAIR2: TLNN B,200000 JRST HAIR MOVE A,[SIXBIT /IPAGE/] TLNN B,10000 MOVE A,[SIXBIT /PAGE/] JRST HAIR1 EHAIR: OASCI "+ HAIR: SKIPGE A,@SV40 ;SKIP IF SIGN BIT ON JRST IOTUUO LSH A,-27. ;RIGHT JUSTIFY OP CODE AND AC CAIG A,47 ;SKIP IF TOO LARGE FOR SYS UUO CAIGE A,40 ;SKIP IF SYS UUO SKIPA A,[SIXBIT /UUO/] ;NOT SYS UUO, OUTPUT "UUO" XCT UUOTB-40(A) ;SYS UUO, DISPATCH HAIR1: OSIX A ;OUTPUT MNEMONIC JRST USTAT2 IOTUUO: LDB A,[270300,,@SV40] MOVE A,UIOTAB(A) JRST HAIR1 UIOTAB: IRPS A,,[BLKI DATAI BLKO DATAO CONO CONI CONSZ CONSO] SIXBIT /A/ TERMIN UUOTB: JRST AIOT MM /OPEN/ JRST AOPER JRST ACALL MM /USET/ MM /BREAK/ MM /STATUS/ MM /ACCESS/ ACALL1: SKIPGE C,@UUAC ;.CALL IOT OR SIOT MOVE D,@LSCALL JRST AIOT1 ;DON'T BE CRETINOUS WITH IOT/SIOT! AIOT: LDB C,[270400,,@SV40] ;.IOT, GET AC FIELD MOVEI D,0 ;NOT SIOT AIOT1: MOVEI A,@IOCHNM ADD A,U HRRZ C,(A) ;RIGHT HALF OF IOCHNM IS INDEX TO IOTTB PUSHJ P,AIOTNM JRST USTAT2 AIOTNM: MOVEI B,(C) HLL A,@CLSTB TLNN A,100040 JRST AIOTN1 HLRZ C,(A) ;JOB DEVICE SKIPA A,@JBDEV AIOTN1: HLLZ A,@DCHSTB OSIX A MOVEI C,(B) MOVE E,@IOTTB TLNE E,400000 JRST [OASCI "B JRST .+1] CAMN D,[SIXBIT/SIOT/] JRST [OASCI "S JRST .+1] MOVEI C,"I TLNE E,200000 MOVEI C,"O OASCI (C) POPJ P, ACALL: LDB C,[270400,,@SV40] ;GET AC FIELD JUMPE C,ACALL0 OSIX @CALSXB ;OUTPUT MNEMONIC JRST USTAT2 ACALL0: MOVE C,@LSCALL CAME C,[SIXBIT/SIOT/] CAMN C,[SIXBIT/IOT/] JRST ACALL1 ACALL2: OSIX @LSCALL JRST USTAT2 AOPER: HRRZ C,@SV40 ;GET OPER NUM MOVE A,CALSXB SUB A,OPRSXB CAML C,A MOVEI C,0 ;NOT IN RANGE, DISPLAY AS 'OPER' OSIX @OPRSXB JRST USTAT2 RUNTBL: SIXBIT /MULTIX/ SIXBIT /TENEX/ SIXBIT /WALK/ SIXBIT /RUN/ SIXBIT /FLY/ SIXBIT /ZOOM/ SIXBIT /WARP/ CHAN: MOVE C,NQCHN MOVE U,UIND IMUL U,LUBLK MOVEM U,ULIND' CHNLP: SKIPGE U,@QUSR JRST CHNLP1 CAMN U,ULIND PUSHJ P,PRCHAN CHNLP1: SOJGE C,CHNLP POPJ P, PRCHAN: PUSH P,C MOVE A,@QSMPRP IBP A ANDI A,1777 HRRZ B,@QSBYTE IMUL A,B ;CONVERT WORDS TO BYTES SKIPGE @QSMDN SETZM A ADD A,@QFBLNO IDIV A,B ;CONVERT BACK TO WORDS (AT LEAST FOR NOW) MOVEM A,WDCNT' MOVE B,A MOVE U,@QUDPR MOVE A,@QSNLCN ADD A,@QUDFPR ;POINTER INTO USER DIRECTORY SETZM WRTFLG' SKIPGE @QSCRW ;ONLY HACK READ CHANNELS SETOM WRTFLG PFNAME: SETZ E, PUSH P,A HRL A,A HRRI A,B .GETLOC A, JSP RET,NAMLEN MOVEM B,FNAME1 ADD A,[1,,] .GETLOC A, JSP RET,NAMLEN MOVEM B,FNAME2 MOVE B,@QSNUD MOVEM B,DIRECT JSP RET,NAMLEN MOVE C,CNT IDIVI C,3 ADDI E,6(C) SKIPE WRTFLG ADDI E,4 CAILE E,88. PUSHJ P,MIDDLE MOVE A,CURUNM CAMN A,DIRECT JRST ZORNINPLATZ OSIX DIRECT OASCI 73 ZORNINPLATZ: OSIX FNAME1 OASCI 40 OSIX FNAME2 OASCI "= POP P,A SKIPE WRTFLG JRST WRTPRT PFPCT: SETOM B HRLZI C,UNRNDM(A) HRRI C,C .GETLOC C, LDB C,[UNDSCP+C] IDIVI C,UFDBPW HLL C,QBTBLI(D) ;MAKE A BP TO DESCRIPTOR AREA HRLZI X,UNRNDM(A) HRRI X,X .GETLOC X, LDB X,[UNWRDC+X] ANDCMI A,1777 ;X HAS WORD COUNT IN LAST BLOCK OF FILE HRRZS A ADDI A,UDDESC ADD C,A PUSHJ P,NFLLN1 ;GET THE BLOCK COUNT OF FILE IMULI B,2000 SKIPN X MOVEI X,2000 ADD B,X ;FILE LENGTH NOW IN B MOVE A,WDCNT ;THIS IS WORD COUNT (FROM ABOVE) IMULI A,100. IDIV A,B ODEC A OASCI "% POPSCP: OASCI 40 POP P,C POPJ P, WRTPRT: MOVE A,WDCNT MOVE B,A LSH A,-12 ODEC A OASCI "+ ANDI B,1777 ODEC B JRST POPSCP NAMLEN: MOVE C,[440600,,B] NAMLP: ILDB D,C JUMPE D,(RET) AOJ E, NAMLN1: TLNN C,760000 JRST (RET) JRST NAMLP QBTBLI: 440600,, 360600,, 300600,, 220600,, 140600,, 060600,, 000600,, NFLLN1: IBP C ;HERE TO GET FILE LENGTH MOVEI D,D HRL D,C .GETLOC D, ;PUT STUFF IN D HLL A,C HRRI A,D ;MAKE BP IN A LDB F,A ;GET THE DESCRIPTOR BYTE JUMPE F,CPOPJ CAILE F,UDTKMX JRST NFLLN2 ADD B,F JRST NFLLN1 NFLLN2: CAIGE F,UDWPH AOJA B,NFLLN1 CAIN F,UDWPH JRST NFLLN1 REPEAT NXLBYT, IBP C AOJA B,NFLLN1 UJLKP: SETZ U, UJLKPL: CAMN D,@UNAME CAME E,@JNAME JRST UJLKP1 IDIV U,LUBLK MOVEM U,UIND SETOM UFLG' MOVEM D,UNM MOVEM E,JNM JRST POPJ1 UJLKP1: ADD U,LUBLK CAMGE U,@USRHI JRST UJLKPL POPJ P, SUBTTL IMLAC WHOLINE OUTPUT ROUTINES POWER: 0 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. ? 1000000. UODEC: PUSH P,C MOVEI C,10. ; GET BASE FOR DECIMAL JRST UONIN UOOCT: PUSH P,C MOVEI C,8. ; OCTAL BASE UONIN: PUSH P,A PUSH P,B MOVEM C,BASE MOVE B, PUSHJ P,UONUM ; PRINT NUMBR POP P,B POP P,A POP P,C POPJ P, UONUM: IDIV B,BASE HRLM C,(P) ; SAVE DIGIT SKIPE B PUSHJ P,UONUM UONUM1: HLRZ C,(P) ; RETREIVE DIGITS ADDI C,"0 ; MAKE TO ASCII CAILE C,"9 ; IS IT GOOD DIG ADDI C,"A-"9-1 ; MAKE HEX DIGIT PUSHJ P,IOTC POPJ P, ; RET IOTC: MOVE FROBOZ,C JSP RET,IOTA POPJ P, IOTA: MOVEI ^A IDPB BUF MOVEI ^Y IDPB BUF IDPB FROBOZ,BUF ADDI CNT,3 JRST (RET) UOASC: PUSH P,A PUSH P,B MOVE B, UOASCL: ILDB FROBOZ,B JUMPE FROBOZ,POPBAJ JSP RET,IOTA JRST UOASCL UOSIX: PUSH P,A PUSH P,B MOVE B, USXOOP: JUMPE B,POPBAJ LDB FROBOZ,[360600,,B] ADDI FROBOZ,40 JSP RET,IOTA LSH B,6 JRST USXOOP POPCJ: POP P,C POPJ P, POPCBA: POP P,C POPBAJ: POP P,B POPAJ: POP P,A CPOPJ: POPJ P, VARIAB CONSTA SUBTTL PAGE 2 - START UP, JCL, COMMAND LEVEL LOC VARNAM NAME: 0 UUOD: 0 UUOE: 0 UUOSCR: BLOCK 2 ACTIV: 0 BPSAV: 0 START: .SUSET [.RXJNAME,,A] .SUSET [.RJNAME,,B] CAME A,B .BREAK 16,160000 .SUSET [.RUIND,,B] IMUL B,LUBLK MOVEM B,WHOIND START0: .SUSET [.RUIND,,UIND] .SUSET [.SIMASK,,[%PIATY]] .RSYSI A, CAME A,SYSVER' JRST INIT START1: PUSHJ P,TTYOPN .BREAK 12,[5,,JCL] PUSHJ P,GETJCL JRST INPEND EVAL: PUSHJ P,EVALR -LFWDT,,FLWDT FLWDTS JFCL PUSHJ P,EVALR -LDXTAB,,DXTAB DXTABS IOR A,[400000(D)] PUSHJ P,EVALR -LUSRT,,USERT USERTS IOR A,[400000(U)] PUSHJ P,EVALR -LCXTAB,,CXTAB CXTABS IOR A,[400000(C)] PUSHJ P,EVALR -LNXTAB,,NXTAB NXTABS IOR A,[400000] POPJ P, EVALR: MOVE D,@(P) AOS (P) MOVE E,@(P) AOS (P) MOVE C,@(P) AOS (P) EVALR1: MOVE A,(E) .EVAL A, .LOSE 1000 XCT C MOVEM A,(D) AOBJP D,CPOPJ AOJA E,EVALR1 POPJ P, INIT: SKIPE SYSVER ; IS THIS NEW FILE JRST NEWSYS ; OR NEW SYSTEM? .CALL [SETZ SIXBIT /CORBLK/ MOVEI MOVEI %JSELF SETZ [1]] .VALUE MOVE P,[-20.,,PDL-1] MOVEI UP,UPDL-1 MOVE A,[-140,,200] MOVEI B,0 .CALL [SETZ SIXBIT /CORBLK/ MOVEI %CBNDR MOVEI %JSELF A MOVEI %JSABS SETZ B] ; MAP 0-300000 OF SYS INTO 400000-700000 .LOSE 1000 NEWSYS: .RSYSI A, MOVEM A,SYSVER PUSHJ P,EVAL .CALL [SETZ SIXBIT /OPEN/ [.BIO,,DSKO] [SIXBIT /DSK/] [SIXBIT /TS/] [TS2NM] SETZ [TSSNM]] .VALUE MOVEI A,0 .CALL [SETZ SIXBIT /PDUMP/ [-1] MOVEI DSKO SETZ A] .VALUE MOVE A,[-2,,ZORK] .IOT DSKO,A .CLOSE DSKO, JRST START1 ZORK: JRST START JRST START GETJCE: SETZM JCLINP POPJ P, GETJCL: SKIPN JCL POPJ P, SETOM JCLINP MOVE X,[440700,,JCL] INPUTS: CAIA INPUT: TASCR [0] SKIPE JCLINP JRST [ILDB A,X JRST INPUTC] .RESET TTYI, TASCI "> .IOT TTYI,A INPUTC: CAIL A,"a CAILE A,"z CAIA SUBI A,40 CAIE A,^I CAIN A,40 JRST INPUTS CAIE A,0 CAIN A,^M JRST [SKIPE JCLINP JRST GETJCE JRST CONTIN] CAIN A,"W JRST WCOM CAIN A,"J JRST JCOM CAIN A,"Q .BREAK 16,140000 CAIN A,"C JRST CCOM CAIN A,"F JRST FCOM CAIN A,"R JRST RCOM CAIN A,^L JRST CONTIN CAIN A,"P JRST INPEND CAIN A,"M JRST MCOM CAIN A,"S JRST SCOM CAIN A,"D JRST DCOM CAIN A,"T JRST TCOM CAIN A,"? JRST EXPL INPILL: TASC [ASCIZ / Command not understood - /] TASCI (A) JRST CONTIN EXPL: TASC [ASCIZ / Command Action C Toggle printing of channels D Toggle printing of date F Toggle forgetting of job J set to watch this job J Normal mode (job with TTY) M Print current mode P Proced Q Kill job R to watch this job persistently (and wait when not around) R Toggle persistence (waiting for job to reappear after it goes) S Toggle second-printing mode T Toggle system variable format W Watch tree attached to this tty ? Print this /] JRST CONTIN TCOM: SETCMM TAAMOD SKIPN TAAMOD JRST [MOVE A,[TNINS,,PSMEMB] BLT A,PSMEMB+TNINSL JRST TCOM1] MOVE A,[TCINS,,PSMEMB] BLT A,PSMEMB+TCINSL TCOM1: JSP B,TCOMPT JRST CONTIN TCOMPT: MOVEI A,[ASCIZ / Standard system variables./] SKIPE TAAMOD MOVEI A,[ASCIZ / TAA-style system variables./] JRST PMODER TCINS: ODEC @AUSOPG OASCI "| ODEC @TRUMM OASCI "| ODEC @NPGSWO OASCI 40 POPJ P, TCINSL==.-TCINS TNINS: MOVE A,@TRUMM SUB A,@AUSOPG ODEC A OASCI "/ ODEC @TRUMM OASCI 40 POPJ P, TNINSL==.-TNINS MCOM: SKIPE UFLG JRST MCOM1 TASC [ASCIZ / Normal mode./] JRST MCOM2 MCOM1: MOVEI A,[ASCIZ / Waiting for /] SKIPN JOBLST MOVEI A,[ASCIZ / Watching /] TASC (A) TSIX UNM TASCI 40 TSIX JNM TASCI ". MCOM2: JSP B,CHNS JSP B,FORG JSP B,PERS JRST CONTIN SCOM: SETCMM SECPRT JSP B,SECS JRST CONTIN SECS: MOVEI A,[ASCIZ / No seconds mode./] SKIPE SECPRT MOVEI A,[ASCIZ / Seconds mode./] JRST PMODER DCOM: SETCMM DATPRT JSP B,DATS JRST CONTIN DATS: MOVEI A,[ASCIZ / No date mode./] SKIPE DATPRT MOVEI A,[ASCIZ / Date mode./] JRST PMODER CHNS: MOVEI A,[ASCIZ / Printing channels./] SKIPN FILPRT MOVEI A,[ASCIZ / Not printing channels./] JRST PMODER PERS: MOVEI A,[ASCIZ / Persistent. /] SKIPN PRSIST MOVEI A,[ASCIZ / Quitter. /] PMODER: SKIPN JCLINP TASC (A) JRST (B) FORG: MOVEI A,[ASCIZ / Forgetting./] SKIPN FORGET MOVEI A,[ASCIZ / Not forgetting./] JRST PMODER RCOMS: SETCMM PRSIST JSP B,PERS JRST CONTIN RCOM: SETZM ACTIV SETZM TTYFLG SETOM PRSIST PUSHJ P,GETNAM JRST RCOMS MOVEM A,BPSAV MOVE D,NAME MOVEI RCOM MOVEM ACTIV PUSHJ P,GETNAM JRST JERR MOVE E,NAME SETZ U, RCOML: CAMN D,@UNAME CAME E,@JNAME JRST RCOML1 IDIV U,LUBLK MOVEM U,UIND SETOM UFLG' MOVEM D,UNM MOVEM E,JNM TASC [ASCIZ / Job #/] TOCT UIND SETOM PRSIST JRST CONTIN RCOML1: ADD U,LUBLK CAMGE U,@USRHI JRST RCOML TASC [ASCIZ / Waiting for /] TSIX D TASCI 40 TSIX E TASCI ". SETOM UFLG MOVEM D,UNM MOVEM E,JNM SETOM JOBLST JRST CONTIN FCOM: SETCMM FORGET JSP B,FORG JRST CONTIN CCOM: SETCMM FILPRT JSP B,CHNS JRST CONTIN WCOM: SETZM ACTIV PUSHJ P,GETNAM JRST WCOMME MOVE B,[440600,,NAME] MOVEI A,0 ILDB D,B SUBI D,20 MOVE A,D ILDB D,B JUMPE D,WCEND SUBI D,20 IMULI A,10 ADDI A,(D) WCEND: MOVEM A,TTYFLG SETZM UNM SETZM JNM JRST CONTIN WCOMME: SETZM TTYFLG JRST CONTIN JCOM: SETZM ACTIV SETZM TTYFLG PUSHJ P,GETNAM JRST JCOMME MOVEM A,BPSAV MOVE D,NAME MOVEI JCOM MOVEM ACTIV PUSHJ P,GETNAM JRST JERR MOVE E,NAME SETZ U, JCOML: CAMN D,@UNAME CAME E,@JNAME JRST JCOML1 IDIV U,LUBLK MOVEM U,UIND SETOM UFLG' MOVEM D,UNM MOVEM E,JNM TASC [ASCIZ / Job #/] TOCT UIND JRST CONTIN JERR: TASC [ASCIZ / Must be UNAME-JNAME pair./] JRST CONTIN JCOML1: ADD U,LUBLK CAMGE U,@USRHI JRST JCOML TASC [ASCIZ / Job /] TSIX D TASCI 40 TSIX E TASC [ASCIZ / not found./] JRST CONTIN JCOMME: SETZM UFLG TASC [ASCIZ /Normal mode./] JRST CONTIN GETNAM: MOVE A,[440600,,NAME] SETZM GETSW SETZM NAME GETNM1: SKIPE JCLINP JRST [ILDB B,X JRST .+2] .IOT TTYI,B CAIN B,177 JRST GETRUB CAIE B,^M CAIN B,^J JRST [SKIPN JCLINP POPJ P, MOVEI B,40] CAIN B,40 JRST [SKIPN GETSW JRST GETNM1 JRST POPJ1] SUBI B,40 CAIL B,100 SUBI B,40 IDPB B,A SETOM GETSW TLNN A,760000 JRST POPJ1 JRST GETNM1 GETRUB: JUMPL A,GETFLS MOVEI B,0 DPB B,A ADD A,[60000,,] JRST GETNM1 GETFLS: SKIPE B,ACTIV JRST [MOVE A,BPSAV MOVEM B,(P) MOVEM D,NAME SETOM GETSW JRST GETNM1] TASC [ASCIZ / XXX? /] POPJ P, TTYOPN: .OPEN TYOC,[%TJSIO\.UAO,,'TTY] ; get a TTY output channel .LOSE ; failed .CALL [SETZ SIXBIT /CNSGET/ MOVEI TYOC MOVEM MOVEM SETZM A] .LOSE %LSSYS CAIE A,%TNSFW .VALUE [ASCIZ \:Use :WHOLINKILL \] .CALL [SETZ 'TTYVAR MOVEI TYOC ['SMARTS] SETZM B] .LOSE %LSSYS TLNN B,%TQIM1 .VALUE [ASCIZ \:Use :WHOLINKILL \] .CALL [SETZ SIXBIT /OPEN/ [.UAI,,TTYI] [SIXBIT /TTY/] [SIXBIT /TTY/] SETZ [SIXBIT /TTY/]] .LOSE 1000 .CALL [SETZ SIXBIT /OPEN/ [%TJDIS+.UAO,,TTYO] [SIXBIT /TTY/] [SIXBIT /TTY/] SETZ [SIXBIT /TTY/]] .LOSE 1000 .SUSET [.SIMSK2,,[1_TTYI]] .CALL TTYSET ; SET UP TTY TO TAKE CONTROL CHARACTERS .LOSE 1000 POPJ P, TSIOT: SETZ SIXBIT /SIOT/ MOVEI TTYO A SETZ B TTYSET: SETZ SIXBIT /TTYSET/ 1000,,TTYI [232323,,232323] SETZ [232323,,232323] SUBTTL PAGE 2 -- UUOS UUOCT==0 UUOTAB: JRST ILUUO IRPS X,,[TOCT TDEC TSIX TASC TASCI TASCR] UUOCT==UUOCT+1 X=UUOCT_33 JRST U!X TERMIN UUOMAX==.-UUOTAB UUOH: 0 PUSH P,A PUSH P,B PUSH P,C PUSH P,D MOVEI @40 ; GET EFF ADDR. OF UUO MOVEM UUOE MOVE @0 MOVEM UUOD ; CONTENTS OF EFF ADR MOVE B,UUOE ; EFF ADR LDB A,[270400,,40] ; GET UUO AC, LDB C,[330600,,40] ; OP CODE CAIL C,UUOMAX MOVEI C,0 ; GRT=>ILLEGAL JRST @UUOTAB(C) ; GO TO PROPER ROUT UUORET: POP P,D POP P,C POP P,B POP P,A ; RESTORE AC'S JRST 2,@UUOH ILUUO: .VALUE UOBPTR: MOVEI C,0 MOVE B,UUOD ; PICK UP BYTE POINTER JRST UTASC1 ; AND JOIN CODE UTASCR: SKIPA C,[-1] ; CR FOR END OF TYPE UTASC: MOVEI C,0 ; NO CR HRLI B,440700 ; MAKE ASCII POINTER UTASC1: MOVEI A,0 PUSH P,B ; SAVE BPTR UTASCC: ILDB D,B ; GET CHAR JUMPE D,UTASCD ; FINISH? AOJA A,UTASCC ; AOS COUNT, GO ON UTASCD: POP P,B PUSHJ P,STIOTA ; SPIT IT OUT JUMPE C,UUORET ; CR NEEDED? MOVEI A,2 ; YES MOVE B,[440700,,[ASCIZ / /]] PUSHJ P,STIOTA JRST UUORET UOCTLP: MOVEI A,^P PUSHJ P,TIOTAD MOVE A,B PUSHJ P,TIOTAD ; DISPLAY-MODE IOT JRST UUORET UTASCI: MOVE A,B ; PRT ASCII IMMEDIATE PUSHJ P,TIOTA JRST UUORET UTSIX: SKIPN C,UUOD JRST UUORET MOVEI A,0 MOVE B,[440700,,UUOSCR] TSXOOP: LDB D,[360600,,C] ADDI D,40 IDPB D,B ADDI A,1 LSH C,6 JUMPN C,TSXOOP MOVE B,[440700,,UUOSCR] PUSHJ P,STIOTA JRST UUORET UOHPOS: MOVEI A,^P PUSHJ P,TIOTAD MOVEI A,"H PUSHJ P,TIOTAD MOVEI A,10(B) PUSHJ P,TIOTAD JRST UUORET UTDEC: SKIPA C,[10.] ; GET BASE FOR DECIMAL UTOCT: MOVEI C,8. ; OCTAL BASE MOVE B,UUOD ; GET ACTUAL WORD TO PRT JRST .+3 ; JOIN CODE UTDECI: SKIPA C,[10.] ; DECIMAL UTOCTI: MOVEI C,8. MOVEM C,BASE SKIPN A MOVEI A,0 ; A=DIGIT COUNT MOVE C,B ; PUT # TO PRT IN C MOVE B,[010700,,UUOSCR+1] PUSHJ P,UTNUM ; PRINT NUMBR JRST UUORET UTNUM: IDIV C,BASE ADDI D,"0 CAILE D,"9 ADDI D,"A-"9-1 ; MAKE HEX DIGIT, IF NOT DECIMAL DPB D,B ; SAVE DIGIT DBP B ADDI A,1 JUMPN C,UTNUM ; IF NON-ZERO, STILL CRAP LEFT PUSHJ P,STIOTA POPJ P, TIOTA: .IOT TTYO,A POPJ P, TIOTAD: .CALL [SETZ SIXBIT /IOT/ MOVSI %TJDIS ; TURN ON DISPLAY MODE FOR THIS MOVEI TTYO SETZ A] .LOSE %LSSYS POPJ P, STIOTA: .CALL [SETZ SIXBIT /SIOT/ MOVEI TTYO B SETZ A] .LOSE %LSSYS POPJ P, END START