1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-26 04:02:06 +00:00

MONIT - lightweight ATSIGN HACTRN replacement.

Jack Haverty wrote on its-hackers:

> On MIT-DM, the most commonly used top-level program was called
> "monit". It was used by most people instead of DDT because it required
> less memory, which was a very scarce and precious commodity in the
> early 70s before paging and swapping.  In fact there was a lot of peer
> pressure to use monit unless you had a very good reason to use DDT.

This is a very old source file -- AI: SYSENG; MONIT 114 is listed in
MAPS in 1971-04. Development happened on DM; "Scenarios for Using
Arpanet at the International Conference on Computer Communication" has a
1972-09 transcript showing MONIT 192 on DM.

The binary SYS; TS MONIT is listed on AI, MC and ML from 1971 to 1983 in
MAPS, although it doesn't survive in the AI/MC KS10 dumps. A 1981
message to BUG-ITS from ED@MIT-ML suggests it was an old version:

> ML:SYS;TS MONIT [...] does not have symbols nor the correct start
> address (1300). It is pretty badly broken, but great fun to play with
> nevertheless.
This commit is contained in:
Adam Sampson
2018-06-18 16:04:57 +01:00
committed by Adam Sampson
parent 44dbbbb033
commit 8d2eb9bd16
3 changed files with 898 additions and 0 deletions

893
src/syseng/monit.114 Normal file
View File

@@ -0,0 +1,893 @@
TITLE MONITOR AND MERRY MAKING
;ACCUMULATOR DEFS
FF==0 ;FLAG AC
A=1
B=2
C=3
D=4
P=17 ;PUSH DOWN POINTER
;FLAGS FOR FF REG
USRUN==1 ;INFERIOR EXISTS
VALCM==10 ;LOOKING AT .VALUE FROM INFERIOR
CRLF==40 ;CR WAS LAST CHARACTER OUTPUT TO TTY
RDF==200 ;READING COMMANDS FROM FILE
ECHF==400 ;ECHO TYPING
TTYGN==1000 ;TTY GIVEN AWAY
INFIL==2000 ;FILE INPUT FOR LOAD OPEN
OUTFLS==4000 ;OUTPUT STOPPED BY ^S
;CHANNELS FOR I/O
TYIC==1 ;TTY INPUT
TYOC==2 ;TTY OUTPUT
SYSI==3 ;INPUT OF PROGRAMS
USRO==4 ;OUTPUT TO INFERIOR
USRT==5 ;TEMPORARY SECOND INFERIOR
PRTC==6 ;PRINT AND LISTF INPUT AND ERROR DEVICE
CLAC==7 ;CLA INPUT
CLIC==10 ;CLI OUTPUT
PDLLNG==30
COMLNG==24 ;WDS FOR COMMANDS
BUFLNG==200 ;IO BUFF LNG
ZZZ==.
LOC 41
JSR UUOH
JSR TSINT
LOC ZZZ
DEFINE FATAL MESS
JSP A,XFATAL
INFOR2 \.,MESS
TERMIN
DEFINE INFORM N,MESS
IF1,[PRINTC / N MESS
/] TERMIN
DEFINE INFOR2 N,MESS
IF2,[PRINTC / N MESS
/] TERMIN
FFSAV=5
STARTA=6
COMPTR=7
LCMCHR=10
LOGNAM=11
LPOS=12
BASE=13
NOATTY: PSIXI (SIXBIT /ATY/) ;CFT - UNABLE TO GIVE CONSOLE TO INFERIOR
QBEG: PASCR [ASCIZ /?/]
QBUST: TLZ FF,RDF+ECHF+VALCM ;IN CASE _G'ED
BEG: TLZ FF,OUTFLS
.SUSET [.SPICL,,[-1]] ;? ? MAKE ME INTERUPT-PRONE
MOVE P,[-PDLLNG,,PDL-1] ;FLUSH OUT PDL
TLNN FF,VALCM ;VALRETED FROM PREV
PUSHJ P,RCMD ;READ STRING IN
PUSHJ P,SCMD ;SCAN COMMAND
JUMPE B,.-2 ;COMMAND BLANK, TRY AGAIN
PASCI ^M
MOVE A,[-NUMCOM,,MYCOM]
CAMN B,(A) ;CHECK FOR LOCAL COMMANDS
JRST @1(A) ;FOUND
AOBJN A,.+1
AOBJN A,.-3 ;GET ANOTHER
MOVEM B,SYSF+2 ;STORE SYS FILE NAME
CAMN B,USRF+2
PUSHJ P,USRCLO ;KILL CURRENT ONE FIRST
MOVEM B,USRF+2 ;AND NAME TO CREATE
TLZ FF,INFIL ;SHOW NO INFILE OPEN (IN CASE RE-OWN JOB)
UOPEN: MOVEI A,7 ;SET MODE FOR USER FILE
HRLM A,USRF ;IMAGE, BLOCK, OUTPUT
TLNN FF,INFIL
PUSHJ P,USROPE ;SEE IF DISOWNED - AND OPEN THE USER
PUSHJ P,ALD ;LOAD THE FILE - SKIPPED IF RE-OWNED JOB
.USET USRO,[.SUPC,,STARTA] ;SET INF PC TO START - MAY BE SKIPPED TOO
.CLOSE SYSI,
PUSHJ P,ATTY ;GIVE HIM THE CONSOLE
.USET USRO,[.SUSTP,,BLANK] ;START INF
JRST QBUST
; MOVSI A,200000
; .SLEEP A, ;RIP VAN WINKLE
; JRST .-2 ;IN CASE 40 YRS PASS
RCMD: SETZM LCMCHR
TLNN FF,RDF ;READING
JRST RCMD2 ;NO, TYPE
TLNN FF,ECHF
JRST RCMD3 ;NOT ECHO => NO TYPE
RCMD2: .IOT TYOC,[15] ;CR IF (RDF OFF) OR (ECHF ON)
.IOT TYOC,[";] ;PROMPT CHARACTER
RCMD3: MOVE B,[440700,,COMMND] ;BEG INPUT
MOVEM B,COMPTR ;SET COMMAND PTR
MOVEI C,0 ;COUNTER
RCMD1: .IOT TYIC,A ;GET CHAR
CAIN A,33 ;ALT MODE
JRST QBEG
CAIN A,"?
JUMPE C,PHELP ;INIT ? MEANS HELP
TLNN A,-1 ;MAGIC EOF CONDITION
CAIN A,^C ;EOF ON READ?
JRST CLSRD ;YES, OPEN TTY
CAIE A,^S
CAIN A,^G ;BELL TO FLUSH LINE - DOESNT HAPPEN ON THIS LEVEL
JRST RCMD1 ;IGNORE
CAIN A,177 ;RUBOUT
JRST RUB
IDPB A,B ;STORE CHAR IN STRING
CAML B,[350700,,COMMND+COMLNG-1] ;BYTE P TO END OF BUFF
JRST RCFUL ;FULL BUFFER
CAIL A,40 ;OUT FOR ANY CONTROL CHARACTER
AOJA C, RCMD1 ;NO, GET MORE
RCMDX: MOVEI A,0 ;YES, TERM WITH NULL FOR TYPE
IDPB A,B
TLZ FF,OUTFLS
POPJ P, ;RETURN BEFORE POSSIBLE END OF FILE
CLSRD: MOVEM A,LCMCHR
TLZ FF,ECHF+RDF ;END OF READ
.OPEN TYIC,TYIF ;SWITCH BACK TO TTY INPUT OF COMMANDS
JSP A,ANALER ;ENDS UP BEING FATAL
RCFUL: MOVEI A,15 ;END UP COMMAND
IDPB A,B
JRST RCMDX ;MUST BE END OF COMM
RUB: SOJL C,RCMD ;IF RUBBED OUT EVERYTHING
LDB A,B ;GET LAST INSERTED
.IOT TYOC,A ;ECHO IT OUT
ADD B,[070000,,] ;BUMP CH POINTER
TLNE B,400000 ;AT WORD BOUND
ADD B,[347777777777]
JRST RCMD1
SCMD: MOVE A,COMPTR ;SCAN COMMAND
ILDB A,A
CAIE A,": ;WAS FIRST CHAR A :
JRST GETSYL
PUSHJ P,GETCAT ;YES, IGNORE IT
IBP COMPTR
JRST GETSYL
GETCCA: ILDB A,COMPTR ;FETCH COMM CHAR TO A
CAIE A,^L ;FLUSH FORM FEED
CAIN A,^J ;FLUSH LF
JRST GETCCA
CAIE A,^C ;EOF
SKIPN A ;NULL AT END OF ASCIZ
TLZ FF,VALCM+ECHF ;TURN OFF .VALUE READING
GETCAT: TLNE FF,VALCM+ECHF
JRST IOTA ;ECHO IF VALRET OR ECHO FLAG
POPJ P, ;ELSE JUST RETURN
; SCNAME - ROUTINE TO SCAN COMMAND LINE FROM CURRENT POSITION
; RETURNS A FILE NAME. A,B,C,D <= NAME1,NAME2,DEVICE,USER
; USING "[DEV:][USR;]NAME1 NAME2" OR "NAME1 NAME2 [DEV [USR]]"
SCNAME: PUSH P,[SIXBIT /@/] ;WORK SCRATCH ON STACK
PUSH P,[SIXBIT /@/] ;NAME1,NAME2
PUSH P,BLANK ;DEV
PUSH P,BLANK ;USR
MOVEI C,-3(P) ;INIT PTR TO N1
SCNGET: PUSHJ P,GETSYL ;RET A,B <= BRKCHR,6BIT SYL
SKIPN B
JUMPL A,POPIT ;EMPTY SYLLABLE AT END OF LINE
CAIN A,': ;CHECK WHICH BREAK
MOVEM B,-1(P) ;MOVE SYL: TO DEVICE
CAIN A,'; ;MOVE SYL; TO USR
MOVEM B,0(P)
JUMPG A,SCNGET ;NOT SPACE, GET MORE SYL(NOT CTL EITHER)
CAIN C,-2(P) ;POINT TO NAME2?
EXCH B,-3(P) ;YES, MOVE SYL1 TO NAME1
MOVEM B,(C)
JUMPL A,POPIT ;CTL TERMINATES
CAIGE C,(P) ;ALSO 4 SYLS DOES
AOJA C,SCNGET ;UP PTR, GET MORE
POPIT: POP P,D ;USR;
POP P,C ;DEV:
POP P,A ;N1
JRST GETSX ;N2
;GETSYL - ROUTINE TO GET SINGLE WORD OFF COMMAND LINE
; ONLY BRK CHAR ARE : ; SPACE AND CONTROLS EXCEPT ^Q WHICH
; QUOTES THE NEXT NON CTL CHAR (: ; SP)
GETSYL: PUSH P,BLANK ;INIT SYL ON STACK
MOVE B,[440600,,0(P)] ;BYT PTR TO STACK
GETSLP: PUSHJ P,GETCCA ;GET CHAR
CAIN A,^Q ;IS IT "QUOTE"
JRST GETQOT ;YES
SUBI A,40 ;MAKE SIXBIT
JUMPL A,GETSX ;CTL=EXIT
JUMPE A,GETSP ;INIT SPACES FLUSHED
CAIE A,':
CAIN A,';
JRST GETSX ; ; OR : TERM
GETSPT: CAIL A,100 ;LC?
SUBI A,40 ;MAKE UC
TLNE B,770000 ;CHECK FIT
IDPB A,B ;STORE CHAR
JRST GETSLP
GETQOT: PUSHJ P,GETCCA ;GET CHAR TO QUOTE
SUBI A,40 ;6BIT
JUMPGE A,GETSPT ;CANT ^Q A CTL
JRST GETSX
GETSP: TLNE B,400000 ;IF NONE YET PUT IN
JRST GETSLP ;SPACE IGNORED
GETSX: POP P,B ;ASSEMBLED SYL TO B
POPJ P, ;BREAK IS LEFT IN A
ALDLOS: MOVEI A,(SIXBIT /DSK/)
HRRM A,SYSF
.OPEN SYSI,SYSF ;TRY DSK:TS <NAME>
SKIPA
JRST USRCAS ;FLUSH OLD ONE, OPEN NEW ONE
MOVEI A,(SIXBIT /SYS/)
HRRM A,SYSF
.OPEN SYSI,SYSF ;NOW SYS:TS <NAME>
JSP A,ANALER
JRST USRCAS ;FLUSH OLD ONE, OPEN NEW ONE
ALD: TLZN FF,INFIL ;IS FILE OPEN ?
PUSHJ P,ALDLOS ;CROCK !
ALDO: PUSHJ P,GTWD ;READ BEGIN FILE
JUMPE B,PURE ;PURE PROCEDURE !!
CAME B,[JRST 1] ;CHECK FOR END OF LOADER
JRST ALDO
ALD1: PUSHJ P,GTWD ;GET CTL WD
JUMPGE B,ALDJ ;JRST OR CTL
MOVE C,B ;-N,,ADR
ALD2: MOVE D,B
CAMGE B,[-BUFLNG,,] ;CHECK FIT IN BUFF
HRLI B,-BUFLNG ;USE OWN SIZE
HRRI B,UBUF ;INBUFFER
PUSHJ P,ALDRD ;GET BLOCK
MOVEI A,(D)
.ACCESS USRO,A ;BEGIN OUTPUT AT LD ADR
MOVE A,B
.IOT USRO,A ;MOVE BLOCK THERE
SUB B,[-1,,]
SUB B,D ;CHECK IF MORE IN LD BLK
JUMPL B,ALD2 ;GET ANOTHR BUFF
PUSHJ P,GTWD ;END BLOCK, GET SUM
CAMN C,B ;CHECK
JRST ALD1 ;LOAD NEXT BLK
PSIXI (SIXBIT /CKS/)
SKIPA
EOF: PSIXI (SIXBIT /EOF/)
.CLOSE SYSI,
PUSHJ P,USRCLO ;FLUSH OUT JOB
JRST QBEG ;WILL SCRATCH PDL
ALDJ: HRRZM B,STARTA ;START IN FILE
POPJ P, ;RETURN
ALDRD: MOVE A,B
PUSHJ P,GTWD1 ;READ BUFF
MOVE A,B
ROT C,1 ;ACCUM CHECK SUM
ADD C,(A)
AOBJN A,.-2 ;FOR WHOLE BUFF
POPJ P,
GTWD: HRROI A,B ;SINGLE WORD TO B
GTWD1: .IOT SYSI,A ;BLOCK IN
JUMPL A,EOF ;UNABLE TO READ DESIRED CT
POPJ P,
PURE: SETZM BLK
.CALL CBLK ;GET SYSTEM TO LOAD THIS PURE PROCEDURE
PSIXI (SIXBIT /CBK/)
JRST ALD1
CBLK: 400000,,0
SIXBIT /LOAD/
[USRO]
[SYSI]
400000,,ARG3
ARG3: -3,,BLK
BLK: 0
0
0
DEATH: TLNE USRUN
PUSHJ P,DISOW
JRST DEAT
XFATAL: POCTI (A) ;MAY VERY WELL NOT OUTPUT ANYTHING
PASCR [ASCIZ / FATAL ERR/]
DEAT: .VALUE ;?? - MAY CAUSE RELOADING OF MONIT
PSIXI (SIXBIT /DTH/)
JRST QBEG ;IN CASE
ANALER: TLNN FF,RDF ;ERR DURING READING
JRST ANAL1 ;NO
.OPEN TYIC,TYIF ;SWITCH BACK TO TTY FOR INPUT OF COMMANDS
FATAL CANT RE-OPEN TTY
ANAL1: TLZ FF,RDF+ECHF+VALCM ;ERROR => NO TAPE IN OR VALRET
MOVEI A,@-2(A)
PSIX (A) ;POINTS TO OPEN BLOCK
PASCI ":
PSIX 1(A) ;NAME1
PASCI " ;SPACE
PSIX 2(A) ;NAME2
PASCI 40 ;SP
ERR: .OPEN PRTC,[SIXBIT / ERR !/] ;OPEN ERROR COMMENT
FATAL CANT OPEN ERROR DEVICE
XPRINT: .IOT PRTC,A
TLNN A,-1 ;MAGIC EOF?
CAIN A,^C
JRST BEG ;YES, FINISHED
CAIE A,^L ;IGNORE FF
PUSHJ P,IOTA ;PRINT SYSTEM COMMENT
TLZN FF,OUTFLS
JRST XPRINT
JRST BEG
USROPE: PUSHJ P,CKLOG ;MUST BE LOGGED IN
.OPEN USRT,USRF ;NAME PTR IN A
JSP A,ANALER ;YOU LOST
.USET USRT,[.RMEMT,,A] ;ATTEMPT TO SEE IF REOWNED JOB
CAIE A,2000
JRST USRAT1 ;CERTAINLY
.USET USRT,[.RUPC,,A] ;??
TRNN A,-1
JRST USRILT ;NO, NO SUCH REOWNED JOB EXISTS
USRAT1: AOS (P) ;TO SKIP LOAD - SINCE JOB ALREADY EXISTS
AOS (P) ;TO SKIP GIVING IT PC
.CLOSE USRT, ;CLOSE TEMPORARY INFERIOR
USRCAS: PUSHJ P,USRCLO ;
.OPEN USRO,USRF ;FINALLY OPEN ON RIGHT CHANNEL
JSP A,ANALER
TLO FF,USRUN ;INDICATE THERE EXISTS ONE
POPJ P,
USRILT: .UCLOSE USRT, ;FLUSH TEMPORARY INFERIOR
POPJ P,
USRCLO: PUSHJ P,DTTY ;MAKE SURE TTY IS UP
TLZE FF,USRUN ;CHECK IF ACTUALLY OPEN
.UCLOSE USRO, ;YES, WIPE IT OUT
POPJ P,
ATTY: TLNE FF,USRUN ;CANT IF NO USR OPEN
.ATTY USRO, ;TRY TO GIVE IT UP
JRST NOATTY ;LOST
TLO FF,TTYGN ;FLAG TTY GONE
POPJ P,
DTTY: TLZN FF,TTYGN ;SEE IF TTY GIVEN AWAY
POPJ P, ;I GOT IT ALREADY
.DTTY USRO, ;GOBBLE IT BACK
FATAL CANT GET TTY BACK FM INF
POPJ P,
LISTF: PUSHJ P,SCARE ;OUTPUT FILE DIRECTORY
JUMPN C,.+3
CAME B,[SIXBIT /@/]
MOVE C,B ;1ST ARG IS DEV IF NO :
MOVE A,[SIXBIT /.FILE./]
MOVE B,[SIXBIT /(DIR)/]
PUSHJ P,SCARE1
SKIPE C
HLRM C,PRTF ;SET DEV
HRRZS PRTF
JRST PRNCOM
PRINT: PUSHJ P,SCARE ;GET A,B,C,D = N1,N2,DEV,USR
PUSHJ P,COMTTT
PRNCOM: .OPEN PRTC,PRTF
JSP A,ANALER
JRST XPRINT
LOAD: PUSHJ P,SCARE ;GET FILE NAME
CAME A,[SIXBIT /TS/]
CAMN A,[SIXBIT /@/]
MOVE A,B
CAMN A,USRF+2
PUSHJ P,USRCLO ;KILL OLD ONE FIRST
MOVEM A,USRF+2 ;'@' OR 'TS' FIRST NAME => SECOND FOR JOB NAME
PUSHJ P,COMTTT
MOVSI C,6
HLLM C,PRTF ;SET BLOCK IMAGE INPUT
.OPEN SYSI,PRTF
JSP A,ANALER
TLO FF,INFIL
PUSHJ P,USRCAS ;FLUSH OLD INFERIOR, OPEN NEW ONE
JRST UOPEN
DELETE: PUSHJ P,SCARE
PUSHJ P,COMTTT
.FDELE PRTF ;SYS CALL DELETE
JRST CANNOT ;OOPS, ERROR RET
JRST BEG ;OK
XFILE: PUSHJ P,SCARE ;READ COMMANDS FROM FILE
TLO FF,RDF+ECHF ;FLAG READING
PUSHJ P,COMTTT
.OPEN TYIC,PRTF
JSP A,.+2
JRST BEG
.OPEN TYIC,TYIF ;GET BACK TTY - COULDNT OPEN COMMAND FILE
JSP A,ANALER ;COULDNT GET TTY - WILL BE FATAL ??
JRST ANALER
SCARE: PUSHJ P,SCNAME
SCARE1: CAMN B,[SIXBIT /@/]
JRST UNCHN ;IF HE DIDNT GIVE FILE NAME,USE OLD ONE ????
MOVEM A,PRTF+1
MOVEM B,PRTF+2
UNCHN: SKIPE D ;CHANGE SNAME
.SUSET [.SSNAME,,D]
POPJ P,
COMTTT: SKIPE C
HLRM C,PRTF ;SET DEV
HRRZ C,PRTF
MOVEM C,PRTF
CAIE C,(SIXBIT /TTY/)
POPJ P,
PSIXI (SIXBIT /DEV/)
JRST QBEG
LOGIN: PUSHJ P,GETSYL
MOVEM B,USRF+1 ;SET NEW UNAME (? SO CAN HACK OTHERS DISOWNED PROCEDURES)
.LOGIN B,
JRST CANNOT
MOVEM B,LOGNAM
MOVEM B,COMPF+1
MOVEI B,(SIXBIT /COM/)
HRRM B,COMPF
.OPEN PRTC,COMPF
JRST BEG ;NO COM:USER MAIL
JRST XPRINT
DISOWN: PUSHJ P,CKRUN
PUSHJ P,DISOW
JRST BEG
DISOW: .DISOWN USRO, ;DSN
FATAL WONT DISOWN INFERIOR
SETOM USRF+2 ;TO AVOID LOSSAGE ON REOWNING
TLZ FF,USRUN
POPJ P,
CONTIN: PUSHJ P,CKRUN
PUSHJ P,ATTY ;GIVE UP THE TTY
PROCED: PUSHJ P,CKRUN
.USET USRO,[.SUSTP,,BLANK] ;SEE HIM RUN !
JRST BEG
KILL: PUSHJ P,CKRUN
PUSHJ P,USRCLO ;FLUSH JOB IF ANY
JRST BEG
CKLOG: SKIPE LOGNAM ;CHECK IF LOGGED IN
POPJ P,
PASC [ASCIZ /LOGIN/]
JRST QBEG
CKRUN: TLNE FF,USRUN ;CHECK IF JOB CURRENTLY EXISTS
POPJ P,
PASCR [ASCIZ /NO PROGRAM RUN/] ;JOB
JRST BEG
DEFINE COMTAB A,B
SIXBIT /A/
SIXBIT /B/+A
TERMIN
MYCOM: COMTAB HELP
COMTAB LOGOUT
COMTAB DELETE
COMTAB FLAP
COMTAB DISOWN
COMTAB CONTIN
COMTAB PROCED
COMTAB KILL
COMTAB LOAD
COMTAB LISTF
COMTAB PRINT
COMTAB ERR
COMTAB XFILE
COMTAB LOGIN
COMTAB DEATH
COMTAB SEND
COMTAB DDT
NUMCOM==.-MYCOM ;COUNT FOR TABLE USES
PHELP: POP P,A ;HMM FOR ?
HELP: PASC [ASCIZ /COMMANDS /]
MOVE A,[-NUMCOM,,MYCOM]
PASCI 40 ;SPACE
PSIX (A) ;TABLE ENTRY
AOBJN A,.+1
AOBJN A,.-3
PASCI ^M ;CR TO END IT
JRST BEG
LOGOUT: .LOGOUT ;IF AT TOP LEVEL
.VALUE [ASCIZ /:LOGOUT /] ;OTHERWISE
PSIXI (SIXBIT /LOG/)
JRST QBEG ;IN CASE
FLAP: MOVE B,[.UDISMT A,]
ACOMM: PUSHJ P,GETCCA ;GETCOMM CHAR TO A
SUBI A,"0 ;MAKE ASCII TO UNIT #
JUMPLE A,.+3 ;CHECK FOR VALID
CAIG A,8
XCT B ;DO IT
SKIPA ;HMM!
JRST BEG
CANNOT: PASC [ASCIZ /CAN'T /]
MOVEI A,0
IDPB A,COMPTR ;FUDGE FOR ASC PRT
PASCR COMMND
JRST BEG
DDT: .TRANDL TBLOCK ;UNTRANSLATE TO ATSIGN HACTRN
PSIXI (SIXBIT /TRN/)
JRST DEATH ; DISOWN AND GET CLASS ONE INTERUPT TO RELOAD
TBLOCK: 0 ;UNAME
SIXBIT /*/ ;JNAME
UUOCT==0
UUOTAB: JRST ILUUO
IRPS X,,[PDEC PDECI POCT POCTI PSIX PSIXI PASC PASCI PASCR]
UUOCT==UUOCT+1
X=UUOCT_33
JRST U!X
TERMIN
UUOMAX==.-UUOTAB
UUOH: 0
PUSH P,A
PUSH P,B
PUSH P,C
MOVE A,LPOS
CAIGE A,35. ;CHECK LINE POS
JRST .+3
MOVEI A,^M
PUSHJ P,IOTA
LDB A,[270400,,40] ;GET UUO AC,
HRRZ B,40 ;AND ADR
LDB C,[330600,,40] ;OP CODE
CAIL C,UUOMAX
MOVEI C,0 ;GRT=>ILLEGAL
TLNN FF,OUTFLS
JRST @UUOTAB(C) ;GO TO PROPER ROUT
SKIPE C
JRST UUORET
ILUUO: MOVEI B,[ASCIZ /ILLGL UUO/] ;ILUUO
UPASCR: SKIPA C,[15] ;CR FOR END OF TYPE
UPASC: MOVEI C,0 ;NO CR
HRLI B,440700 ;MAKE ASCII POINTER
ILDB A,B ;GET CHAR
JUMPE A,.+3 ;FINISH?
PUSHJ P,IOTA ;TYPE "A"
JRST .-3 ;AND GET ANOTHER
SKIPE A,C ;GET SAVED CR?
PUSHJ P,IOTA
UUORET: POP P,C
POP P,B
POP P,A
JRST 2,@UUOH
UPASCI: MOVE A,B ;PRT ASCII IMMEDIATE
PUSHJ P,IOTA
JRST UUORET
UPSIX: SKIPA A,[440600,,0(B)] ;PRINT A SIXBIT WORD
UPSIXI: MOVE A,[220600,,40] ;PRT SIXBIT IMMEDIATE
UPSLA: ILDB C,A
ADDI C,40 ;MAKE TO ASCII(+40)
CAIE C,40 ;BUT SKIP IF SPACE
PUSHJ P,IOTC
TLNE A,770000 ;SEE IF FINISH
JRST UPSLA ;NOPE, MORE
JRST UUORET
UPDEC: SKIPA C,[10.] ;GET BASE FOR DECIMAL
UPOCT: MOVEI C,8. ;OCTAL BASE
MOVE B,(B) ;GET ACTUAL WORD TO PRT
JRST .+3 ;JOIN CODE
UPDECI: SKIPA C,[10.] ;DECIMAL
UPOCTI: MOVEI C,8.
MOVEM C,BASE
SKIPN A
HRREI A,-1 ;A=DIGIT COUNT
PUSHJ P,UPNUM ;PRINT NUMBR
JRST UUORET
UPNUM: IDIV B,BASE
HRLM C,(P) ;SAVE DIGIT
SOJE A,UPNUM1 ;DONE IF 0
SKIPG A ;+ => MORE
SKIPE B ;- => B=0 => DONE
PUSHJ P,UPNUM ;ELSE MORE
UPNUM1: HLRZ C,(P) ;RETREIVE DIGITS
ADDI C,"0 ;MAKE TO ASCII
IOTC: EXCH A,C
PUSHJ P,IOTA
EXCH A,C
POPJ P,
IOTA: CAIE A,^C
TLNE FF,OUTFLS
POPJ P,
CAIN A,^J ;IS LF
TLZN FF,CRLF ;IF AFTER CR
.IOT TYOC,A ;TYPE OUT A
AOS LPOS
CAIE A,^M ;TYPE CR?
POPJ P,
.IOT TYOC,[^J] ;PUT OUT LF FOR CR
TLO FF,CRLF ;AND FLG
SETZM LPOS ;YES, ZERO
POPJ P,
TSINT: 0 ;MASK WD HERE
0 ;RETURN LOC
PUSH P,A ;SAVE IN CASE
MOVEM FF,FFSAV
SKIPL A,TSINT ;IS IT INFERIOR PROBLEM ?
JRST MONINT ;NO, MY OWN !
.USET USRO,[.RPIRQ,,A] ;GET USER INT BITS
.USET USRO,[.SPIRQ,,BLANK] ;FLUSH ALL ???
TLO FF,USRUN ;IN CASE YOU DIDN'T KNOW !!
TLZ FF,OUTFLS
TRZE A,2 ;_Z TYPED AT INFERIOR
TLO FF,TTYGN ;IN CASE YOU DIDN'T KNOW !!
PUSHJ P,DTTY ;GET TTY BACK
TRZE A,20 ;DISPLAY PROTECTION VIOLATION
PSIXI (SIXBIT /DPV/)
TRZE A,40 ;ILLEGAL INSTRUCTION
PSIXI (SIXBIT /ILL/)
TRZE A,200 ;.VALUE FROM INFERIOR
JRST VALRET ;READ HIS STRING
TRZE A,400 ;I/O CHANNEL ERROR
PSIXI (SIXBIT /IOC/)
TRZE A,2000 ;.BREAK
PSIXI (SIXBIT /BRK/)
TRZE A,20000 ;MEMORY PROTECTION VIOLATION
PSIXI (SIXBIT /MPV/)
TRNN A,-1
JRST IFLUSH ;NOMORE INTS
POCTI 6,(A) ;PRT RH ONLY
PASC [ASCIZ / INTRPT FM INF/]
IFLUSH: POP P,A ;GET OFF STACK
.RESET TYIC,
.DISMISS [QBEG] ;ALWAYS STOP HIM FOR INTERUPTING
MONINT: PUSHJ P,DTTY
TRZE A,2 ;_Z TYPED AT ME
PASCI ^Z
TRZE A,1 ;CHARACTER TYPED
PUSHJ P,TYILK
TRNE A,-1
TLZ FF,OUTFLS ;IF ANY BUGS TO REPORT ABOUT
TRZE A,100 ;FIVE MINUTES
PUSHJ P,CKDIE ;PRINT DOWN MESS
TRZE A,1000 ;NO INF CORE
JRST NOCORA
TRZE A,400000 ;CLI INTERUPT
PUSHJ P,GULPMS
TRNN A,-1
JRST NOCORB
POCTI 6,(A) ;PRINT ERROR BITS
PASC [ASCIZ / INTRPT /]
MOVE A,TSINT+1
POCTI 6,(A)
JRST IFLUSH ;YES, FLUSH-SINCE IT WASNT STANDARD INTERUPT
NOCORB: MOVE A,FFSAV
TLNE A,TTYGN ;WAS IT GONE AT INTERUPT TIME ?
PUSHJ P,ATTY ;GIVE TTY BACK TO INF
POP P,A
.DISMISS TSINT+1 ;GO ON - I SERVICED IT OK
NOCORA: PSIXI (SIXBIT /COR/)
JRST IFLUSH
GULPMS: .OPEN CLAC,[SIXBIT / "CLA/]
POPJ P, ;MIGHT WANT TO BARF
PUSH P,A
PASCI ^M
PASC [ASCIZ /MESSAGE FROM /]
PUSHJ P,REDONE
PSIX ONEWRD
PASCI "
PUSHJ P,REDONE
PSIX ONEWRD
PASCI ^M
GULPM1: PUSHJ P,REDONE
PASC ONEWRD
JRST GULPM1
REDONE: HRROI A,ONEWRD
.IOT CLAC,A
SKIPL A
POPJ P,
SUB P,[1,,1]
CLOCRR: .CLOSE CLAC,
PASCI ^M
JRST POPAJ
SEND: PUSHJ P,GETSYL ;GET LOSER NAME
MOVEM B,CLIFN1
MOVEM B,CLUFN1
.OPEN CLIC,CLUFNB ;SEE IF LOGGED IN
JRST CLSNDB ;NO
.CLOSE CLIC,
.OPEN CLIC,CLIFNB
JSP A,ANALER
SEND1: ILDB A,COMPTR ;SEND STUFF ON CLI
.IOT CLIC,A
CAIE A,^M
JRST SEND1
MOVE A,LCMCHR
CAIN A,^C
JRST DONCLI
MOVE A,CLUFN1
CAMN A,LOGNAM ;TO SELF ?
JRST DONCLI ;BARF ! GROSS DANGER !
PUSHJ P,RCMD ;GET MORE UNTIL GET EOF
.IOT CLIC,[^M]
JRST SEND1
DONCLI: .CLOSE CLIC,
JRST BEG
CLSNDB: PASCR [ASCIZ /NOT LOGGED IN/]
JRST BEG
CLIFNB: 1,,(SIXBIT /CLI/)
CLIFN1: .
SIXBIT /HACTRN/
CLUFNB: (SIXBIT /USR/)
CLUFN1: .
SIXBIT /HACTRN/
ONEWRD: 0
BLANK: 0 ;AND ANOTHER TO STOP ASCIZ
TYILK: PUSH P,A
MOVEI A,TYIC
.ITYIC A,
JRST POPAJ
CAIN A,^G
JRST FLSTYO
CAIE A,^S
JRST POPAJ
TLO FF,OUTFLS ;INDICATE OUTPUT FLUSHAGE
.RESET TYOC,
JRST POPAJ
FLSTYO: .RESET TYOC,
.IOT TYOC,[7] ;ECHO THE CNTRL G
JRST IFLUSH ;PDL WILL GET RESET LATER
VALRET: .USET USRO,[.RSV40,,A]
TRNN A,-1
JRST VALRE2 ;ZERO ADDRESS
MOVEI B,6
HRLM B,USRF ;SET MODE TO IMAGE, BLOCK, INPUT
.OPEN SYSI,USRF
JSP A,ANALER
.ACCES SYSI,A ;?
MOVE B,[-COMLNG,,COMMND]
.IOT SYSI,B ;MOVE STRING OVER
TLO FF,VALCM ;SET TO SCAN
MOVE B,[440700,,COMMND] ;RESET COMMAND SCANNER
MOVEM B,COMPTR
.CLOSE SYSI,
VALRE1: POP P,A
.RESET TYIC,
.DISMISS [BEG] ;JRST BEG
VALRE2: PSIXI (SIXBIT /VAL/)
JRST IFLUSH
CKDIE: PUSH P,A
.DIETIM A, ;GET TIME TIL SYS DWN
JUMPL A,POPAJ ;NO DYING NOW
PUSH P,B
PUSH P,C
PUSH P,D
IDIVI A,30.*60.*60. ;HOURS IN A
IDIVI A+1,30.*60. ;MINS IN A+1
IDIVI A+2,30. ;SEC IN A+2
PDECI (A) ;PRT HRS
PASCI ":
PDECI 2,(A+1) ;PRT MINS
PASCI ":
PDECI 2,(A+2) ;PRT SECS
PASCR [ASCIZ / UNTIL SYS DWN/]
POPDJ: POP P,D
POPCJ: POP P,C
POPBJ: POP P,B
POPAJ: POP P,A
POPJP: POPJ P,
COMPF: SIXBIT / SYSSYSTEMMAIL / ;FOR MAIL PRINT, SET FOR USER WHEN LOGIN
SYSF: SIXBIT / &SYSTS /
USRF: SIXBIT / 'USR /
TYIF: SIXBIT / (TTYMONITRTTYIN /
PRTF: SIXBIT / DSK / ;EXTRA LONG FOR DELETE
CONSTANTS
VARIABLES
;OVERLAYED BY COMMANDS LATER ON AND PART OF I/O BUFFER (FOR LOADING PROGS)
COMMND: ;HERE STARTS COMMND,I/O BUFFER
STARTU: .CLOSE 3,
.SUSET [.RJNAME,,A] ;THIS GETS OVERLAYED
CAME A,[SIXBIT /HACTRN/]
.VALUE [ASCII /:DDT ISYS ATSIGN HACTRN SYS TS MONITîU./]
;FLUSH UNLESS TOP LEVEL
MOVE P,[-PDLLNG,,PDL-1]
.OPEN TYOC,[SIXBIT / !TTYMONITRTTYOUT/]
JRST LOGOUT ;FLUSH IMMEDIATE IF CANT TYPE
.OPEN TYIC,TYIF
FATAL CANT OPEN TTY INPUT
TLZ FF,-1 ;RESET ALL FLAGS
.STATUS TYIC,A
TRNE A,2 ;IS IT GE-BITER ?
PASCI ^L
PASCI ^M
PSIX [.FNAM1]
PASCI ".
PSIX [.FNAM2]
.SUSET [.RUINDEX,,A] ;GIVE USER INDEX
PASC [ASCIZ / U=/]
POCTI (A)
PASCI ^M ;CR
PUSHJ P,CKDIE ;CHECK IF SYS GOING DOWN
MOVEI A,621561 ;MASK WORDS FOR INTERRUPTS
; CHRTYP DPMPV ILLINS SYSDIE IOCHNER MPVINF MPV PDLOV + BAD42 _Z .VALUE .BREAK _N CLI
MOVSI A+1,1 ;BIT FOR INFERIOR
.SETM2 A, ;SET MASKWDS
.SUSET [.RUNAM,,B] ;GET USERS NAME
AOJE B,STAR1 ;JUMP IF NOT LOGGED YET
SOS B
MOVEM B,LOGNAM ;ALREADY LOGGED IN IF NOT -1
JRST BEG
STAR1: .OPEN PRTC,COMPF
JRST BEG ;NO SYS:SYSTEM MAIL
JRST XPRINT ;YES, THERE IS, PRINT IT
CONSTANTS
VARIABLES
INFORM \.-STARTU,STARTUP LENGTH
;MIGHT WANT TO PUT UBUF IN TRANSIENT SECOND BLOCK OF CORE IF WE NEED MORE SPACE.
UBUF=COMMND+COMLNG ;LEAVE COMMAND BUFF SEPARATE
IFL .-UBUF-BUFLNG,LOC UBUF+BUFLNG
PDL: BLOCK PDLLNG
INFORM \NUMCOM/2,NUMBER OF COMMANDS
INFORM \.,PROG LENGTH
END STARTU
 .VALUE FROM INFERIOR
JRST VALRET ;READ HIS STRING
TRZE A,400 ;I/O CHANNEL ERROR