Consolidate license copies
[its.git] / system / sysjob.117
1 ; -*-MIDAS-*-
2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;;
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;;; General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18
19 SUBTTL DEMON JOB INTERFACE ROUTINES
20         ;GIVE STUFF TO DEMON JOB RUNNING IN USER MODE, WHICH THEN OUTPUTS
21                 ;STUFF IN ITS OWN FORMAT TO THE DISK
22         ;COMMUNICATION IS VIA DMNBUF (BUFFER) AND POINTERS,
23         ;DEMON JOB FINDS IT BY LOOKING UP SYSTEM SYMS
24
25         ;USAGE:
26         ;ROUTINES MUST BE CALLED WITH CLK OFF OR IN PROGRESS
27         ;FIRST CALL DMNP TO SET UP D AS "PDL POINTER" INTO DMNBF
28         ;DMNPSH ADR     ;PUSH ADR INTO DMNBF (ASSEMBLES INTO A PUSH)
29                 ;FIRST WORD PUSHED SHOULD HAVE ENTRY TYPE DESCRIPTOR IN HIGH SIX BITS
30
31         ;ENTRY TYPE DESCRIPTORS:
32 DMNELI==10000   ;LOGIN (DMNPLI)
33 DMNELO==20000   ;LOGOUT (DMNPLO)
34         ;^ ADD MORE AS NEEDED, NEED NOT BE SYMBOLIC BUT PLEASE COMMENT THEM HERE FOR XREF
35
36         ;DMNRS          ;NORMALLIZE POINTER (DUE TO STANDARD LENGTH ENTRY IN TABLE)
37                 ;ASSEMBLES INTO ONE STORAGE WORD
38         ;THEN CALL (PUSHJ) DMNRT WHICH STORES BACK D
39         ;ALL DMNPSH'S SHOULD BE ASSEMBLED BEFORE DMNRT;
40         ;ALL ROUTINES SHOULD BE BETWEEN THIS PAGE AND DMNBUF
41
42 ;DMNSZ (# ENTRIES IN DMNBF) DEFINED EARLY IN SYSTEM ENGLISH SO CAN BE CHANGED EASILY
43
44 DMNFMT==2       ;ASCENDING FORMAT NUMBER, SHOULD BE INCREMENTED EACH TIME
45                         ;A CHANGE IS MADE REQUIRING CHANGE IN CODING EITHER OF DEMON JOB
46                         ;OR OF PROGRAMS READING ITS OUTPUT
47 ;DMNFNT 1 -> 2 9/71 SWAPIN RQ INCLUDED W/LOGOUT
48
49 DMNBAC==0       ;DMNPSH COUNTER, AFTER FIRST TIME GETS RE-INITIALIZED TO DMNBLM
50
51 DEFINE DMNPSH ADR
52         DMNBAC==DMNBAC+1
53         PUSH D,ADR
54 TERMIN
55
56 IF1,DMNBEL==0           ;BECOMES LENGTH PER ENTRY IN DMNBF
57
58 DEFINE DMNRS
59         ADDI D,DMNBEL-DMNBAC
60 IF1,IFG DMNBAC-DMNBEL,DMNBEL==DMNBAC
61 DMNBAC==DMNBLM
62 TERMIN
63 \f
64                 ;PUSHJ P,DMNP   ;SET UP D FOR DMNPSH'S INTO DMNBF
65
66 DMNP:   MOVE D,DMNBFP   ;GET POINTER
67         CAIL D,DMNBFE-1 ;AT END OF BUFFER?
68         MOVEI D,DMNBF-1 ;YES, RE-INITIALIZE
69         AOS DMNBC       ;INDICATE ENTRY ABOUT TO BE FILLED, SO DEMON KNOWS IF IT LOST
70 DMNP0:  ;DMNP0 MAY BE CALLED IN USER MODE FROM DEMON JOB
71         DMNPSH TIME     ;FIRST WORD IN BUFFER ALWAYS TIME OF ENTRY
72                 ;^ MAYBE ADD MORE STANDARD PUSHES HERE
73         POPJ P,
74
75 DMNBLM==DMNBAC  ;NUMBER OF INITIAL WORDS PUSHED
76
77                 ;PUSHJ P,DMNRT (BUT USUALLY JRST DMNRT FOR RETURN)
78                         ;DMNBF ENTRY COMPLETED, STORE BACK POINTERS
79
80 DMNRT:  TLZ D,-1        ;CLEAR OUT LEFT HALF OF POINTER
81         CAIL D,DMNBFE   ;AFTER END OF BUFFER?
82         JRST 4,.+1      ;DMNBF POINTER INCREMENTED INCORRECTLY SOMEWHERE ALONG THE LINE
83                 ;PROBABLY PROGRAMMER FORGOT TO DO DMNRS; CODING AFTER DMNBF MIGHT BE CLOBBERED
84         AOS DMNBD       ;ENTRY COMPLETE, GIVE IT TO DEMON JOB
85         MOVEM D,DMNBFP
86         POPJ P,
87
88                 ;NOW FOR INDIVIDUAL ROUTINES
89
90                 ;LOGIN
91
92 DMNPLI: PUSHJ P,DMNP    ;SET UP
93         HRLI U,DMNELI   ;INDICATE LOGIN
94                 ;PUT FOLLOWING INTO DMNBF:
95         DMNPSH U        ;INDEX OF USER BEING LOGGED IN
96         TLZ U,-1
97         DMNPSH UNAME(U) ;UNAME
98         DMNPSH JNAME(U) ;JNAME
99         DMNPSH TRMNAM(U)        ;TERMINAL NAME
100         DMNPSH XUNAME(U)
101         DMNRS           ;THAT'S ALL
102         JRST DMNRT
103 \f
104                 ;LOGOUT
105
106 DMNPLO: PUSHJ P,DMNP            ;SET UP D
107         PUSHJ P,LOGUSE          ;GET TREE'S USAGE IN T AND TT
108         HRLI U,DMNELO           ;INDICATE LOGOUT
109                 ;PUT FOLLOWING IN DMNBF FOR DEMON JOB TO DUMP OUT ON DISK:
110         DMNPSH U                ;INDEX OF USER BEING LOGGED OUT
111         TLZ U,-1
112         DMNPSH UNAME(U)         ;UNAME OF USER
113         DMNPSH JNAME(U)         ;JNAME
114         DMNPSH TT               ;TIME USED, IN 4.069 USEC UNITS
115         DMNPSH T                ;# SWAPIN REQUESTS (THESE VALID SINCE LOGUSE ALREADY CALLED)
116                 ;^ ADD MORE HERE
117         ADDM TT,LOUTIM          ;COUNT UP TOTAL TIME USED BY ALL LOSERS
118         DMNRS
119         JRST DMNRT
120
121 DMNPL0==CPOPJ   ;DMNPL0 MAY BE CALLED FROM DEMON JOB IN USER MODE
122                 ;IT IS NO LONGER POSSIBLE TO MAKE THIS WORK RIGHT,
123                 ;SO WE JUST RETURN.  PFTHMG DRAGON SHOULD BE FIXED.
124
125 EBLK
126                 ;DEMON VARIABLES, MUST FOLLOW CODING
127                 ;USE CARE IN REDEFINING SYMBOLS ON THIS PAGE; DEMON JOB RUNNING IN USER MODE
128                         ;LOOKS AT SOME OF THEM, EXCEPT AS INDICATED
129
130 DMNBF:  BLOCK DMNBEL*DMNSZ      ;BUFFER
131 DMNBFE::
132
133 DMNBC:  0       ;ENTRY COUNT, INCREMENTED JUST BEFORE ENTRY ADDED TO DMNBF (USED BY DEMON)
134 DMNBD:  0       ;ENTRY COUNT, INCREMENTED JUST AFTER " " "
135 DMNBFP: DMNBF-1 ;POINTER INTO BUFFER, HAS ADR OF LAST WORD WRITTEN (NOT USED BY DEMON)
136 VSCLAU: 0       .SEE VSCLA1     ;LAST JOB TREE ACCOUNTING UPDATE DONE FOR
137                 ;NO MORE CODING ALLOWED AFTER THIS POINT
138
139 DEFINE DMNPSH A
140 INFORM DMNPSH AT .,\.
141 TERMIN
142
143 DEFINE DMNRS
144 INFORM DMNRS AT .,\.
145 TERMIN
146
147 BBLK
148 \f
149 SUBTTL "SYSTEM" JOBS
150
151 IFN TPLP,[
152 TPLI==11        ;PSEUDO LPT IN
153 PRTO==12        ;REAL LPT OUT
154 ]
155 IFN DEMON,TPLI==11      ;FOR DEMON HACKER
156 IFN DEMON,TEMPC==16     ;FOR TESTING WHETHER DEMON FILE EXISTS.
157 STYOC==17       ;OUTPUT "
158
159 ;CODE FROM ICLR TO SCOR EXECUTED ONLY ONCE (SEE BEG)
160 ICLR:   MOVE A,[GO,,GO+1]       ;PICK UP BLT POINTER (COPY EXCH WORD INTO NEXT)
161         SETZM GO        ;CLEAR FIRST WORD
162         BLT A,IEND      ;CLEAR OUT INITIALIZING CODE (IN AREA TO BE USER VAR BLOCKS)
163         SKIPL CORRQ     ;SKIP IF CORE RQ FOR SYSTEM'S SPACE PROCESSED
164          PUSHJ P,UFLS   ;WAIT AS NECESSARY
165         PUSHJ P,SYSCOP  ;"OPEN" SYSTEM CONSOLE CHANNEL
166 IFN CCLKP,[
167         JRST .+3        ;JFCL FOR CHESS CLK MODE
168          PUSHJ P,CLQAD1
169              CCLKB
170 ];CCLKP
171 IFN IMPP,[
172         MOVE A,TIME
173         MOVEM A,LNETIM
174         PUSHJ P,IMPINI
175 ];IMPP
176         MOVEI A,IINTIC
177         MOVEM A,IINCNT
178 SCOR:   MOVE P,SYSPDP
179         MOVE U,USER
180         CONO PI,CLKON
181         MOVE A,TIME
182         ADDI A,30.*60.*5        ;5 MINUTES BEFORE SHUTDOWN?
183         SKIPLE SHUTDN
184          CAMG A,SHUTDN
185           JRST .+3
186            SKIPN SUSRS
187             JRST SYSOUT ;JUMP IF SYS DYING & NO ONE LOGGED IN
188         MOVE T,[.HANG]
189         MOVEM T,FORTY   ;TELL PEEK WHAT OUR UFLS REALLY IS.
190         MOVE T,TIME
191         MOVEM T,SYSITM
192         SKIPN SUPCOR    ;SKIP IF ANY BITS ON IN SUPCOR
193          PUSHJ P,UFLS   ;HANG TILL A BIT ON
194 ;SYS JOB IS HUNG IF SYSITM IS 30 SEC OLD AND PC ISN'T SCOR1.
195 SCOR1:  MOVSI A,(SETZ)
196         MOVEI B,0
197 SYSDP1: TDNE A,SUPCOR
198          JRST SYSDP2
199 SYSDP3: LSH A,-1
200         JUMPE A,SCOR
201         AOJA B,SYSDP1
202
203 SYSDP2: SKIPGE SYSDTB(B)        ;SKIP UNLESS 4.9 BIT OF ENTRY ON
204          ANDCAM A,SUPCOR                ;4.9 ON, CLEAR SUPCOR BIT
205         LDB C,[370200,,SYSDTB(B)]
206         TRNE C,2                ;IF ROUTINE IS GOING TO USE TTY,
207          PUSHJ P,WARMTTY        ;THEN WARM IT UP FOR IT
208         TRNE C,1
209          PUSHJ P,DINGTTY
210         LDB T,[420100,,SYSDTB(B)]       ;GET 4.8 BIT
211         JUMPE T,@SYSDTB(B)      ;IF 4.8 BIT = 0, JUMP TO ROUTINE
212         PUSH P,A        ;4.8 .NE. 0, SAVE A
213         PUSH P,B        ;SAVE B
214         PUSHJ P,@SYSDTB(B)      ;CALL ROUTINE
215         POP P,B         ;RESTORE B
216         POP P,A         ;RESTORE A
217         LDB T,[410100,,SYSDTB(B)]       ;GET 4.7 BIT
218         JUMPE T,SYSDP3  ;IF ZERO RETURN TO LOOP
219         ANDCAM A,SUPCOR ;NON-ZERO, CLEAR SUPCOR BIT
220         JRST SYSDP3     ;LOOP
221 \f
222 SUBTTL SUPCOR DISPATCH TABLE
223
224 ;DISPATCH TABLE FOR BITS IN SUPCOR
225 ;4.9 = 1 TO CLEAR SUPCOR BIT BEFORE DISPATCHING
226 ;4.8 = 0, JRST TO ROUTINE ; = 1, PUSHJ
227 ;4.7 = 1 TO CLEAR SUPCOR BIT AFTER (ONLY USEFUL IF PUSHJ)
228 ;4.6 WARM UP TELETYPE BEFORE CALL
229 ;4.5 DING BEFORE CALL
230
231 SCL==1,,525252  ;BIT TYPEOUT MASK FOR SUPCOR
232 SCR==525252     ; ..
233
234 SYSDTB:
235 SCLEX==400000 ?  300000,,SYSEX  ;INCREASE USER-VAR BLOCK SPACE.
236 SCLSHD==200000 ? 340000,,SYSSHD ;HANDLE .SHUTDN - PRINT "GOING DOWN" MESSAGES.
237 SCLOUT==100000 ? 400000,,SYSOUT ;TIME FOR SYSTEM TO GO DOWN.
238 IFE KS10P,[     660000,,SYSCK5  ;CHECK FOR DEVICES GIVING SPURIOUS INTERRUPTS.
239                 SCLCK5==040000]
240 IFN KS10P,      400000,,SYSDP3
241 SCLDAT==020000 ? 600000,,DATIME ;CONTINUE TRYING TO DETERMINE DATE AND TIME.
242 SCLPAR==010000 ? 360000,,PARTYP ;PRINT "PARITY ERROR..."
243 SCLSET==004000 ? 340000,,SYSSET ;DEPOSIT IN SYSTEM (.SETLOC).
244 SCLIMP==002000 ? 600000,,SYSIMU ;PRINT "NETWORK UP ..."
245 SCLWRT==001000 ? 340000,,SYSWRT ;PRINT WRITING-ON-SYS: MESSAGE.
246 SCLLGI==000400 ? 340000,,SYSLGI ;PRINT LOGIN MESSAGE.
247 SCLDEC==000200 ? 300000,,SYSDEC ;DECREASE USER-VAR SPACE.
248 SCLVSK==000100 ? 600000,,VSCLK  ;VERY SLOW (2 MINUTE) CLOCK.
249 SCLGUN==000040 ? 600000,,SYSGUN ;FLUSH TREES THAT ARE TRYING TO LOG OUT.
250 SCLNET==000020 ? 460000,,SYSNET ;BRING NCP DOWN AND UP.
251 IFN DEMON,[     600000,,DEMCHK  ;RUN ANY DEMONS WHICH NEED IT.
252                 SCLDMN==000010]
253 IFE DEMON,      400000,,SYSDP3
254 SCLNXM==000004 ? 360000,,NXMTYP ;PRINT "NON-EX MEM ERROR ..."
255 IFE KA10P,[
256 SCLBPF==000002 ? 360000,,BPFTYP ;BAD PAGE FAIL
257 ].ELSE           400000,,SYSDP3
258 SCLIDK==000001 ? 600000,,ISYS   ;DISK IS INITIALIZED
259 SCRTPP==400000 ? 600000,,TPLPRT ;TRANSFER DATA TO LPT (FROM TPL)
260 SCRTPC==200000 ? 600000,,VSCL6  ;SEE IF ANY FILES HAVE BEEN SPOOLED.
261                  400000,,SYSDP3
262 SCRHNG==040000 ? 600000,,SYSDIL ;DIALUP LINE CONNECT OR DISCONNECT
263 SCRDET==020000 ? 600000,,SYSDT  ;DETACH TOP-LEVEL JOBS WITH INTERRUPTS.
264 SCRCFM==010000 ? 600000,,SYSCFM ;PRINT CONSOLE FREE MSGS
265 SCRMSG==004000 ? 640000,,SYSMPR ;PRINT RANDOM SYSTEM MESSAG
266         REPEAT 5,400000,,SYSDP3 ;CAN BE SET BY USER (.SUPSET)
267 IFN N11TYS,[    600000,,VWHO    ;UPDATE WHO LINES (40)
268                 SCRWHO==000040]
269 .ELSE           400000,,SYSDP3
270 IFN N11TYS,[    640000,,SYS11D  ;TV 11 GONE DOWN (20)
271                 SCR11D==000020]
272 .ELSE           400000,,SYSDP3
273 IFN N11TYS,[    640000,,SYS11U  ;TV 11 COME UP, INIT IT (10)
274                 SCR11U==000010]
275 .ELSE           400000,,SYSDP3
276 IFE DEMON,      400000,,SYSDP3  ;(4)
277 IFN DEMON,[     600000,,DMNOFF
278                 SCRDMF==000004]
279 SCRTPF==000002 ? 300000,,TPLOFF ;BLOCK TPL.
280 SCRCKS==000001 ? 600000,,SYSCKS ;PERFORM CHECKSUMMING
281
282 IFN .-SYSDTB-36.,.ERR SYS JOB DISPATCH
283 \f
284 SUBTTL DM DAEMON OVERSEER
285
286 IFN DEMON,[
287 DEMCHK: PUSHJ P,SYSDEX  ;HANDLE REQUESTS TO KNOW WHETHER A FILE
288                         ;EXISTS TO BE SIGNALLED AS A DEMON.
289         PUSHJ P,LSWTL   ;SYSTEM JOB SIEZES DEMON TABLE SWITCH WITH UTCOFF
290          400000,,DEMSW
291         MOVE B,DMLSEX
292         CAMN B,[-DMLNG,,0]      ;IF AT BEGINNING OF TABLE SET FLAG
293          TDZA D,D
294           SETOM D
295 DMSCN9: SKIPE TT,DMTTBL(B)
296          SKIPE DMTTBL+1(B)      ;ONLY PAY ATTENTION IF NOT DOWN
297           JRST DMSCN1   ;AND GUY THERE
298         MOVE T,DMTTBL+2(B)
299         HRRE C,T
300         TLNE T,-1
301          JRST DMSCN3
302         JUMPLE C,DMSC10
303 DMSCN0: SKIPG DMNFLG
304          JRST DMSC11    ;IF FLAG SET CAN'T LOAD EM
305         CAME TT,[SIXBIT /UNSPOO/]
306          JRST DMSCN4    ;DON'T BOTHER WITH TPL STUFF, IF NOT TPL
307         SKIPGE TPLFLG
308          JRST DMSC10    ;REMOVE FROM WORLD
309         JRST DMSCN4
310
311 DMSCN4: HLRM T,DMTTBL+3(B)      ;SET UP IMPLICIT REQUEST
312         CONO PI,UTCON   ;ATTEMPT LOAD HERE
313         MOVE T,DMTTBL(B)
314         MOVEM T,DMOBLK+2        ;CHECK TO SEE IF FILE EXITS
315         .IOPUSH TPLI,
316         .OPEN TPLI,DMOBLK       ;DON'T WORRY CAN'T PCLSR
317          JRST DMSCN5    ;OPEN FAILURE
318         .IOPOP TPLI,    ;GET BACK STUFF
319         HRROI T,DMTTBL(B)
320         PUSHJ P,NUJBST  ;TRY TO LOAD
321          JRST DMSCN6    ;COME BACK LATER, NO ENTRY FOR THIS GUY.
322 DMSCN8: ADD B,[DMTLL,,DMTLL]
323         SKIPL B
324          MOVSI B,-DMLNG
325         MOVEM B,DMLSEX  ;FIX UP TABLE
326 DMSCN7: MOVSI B,SCLDMN
327         IORM B,SUPCOP   ;IF MORE REQUESTS, RUN AGAIN IN 1 SECOND.
328         SOSLE REQCNT    ;NO MORE REQUESTS =>
329          JRST LSWPOP
330         SETZM REQCNT
331         ANDCAM B,SUPCOP ;DON'T RUN AGAIN.
332         ANDCAM B,SUPCOR ;THEN CLEAR OUT SUPCOR BIT
333         JRST LSWPOP
334
335
336 DMSCN5: .IOPOP TPLI,    ;FILE DOESN'T EXIST
337         CONO PI,UTCOFF
338 DMSC10: PUSHJ P,DEMMRV  ;REMOVE DEAMON
339         JRST DMSCN8     ;AND REQUEST
340
341 DMSCN3: JUMPG C,DMSCN0  ;LOAD
342         JRST DMSCN1
343
344 DMSCN2: CONO PI,UTCON   ;CONTINUE AROUND LOOP
345         ADD B,[DMTLL,,DMTLL]
346 DMSCN6: MOVEM B,DMLSEX
347         JRST LSWPOP     ;COME BACK LATTER WITHOUT FLUSHING REQ
348
349 DMSCN1: ADD B,[DMTLL,,DMTLL]    ;ADD ON VAL
350         JUMPL B,DMSCN9  ;CONTINUE AROUND LOOP
351         MOVSI B,-DMLNG
352         MOVEM B,DMLSEX
353         JUMPE D,UTOLKJ
354 DMSC11: SETZM REQCNT    ;IF RAN THROUGH WHOLE TABLE WITHOUT ANY PROCESS
355         CONO PI,UTCON
356         JRST DMSCN7     ;FLUSH ALL REQUESTS AND RETURN
357
358 DMNOFF: MOVNS TT,DMNFLG
359         JUMPLE TT,DMNOF1        ;DEAMONS OFF
360         PUSHJ P,LSWTL
361             DEMSW
362 DMNOF3: SKIPE DMTTBL(B)
363          SKIPE DMTTBL+1(B)
364           JRST DMNOF2
365         AOS REQCNT
366 DMNOF2: ADD B,[DMTLL,,DMTLL]
367         JUMPL B,DMNOF3
368         MOVSI B,SCLDMN
369         IORM B,SUPCOR
370         JRST LSWPOP
371
372 DMNOF1: MOVSI B,SCLDMN
373         ANDCAM B,SUPCOR
374         SETZM REQCNT    ;ZERO COUNT
375         POPJ P,
376
377 ;CALL HERE TO HANDLE ALL JOBS THAT ARE WAITING IN .DEMSIG TO
378 ;BE TOLD WHETHER A PURPORTED DEMON REALLY EXISTS. GIVE THEM
379 ;THEIR ANSWERS AND START THEM UP AGAIN.
380 SYSDEX: SETZ A,
381         MOVEI C,'SYS
382         MOVE D,['ATSIGN]
383 SYSDE1: CONO PI,CLKOFF
384         SKIPN SRN3(A)   ;THIS JOB'S ALREADY BEEN SERVICED?^
385          SKIPN UNAME(A) ;OR DOESN'T REALLY EXIST?
386           JRST SYSDE3
387         MOVE B,UPC(A)   ;IS IT WAITING FOR SERVICE FROM US?
388         XORI B,ADEMS1   ;MUST BE IN EXEC MODE AT THE RIGHT PLACE.
389         TDNE B,[%PCUSR,,-1]
390          JRST SYSDE3
391         MOVE E,AC0S+A(A) ;GET THE FN2 IT WANTS TO CHECK.
392         CONO PI,CLKON
393         SETZ T,         ;T GETS 0 IFF FILE CAN BE OPENED.
394         .OPEN TEMPC,C
395          CAIA
396           JRST SYSDE2
397         LDB T,[220600,,IOCHST+TEMPC]
398         SKIPN T
399          MOVEI T,%ENSFL
400 SYSDE2: .CLOSE TEMPC,
401         CONO PI,CLKOFF
402         SKIPN UNAME(A)  ;SEE IF JOB IS STILL WAITING FOR SERVICE
403          JRST SYSDE3    ;SO IT ISN'T CLOBBERED IF IT GOT AN
404         MOVE B,UPC(A)   ;INTERRUPT AND IS DOING SOMETHING ELSE.
405         XORI B,ADEMS1
406         TDNN B,[%PCUSR,,-1]
407          CAME E,AC0S+A(A)
408           JRST SYSDE3
409         MOVEM T,AC0S+T(A) ;GIVE THE JOB ITS ANSWER IN T, AND
410         SETOM SRN3(A)   ;TELL THE JOB IT HAS BEEN SERVED.
411 SYSDE3: CONO PI,CLKON
412         ADDI A,LUBLK
413         CAMGE A,USRHI
414          JRST SYSDE1
415         POPJ P,
416 ];DEMON
417 \f
418 SUBTTL VERY SLOW CLOCK
419
420 ;SUBROUTINES CALLED BY THE VERY SLOW CLOCK.
421
422 ;CHECK FOR DEMON REQUESTS WHOSE TIME HAS COME.
423 IFN DEMON,[
424 VSCLDM: PUSHJ P,LSWTL
425         DEMSW
426         MOVSI B,-DMLNG
427 VSCLD2: SKIPG DMTTBL+3(B)       ;IF SPECIFIC ENTRY IS < = O, IGNORE
428         JRST VSCLD1
429         SOSE DMTTBL+3(B)
430         JRST VSCLD1
431         HLRZ T,DMTTBL+2(B)      ;SIGNAL DEAMON
432         MOVEM T,DMTTBL+3(B)
433         MOVE A,DMTTBL(B)
434         PUSHJ P,DEMSIG  ;SIGNAL REQUEST FOR THIS GUY
435          BUG            ;ENTRY IN TABLE NOT FOUND EVEN THOUGH NON ZERO TIME
436 VSCLD1: ADD B,[DMTLL,,DMTLL]
437         JUMPL B,VSCLD2
438         JRST LSWPOP
439 ]
440
441 ;CHECK FOR CLOBBERED TEN-11 INTERFACE CONTROL PAGE WORDS,
442 ;AND RESET THEM TO THEIR CORRECT SETTINGS.
443 IFN TEN11P,[
444 T11CK:  SKIPE TEN11F
445         POPJ P,
446         MOVSI I,-256.
447 T11CKL: MOVE A,T11MP(I)
448         CAMN A,[-1]
449         MOVEI A,0       ;HARDWARE SHOULD BE 0 ON CONFLICT PAGE
450         TLZ A,174000    ;USAGE COUNT
451         MOVE B,400000+T11CP*2000(I)
452         CAME A,B
453         JRST T11ERR
454 T11CL1: AOBJN I,T11CKL
455         POPJ P,
456
457 T11ERR: AOS T11ERC
458         MOVEM A,400000+T11CP*2000(I)
459         MOVEM A,T11CCN
460         MOVEM B,T11WCN
461         MOVEM I,T11PG
462         JRST T11CL1
463 ]
464 \f
465 ;VERY SLOW CLOCK (EVERY 2 MIN). SIGNALLED BY SCLVSK, SET BY A CLOCK-QUEUE ENTRY.
466 ;CALLS THE ULTRA-SLOW CLOCK (EVERY 2 HOURS) WHEN IT'S TIME.
467
468 VSCLK:;JSP E,CHECK              ;CHECK FOR CLOBBERED DEVICES (WOULD BE NICE, BUT BUGS...)
469 IFN DEMON,PUSHJ P,VSCLDM        ;DEAMON SLOW CLOCK BREAK ROUTINE
470 IFN TEN11P,PUSHJ P,T11CK
471         MOVE U,VSCLAU   ;ACCOUNTING UPDATE, FIND A JOB TREE
472 VSCLA1: ADDI U,LUBLK
473         CAML U,USRHI
474          MOVEI U,0
475         SKIPE UNAME(U)
476          SKIPL SUPPRO(U)
477           JRST VSCLA1
478         HRLO TT,UNAME(U)
479         AOJE TT,VSCLA1  ;DON'T IF NOT LOGGED IN YET
480         MOVEM U,VSCLAU
481         CONO PI,CLKOFF
482         PUSHJ P,LOGUPD
483         PUSHJ P,DMNPLI
484         CONO PI,CLKON
485         MOVE U,USER
486         SKIPLE CTLCNT   ;Time to print date on console log?
487          JRST VSCLA2    ; No.
488         PUSHJ P,GLPDTM  ;Yes - get localized pdtime.
489          JRST VSCLA2    ; Can't print time if we don't know it.
490         PUSHJ P,WARMTTY ;Warm up tty, newline.
491         PUSHJ P,DATIM6  ;Print what time it is now.
492         MOVEI TT,CTLMAX ;Restart countdown of lines printed.
493         MOVEM TT,CTLCNT
494 VSCLA2: PUSHJ P,VSCOLD  ;CHECK FOR OLD DETACHED TREES TO BE KILLED
495         PUSHJ P,TTTMNT  ;TURN OFF MOTORS OF IDLE TERMINETS.
496 VSCL7:  SETOM UFDFLF    ;CAUSE CORE JOB TO TRY TO FLUSH 2311 UFDS
497         AOS NCORRQ
498         MOVSI I,-NCLCH  ;LOOK FOR UNOPEND CORE LINK BUFFERS THAT HAVE BEEN
499         PUSHJ P,SWTL    ;AROUND FOR MORE THAN 2 MINUTES
500             CLOSW
501 VSCLCL: SKIPE CLSYN(I)  ;SKIP IF VARS UNUSED
502          SKIPL A,CLUSR(I)
503           JRST VSCLC2
504         AOJN A,VSCLC2   ;JUMP IF OPEN
505         MOVE TT,CLRAC(I)
506         TLOE TT,200000
507          JRST VSCLCR    ;BIT ALREADY ON, BUFFER OLD
508         MOVEM TT,CLRAC(I)
509 VSCLC2: AOBJN I,VSCLCL  ;LOOP FOR ALL SETS OF VARIABLES
510         PUSHJ P,LSWPOP  ;RELEASE SWITCH
511
512         MOVE A,UTTBF    ;IF MANY 200-WORD BUFFERS ARE FREE,
513         CAIGE A,8
514          JRST .+3
515           SETOM UTBFLF  ;HAVE THE CORE JOB FLUSH THEM
516           AOS NCORRQ
517
518 IFN IMPP,[
519         SKIPGE IMPUP    ;SKIP IF IMP UP, OR PERMANENTLY DOWN
520          PUSHJ P,SYSIMU ;TRY TO BRING IT UP
521 ];IMPP
522 IFN TPLP,PUSHJ P,VSCL6  ;MAYBE START PRINTING FROM .LPTR.
523 IFN NLPTP,[
524         SKIPL NLUSR     ;IF LPT ISN'T IN USE,
525          JRST VSCNL1
526         AOS TT,NLFREE   ;KEEP TRACK OF HOW LONG THAT'S BEEN SO.
527         SOJN TT,VSCNL1  ;IF TRUE FOR >=2 VSCLK INTREVALS (4 MIN)
528         CONO NLPT,1000  ;TURN LPT MOTOR OFF: 1ST PUT LPT IN IMAGE MODE
529         DATAO NLPT,[.BYTE 7 ? 24 ? 177 ? 177 ? 177 ? 177] ;THEN TURN OFF.
530 VSCNL1:]
531         SOSLE IINCNT
532          POPJ P,
533
534 ;IT'S TIME FOR THE ULTRA-SLOW CLOCK
535         MOVEI A,IINTIC  ;GET HERE EVERY TWO HOURS OR SO
536         MOVEM A,IINCNT
537         PUSHJ P,GLPDTM
538          POPJ P,        ;TIME NOT KNOWN
539         PUSHJ P,WARMTTY
540         JRST DATIM6     ;TIME KNOWN, TELL SYSTEM CONSOLE
541
542 VSCLCR: HRRZ A,TT
543         PUSHJ P,BRTN    ;RETURN BUFFER
544         SETZM CLSYN(I)  ;FREE VARIABLES
545         JRST VSCLC2
546 \f
547 ;CHECK FOR TREES WITH BUMRTL SET THAT HAVE NOT RUN FOR
548 ;A WHOLE HOUR, AND GUN THEM.
549 VSCOLD: SETZB U,J
550         CONO PI,CLKOFF
551         MOVSI B,BUMRTL
552         MOVSI C,BULGOS
553         MOVE A,TIME
554         SUBI A,60.*60.*30.      ;1 HOUR AGO
555 VSCOL0: SKIPE UNAME(J)
556          TDNN B,APRC(J)
557           JRST VSCOL1   ;JOB NON EX OR DOSN'T HAVE BUMRTL
558         SKIPGE SUPPRO(J) ;NO GOOD IF NOT TOP LEVEL.
559          TDNE C,APRC(J) ;IGNORE JOBS THAT ARE ALREADY LOGGING OUT.
560           JRST VSCOL1
561         CAML A,LUBTM(J) ;NOT RUNNING AND HASN'T RUN FOR 1 HOUR => GUN.
562          JRST VSCOL2
563 VSCOL1: ADDI J,LUBLK    ;KEEP LOOKING TILL FIND JOB THAT NEEDS GUNING.
564         CAMGE J,USRHI
565          JRST VSCOL0
566         JRST CLKONJ     ;NO TREES NEED TO BE GUNNED.
567
568 VSCOL2: MOVEI I,[ASCIZ /KILLED HOUR-OLD DETACHED JOB, # /]
569         PUSHJ P,SYSJEX  ;PRINT MESSAGE AFTER CALLING ALOGO6
570             PUSHJ P,ALOGO6
571         JRST VSCOLD     ;LOOK FOR ANOTHER TREE TO GUN.
572
573 ;       MOVEI I,[ASCIZ/DID FOO TO JOB # /]
574 ;       PUSHJ P,SYSJEX
575 ;           PUSHJ P,FOO
576 ;DOES FOO TO THE JOB WITH IDX IN J, AND PRINTS A SYSTEM MSG.
577 ;FOO WILL FIND THE USR IDX IN A AND J. IT IS OK TO ENTER
578 ;SYSJEX WITH CLOCK OFF BUT FOO MUST TURN IT ON.
579 SYSJEX: HRRZS A,J
580         PUSH P,JNAME(A)
581         PUSH P,UNAME(A)
582         PUSH P,A        ;SAVE ALL THE INFO WE NEED FOR THE MESSAGE.
583         PUSH P,I
584         XCT @-4(P)      ;DO "FOO"
585          JFCL           ;LET FOO SKIP.
586         AOS -4(P)       ;SKIP OVER THE PUSHJ TO FOO.
587         PUSHJ P,WARMTTY
588         HRRZ I,(P)
589         PUSHJ P,SYSSP   ;PRINT THE STRING IN I
590         POP P,I
591         HLRZS I
592         SKIPE I
593          PUSHJ P,(I)    ;IF LH(I) WAS NONZERO, CALL THAT PRINT ROUTINE
594         POP P,A
595         IDIVI A,LUBLK
596         PUSHJ P,SYSOPT  ;PRINT THE JOB #
597         MOVEI I,[ASCIZ /, USR:/]
598         PUSHJ P,SYSSP
599         POP P,A
600         PUSHJ P,SYSIXP  ;PRINT UNAME, AND SPACE
601         PUSHJ P,STYOS
602         POP P,A
603         PUSHJ P,SYSIXP  ;PRINT JNAME
604         JRST SYSTCR     ;SPACE, TIME AND CR.
605 \f
606 SUBTTL TPL
607
608 VSCL6:  ;CHECK TPL: SEE IF LPT FREE AND ANY FILE TO PRINT.
609 IFN UNSPLP,[
610         PUSHJ P,LSWTL
611         DEMSW
612         MOVE A,[SIXBIT /UNSPOO/]
613         PUSHJ P,DEMSIG
614         JRST LSWPOP     ;REQUEST FAILED, TOO BAD
615         JRST LSWPOP
616 ]
617
618 IFE TPLP,POPJ P,
619 IFN TPLP,[
620         MOVEI A,SCRTPP  ;ALSO ENTER HERE FOR TPL CHECK
621         TDNE A,SUPCOR   ;SKIP IF NOT ALREADY PRINTING FILE
622         POPJ P,
623   IFG LPTP-1,[
624         SKIPE TPLSWP
625         JRST VSCL6A
626         SKIPLE NLPTBR
627         SKIPL LPTUSR
628         POPJ P,
629 VSCL6B:
630   ]
631   IFLE LPTP-1,[
632         SKIPL LPTUSR
633         POPJ P,
634   ]
635   IFG OLPTP-NLPTP,[
636         MOVEI A,132.
637         CAMLE A,LPTCC
638         POPJ P,
639   ]
640   IFG NLPTP-OLPTP,[
641         CONSO NLPT,207
642          SKIPG NLPTBR
643           POPJ P,       ;.OPEN OF LPT WOULD HANG
644   ]
645         MOVEI A,SCRTPF
646         TDNE A,SUPCOR   ;BLOCKED
647          POPJ P,
648         .OPEN TPLI,[SIXBIT /   TPL.FILE.(DIR)/] ;MAKE SURE FILE DIR IN CORE
649          JRST VSCLX1
650         MOVEI B,2
651 VSCL2:  .IOT TPLI,A
652         CAIE A,^C
653         CAIN A,12
654         SOJG B,VSCL2
655         JUMPN B,VSCL2
656         SETOB I,C
657         SETZM TPLFN1
658         SETZM TPLFN2
659         MOVEI B,TPLFN1
660         HRLI B,440600
661 VSCL2A: .IOT TPLI,A
662         CAIN A,"*
663          JUMPL I,VSCL4
664         CAIE A,^C
665          CAIN A,14
666           JRST VSCLX1
667         CAIN A,40
668          JUMPL I,VSCL2A ;IGNORE SPACES BEFORE THE PACK NUMBER.
669         CAIN I,3        ;AFTER 4 CHARS STARTING WITH BEGINNING OF PACK NUMBER
670          JRST VSCL2E    ;COMES THE START OF THE FN1.
671         CAIN A,"L
672          MOVEI C,0      ;INDICATE LINK
673         AOJA I,VSCL2A   ;FIRST NON SPACE CRUFTY
674 \f
675 IFG LPTP-1,[
676 VSCL6A: MOVEI A,132.
677         CAMG A,LPTCC
678         SKIPL OLPUSR
679         POPJ P,
680         JRST VSCL6B
681 ]
682
683 VSCL2E: MOVEI TT,6
684 VSCL2B: SUBI A,40
685         IDPB A,B
686         .IOT TPLI,A
687         SOJG TT,VSCL2B
688         MOVE B,[440600,,TPLFN2]
689 VSCL2C: .IOT TPLI,A
690         SUBI A,40
691         IDPB A,B
692         TLNE B,770000
693         JRST VSCL2C
694         .IOPUSH TPLI,
695         .OPEN TPLI,TPLFN
696         JRST VSCLL1     ;TRY AGAIN
697         .IOPOP PRTO,
698         .CLOSE PRTO,
699 IFN NLPTP,[
700 IFN OLPTP,[
701         SKIPE TPLSWP
702         JRST VSCL3A
703 ]
704         CONSZ NLPT,207
705          JRST VSCLX1
706         MOVEI T,LPTBSZ
707         CAMN T,NLPTBR   ;SKIP ON OPEN WOULD HANG
708         .OPEN PRTO,[3,,(SIXBIT /LPT/)]
709         JRST VSCLX1
710 IFN OLPTP,[
711         JRST VSCL3B
712 VSCL3A:
713 ]]
714 IFN OLPTP,[
715         MOVEI A,132.
716         CAMG A,LPTCC    ;SKIP IF .OPEN WOULD HANG
717 IFN NLPTP,.OPEN PRTO,[3,,'OLP]
718 .ELSE   .OPEN PRTO,[3,,(SIXBIT /LPT/)]
719         JRST VSCLX1
720 VSCL3B:
721 ]
722         MOVEI A,SCRTPP
723         IORM A,SUPCOR   ;PRINT THIS FILE
724         IORM A,SUPCOP   ;PRINT MORE EVERY SECOND.
725         JRST TPLPRT
726
727 VSCLL1: .IOPOP TPLI,
728         JUMPL C,VSCLX1
729         MOVEI B,1       ;LINK THAT DIDN'T EXIST
730         JRST VSCL2
731 ]
732 \f
733 IFN TPLP,[
734 ;COME HERE TO TRANSFER SOME CHARS FROM DSK TO LPT,
735 ;ASSUMING BOTH CHNLS ALREADY OPEN.
736 TPLPRT:
737 IFN NLPTP,[
738 IFN OLPTP,[
739         SKIPE TPLSWP
740          JRST TPLPR3
741 ]
742         MOVEI A,TPLBSZ
743         CAMLE A,NLPTBR
744          POPJ P,
745 IFN OLPTP,[
746         JRST TPLPR5
747 TPLPR3:
748 ]]
749 IFN OLPTP,[
750         MOVEI A,10.*TPLBSZ      ;LEAVE SPACE FOR CHARS THAT TAKE MORE THAN 1 CHAR
751         CAMLE A,LPTCC
752          POPJ P,
753 TPLPR5:
754 ]
755         MOVE A,[-TPLBSZ,,TPLBUF]        ;"UN-RELOCATE"
756         .IOT TPLI,A
757         MOVE B,A
758         MOVNI A,-TPLBUF(A)
759         HRLZS A
760         JUMPE A,TPLPR1  ;JUMP ON END OF FILE
761         HRRI A,TPLBUF
762         .IOT PRTO,A
763         JUMPL B,TPLPR1  ;LAST BUFFER-FULL PRINTED
764         JRST TPLPRT
765
766 TPLPR4: CLEARM TPLFN3
767         .FDELE TPLFN    ;DELETE FILE JUST PRINTED
768          JFCL
769         MOVEI A,SCRTPP
770         ANDCAM A,SUPCOP ;DON'T NEED TO CALL TPLPRT EVERY SECOND.
771         ANDCAM A,SUPCOR
772 VSCLX1: .CLOSE PRTO,
773         .CLOSE TPLI,
774         POPJ P,
775
776 VSCL4:  .IOT TPLI,A
777         CAIN A,14
778          JRST VSCLX1
779         CAIN A,12
780          JRST VSCL2A
781         JRST VSCL4
782
783 TPLPR1: PUSHJ P,TPLPR4
784         JRST VSCL6
785 ]
786 .ELSE TPLPRT==CPOPJ
787 \f
788 ;HANDLE A USER'S REQUEST TO "BLOCK THE TPL"
789 IFN TPLP,[
790 ;IF SYS JOB IS SPOOLING, JUST THROW AWAY CURRENT FILE.
791 TPLOFF: MOVEI A,SCRTPP
792         TDZN A,SUPCOP
793          POPJ P,                ;NOTHING HAPPENING
794         PUSHJ P,WARMTTY
795         .RESET PRTO,
796         PUSHJ P,TPLPR4
797         MOVE A,[SIXBIT /TPLOFF/]
798         PUSHJ P,SYSIXP
799         JRST SYSTCR
800 ]
801
802 IFE TPLP+UNSPLP,TPLOFF==CPOPJ
803
804 IFN UNSPLP,[
805 TPLOFF: MOVNS B,TPLFLG
806         JUMPG B,VSCL6   ;IF NOW RUNNING GIVE REQ
807         MOVSI B,-DMLNG
808 TPLOF1: SKIPE C,DMTTBL(B)
809         SKIPG D,DMTTBL+1(B)     ;USER INDEX -0 IF NOT YET LOADED
810         JRST TPLOF2
811         CAME C,[SIXBIT /UNSPOO/]
812         JRST TPLOF2
813         PUSH P,U
814         MOVE U,D
815         PUSHJ P,ALOGOUT ;DOES ONE USTOP FOR YOU
816         POP P,U
817         JRST TPLOF3
818
819 TPLOF2: ADD B,[DMTLL,,DMTLL]
820         JUMPL B,TPLOF1
821 TPLOF3: PUSHJ P,WARMTTY
822         MOVE A,[SIXBIT /TPLOFF/ ]
823         PUSHJ P,SYSIXP
824         JRST SYSTCR
825 ]
826 \f
827 SUBTTL WHO LINES
828
829 IFN N11TYS,[
830 ;PDP11 COMM AREA (SYSTEM WIDE)
831 ;STARTS AT PDP11 ADDRESS 40
832 ;PNTR TO TT11HD
833 ;PNTR TO POINTA
834 ;I/O VERSION #
835 ;SORCE FILE VERSION #
836 ;--PDP10 WD BOARDARY--  0 , INITED
837 ;                       0 , GODOWN
838
839 ;AT POINTA:
840 ;       ADDR OF SYSTEM WHO-LINE VARS
841 ;       ADDR OF 10-11 COMMAND BUFFER
842 ;       TENWHO , 0      ;PDP10 SETS TO TELL PDP11 TO UPDATE WHO-LINES
843 ;       MAXTV , 0       ;MAXTV = # TV'S 11 IS SET UP TO HANDLE
844 ;       NF11TY , 0      ;10 TELLS 11 WHAT TTY # OF 1ST BUFFER IS.
845
846 ;PDP11 CONSOLE VARS
847 ;         EVEN PDP11 WORD                 ODD PDP11 WORD
848 ;TT11HD - CHAIN OF ACTIVE INPUT BUFFERS   0
849 ;         PNTR TO OUTPUT BUFFER CHNL 0    VIDEO BUFFER,KBD # (377 IF NONE)
850 ;          "                    CHNL 1     "
851 ;...
852 ;         OUTPUT BFR EMPTY NOTIFY RQ       FLAG TO FREE CHNL
853 ;...
854 ;         PNTR TO WHO LINE BLOCK           FREE
855
856 ;THE 11 HAS COME UP, SO INIT COMMUNICATION VARIABLES AND START USING IT
857 SYS11U: SKIPG TT11P
858          POPJ P,
859         LDB A,[$11AD0,,TT11HA]          ;GET PDP10 ADDRESS OF INPUT-BFR-CHAIN PTR
860         CAIL A,NTTPG*2000
861          BUG HALT,[GARBAGE POINTER IN TV-11 MEMORY]
862         ADDI A,TT11LO
863         CONO PI,TTYOFF
864         MOVEM A,TT11HD                  ;SAVE IT FOR CLOCK LVL TO CHECK.
865         LDB C,[$11WD0,,TT11HA+1]        ;GET PDP11 IO VERSION #.
866         MOVEI B,12.                     ;OLD TV PROGRAMS HANDLE 12. BUFFERS
867         LDB T,[$11AD1,,TT11HA]          ;GET ADDR OF POINTA
868         CAIL C,3                        ;VERSION 3 AND UP TV PGM HAS MAXTV - READ IT
869          LDB B,[$11WD0,,TT11LO+2(T)]
870         MOVEM B,TT1111                  ;THAT'S HOW MANY TV'S THE 11 THINKS TERE ARE
871         CAIL B,N11TYS
872          MOVEI B,N11TYS                 ;MIN OF THAT AND # TEN THINKS THERE ARE
873         MOVEM B,TT11RL
874         MOVEI B,NF11TY
875         CAIL C,3                        ;VERSION 3 TV PGM AND UP WANTS NF11TY
876          DPB B,[$11WD0,,TT11LO+3(T)]
877         HRLZ I,TT11RL                   ;GET AOBJN -> TV'S BOTH 10 AND 11 WILL HANDLE.
878         MOVNS I
879 VSCL7C: LDB B,[$11AD0,,1(A)]            ;GET DPY BUFFER ADRESS FOR THIS TTY
880         ADDI B,TT11LO+2                 ;CONVERT TO PDP10 ADDRESS.
881         HRLI B,040000+TT11BY_6          ;GET BP TO ILDB 1ST DATA WORD.
882         MOVEM B,NF11TY+TOBBP(I)         ;PNTR TO BEG OF OUTPUT BUFFER
883         LDB C,[$11AD0,,(B)]             ;GET # BYTES IN DATA AREA
884         ADDI B,(C)                      ;GET BP TO LAST WORD IN AREA
885         MOVEM B,NF11TY+TOBEP(I)
886         MOVEM B,NF11TY+TOIP(I)
887         ADDI A,1
888         AOBJN I,VSCL7C
889         MOVEM C,TT11OL                  ;REMEMBER LENGTH OF OUTPUT BUFFERS.
890         SETOM TT11P                     ;TV TTYS NOW UP.
891         CONO PI,TTYON
892         MOVE A,[-N11TYS,,NF11TY]
893         MOVSI B,%TACFM                  ;NOW SAY ALL PDP11 TTYS NEED
894         ANDCAM B,TTYSTA(A)              ;CONSOLE FREE MESSAGES,
895         AOBJN A,.-1
896         MOVEI A,SCRCFM
897         IORM A,SUPCOR                   ;TELL SYS JOB TO PRINT THEM.
898         PUSHJ P,CLQAD1                  ;ADD WHO LINE BLOCK TO CLOCK QUEUE IF NOT THERE
899          WHOCLB
900         MOVEI I,[ASCIZ /TV 11 IS UP -/]
901         JRST SYSSTD                     ;STRING,SPACE TIME AND DATE THEN CR
902 ]
903 \f
904 IFN N11TYS,[
905
906 $INSRT WHOVAR
907
908 ;UPDATE WHO-LINE VARIABLES.
909 VWHO:   SKIPL TT11P             ;DON'T SCREW UP IF PDP11 ISN'T UP.
910          POPJ P,
911         MOVE A,TT11HD
912         HRLZ A,TT11RL
913         MOVNS A
914         HRR A,TT11HD            ;-<# TV'S BEING USED>,,<HEADER ADDR>
915         ADD A,TT1111
916         ADD A,TT1111            ;NOW RH -> 2 11-WDS BEFORE PTR TO WHOLINE VARS OF 1ST TV
917 VWHO1:  LDB B,[$11AD0,,1(A)]    ;GET WHO LINE VAR PDP11-ADDR, SHIFTED 2.
918         ADDI B,TT11LO           ;CONVERT TO PDP10 ADDRESS.
919         CONO PI,TTYOFF
920         MOVE TT,WHJOB(B)        ;JOB # (SHIFTED 4+16.)
921         MOVE C,WHMODE(B)        ;MODE (SHIFTED 4+16.)
922         JUMPG C,VWHO3
923         CONO PI,TTYON
924         JUMPL C,VWHO2           ;MODE < 0 => NO WHOLINE.
925         HLRE I,A                ;GET -<# TIMES REMAINING THRU LOOP>
926         ADD I,TT11RL
927         HRRZ TT,TTYSTS+NF11TY(I) ;MODE 0, USE JOB WHICH HAS THE TTY.
928         MOVE Q,TT
929         IDIVI Q,LUBLK
930         LSH Q,4.+16.
931         MOVEM Q,WHJOB(B)
932 ;FOR OTHER MODES, COME BACK HERE, WITH USER IDX IN TT.
933 VWHO3R: CONO PI,CLKOFF
934         MOVE C,UNAME(TT)
935         HLLZM C,WHUNAM(B)
936         HRLZM C,WHUNM2(B)       ;STORE THE JOB'S UNAME
937         MOVE C,JNAME(TT)
938         HLLZM C,WHJNAM(B)
939         HRLZM C,WHJNM2(B)       ;AND JNAME.
940         MOVE C,USYSNM(TT)
941         HLLZM C,WHSNAM(B)
942         HRLZM C,WHSNM2(B)       ;AND SNAME.
943         MOVE C,[SIXBIT /STOP/]
944         SKIPE USTP(TT)          ;AND "STATUS": IF NOT RUNNABLE, "STOP".
945          JRST VWHO4
946         MOVE C,[SIXBIT /RUN/]   ;IF NOT WAITING, "RUN".
947         SKIPN FLSINS(TT)
948          JRST VWHO4A
949         MOVE C,[SIXBIT /PAGE/]  ;DETECT WAITING FOR PAGE.
950         MOVE Q,USWST(TT)
951         TLNE Q,200000
952          JRST VWHO4
953         JRST VWHO4B
954
955 VWHO4A: MOVE E,UPC(TT)          ;JOB RUNNING: USER MODE?
956         TLNE E,%PCUSR           ;IF SO, STATUS IS "RUN" (C ALREADY SET UP)
957          JRST VWHO4
958 VWHO4B: MOVE E,SV40(TT)         ;ELSE DECODE SYSTEM CALL TO GET STATUS.
959         HLRZ Q,E
960         CAIN Q,(.CALL)
961          JRST VWHO4D            ;SYMBOLIC SYSTEM CALL.
962         TRZ Q,17_5
963         MOVE I,OPTION(TT)
964         TLNN I,%OPDEC
965          JRST VWHO4E
966         CAIE Q,40_9
967          CAIN Q,41_9
968           JRST VWHO4F
969         CAIN Q,47_9
970          JRST VWHO4F
971 VWHO4E: CAIN Q,(.IOT)           ;.IOT => DECODE DEVICE IN USE.
972          JRST VWHOI1
973         CAIN Q,(.OPER)
974          JRST VWHOO1            ;.OPER => DECODE ADDRESS FIELD.
975         CAIN Q,(.CALL)
976          JRST VWHOC1            ;.CALL BUT NOT SYMBOLIC => DECODE AC FIELD.
977         LSH Q,-9
978         CAIL Q,40
979         CAIL Q,40+NUUOSX
980 VWHO4F:  SKIPA C,[SIXBIT /UUO/] ;UNRECOGNIZED UUO.
981           MOVE C,UUOSXB-40(Q)   ;ELSE GET SIXBIT NAME OF UUO.
982         JRST VWHO4C
983
984 ;A SYMBOLIC SYSTEM CALL IS IN PROGRESS.
985 VWHO4D: MOVE C,LSCALL(TT)       ;USE SYSTEM CALL NAME AS STATUS
986         CAME C,[SIXBIT /SIOT/]
987          CAMN C,[SIXBIT /IOT/]
988           JRST VWHOI2           ;BUT IF IT'S "IOT", DECODE DEVICE TYPE.
989 VWHO4C: SKIPE FLSINS(TT)
990          JRST VWHO4
991         LSH C,-6
992         TLO C,'+_12.            ;STICK "+" ON FRONT IF RUNNING IN SYSTEM
993 ;DROPS THROUGH                  ;(NOT IF IN USER MODE, OR IF HUNG).
994 \f;DROPS IN
995 ;COME HERE WITH STATUS AS SIXBIT IN C.
996 VWHO4:
997 IFE SWPWSP,     SKIPL USWSCD(TT) ;SKIP IF SWAP-BLOCKED
998 IFN SWPWSP,[    MOVE Q,USWST(TT)
999                 TLNN Q,%SWSB
1000 ]
1001                  JRST .+3
1002                   LSH C,-6
1003                   TLO C,(SIXBIT/>/)
1004         HLLZM C,WHSTAT(B)
1005         HRLZM C,WHSTA2(B)
1006         MOVEI C,WHJ%RT(B)
1007         HRLI C,442000
1008         MOVE Q,JTMU(TT)         ;COMPUTE % RUN TIME FROM SCHEDULER PRIORITY.
1009         MULI Q,100.
1010         DIV Q,[2.^6]
1011         IDPB Q,C
1012         MOVE Q,UTRNTM(TT)
1013         IDIVI Q,25000.
1014         IDPB Q,C                ;JOB RUNTIME IN .1 SEC UNITS.
1015         MOVE Q,NMPGS(TT)
1016         MOVE I,NSWPGS(TT)
1017         SUBM Q,I
1018         IDPB I,C                ;JOB # REAL PAGES.
1019         IDPB Q,C                ;JOB # VIRTUAL PAGES.
1020 ;HANDLE THE USER-SPECIFIED FIELDS IN THE WHOLINE.
1021         MOVE Q,UWHO1(TT)
1022         ANDCMI Q,17
1023         MOVEM Q,1(C)            ;STORE JOB'S WHOLINE FLAGS.
1024         MOVE Q,UWHO2(TT)
1025         HLLZM Q,2(C)            ;STORE FIRST USER WHO VAR
1026         HRLZM Q,3(C)
1027         MOVE Q,UWHO3(TT)
1028         HLLZM Q,4(C)            ;STORE SECOND USER WHO VAR
1029         HRLZM Q,5(C)
1030 VWHO2:  CONO PI,CLKON
1031         AOBJN A,VWHO1
1032         JRST VWSYS
1033
1034 VWHOO1: HRRZ Q,E                ;JOB EXECUTING .OPER.
1035         CAIL Q,MXOPR
1036          SKIPA C,[SIXBIT/UUO/]
1037           MOVE C,OPRSXB(Q)      ;GET .OPER NAME AS STATUS
1038         JRST VWHO4C
1039
1040 VWHOI2: SKIPL Q,UUAC(TT)        ;NEW SYS CALL IOT
1041          JRST VWHO4C            ;GETTING ARGUMENTS, UUAC NOT SET UP YET
1042         MOVE I,C                ;SAVE NAME IN I
1043         JRST VWHOI4
1044
1045 VWHOI1: LDB Q,[270400,,E]       ;.IOT
1046         SETZ I,
1047 VWHOI4: ADDI Q,IOCHNM(TT)       ;Q HAS IOCHNM WORD ADDR FOR CHANNEL.
1048         MOVE Q,(Q)              ;GET IOCHNM WORD CONTENTS (RH INDEXES TABLES)
1049         HLRZ C,Q
1050         HLL Q,IOTTB(Q)          ;LH GETS BITS SAYING DIRECTION, BLOCK VS UNIT.
1051         HLL C,CLSTB(Q)
1052         TLNE C,%CLSJ            ;IF JOB DEVICE
1053          JRST [ MOVE C,JBDEV(C) ;GET NAME OF SIMULATED DEVICE
1054                 JRST VWHOI6 ]
1055         HLLZ C,DCHSTB(Q)        ;C GETS DEVICE NAME (LEFT-JUST SIXBIT)
1056         JUMPL C,VWHOI6          ;JUMP IF NORMAL 3-CHARACTER NAME
1057         MOVSS C                 ;NO, IS ADDRESS OF 6-CHARACTER NAME
1058         MOVE C,(C)
1059 VWHOI6: SETZ D,                 ;EVENTUALLY MAKE STATUS BE 9 CHARS, NOT 6?
1060         MOVE E,[360600,,C]
1061         ILDB J,E                ;FIND FIRST SPACE IN THAT DEVICE NAME
1062         JUMPN J,.-1
1063         JUMPGE Q,VWHOI3  .SEE %IOTBK    ;IF BLOCK MODE, PUT A "B" THERE.
1064         MOVEI J,'B
1065         DPB J,E
1066         IBP E
1067 VWHOI3: CAME I,[SIXBIT /SIOT/]
1068          JRST VWHOI5
1069         MOVEI J,'S
1070         DPB J,E
1071         IBP E
1072 VWHOI5: MOVEI J,'O              ;FOLLOW WITH "O" OR "I" SAYING DIRECTION.
1073         TLNN Q,%IOTOT
1074          MOVEI J,'I
1075         DPB J,E
1076         JRST VWHO4C             ;COMPLETED STATUS LOOKS LIKE "TTYBO".
1077
1078 VWHOC1: LDB Q,[270400,,E]       ;.CALL: GET AC FIELD,
1079         MOVE C,CALSXB(Q)        ;GIVE SIXBIT NAME OF .CALL.
1080         JRST VWHO4C
1081 \f
1082 ;MODE ISN'T 0: FIGURE OUT WHICH JOB TO DISPLAY WHO-LINE FOR,
1083 ;AND GO TO VWHO3R WITH JOB'S IDX IN TT. COME HERE WITH TTYCHN OFF.
1084 VWHO3:  LSH TT,-16.-4           ;WHAT JOB WAS LAST DISPLAY DONE FOR?
1085         IMULI TT,LUBLK
1086         CAMGE TT,USRHI
1087          SKIPN D,UNAME(TT)
1088           JRST VWHO3B           ;JOB WE WERE LOOKING AT HAS VANISHED.
1089         TLNE C,<-4>_<16.+4-18.>
1090          JRST VWHO3B            ;THIS TTY IS GETTING SYSTEM WHO-LINE.
1091         TLNN C,2_<16.+4-18.>
1092          JRST VWHO3E            ;WANT SAME JOB AS LAST TIME.
1093
1094 ;MODE 2 OR 3: COME HERE TO SEARCH FOR DESIRED JOB.
1095 VWHO3A: MOVSI E,1_<16.+4-18.>
1096         MOVEM E,WHMODE(B)       ;SWITCH TO MODE 1.
1097         MOVEI E,MAXJ+5          ;DON'T LOOP FOREVER
1098 VWHO3D: ADDI TT,LUBLK           ;ADVANCE TO NEXT JOB UP OR DOWN.
1099         TLNE C,1_<16.+4-18.>
1100          SUBI TT,2*LUBLK
1101         SKIPGE TT               ;WRAP AROUND IF NEC GOING DOWN.
1102          ADD TT,USRHI
1103         CAML TT,USRHI           ;WRAP AROUND IF NEC. GOING UP.
1104          MOVEI TT,0
1105         CAMN D,UNAME(TT)        ;BELONGS TO SOMEONE ELSE => KEEP GOING.
1106          JRST VWHO3C            ;BELONGS TO THIS USER => STOP.
1107         SOJG E,VWHO3D           ;KEEP LOOKING BUT DON'T LOOP IF NO JOB TO BE FOUND.
1108 VWHO3B: SETZM WHSTAT(B)         ;NO JOB TO BE FOUND.
1109         CONO PI,TTYON
1110         JRST VWHO2
1111
1112 VWHO3C: MOVE Q,TT               ;DESIRED JOB FOUND: SET UP FOR MODE 1
1113         IDIVI Q,LUBLK           ;LOOKING AT THIS JOB.
1114         LSH Q,16.+4
1115         MOVEM Q,WHJOB(B)
1116 VWHO3E: CONO PI,TTYON
1117         JRST VWHO3R
1118
1119 \f
1120 ;USER WHO LIES UPDATED; NOW UPDATE SYSTEM WHO LINE VARS.
1121 VWSYS:  LDB A,[$11AD1,,TT11HA]
1122         LDB B,[$11AD0,,TT11LO(A)]
1123         ADD B,[$11WD1,,TT11LO]          ;FIRST WORD OF BLOCK SET BY 11
1124         MOVEI C,SRI
1125         IDPB C,B        ;ITS VERSION#.
1126         MOVEI C,2
1127         MOVEI E,0
1128 IFN SWPWSP, MOVSI TT,%SWSB
1129         MOVEI Q,2*LUBLK
1130 VWSYS2: CAML Q,USRHI    ;COUNT # JOBS.
1131          JRST VWSYS1
1132         SKIPN UNAME(Q)
1133          JRST VWSYS3
1134         AOS C           ;C GETS # JOBS,
1135         SKIPE USTP(Q)
1136          JRST VWSYS3
1137 IFE SWPWSP,     SKIPGE USWSCD(Q)
1138 IFN SWPWSP,     TDNE TT,USWST(Q)
1139          AOS E          ;E GETS NUMBER OF ACTIVE SWAPPED BLOCKED JOBS
1140 VWSYS3: ADDI Q,LUBLK
1141         JRST VWSYS2
1142
1143 VWSYS1: IDPB C,B        ;TOTAL # JOBS
1144         MOVE D,MMPCNT
1145         IDPB D,B        ;TOTAL MEM (= TOTAL # PAGES, COUNTING SHARED PAGES ONLY ONCE).
1146         MOVE C,RNABLU
1147         SUBI C,1
1148         IDPB C,B        ;RUNNABLE USERS
1149         IDPB E,B        ;# SWAP-BLOCKED JOBS
1150         MOVE TT,NPGWTU
1151         IDPB TT,B       ;# WAITING FOR PAGE.
1152         MOVE C,TRUMM    ;TOTAL RUNNABLE USER MEMORY
1153         IDPB C,B
1154         MOVEI C,0
1155         MOVE TT,USRHI   ;COUNT PAGES AVAILABLE FOR USE OR ACTUALLY USED FOR USER MEM
1156         ADDI TT,USRSTG+1777
1157         LSH TT,-10.
1158 VWSYS5: LDB D,[MUR,,MEMBLT(TT)]
1159         CAIE D,MURUSR
1160         CAIN D,MUFR
1161          AOS C          ;FREE OR USER MEM.
1162         CAIGE TT,TSYSM-1
1163         AOJA TT,VWSYS5
1164         IDPB C,B        ;TOTAL MEM AVAIL FOR USERS
1165         HLRZ C,QDATE
1166         IDPB C,B
1167         MOVE C,SYSDBG
1168         IDPB C,B
1169         AOS B           ;SKIP A WHOLE WORD FOR TIME OF DAY
1170         MOVEI D,(B)     ;SAVE ADDRESS FOR BELOW
1171         MOVE C,SUSRS    ;# LOGGED IN USERS.
1172         IDPB C,B
1173         MOVEI E,10000.  ;FAIR SHARE IN %
1174         IDIV E,SLOADU   ;BASHES TT
1175         IDPB E,B
1176         MOVE C,TIMOFF   ;TIME OF DAY IN .5 SEC UNITS.
1177         LSH C,4
1178         MOVEM C,(D)     ;DEPOSITING TIME OF DAY TRIGGERS WHO-LINE UPDATE
1179         POPJ P,         ; BY THE PDP-11, SO DEPOSIT IT LAST
1180
1181 ]       ;END IFN N11TYS
1182 \f
1183 SUBTTL EXPAND/CONTRACT USER VARIABLES AREA
1184
1185 SYSEX:  PUSHJ P,SCOREX
1186          POPJ P,
1187         MOVE A,TIME
1188         MOVEM A,SCITM
1189         POPJ P,
1190
1191 SYSDEC: MOVE A,TIME     ;TRY TO DECREASE CORE RESERVED FOR USER VARIABLES
1192         SUB A,SCITM
1193         CAIG A,50.
1194          POPJ P,        ;TOO SOON SINCE GOT MORE CORE
1195         CONO PI,CLKOFF
1196         MOVE A,USRHI
1197         SUBI A,LUBLK
1198         SKIPN UNAME(A)
1199          JRST .-2
1200         ADDI A,LUBLK
1201         MOVEM A,USRHI   ;USRHI=> HIGHEST USER+L
1202         ADDI A,USRSTG
1203         ADDI A,1777
1204         SETOM SJCFF     ;INHIBIT ALLOCATION WHILE HUSRAD IS CHANGING
1205         CONO PI,CLKON
1206         MOVEI U,0       ;FOR ACORE
1207         LSHC A,-10.-36. ;MOVE INTO B AS WELL
1208         PUSHJ P,ACORE
1209          BUG            ;LOST FLUSHING CORE?
1210         CLEARM SJCFF
1211         POPJ P,
1212
1213 SCOREX: LDB B,[121000,,HUSRAD]  ;EXTEND CORE FOR USER VARIABLES AT TOP OF SYSTEM
1214         ADDI B,1
1215         CAILE B,LIOBLK
1216          MOVEI B,LIOBLK         ;TRYING TO GET TOO BIG, DON'T
1217         MOVEI U,0
1218         JRST ACORE
1219 \f
1220 SUBTTL LOGGER OUT
1221
1222 ;THIS ROUTINE AWAKENED BY .LOGOUT, .GUN, ETC.
1223 ;SEARCH FOR TREES THAT ARE LOGGING OUT AND READY TO BE FLUSHED
1224 ;(IE HAVE BULGO SET) AND FLUSH THEM, PRINTING LOGOUT MESSAGE IF APPRO.
1225 SYSGUN: SETZ U,
1226 SYSGU0: MOVE T,APRC(U)
1227         TLNE T,BULGO    ;IS THIS JOB READY TO BE FLUSHED?
1228          SKIPN UNAME(U)
1229           JRST SYSGU1
1230 IFN NUNITS,[
1231         SKIPGE TTYTBL(U) ;IF CONSOLE-CONTROLLED, FLUSH UTAPE ASSIGNMENTS
1232          JRST SYSGU2
1233         MOVSI I,-NUNITS
1234         MOVE A,UNAME(U)
1235         CAMN A,UTASS+1(I)
1236          SETZM UTASS+1(I)
1237         AOBJN I,.-2
1238 SYSGU2: ]
1239         HLRO B,UNAME(U)
1240         AOJE B,SYSGU3   ;IF THIS TREE COUNTS AS A LOGGED-IN USER,
1241         SKIPL TTYTBL(U)
1242          SOS SUSRS      ;DECREMENT COUNT OF SUCH.
1243 SYSGU3: CONO PI,CLKOFF
1244         PUSHJ P,DMNPLO  ;UPDATE TREE'S USAGE AND INFORM DEMON JOB
1245         MOVEM TT,TRUNTM(U)      ;SAVE RUN TIME FOR LOGOUT MSG
1246         CONO PI,CLKON
1247         SKIPGE A,TTYTBL(U)
1248          JRST SYSGU4    ;IF TREE HAS CONSOLE,
1249         SKIPE TTNTO(A)
1250          BUG
1251         PUSHJ P,TTYLO1  ;FREE IT.
1252         CAMN U,EPDL(U)  ;UNLESS GUNNED DOWN,
1253          SKIPN SUPPLG   ;MAY NOT WANT TO BOTHER PRINTING MESSAGE ON SYS CONSOLE
1254           SKIPGE DEDTIM
1255            JRST SYSGU4  ;IF LOGGED OUT BECAUSE SYS DOWN, SPARE THE LOGOUT MSG
1256         PUSHJ P,WARMTTY
1257         MOVEI I,[ASCIZ / LOGOUT /]
1258         PUSHJ P,SYSSP
1259         MOVE A,UNAME(U)
1260         PUSHJ P,SYSIXP  ;UNAME.
1261         PUSHJ P,STYOS   ;SPACE.
1262         HRRZ A,TTYTBL(U)
1263         PUSHJ P,SYSOPT  ;TTY #.
1264         PUSHJ P,SYSTCR
1265         ;VALUE PRINTED IS WRONG, AND HARD TO FIX, SO FOLLOWING CODE HAS BEEN FLUSHED.
1266         ;THE REASON IT'S WRONG IS BECAUSE TIME ALREADY SENT TO THE DAEMON IS NOT INCLUDED.
1267         ;MOVEI I,[ASCIZ / TUSED= /]
1268         ;PUSHJ P,SYSSP
1269         ;MOVE A,TRUNTM(U)
1270         ;MULI A,4069.
1271         ;DIVI A,1000.
1272         ;PUSHJ P,SYSDPC
1273         ;MOVEI I,[ASCIZ / USECS/]
1274         ;PUSHJ P,SYSSTD
1275         CAMN U,EPDL(U)  ;WAS LOGGED OUT BY SELF?
1276          JRST SYSGU4
1277         MOVEI I,[ASCIZ /   ^^  GUNNED DOWN BY /]
1278         PUSHJ P,SYSSP
1279         MOVE A,SRN4(U)
1280         PUSHJ P,SYSIXP  ;UNAME OF GUNNER.
1281         MOVE A,SRN5(U)
1282         PUSHJ P,SYSSIX  ;SPACE, AND JNAME OF GUNNER.
1283         PUSHJ P,SYSTCR  ;CRLF.
1284 ;MESSAGES PRINTED IF NECESSARY.
1285 SYSGU4: SETZ R,
1286         PUSHJ P,ZUSER   ;COMPLETELY ELIMINATE THE JOB.
1287         CONO PI,CLKON
1288 SYSGU1: ADDI U,LUBLK
1289         CAMGE U,USRHI
1290          JRST SYSGU0
1291         SETZ U,
1292         POPJ P,
1293 \f
1294 ;DETACH ANY TREES WHOSE TOP-LEVEL JOBS HAD FATAL INTS
1295
1296 SYSDT:  SETZB U,J
1297         PUSHJ P,SWTL
1298             TREESW
1299         CONO PI,CLKOFF
1300         MOVSI B,BUSRC
1301         MOVSI T,BULGOS+400000
1302 SYSDT0: SKIPN UNAME(J)
1303          JRST SYSDT1
1304         SKIPGE SUPPRO(J)        ;LOOK FOR TOP-LEVEL
1305          TDNE T,APRC(J)         ;IGNORE JOBS ALREADY DISOWNED, OR LOGGING OUT.
1306           JRST SYSDT1
1307         TDNE B,USTP(J)  ;THAT HAS BEEN STOPPED AS BY SUPERIOR
1308          JRST SYSDT2
1309 SYSDT1: ADDI J,LUBLK
1310         CAMGE J,USRHI
1311          JRST SYSDT0
1312         JRST CLKOPJ     ;NO MORE SUCH JOBS, DONE; LSWPOP AND CLKON.
1313
1314 ;FOUND A TOP LEVEL JOB NEEDING TO BE DETACHED.
1315 SYSDT2: PUSH P,J
1316         MOVE T,OPTION(J)
1317         TLNE T,%OPLKF
1318          JRST [ IDIVI J,LUBLK   ;BASHES R
1319                 .CALL [SETZ ? 'UNLOCK ? SETZI %JSNUM(J)]        ;UNLOCK THE LOCKS
1320                  BUG
1321                 MOVE J,(P)
1322                 JRST .+1 ]
1323         CONO PI,CLKOFF          ;IODCSS MIGHT HAVE TURNED IT ON
1324         SKIPL E,JBI(J)          ;NOTE CLKOFF IN EFFECT WHILE HACKING JOB DEVICE STUFF
1325          SKIPGE JBCG(E)
1326           JRST SYSDTA
1327         MOVE A,JBCUI(E)         ;JOB DEVICE, GIVE IOCER1 OR OPNL7
1328         LDB T,[000400,,JBSTS(E)]
1329         CAIE T,1
1330          JRST [ MOVSI T,7_5     ;NON IOT, UNHANG CREATOR SO WILL SEE OPNL7
1331                 MOVEM T,JBSTS(E)
1332                 MOVE T,FLSINS(A)
1333                 CAMN T,JBFLS
1334                  SETZM FLSINS(A)
1335                 JRST SYSDTA ]
1336         MOVEI B,1               ;IOT GIVE IOCER1
1337         MOVS H,E
1338         PUSHJ P,NSTIOC
1339          JFCL
1340 SYSDTA: POP P,J
1341         SETZ U,
1342         MOVE I,[SYSDT8,,[ASCIZ/TOP LEVEL INTERRUPT /]]
1343         PUSHJ P,SYSJEX
1344              PUSHJ P,SYSDT7
1345         JRST SYSDT
1346 \f
1347 SYSDT8: MOVE A,-1(P)    ;USER INDEX
1348         MOVE A,PIRQC(A) ;TOP LEVEL INTERRUPT BITS
1349         PUSHJ P,SYSFWP
1350 SYSDT9: MOVEI I,[ASCIZ/ DETACHED JOB # /]
1351         JRST SYSSP
1352
1353 ;JOB IN J SHOULD BE DETACHED, AND GUNNED AFTER AN HOUR,
1354 ; OR RIGHT AWAY IF NOT LOGGED IN
1355 SYSDT4: HLRE B,UNAME(J)
1356         AOJE B,SYSDT5   ;NOT LOGGED IN => KILL
1357         HRLI I,SYSDT9
1358         PUSHJ P,SYSJEX
1359             PUSHJ P,SYSDT3
1360         POPJ P,
1361
1362 SYSDT5: HRLI I,[MOVEI I,[ASCIZ / KILLED JOB # /]
1363                 JRST SYSSP]
1364         PUSHJ P,SYSJEX
1365             PUSHJ P,SYSDT6
1366         POPJ P,
1367
1368 SYSDT6: PUSHJ P,SYSDT3  ;FIRST DETACH (LEAVES USER INDEX OF TOP LEVEL JOB IN A).
1369         JRST ALOGO6     ;THEN LOG OUT.  SINCE DETACHED, NO ADDITIONAL MSG FROM SYSGUN.
1370
1371 ;CALL WITH CLOCK OFF TO DETACH THE JOB WITH IDX IN A AND J.
1372 ;ASSUME JOB'S BULGOS HAS BEEN CHECKED, AND TREESW LOCKED.
1373 ;TURNS CLOCK BACK ON AND DOES A LSWCLR
1374 SYSDT7: TDZA B,B        ;HERE TO LEAVE AROUND
1375 SYSDT3:  MOVEI B,10     ;HERE TO SET BUMRTL WHEN WE DETACH
1376         PUSHJ P,SOSSET
1377             DIELOK(A)
1378         AOS DIELOK(A)
1379         CONO PI,CLKON
1380         MOVEM B,CTLBTS(U)
1381         PUSHJ P,NDETA0
1382          BUG
1383         POPJ P,
1384 \f
1385 IFN NDLTYS+NETYS,[
1386
1387 ;HANDLE DIAL-UP LINE CONNECTS OR DISCONNECTS ON DL-10 AND DTE20.
1388
1389 SYSDIL:
1390 IFN NDLTYS,[
1391         SKIPN A,DL10CL
1392          JRST SYSDL2    ;THERE'S NONE TO PROCESS?
1393         SETZM DL10CL    ;FREE THE VAR FOR THE PDP11
1394         PUSHJ P,SYSDL0
1395 SYSDL2: ];NDLTYS
1396 IFN NETYS,[
1397         SKIPGE A,DTEHNG
1398          JRST SYSDL3
1399         SETOM DTEHNG
1400         PUSHJ P,SYSDL0
1401 SYSDL3:
1402 ];NETYS
1403         POPJ P,
1404
1405 SYSDL0: LDB I,[.BP 77,A] ;GET OUT THE TTY NUMBER
1406         CAIL I,NCT
1407          POPJ P,
1408         TRNE A,-100
1409          JRST SYSDL1    ;IT'S A CONNECT
1410         PUSHJ P,SWTL    ;IT'S A DISCONNECT
1411             TREESW
1412         MOVE J,TTYSTS(I) ;DETACH THE TREE ON THAT TTY.
1413         JUMPL J,LSWPOP  ;THERE'S NO TREE.
1414         TLNN J,%TSCNS
1415          JRST LSWPOP    ;TTY IS OPEN AS A DEVICE.
1416         MOVE I,APRC(J)
1417         TLNE I,BULGOS   ;GIVE UP IF TREE LOGGING OUT.
1418          JRST LSWPOP
1419         MOVE U,USER
1420         MOVEI I,[ASCIZ /DIALUP LINE DISCONNECTED,/]
1421         JRST SYSDT4
1422
1423 ;ON A CONNECT, SNARF THE LINE SPEEDS DETERMINED BY THE PDP11.
1424 SYSDL1: LDB B,[.BP 7000,A]
1425         DPB B,[$TTISP,,TTYTYP(I)]
1426         LDB B,[.BP 700,A]
1427         DPB B,[$TTOSP,,TTYTYP(I)]
1428         PUSHJ P,NCNSSP          ;SET UP INITIAL TTY TYPE AS PRINTING, ACCORDING TO SPEED
1429         MOVEI B,20              ;DON'T ASSUME TTY IS AT LEFT MARGIN
1430         MOVEM B,TTYIHP(I)
1431         MOVEM B,TPHP(TT)
1432         MOVEM B,TPHP+TPLEN(TT)
1433         POPJ P,
1434 ];NDLTYS+NETYS
1435 .ELSE SYSDIL==CPOPJ
1436 \f
1437 IFN N11TYS,[
1438 SYS11D: MOVEI I,[ASCIZ /TV 11 WENT DOWN --/]
1439         PUSHJ P,SYSSTD  ;STRING, SPACE, TIME AND CR
1440         SETZM TT11P     ;IN CASE SCR11D WAS SET BY A USER, AND HE DIDN'T HACK THIS.
1441         MOVEI A,TT11HD+1
1442         MOVEM A,TT11HD  ;PREVENT TT11IN FROM BEING CALLED ANY MORE.
1443 SYS11G: PUSHJ P,SWTL    ;PREPARE FOR DOING DETACHES
1444             TREESW
1445         MOVE I,[-N11TYS,,NF11TY]
1446 SYS11F: SKIPGE J,TTYSTS(I)      ;DETACH ALL 11TV TREES.
1447          JRST SYS11E            ;THIS 11TV NOT IN USE
1448         TLNN J,%TSCNS
1449          JRST SYS11P            ;THIS 11TV IN USE AS A DEVICE, DON'T DETACH BUT DO PCLSR
1450         MOVE T,APRC(J)
1451         TLNE T,BULGOS
1452          JRST SYS11E            ;DON'T DETACH TREES THAT ARE LOGGING OUT.
1453         MOVE U,USER
1454         MOVEI I,[ASCIZ / .../]
1455         PUSHJ P,SYSDT4  ;DETACH OR KILL JOB W/ # IN J, AND PRINT MESSAGE.
1456         JRST SYS11G     ;TREESW NOW UNLOCKED; MUST RE-LOCK.
1457
1458 SYS11P: HRRZ A,J        ;PCLSR THE NAME DRAGON
1459         PUSHJ P,NJRPCL
1460         PUSHJ P,NJUPCL  ;AND DROP INTO SYS11E
1461
1462 SYS11E: AOBJN I,SYS11F
1463         PUSHJ P,LSWPOP  ;TREESW NOT NEEDED IF NOTHING TO DETACH.
1464         MOVSI T,-MXVBN  ;FLUSH VIDEO BUFFER ASSIGNMENTS.
1465         SETOM VBAST(T)
1466         AOBJN T,.-1
1467         MOVEI T,0
1468 SYS11V: CAML T,USRHI
1469          POPJ P,
1470         SETZM NVDBA(T)
1471         SETOM TVCREG(T) ;FLUSH TV BUFFER NUMBERS IN CREGS
1472         ADDI T,LUBLK
1473         JRST SYS11V
1474
1475 TVBNCL: PUSH P,T        ;"DEASSIGN" TVVBN(U) AND CLEAR IT ON SCREEN IF NECC
1476         SKIPN TEN11F
1477          SKIPL TT11P
1478           JRST TVBNC1
1479         SKIPL T,TVVBN(U)
1480          CAME U,USER
1481           JRST TVBNC1
1482         PUSH P,400000+TTR10*2000
1483         MOVEM T,400000+TTR10*2000
1484         MOVE T,TVBLAD
1485         CLEARM 400000+TTR0*2000(T)
1486         POP P,400000+TTR10*2000
1487 TVBNC1: SETOM TVVBN(U)
1488         JRST POPTJ
1489 ];N11TYS
1490 \f
1491 ;PRINT CONSOLE FREE MSGS ON ALL TTYS THAT NEED IT.
1492 ;NOTE THAT THERE ARE LOWER CASE MESSAGES ON THIS PAGE.
1493 .SEE TTYLO1     ;THIS RTN SIGNALLED WHEN A TTY BECOMES FREE.
1494 SYSCFM: CLEARM IOCHNM+STYOC     ;REUSE SYSTEM CONSOLE CHANNEL
1495 SYSCF0: MOVEI A,0
1496 SYSCF1: CAIL A,NCT
1497          JRST SYSCOP            ;DONE, SWITCH SYSCON CHANNEL BACK TO SYSCON
1498         SKIPGE B,TTYSTA(A)      .SEE %TACFM
1499          AOJA A,SYSCF1
1500         TLNE B,%TANJS
1501          TLZ B,%TACTZ           ;%TANJS MEANS A FAILED ^Z - FORGET ABOUT THAT ^Z.
1502         MOVEM B,TTYSTA(A)
1503         SKIPGE TTYSTS(A)        .SEE %TSFRE
1504          TLNE B,%TACTZ
1505           AOJA A,SYSCF1         ;IN PROCESS OF LOADING TREE FOR THIS CONSOLE
1506         HRLZ T,A
1507         ADD T,[%TJDIS+%TJMOR,,TYODN]
1508         MOVEM T,IOCHNM+STYOC    ;"OPEN" A CHANNEL TO THAT TTY.
1509         SKIPGE SHUTDN
1510          PUSHJ P,SYSTS1         ;IF SHUTDOWN AND A DISPLAY, CLEAR THE SCREEN
1511         MOVEI I,[ASCIZ /
1512 Top level interrupt, tree detached
1513 /]
1514         MOVSI B,%TCDET  ;IF TTY FREE DUE TO DETACH FOR TOP LEVEL INT,
1515         TDNE B,TTYCOM(A)
1516          PUSHJ P,SYSSP  .SEE NDETAC     ;SAY SO.
1517         ANDCAM B,TTYCOM(A)
1518         MOVSI B,%TANJS
1519         ANDCA B,TTYSTA(A)
1520         EXCH B,TTYSTA(A)        ;CLEAR BIT, SAVE OLD VALUE
1521         PUSH P,A
1522         XCT DWNMSG
1523         SKIPGE SHUTDN
1524          JRST SYSCF2            ;SYSTEM IS DOWN, SAY SO
1525         XCT SCMESG
1526         CAMN A,SYSCN
1527          JRST SYSCF2            ;SYSTEM JOB USING THIS CONSOLE, SAY SO
1528         SRITYP [ System fully loaded. Console ]
1529         TLNN B,%TANJS
1530          SRITYP [ Console ]
1531         PUSHJ P,SYSSP
1532 IFN N11TYS,     CAIE A,NF11TY   ;ON ALL FREE PDP11-TV CONSOLES
1533          PUSHJ P,SYSOPT
1534         MOVEI I,[ASCIZ / Free./]
1535         PUSHJ P,SYSSTD
1536         XCT DMESSG
1537         SKIPE SYSDBG
1538 SYSCF2:  PUSHJ P,SYSSTD ;SAY "SYS BEING DEBUGGED" IF NEC.
1539         SKIPLE SHUTDN
1540          PUSHJ P,SYSSHM ;SAY "SYS GOING DOWN" IF NEC.
1541         POP P,A
1542         MOVSI B,%TACFM  ;TTY NO LONGER NEEDS CONSOLE FREE MSG.
1543         IORM B,TTYSTA(A)
1544 IFN N11TYS,PUSHJ P,TTYLO2 ;TELL THE PDP11 THIS TTY IS FREE
1545         SETZM IOCHNM+STYOC
1546         JRST SYSCF0
1547 \f
1548 SUBTTL SHUTDOWN
1549
1550 ;HANDLE .SHUTDN - PRINT "GOING DOWN" MSGS, ETC.
1551 SYSSHD: LDB D,[221700,,SHUTLK+1]
1552         PUSHJ P,SWTL
1553             SHUTLK
1554         MOVEI I,SYSSHM
1555         TLO I,40
1556         PUSH P,D
1557         PUSHJ P,SYALCP
1558         POP P,D
1559         IMULI D,LUBLK
1560         SKIPE D         ;SKIP IF LEFT FROM >5 MIN PRINT OUT
1561          SKIPN A,UNAME(D)
1562           JRST LSWPOP
1563         MOVEI I,[ASCIZ /CULPRIT = /]
1564         PUSHJ P,SYSSP
1565         PUSHJ P,SYSSIX
1566         MOVE A,JNAME(D)
1567         PUSHJ P,SYSSIX
1568         PUSHJ P,SYSTCR
1569         JRST LSWPOP
1570
1571 ;GOING DOWN, WHAT A SHAME
1572 SYSSHM: SRITYP [GOING DOWN IN ]
1573         SKIPG SHUTDN
1574          SRITYP [REVIVED]
1575         PUSHJ P,SYSSP
1576         SKIPG B,SHUTDN
1577          JRST SYSSHN
1578         SUB B,TIME
1579         IDIVI B,30.     ;CONVERT TO SECONDS
1580         PUSHJ P,RTIME   ;CONVERT TO SIXBIT
1581         MOVE B,A
1582         PUSHJ P,SYSTCD
1583 SYSSHN: MOVEI I,[.ASCII /.  /]
1584         JRST SYSSTD
1585 \f
1586 ;AND COME HERE WHEN TIME FOR SYS TO GO DOWN.
1587 ;MARK THE SYSTEM "DOWN", START FLAPPING TAPES AND DISKS,
1588 ;GUN ALL USERS, ETC. COMPLETION OF GOING DOWN IS DETECTED AT
1589 ;SLOW CLOCK LEVEL ("COFFIN").
1590 SYSOUT: PUSHJ P,CLQDEL
1591           DEDBLK
1592         SETOM DEDTIM    ;PREVENT ^Z'S
1593         .FDELE [SIXBIT/   SYSDOWN  MAIL/ ? 0 ? 0]
1594          JFCL
1595         MOVEI U,LUBLK*2
1596 SYSCK3: SKIPGE SUPPRO(U)        ;LOOK FOR ALL TOP-LEVEL JOBS.
1597          SKIPN UNAME(U)
1598           JRST SYSCK4
1599         MOVE T,USTP(U)
1600         TLNE T,BUSRC
1601          JRST SYSCK1
1602         MOVE T,OPTION(U)        ;IS THIS JOB AN EXCEPTION?
1603         TLNE T,%OPLIV
1604          JRST SYSCK4            ;YES, LET IT LOG ITSELF OUT
1605 SYSCK1: PUSHJ P,ALOGOUT         ;LOG IT OUT (TELLS IT TO PREPARE ITSELF, SIGNAL SYSGUN)
1606 SYSCK4: ADDI U,LUBLK
1607         CAMGE U,USRHI
1608          JRST SYSCK3
1609         SETZ U,
1610 DWNMSG: SRITYP [NOT IN OPERATION]
1611         PUSHJ P,SYALCP          ;TYPE OUT ON FREE CONSOLES
1612 IFN TPLP, MOVEI A,SCRTPF        ;TPLOFF
1613 IFN TPLP, IORM A,SUPCOR
1614 IFN UNSPLP,[    SKIPG TPLFLG
1615         JRST SYSCK0
1616         MOVEI A,SCRTPF
1617         IORM A,SUPCOR
1618 SYSCK0: 
1619 ]       MOVE I,QACTB
1620         IORM I,QMDRO
1621         MOVSI A,-NQS
1622 SYSCK7: MOVE I,DCHBT(A)
1623         SKIPN QACT(A)
1624         IORM I,QTUTO(A)
1625         AOBJN A,SYSCK7
1626 IFN NUNITS,[
1627         MOVEI A,1
1628 SYSUDM: SKIPL UDIRO(A)
1629         .UDISMT A,      ;DISMOUNT TAPES
1630         CAIGE A,NUNITS
1631         AOJA A,SYSUDM
1632 ]
1633         MOVE T,TIME
1634         MOVEM T,DTHTIM
1635         SETOM SHUTDN
1636         PUSHJ P,TTTMNT  ;TURN OFF ALL TERMINET MOTORS
1637         JRST SCOR
1638 \f
1639 SUBTTL SYSTEM CHECKS
1640 ;CHECK FOR DEVICES THAT LOSE THE PIA, DEVICES THAT INTERRUPT SPURIOUSLY,
1641 ;CLOBBERD LOCATIONS IN MEMORY.
1642
1643 IFE KS10P,[     ; KS has no devices to speak of...
1644
1645 SYSCK5: MOVSI A,-128.
1646 SYSC51: SKIPL B,DCHNTC(A)
1647 SYSC5A:  AOBJN A,SYSC51
1648         JUMPGE A,CPOPJ
1649         TLNN B,300000
1650         JRST SYSC5A
1651         PUSH P,A
1652         TLZE B,200000
1653         JRST SYSC52
1654         PUSHJ P,SYSC5S
1655         JRST SYSC53
1656 SYSC52: PUSHJ P,SYSC5C
1657 SYSC53: POP P,A
1658         MOVSI B,300000
1659         ANDCAM B,DCHNTC(A)
1660         JRST SYSC5A
1661
1662 SYSC5C: PUSHJ P,SYSC5B
1663         MOVEI I,[ASCIZ / CLOBBERED/]
1664         JRST SYSSTD
1665
1666 SYSC5S: PUSHJ P,SYSC5B
1667         MOVEI I,[ASCIZ / SUSPECTED OF INTERRUPTING ON CHANNEL /]
1668         PUSHJ P,SYSSP
1669         LDB T,[360300,,DCHNTC(A)]
1670         PUSHJ P,SYSSOP
1671         JRST SYSTCR
1672
1673 SYSSOP: PUSH P,A
1674         PUSH P,B
1675         MOVE A,T
1676         PUSHJ P,SYSOPT
1677         JRST POPBAJ
1678
1679 SYSC5B: MOVEI I,[ASCIZ /DEVICE /]
1680         PUSHJ P,SYSSP
1681         HRRZ T,A
1682         LSH T,2
1683         PUSHJ P,SYSSOP
1684         MOVEI I,[ASCIZ / (CONI= /]
1685         PUSHJ P,SYSSP
1686         HRRZ T,DCHNTC(A)
1687         PUSHJ P,SYSSOP
1688         MOVEI I,[ASCIZ /) /]
1689         JRST SYSSP
1690
1691 ] ;IFE KS10P
1692
1693 SYSCKS: HRRZ T,UPDBR1           ;CHECK FOR CLOBBERED DBRS
1694         HRRZ TT,UPDBR2
1695         CAIN T,UPGMP
1696          CAIE TT,UPGMP+100
1697           BUG HALT,[PAGER DATA CLOBBERED.  MAY BE DEC-TTL LEVEL CONVERTERS LOSING.]
1698 ;DROPS THROUGH
1699 \f;DROPS IN
1700         MOVE A,SYSCKP
1701         MOVE B,(A)
1702         MOVEI C,(B)
1703         EQV C,(B)
1704         AOBJN B,.-1
1705         CAME C,CKSUMS-TSTB(A)
1706         JRST SYSKS2
1707         AOBJN A,SYSKS1
1708 SYSKS3: MOVE A,[-LTSTB,,TSTB]
1709 SYSKS1: MOVEM A,SYSCKP
1710         POPJ P,
1711
1712 SYSKS2: EXCH C,CKSUMS-TSTB(A)
1713         XOR C,CKSUMS-TSTB(A)    ;SAVE XOR
1714         PUSHJ P,WARMTTY
1715         PUSHJ P,DINGTTY
1716         MOVEI I,[ASCIZ /SYSTEM CLOBBERED BETWEEN /]
1717         PUSHJ P,SYSSP
1718         HRRZ A,(A)
1719         PUSHJ P,SYSOPT
1720         MOVEI I,[ASCIZ / AND /]
1721         PUSHJ P,SYSSP
1722         MOVE B,SYSCKP
1723         HLRE A,(B)
1724         SETCMM A        ;OFFSET BY ONE
1725         ADD A,(B)
1726         HRRZS A
1727         PUSHJ P,SYSOPT
1728         MOVEI I,[ASCIZ / XOR= /]
1729         PUSHJ P,SYSSP
1730         MOVE A,C
1731         PUSHJ P,SYSFWP
1732         MOVEI I,[ASCIZ / !/]
1733         PUSHJ P,SYSSTD
1734         CLEARM TCKXOR   ;TRY TO DETERMINE EXACT ADR AND PREV CONTENTS
1735         MOVE A,[TCKXOR,,TCKXOR+1]
1736         BLT A,TCKXOR+35.
1737         MOVE A,[-LTSTB,,TSTB]
1738 SYSKS6: MOVE B,(A)
1739 SYSKS5: MOVE C,(B)
1740 REPEAT 36.,[IFL .RPCNT-18.,TLNE C,400000_<-.RPCNT>
1741 IFGE .RPCNT-18.,TRNE C,400000_<18.-.RPCNT>
1742         XORM B,TCKXOR+.RPCNT
1743         ]
1744         AOBJN B,SYSKS5
1745         AOBJN A,SYSKS6
1746         MOVSI D,-36.
1747 SYSKS7: MOVE A,TCKXOR(D)        ;UPDATE CKXORS TBL AND FILL TCKXOR TBL WITH POSSIBLE ADRS
1748         EXCH A,CKXORS(D)
1749         XOR A,CKXORS(D)
1750         HRRZM A,TCKXOR(D)
1751         AOBJN D,SYSKS7
1752         PUSHJ P,STYOT   ;INDENT LINE
1753         MOVSI D,-36.
1754         MOVSI E,400000  ;CURRENT BIT
1755         CLEARB I,J      ;COUNT OF #'S PRINTED, CLOBBERED WD
1756 SYSKS8: SKIPE A,TCKXOR(D)
1757         AOJA J,SYSKS9   ;INCR COUNT OF ADRS PRINTED
1758 SYSKT2: LSH E,-1
1759         AOBJN D,SYSKS8
1760         SOJN J,SYSKT1   ;MORE THAN 1 ADR CLOBBERD SO CANT PRINT PREV CONTENTS
1761         MOVEI T,"=
1762         PUSHJ P,STYO
1763         MOVE A,I        ;PRINT CONTENTS PRIOR TO CLOBBERAGE
1764         XOR A,(R)       ;XOR CURRENT CONTENTS
1765         PUSHJ P,SYSFWP
1766         MOVEI T,"-
1767         PUSHJ P,STYO
1768         MOVEI T,">
1769         PUSHJ P,STYO
1770         MOVE A,(R)
1771         PUSHJ P,SYSFWP  ;CURRENT CONTENTS
1772 SYSKT1: PUSHJ P,SYSCRF
1773         JRST SYSKS3
1774
1775 SCKX1:  PUSH P,T        ;UPDATE CKXORS TO REFLECT CHANGING WD IN T IN ADR IN Q
1776         MOVSI C,-36.
1777 SCKX2:  SKIPGE T
1778         XORM Q,CKXORS(C)
1779         LSH T,1
1780         AOBJN C,SCKX2
1781         JRST POPTJ
1782
1783 SYSKS9: PUSHJ P,SYSOPT
1784         PUSHJ P,STYOS
1785         MOVE R,TCKXOR(D)        ;CLEAR DUP ENTRIES
1786         MOVE T,D
1787         MOVE Q,E        ;ALSO LEAVE LAST ADR IN R (IN CASE ITS ONLY ADR)
1788 SYSKT3: CAME R,TCKXOR(T)
1789         JRST SYSKT4
1790         CLEARM TCKXOR(T)
1791         XORM Q,I
1792 SYSKT4: LSH Q,-1
1793         AOBJN T,SYSKT3
1794         JRST SYSKT2
1795 \f
1796 SUBTTL SUPPORT ROUTINES FOR BUG MACRO
1797
1798 ;NOTE: THESE REPLACE THE SYSMSG ROUTINE THAT USED TO BE HERE
1799
1800 ;ENTRY POINTS
1801 BUGCHK: PUSH P,TT
1802         MOVE TT,SYSMPT          ;HOW MANY MESSAGES BEHIND?
1803         SUB TT,SYSMPU
1804         CAIGE TT,<8_SYSMLNG>-8
1805          SKIPE SYSDBG
1806           JRST BUGPSE+1         ;TREAT AS BUGPSE IF BUFFER FULL OR SYSDBG
1807         CAIA
1808 BUGINF:  PUSH P,TT
1809         PUSHJ P,SYSMS0          ;HAND MESSAGE TO SYSTEM JOB TO BE PRINTED
1810         JRST POPTTJ             ;CONTINUE TRAPPED ROUTINE
1811
1812 BUGPSE: PUSH P,TT
1813         PUSHJ P,SYSMS0          ;COPY MESSAGE INTO SYSTEM JOB BUFFER
1814         JSP TT,BUGDD0           ;PRINT MESSAGE AND GO TO DDT
1815             ASCIZ/PAUSE.  FIND A WIZARD, CONSIDER TAKING A CRASH DUMP,
1816 OR TYPE <ALTMODE>P TO ATTEMPT TO REVIVE THE SYSTEM./
1817
1818 BUGDDT: PUSH P,TT
1819         PUSHJ P,SYSMS0          ;COPY MESSAGE INTO SYSTEM JOB BUFFER
1820         JSP TT,BUGDD0           ;PRINT MESSAGE AND GO TO DDT
1821             ASCIZ/DDT.  TYPE <ALTMODE>P TO CONTINUE./
1822
1823 BUGNIL: PUSH P,TT
1824         JRST BUGHL1             ;NO MESSAGE, JUST GO STRAIGHT TO DDT.
1825
1826 BUGAWF: 0                       ;JSR HERE WHEN AWFUL THINGS HAVE HAPPENED
1827         CONO PI,PIOFF           ;BETTER DO THIS AS SOON AS POSSIBLE
1828         MOVEM P,BUGACS+P        ;SAVE P AND GET A PDL TO USE
1829         MOVE P,BUGPDL
1830         PUSH P,BUGAWF           ;SIMULATE PUSHJ P,BUGHLT
1831 BUGHLT: PUSH P,TT
1832         PUSHJ P,SYSMS0          ;COPY MESSAGE INTO SYSTEM JOB BUFFER
1833 BUGHL1: JSP TT,BUGDD0           ;PRINT MESSAGE AND GO TO DDT
1834             ASCIZ/HALT.  FIND A WIZARD OR CONSIDER TAKING A CRASH DUMP.
1835 THE SYSTEM HAS CRASHED AND CANNOT BE REVIVED WITHOUT EXPERT ATTENTION.
1836 IF YOU CAN'T FIND HELP, RELOAD THE SYSTEM./
1837
1838 ;ROUTINE TO PICK UP THE DATA OUT OF THE BUG TABLE, EVALUATE THE
1839 ;ARGUMENTS, AND DUMP THE RESULTS INTO THE SYSMSG BUFFER TO BE
1840 ;PRINTED LATER.  THE THIRD THING DOWN ON THE STACK IS THE PC+1
1841 ;AT WHICH THE BUG WAS DETECTED.  TT IS THE ONLY SMASHABLE REGISTER.
1842 SYSMS0: MOVEI TT,8              ;8 WORDS IN ENTRY
1843         ADDB TT,SYSMPT          ;UPDATE STORING POINTER
1844         ANDI TT,8_SYSMLNG-1     ;MASK TO BUFFER INDEX
1845         ADDI TT,SYSMBF
1846         PUSH P,TT               ;SAVE PTR
1847         PUSH P,A                ;NOW LOCATE BUG TABLE ENTRY
1848         PUSH P,B
1849         MOVE A,TIME             ;STASH TIME IN EXTRA WORD OF ENTRY
1850         MOVEM A,7(TT)
1851         MOVEI B,BUGTAB
1852 SYSMS1: HRRZ A,(B)
1853         CAIN A,@-5(P)
1854          JRST SYSMS2            ;PC MATCHES
1855         HLRZ A,(B)              ;ADVANCE TO NEXT ENTRY
1856         ADD B,A
1857         JUMPN A,SYSMS1
1858         JRST 4,.                ;NOT IN TABLE?? MACROS MUST BE SCHROD
1859
1860 SYSMS2: HLRZ A,(B)
1861         ADDI TT,-2(A)
1862         EXCH TT,-2(P)           ;TT START OF ENTRY, -2(P) END
1863         MOVE A,TT
1864         HRLI A,1(B)             ;COPY BITS,,STRING AND ARG POINTERS
1865         BLT A,@-2(P)
1866         POP P,B
1867         POP P,A
1868         SUBM TT,(P)             ;(P) GETS -NARGS
1869         SKIPE (P)               ;IN CASE NO ARGS
1870 SYSMS3:  PUSH TT,@1(TT)         ;EVALUATE ARGUMENT POINTERS
1871         AOSGE (P)
1872          JRST SYSMS3
1873         MOVEI TT,SCRMSG         ;BIT FOR MSG PRINT
1874         IORM TT,SUPCOP          ;TRY EVERY SECOND TO PRINT SOME MSGS
1875         IORM TT,SUPCOR          ;FIRST ATTEMPT RIGHT AWAY.
1876         JRST POP1J              ;RETURN TO BUGINF OR WHEREVER
1877
1878 ;CALL HERE TO PRINT THE MESSAGES OUT OF THE BUFFER
1879 ;A HAS SCRMSG
1880 SYSMPR: MOVE TT,SYSMPT          ;LAST MESSAGE IN
1881         CAMG TT,SYSMPU          ;LAST MESSAGE OUT
1882          JRST [ ANDCAM A,SUPCOP ;CAUGHT UP
1883                 POPJ P, ]
1884         SUBI TT,8_SYSMLNG
1885         CAMLE TT,SYSMPU
1886          JRST [ MOVE A,TT       ;BEHIND BY MORE THAN SIZE OF BUFFER
1887                 SUB A,SYSMPU
1888                 MOVEM TT,SYSMPU
1889                 LSH A,-3        ;NUMBER OF MESSAGES LOST
1890                 PUSHJ P,DINGTTY
1891                 PUSHJ P,SYSDPT
1892                 MOVEI I,[ASCIZ/ SYS MSGS LOST/]
1893                 PUSHJ P,SYSSTD
1894                 JRST .+1 ]
1895         MOVEI TT,8
1896         ADDB TT,SYSMPU
1897         ANDI TT,8_SYSMLNG-1
1898         ADDI TT,SYSMBF
1899         PUSHJ P,DINGTTY
1900         HLLZ D,(TT)             ;GET MODE FLAGS
1901         HRRZ I,(TT)             ;GET ASCIZ MSG
1902         HRLI I,440700
1903 SYSMP0: ILDB T,I
1904         JUMPE T,SYSMP1
1905         CAIGE T,10
1906          JRST SYSMP3
1907         PUSHJ P,STYO
1908         JRST SYSMP0
1909
1910 SYSMP1: PUSHJ P,STYOS           ;SPACE AND OUTPUT REMAINING ARGS
1911         PUSHJ P,SYSMP2
1912          JRST SYSTCR            ;END WITH TIME, POPJ
1913         JRST SYSMP1
1914
1915 SYSMP3: PUSH P,T                ;OUTPUT THIS MANY ARGS
1916 SYSMP4: PUSHJ P,SYSMP2
1917          JFCL
1918         PUSHJ P,STYOS
1919         SOSLE (P)
1920          JRST SYSMP4
1921         SUB P,[1,,1]
1922         JRST SYSMP0
1923
1924 SYSMP2: MOVEI C,0
1925         LSHC C,3                ;GET A BYTE
1926         JUMPE C,CPOPJ           ;NO MORE ARGS TO PRINT
1927         PUSH P,I
1928         MOVE A,1(TT)
1929         PUSHJ P,@SYSMTB(C)
1930         POP P,I
1931         AOJA TT,POPJ1
1932
1933 ;DISPATCH TABLE FOR SYSTEM MESSAGE PRINTER
1934
1935 SYSMTB: JRST 4,.        ;0 CHECKED FOR END
1936         SYSFWP          ;1 FULL WORD OCTAL
1937         SYSDPT          ;2 FULL WD DECIMAL
1938         SYSDPC          ;3  " WITH COMMAS
1939         SYSCRF          ;4 DO CR
1940         CPOPJ           ;5 ?
1941         SYSIXP          ;6 SIXBIT
1942         [MOVE I,A       ;7 ASCIZ
1943          JRST SYSSP]
1944
1945 ;ROUTINE FOR BUGS THAT NEED TO HALT INTO DDT
1946 BUGDD0: HRLI TT,440700
1947         CONO PI,PIOFF           ;PREVENT INTERFERENCE, AND HACK STYO
1948         MOVEM TT,T00POS         ;SAVE ADDRESS OF MESSAGE TEMPORARILY
1949         POP P,TT                ;RESTORE TT AT TIME OF BUG
1950         POP P,BUGPC             ;ADDRESS+1 OF BUG
1951         SKIPE BUGAWF
1952          MOVE P,BUGACS+P        ;CORRECT P AT TIME OF BUG
1953         SETZM BUGAWF            ;CLEAR FLAG FOR NEXT BUG IN CASE REVIVED
1954         CONI PI,BUGPI           ; SAVE PI STATUS
1955         CONI BUGAPR             ; SAVE APR STATE
1956 IFE KA10P,[
1957         CONI PAG,BUGEBR         ; SAVE EBR, UBR, ETC
1958         DATAI PAG,BUGUBR
1959 ] ;IFE KA10P
1960         SPM BUGPGM              ; SAVE PAGER STATE
1961         MOVEM 17,BUGACS+17      ;SAVE ACS
1962         MOVEI 17,BUGACS
1963         BLT 17,BUGACS+16
1964         MOVE P,BUGPDL           ;USE THIS PDL FOR TYPING OUT
1965         PUSH P,T00POS           ;RECOVER ASCIZ STRING FOR FLAVOR OF BUG
1966         PUSHJ P,SYSCRF          ;CARRIAGE RETURN
1967 BUGDD1: MOVEI A,SCRMSG
1968         PUSHJ P,SYSMPR          ;DUMP SYSMSG BUFFER
1969 IFN KA10P,[
1970         CONSZ TTY,40            ;PUNT IF CHARACTER TYPED
1971          JRST BUGDD2
1972 ] ;KA10P
1973 IFN KL10P,[
1974         SETZM DTEFLG
1975         MOVEI A,%DTTYI
1976         MOVEM A,DTECMD
1977         CONO DTE,%DBL11
1978         SKIPN DTEFLG
1979          JRST .-1
1980         SKIPE DTEF11            ;INPUT TYPED?
1981          JRST BUGDD2            ;YES, PUNT
1982 ] ;KL10P
1983 IFN KS10P,[
1984         SKIPE 8CTYIN            ; Any input available?
1985          JRST BUGDD2            ; Yes:  Punt.
1986 ] ;KS10P
1987         MOVE TT,SYSMPT          ;LAST MESSAGE IN
1988         CAMLE TT,SYSMPU         ;LAST MESSAGE OUT
1989          JRST BUGDD1
1990 BUGDD2: MOVE A-1,BUGPI          ;CHECK FOR PI IN PROGRESS
1991         ANDI A-1,77400
1992         LSH A-1,20.
1993         JFFO A-1,[ MOVEI I,[ASCIZ/PI LEVEL /]
1994                    PUSHJ P,SYSSP
1995                    PUSHJ P,SYSDPT
1996                    PUSHJ P,STYOS
1997                    JRST .+1 ]
1998         MOVEI I,[ASCIZ/BUG/]
1999         PUSHJ P,SYSSP
2000         POP P,I                 ;PAUSE OR HALT MESSAGE
2001         SKIPN SYSDBG            ;PUNT LONG-WINDED MESSAGE IF DEBUGGING
2002          PUSHJ P,SYSSP
2003         MOVEI I,[ASCIZ/
2004 YOU ARE NOW IN DDT./]
2005         PUSHJ P,SYSSP
2006         MOVEI TT,[ASCIZ|BUGPC/\eQ-2/|]
2007         HRLI TT,440700
2008         MOVEM TT,777777         ;TELL DDT TO EXAMINE BUGHLT ADDRESS
2009         MOVE TT,BUGPC           ;ARRANGE FOR <ALT>P TO JUMP THERE
2010         MOVEM TT,@DDT-6         ;IN OLDER DDT WILL JUST CLOBBER AC0
2011         MOVSI 17,BUGACS         ;RESTORE ACS
2012         BLT 17,17
2013         CONO PI,PION
2014         JRST DDT
2015
2016 EBLK
2017
2018 ;DATA AREAS POINTERS AND BUFFER FOR SYS MSG PRINTER
2019
2020 CTLMAX==55.     ;Number of lines after which we should print the date.
2021 CTLCNT: 0       ;Keeps track of number of lines printed on console.
2022
2023 SYSMPT: 0       ;POINTER TO MESSAGE MOST RECENTLY INSERTED
2024 SYSMPU: 0       ;POINTER TO MESSAGE MOST RECENTLY PRINTED
2025                 ;(MUST TAKE MODULO LENGTH OF TABLE, AND ADD OFFSET OF BEGIN OF TABLE)
2026 IFNDEF SYSMLNG,SYSMLNG==5       ;LOG(2) OF # ENTRIES (5=>32)
2027
2028 SYSMBF: BLOCK 8_SYSMLNG ;8 WDS PER ENTRY: BITS,,STRING, 6 ARGS, TIME
2029
2030 BUGPC:  0                       ;RESTART PC FROM BUG
2031 BUGPI:  0                       ; CONI PI,BUGPI
2032 BUGAPR: 0                       ; CONI APR,BUGAPR
2033 IFE KA10P,[
2034 BUGEBR: 0                       ; CONI PAG,BUGEBR
2035 BUGUBR: 0                       ; DATAI PAG,BUGUBR
2036 ];IFE KA10P
2037 IFN 0,[                         ;UPGML/UPGMLE not defined yet...
2038 BUGPGM: BLOCK UPGMLE-UPGML      ; SPM BUGPGM
2039 ]
2040 BUGPGM: BLOCK 8                 ;KLUDGE
2041 BUGACS: BLOCK 20                ;AC SAVE AREA FOR BUGDD0
2042 BUGPDL: -20,,.
2043         BLOCK 20
2044 T00POS: 0                       ;TTY00 HORIZONTAL POSITION
2045
2046 BBLK
2047 \f
2048 SUBTTL .SETLOC ROUTINE (DOCUMENT THEN DOES IT)
2049
2050 SYSSET: MOVE A,SETSLC   ;LOCATION TO BE MODIFIED
2051         TLNN A,-1       ;SKIP IF ALREADY DONE
2052          SKIPA C,SETSLQ ;NEW VAL IN SETSLQ
2053           SKIPA C,(A)   ;NEW VAL IN LOC
2054            SKIPA D,A    ;OLD VAL IN @A
2055             MOVEI D,SETSLQ      ;OLD VAL IN SETSLQ
2056         PUSHJ P,SYSSCT  ;PRINT OUT DDT-TYPE SEQUENCE
2057         MOVE A,SETSU    ;GET USET NAME
2058         PUSHJ P,STYOT   ;TYPE OUT A TAB
2059         MOVEI B,0
2060         PUSHJ P,SYSIXP  ;PRINT NAME OF GUILTY PARTY
2061         PUSHJ P,SYSTCR  ;STANDARD SYS CARRIAGE RETURN
2062         SKIPGE SETSLC   ;IF ALREADY MUNGED AT UUO LEVEL
2063          POPJ P,        ;THEN EXIT NOW
2064         MOVE T,SETSLQ   ;GET DESIRED VALUE
2065 ;       SKIPL UMBTS
2066 ;        JRST SYSSE8    ;DON'T HACK METABITS
2067 ;       LMB Q,@SETSLC   ;GET META BIT OF DESIRED LOCATION
2068 ;       TRNE Q,1        ;IF 1 THEN HAVE TO MOMENTARILY CLEAR IT
2069 ;        JRST SYSSE5
2070 SYSSE8: EXCH T,@SETSLC  ;META BIT=0, CHANGE LOCATION
2071 SYSSE6: MOVE Q,SETSLC   ;GET ADR OF MUNGED LOC
2072         MOVE A,[-LTSTB,,TSTB]
2073 SYSSE1: MOVE B,(A)
2074         CAIGE Q,(B)
2075          JRST SYSSE3
2076         HLRE C,B
2077         SETCMM C
2078         ADD C,B
2079         CAILE Q,(C)
2080          JRST SYSSE3
2081         PUSHJ P,SCKX1   ;UPDATE CKXORS TBL TOO
2082         EQV T,@SETSLC
2083         EQVM T,CKSUMS-TSTB(A)
2084         MOVE T,@SETSLC
2085         PUSHJ P,SCKX1   ;UPDATE TO REFLECT NEW CONTENTS
2086 SYSSE2: MOVSI A,SCLSET
2087         ANDCAM A,SUPCOR
2088         CAIE Q,SYSDBG   ;IF NOT DEBUG SWITCH
2089          POPJ P,        ;EXIT
2090         PUSHJ P,DBGINT  ;SYSDBG STATE CHANGE, TELL ALL USERS
2091         SKIPE SYSDBG
2092          JUMPN T,CPOPJ
2093 ;SYSDBG CLEARED, GIVE "IN OPERATION" MESSAGE BY DROPPING INTO ISYS
2094 ;HERE WHEN SYSTEM IS UP AND DISKS HAVE BEEN INITIALIZED
2095 ;RE-ENTER HERE WHEN SYSDBG STATE CHANGED
2096 ISYS:   PUSHJ P,DATIME  ;MAY BE ABLE TO FIND TIME IMMEDIATELY (ONCE MFD IN)
2097         PUSHJ P,TTTMN2  ;MAKE SURE WE THINK THAT ALL TERMINET
2098                 ;MOTORS ARE OFF, SO WE'LL TRY TO TURN THEM ALL ON WHEN WE TYPE
2099                 ;"ITS IN OPERATION" ON THEM.
2100         PUSHJ P,TTRSAL  ;SEND %TDORS TO ALL SOFTWARE TTYS
2101         SRITYP [\aIN OPERATION\a]
2102         SKIPE SYSDBG    ;IF SYS IN DEBUG MODE
2103 DMESSG:  SRITYP [\aBEING DEBUGGED\a]      ;SET TO APPROP MSG
2104         PUSHJ P,SYALCP  ;PRINT ON ALL CONSOLES
2105 SCMESG: SRITYP [SYSTEM JOB USING THIS CONSOLE.]
2106         PUSHJ P,SYSSP   ;PRINT ON SYS JOB CONSOLE
2107         SKIPGE DMLLDF   ;START DRAGON (DAEMON) IF WANTED
2108          SKIPL DMON+1   ;AND NOT DONE ALREADY
2109           POPJ P,
2110         HRROI T,DMON
2111         CONO PI,UTCOFF
2112         PUSHJ P,NUJBST
2113          BUG            ;SHOULD BE ROOM IN REQUEST BUFFER
2114         JRST UTCONJ
2115
2116 SYSSE3: AOBJN A,SYSSE1
2117         JRST SYSSE2
2118
2119                 ;SETLOC ROUTINE TO MODIFY LOCATION WITH META BIT = 1
2120
2121 ;SYSSE5:        MOVEI D,0
2122 ;       SMB D,@SETSLC
2123 ;       EXCH T,@SETSLC
2124 ;       SMB Q,@SETSLC
2125 ;       JRST SYSSE6
2126 \f
2127 SUBTTL MEMORY ERROR MESSAGES
2128
2129 NXMTYP: MOVEI I,[ASCIZ /NON-EX MEM ERROR #/]
2130         MOVEI TT,1
2131         JRST MEMTYP
2132
2133 IFE KA10P,[
2134 BPFTYP: MOVEI I,[ASCIZ /PAGE FAIL ERROR #/]
2135         MOVEI TT,2
2136         JRST MEMTYP
2137 ] ;IFE KA10P
2138
2139 PARTYP: MOVEI I,[ASCIZ /PARITY ERROR #/]        ;PARITY ERROR
2140         MOVEI TT,0
2141 MEMTYP: PUSHJ P,SYSSP
2142         MOVE A,PARERR(TT)
2143         PUSHJ P,SYSOPT
2144         MOVEI I,[ASCIZ /,  PC = /]
2145         PUSHJ P,SYSSP
2146         MOVE A,PARPC(TT)
2147         PUSHJ P,SYSFWP
2148         MOVEI I,[ASCIZ /,  JOB # /]
2149         PUSHJ P,SYSSP
2150         MOVE A,PARUSR(TT)
2151         IDIVI A,LUBLK
2152         PUSHJ P,SYSOPT
2153         MOVEI I,[ASCIZ /, USR:/]
2154         PUSHJ P,SYSSP
2155         MOVE D,PARUSR(TT)
2156         MOVE A,UNAME(D)
2157         PUSHJ P,SYSSIX
2158         PUSHJ P,STYOS
2159         MOVE A,JNAME(D)
2160         PUSHJ P,SYSSIX
2161         JRST @.+1(TT)   ;DISPATCH ON TYPE OF ERROR
2162          PARTY2         ;PARITY
2163          SYSTCR         ;NXM
2164 IFE KA10P,[
2165          BPFTY2         ;BPF
2166
2167 BPFTY2: MOVEI I,[ASCIZ /, PFW = /]
2168         PUSHJ P,SYSSP
2169         MOVE A,BPFPFW
2170         PUSHJ P,SYSFWP
2171         JRST SYSTCR
2172 ] ;IFE KA10P
2173
2174 PARTY2: PUSHJ P,SYSTCR
2175 IFN KS10P,[
2176         MOVEI I,[ASCIZ /ERR ADDR = /]
2177         PUSHJ P,SYSSP
2178         MOVE T,PARERA           ; Error address is all we collect on the KS.
2179         PUSHJ P,SYSP
2180         PUSHJ P,SYSCRF
2181 ] ;KS10P
2182 IFN KL10P,[
2183         SKIPN PARRSN
2184          JRST PARTP1
2185         MOVEI I,[ASCIZ /ERR ADDR = /]
2186         PUSHJ P,SYSSP   ;PAR ERR INT ALWAYS GIVES ERR ADDR
2187         MOVE T,PARERA
2188         JRST PARTP2
2189
2190 PARTP1: MOVEI I,[ASCIZ /PFW = /]
2191         PUSHJ P,SYSSP   ;PAR ERR TRAP GIVES PFW AND BAD DATA
2192         MOVE T,PARPFW   ;EVEN IF SCAN DOESN'T FIND PAR ERRS.
2193         PUSHJ P,SYSP
2194         MOVEI I,[ASCIZ /,  BAD DATA = /]
2195         PUSHJ P,SYSSP
2196         MOVE T,PARWRD
2197 PARTP2: PUSHJ P,SYSP
2198         PUSHJ P,SYSCRF
2199 ] ;KL10P
2200         SOSGE D,PARCNT
2201          POPJ P,
2202         JUMPE D,PARTP3  ;IF SCAN FOUND MORE THAT ONE PAR ERR,
2203                 ;PRINT AND'S AND OR'S OF DATA AND ADDRS.
2204 IRP X,,[PARAAN,PARAOR,PARAND,PARIOR]Y,,[ADDR AND,ADDR IOR,DATA AND,DATA IOR]
2205 IFE .IRPCNT&1,  MOVEI I,[ASCIZ /Y = /]
2206 .ELSE           MOVEI I,[ASCIZ /,  Y = /]
2207                 PUSHJ P,SYSSP
2208                 MOVE T,X
2209                 PUSHJ P,SYSP
2210 IFN .IRPCNT&1,  PUSHJ P,SYSCRF  ;PRINT TWO ITEMS PER LINE.
2211 TERMIN
2212 PARTP3: MOVEI I,[ASCIZ /PARITY ERRORS:
2213 /]
2214         PUSHJ P,SYSSP
2215 SYSPR1: PUSHJ P,STYOT   ;TYPE TAB
2216         MOVE A,PARADR(D)
2217         PUSHJ P,SYSFWP
2218         PUSHJ P,STYOT
2219         MOVE A,PARCON(D)
2220         PUSHJ P,SYSFWP
2221         PUSHJ P,SYSCRF
2222         SOJGE D,SYSPR1
2223         AOS D,PARCNT
2224         MOVEI I,[ASCIZ/ .../]
2225         CAIN D,MXPARS
2226          PUSHJ P,SYSSP  ;NOT ALL PARITY ERRORS WERE PRINTED
2227         JRST SYSCRF
2228 \f
2229 SUBTTL LOGIN & MISCELLANEOUS MESSAGES
2230
2231 SYSLGI: SKIPE SUPPLG
2232          POPJ P,                ;DON'T BOTHER PRINTING MESSAGE
2233         HLRZ I,SLGIV+1          ;Message (CHUNAME, LOGIN, etc)
2234         PUSHJ P,SYSSP
2235         MOVEI TT,SLGIV  ;.LOGIN
2236         MOVE A,(TT)
2237         CAMN A,[-1]
2238          BUG
2239         PUSHJ P,SYSG23
2240         SKIPE A,SLGIV+2
2241         PUSHJ P,SYSSIX
2242         JRST SYSTCR
2243
2244 SYSG23: PUSHJ P,SYSIXP
2245         PUSHJ P,STYOS
2246         HRRZ A,1(TT)    ;PICK UP TTY NUM
2247         JRST SYSOPT
2248
2249 ;PRINT A MESSAGE WHEN SOMEONE WRITES ON SYS.
2250 SYSWRT: MOVE A,SWUNAM   ;WRITE ON SYS DEVICE
2251         PUSHJ P,SYSIXP
2252         MOVE A,SWJNAM
2253         PUSHJ P,SYSSIX
2254         MOVE A,SWFN3    ;SNAME - SYS,SYS1, ...
2255         PUSHJ P,SYSSIX
2256         MOVE A,SWFN1
2257         PUSHJ P,SYSSIX
2258         MOVE A,SWFN2
2259         PUSHJ P,SYSSIX
2260         MOVE A,[SIXBIT /WRITE/]         ;Assume luser was writing.
2261         MOVE B,SWMOD                    ;Check opcode.
2262         CAIN B,2                        ;MLINK?
2263          MOVE A,[SIXBIT /LINK/]         ; Yup.
2264         CAIN B,4                        ;Maybe DELE/WO, RENAM/WO?
2265          MOVE A,[SIXBIT /DELRNM/]       ; Yah, hmmhmmm.
2266 SYSWR3: PUSHJ P,SYSSIX
2267         JRST SYSTCR
2268 \f
2269 SUBTTL DETERMINE AND PRINT THE DATE AND TIME
2270
2271 EBLK
2272 DATIME: JRST .+1        ;RH MODIFIED TO REFLECT PROGRESS
2273 BBLK            ;ROUTINE CALLED BY PUSHJ,
2274                 ;BIT SET EVERY SECOND FROM SUPCOP UNTIL
2275                 ;THE DATE IS KNOWN.
2276         MOVSI T,40000   ;"MFD IN" BIT IN QMDRO
2277         CONO PI,UTCOFF  ;DISABLE INTERRUPTS
2278         TDNE T,QMDRO    ;SEE IF DIRECTORY IN
2279          JRST UTCONJ    ;NOT IN
2280                 ;MFD IN, GET CRUD FROM IT
2281         MOVE A,QMDRO    ;GET ORIGIN OF MFD
2282         SKIPE B,MDYEAR(A)       ;YEAR
2283          MOVEM B,FYEAR
2284         SKIPE C,MPDOFF(A)       ;PDTIME OFFSET
2285          MOVEM C,PDTIME
2286         MOVEI C,DATIM0
2287         HRRM C,DATIME
2288         JRST UTCONJ
2289
2290 DATIM0: PUSHJ P,GLPDTM  ;NOW SEE IF IT'S ALL THERE
2291          JRST DATIM2    ;NOT ALL THERE, DOCUMENT WHAT'S MISSING
2292         JRST DATIM6     ;ALL THERE, TYPE OUT AND CLEAR SUPCOR BIT
2293
2294                 ;NOT ALL THERE, DOCUMENT (TYPE OUT) WHAT IS MISSING
2295                 ;SHOULD NOT BE NECESSARY TO WARM UP TTY
2296
2297 DATIM2:
2298 IFN PDCLKP,[
2299         DATAI PDCLK,A   ;SEE IF CLOCK ON
2300         JUMPN A,DATIM3  ;JUMP IF CLOCK WINNING
2301         MOVEI I,[ASCIZ /DECORIOLIS CLOCK HAS BEEN POWERED OFF, IF THE TIME
2302 CANNOT BE DETERMINED FROM THE NETWORK, YOU MAY HAVE TO :PDSET
2303 /]
2304         MOVEI T,500.
2305         SOJG T,.        ;WAIT AND BE SURE
2306         DATAI PDCLK,A   ;GET DATAI AGAIN
2307         JUMPN A,DATIM3  ;JUMP IF OK NOW
2308         PUSHJ P,SYSSP   ;COMPLAIN
2309 ] ;PDCLKP
2310 IFN KS10P,[
2311         RDTIM A         ; Clobbers B
2312         TLC A,1729.     ; "A most interesting number"
2313         TLNN A,-1       ; If present, KS-10 clock still remembers the time.
2314          JRST DATIM3
2315         MOVEI I,[ASCIZ /THE KS-10 CLOCK HAS BEEN RESET, IF THE TIME CANNOT
2316 BE DETERMINED FROM THE NETWORK, YOU MAY HAVE TO :PDSET
2317 /]
2318         PUSHJ P,SYSSP   ; Complain
2319 ] ;KS10P
2320 DATIM8:
2321 ;       HRROI T,CCTSS   ;NOW PREPARE TO LOAD CTSS CALLER FROM SYS:@ CCTSS
2322 ;       PUSHJ P,NUJBST  ;DO A PSEUDO-CONTROL Z
2323 ;       JRST DATIM7
2324 DATIM3: MOVEI C,0       ;COUNTER OF THINGS MISSING FROM MFD
2325         MOVEI I,[ASCIZ /YEAR, /]
2326         SKIPG FYEAR     ;CHECK YEAR
2327         PUSHJ P,[AOJA C,SYSSP]  ;NOT IN, COMPLAIN
2328 IFN PDCLKP\KS10P,[
2329         MOVEI I,[ASCIZ /PDTIME OFFSET, /]
2330         SKIPN PDTIME
2331         PUSHJ P,[AOJA C,SYSSP]  ;PDTIME OFFSET NOT IN
2332 ] ;PDCLKP\KS10P
2333         JUMPE C,DATIM4  ;SKIP FOLLOWING IF EVERYTHING ON DISK
2334         MOVEI I,[ASCIZ /NOT ON DISK.
2335 PLEASE SETLOC APPROPRIATELY.
2336 /]
2337         PUSHJ P,SYSSP
2338 DATIM4: SKIPA T,[DATIM5];UPDATE DATIME TO WAIT FOR EVERYTHING TO BE THERE
2339 DATIM7: MOVEI T,DATIM8  ;UPDATE DATIME TO WAIT FOR ABILITY TO DO
2340                         ; PSEUDO-CONTROL Z FOR CTSS CALLER
2341         HRRM T,DATIME
2342         POPJ P,
2343 \f
2344         ;WAIT FOR EVERYTHING TO BE THERE
2345         ;THEN TYPE OUT "IT IS NOW...", ETC.
2346
2347 DATIM5: PUSHJ P,GLPDTM  ;CHECK IT
2348          POPJ P,                ;NOT ALL THERE YET
2349         MOVEI T,DATIME+1        ;ALL THERE, RE-INITIALIZE DATIME
2350         HRRM T,DATIME
2351 DATIM6: MOVSI T,SCLDAT  ;STOP CALLING DATIME EVERY SECOND
2352         ANDCAM T,SUPCOP ;NOW THAT THE WORK IS DONE.
2353         HRRZS TIMOFF    ;START UP SLOW CLOCK REAL-TIME ROUTINE
2354         SETZM RSWTIM    ;Initialize the resource-warning timestamp.
2355         PUSHJ P,WARMTT  ;WARM UP TTY
2356         PUSHJ P,RYEAR1  ;GET DAY OF WEEK IN RELEVANT FIELD OF E
2357 SYSNWP: MOVEI I,[ASCIZ /IT IS NOW /]
2358         PUSHJ P,SYSSP   ;TYPE IT OUT
2359         IDIVI A,SPD     ;A HAS RESULT OF PUSHJ TO GLPDTM
2360         PUSH P,A        ;SAVE DAY OF YEAR
2361         MOVE A,B        ;GET # SECS SINCE MIDNIGHT IN A
2362         IDIVI A,SPD/2   ;GET AM/PM BIT IN A, 12 HOUR TIME (SECS) IN B
2363         PUSH P,[SIXBIT / AM    PM/](A)  ;REMEMBER WHAT HALF-DAY
2364         CAIGE B,3600.   ;USE 12:01 RATHER THAN 0:01 IN 12-HR TIME.
2365          ADDI B,12.*3600.
2366         PUSHJ P,RTIME   ;CONVERT TIME TO SIXBIT
2367         MOVE B,A
2368         TLNN B,170000   ;IF LEADING DIGIT IS ZERO,
2369         TLZ B,770000    ;THEN TURN IT INTO A BLANK
2370         PUSHJ P,SYSTCD  ;TYPE OUT TIME
2371         POP P,B         ;RESTORE AM OR PM WORD
2372         PUSHJ P,SYS6    ;TYPE IT OUT
2373         MOVE B,[SIXBIT / EST,/]
2374         TLNE E,100000   ;DST BIT
2375         HRLI B,(SIXBIT / ED/)   ;DAYLIGHT SAVINGS TIME, TYPE OUT EDT INSTEAD OF EST
2376         PUSHJ P,SYS6    ;TYPE IT OUT
2377         PUSHJ P,STYOS   ;TYPE A SPACE
2378         LDB B,[320300,,E]       ;GET DAY OF WEEK (0 => SUNDAY)
2379         MOVE B,DOWTBL(B)        ;MON, TUES, WEDNES, ETC. (IN SIXBIT)
2380         PUSHJ P,SYS6    ;TYPE IT OUT
2381         MOVEI I,[ASCIZ /DAY, /] ;FINISH ON DAY OF WEEK
2382         PUSHJ P,SYSSP   ;" " "
2383         POP P,A         ;RESTORE DAY OF YEAR
2384         PUSHJ P,RDATE1  ;CALCULATE MONTH AND DAY
2385         MOVE B,NMNTBL-1(B)      ;GET SIXBIT FOR MONTH
2386         PUSHJ P,SYS6    ;TYPE OUT MONTH
2387         PUSHJ P,STYOS   ;TYPE A SPACE
2388         MOVE A,C        ;GET DAY OF MONTH IN A
2389         PUSHJ P,SYSDPT  ;TYPE OUT IN DECIMAL
2390         MOVEI T,",
2391         PUSHJ P,STYO    ;TYPE A COMMA
2392         MOVEI A,(E)     ;GET YEAR
2393         PUSHJ P,SYSDPT  ;TYPE IT OUT
2394         JRST SYSCRF     ;END WITH CRLF
2395
2396                 ;TABLE OF NAMES OF MONTHS (FIRST THREE LETTERS, IN SIXBIT)
2397
2398 NMNTBL: MNIRP [SIXBIT /M/]
2399
2400                 ;TABLE OF SIXBIT NAMES FOR DAYS OF THE WEEK
2401                 ;(THE "DAY" ON THE END LEFT OFF)
2402
2403 DOWTBL: IRPS D,,[SUN MON TUES WEDNES THURS FRI SATUR]
2404         SIXBIT /D/
2405         TERMIN
2406 IFN .-DOWTBL-7,.ERR BARF AT DOWTBL
2407 \f
2408 SUBTTL NETWORK UP/DOWN
2409
2410 SYSNET:
2411 IFE IMPP,JRST SCOR
2412 IFN IMPP,[
2413         MOVE A,IMERCN           ;Get error status
2414         CAME A,[-1]             ;--1 means IMP cycled by user
2415          SKIPA I,[[ASCIZ /IMP CRASHED, STATUS=/]]
2416           MOVEI I,[ASCIZ /IMP cycled by user at/]
2417         PUSHJ P,SYSSP           ;Print string
2418         MOVE A,IMERCN           ;Get IMP error code back
2419         CAME A,[-1]
2420          PUSHJ P,SYSFWP         ;Print status if error
2421         PUSHJ P,SYSTCR          ;Time, CRLF
2422         SETOM IMERCN            ;Reset error status
2423         MOVE A,LNETIM           ;Last time net was initted
2424         SUB A,TIME              ;A will be positive if net was last
2425         ADDI A,30.*30.          ; initted less than 30 sec ago.
2426         PUSH P,A                ;Flag for SYSNT5. + means don't restart IMP
2427         MOVNI A,2               ;Say we are coming up, but no PI action yet,
2428         MOVEM A,IMPUP           ; and prevent new net openers.  IMPUP may
2429         PUSHJ P,SYSNT5          ; not already be -1 if got here via LOCK/NET
2430         JRST SCOR               ;Reset net, then back to main loop
2431
2432 ;Reset net, and potentially restart IMP
2433 ; Try restarting if IMP ready and -1(P) is negative. 
2434 ;
2435 ;IMPUP is -1 so no new opens can happen.
2436
2437 SYSNT5: 
2438         ;PCLSR those users running in OPEN.
2439         ;
2440         MOVEI U,0
2441 IFN NCPP,[
2442         PUSHJ P,LSTSTP          ;PCLSR all users in .OPEN
2443             NETLST
2444         MOVSI I,-IMPSTL
2445 SYSNT2: SKIPL A,IMSOC1(I)
2446          JRST SYSNT1
2447         HRRZS A
2448         SKIPN UNAME(A)
2449          JRST SYSNT1
2450         MOVE T,APRC(A)
2451         TLNE T,BULGO            ;Tree is being deleted anyway.
2452          JRST SYSNT1
2453         PUSHJ P,IFSTOP          ;Stop network user
2454         PUSHJ P,CHSCAA
2455             PUSHJ P,SYSNT3      ;Hack IOCHNM words of net user
2456 SYSNT1: AOBJN I,SYSNT2
2457 ];NCPP
2458
2459         ;Disconnect all STYs from the network
2460         ;
2461         MOVEI I,NFSTTY+NSTTYS-1
2462 SYSNT6:
2463         PUSHJ P,NSTYN0
2464          JFCL
2465         CAILE I,NFSTTY
2466          SOJA I,SYSNT6
2467
2468 IFN NCPP,[
2469         ;Clean up connections which were closing
2470         ;
2471         CONO PI,UTCOFF
2472         MOVSI I,-IMPSTL
2473 SYSNT7: SKIPL H,IMSOC1(I)
2474          JRST SYSNT4
2475         PUSHJ P,IMPBRT  ;RETURN BUFFER
2476         TLNN H,200000   ;IN PROCESS OF CLOSING?
2477          JRST SYSNT4    ;NO, IGNORE
2478         SETZM IMSOC1(I) ;FLUSH SOCKET
2479         SOS IMNCS       ;DECREASE COUNT OF CLOSES IN PROCESS
2480 SYSNT4: AOBJN I,SYSNT7  ;LOOP THRU ALL SOCKETS
2481         SKIPE IMNCS     ;SKIP IF 0 MORE CLOSES
2482          BUG PAUSE,DEC,IMNCS,[NET CHANNELS NOT CLOSED YET]
2483         CONO PI,UTCON
2484 ];NCPP
2485
2486         ;Maybe try to bring the IMP up again
2487         ;
2488         MOVEI U,0
2489         SKIPG -1(P)             ;If last time down was < half minute ago,
2490          CALL IMPCKR            ; or IMP ready line is not set,
2491           JRST LSWCLR           ; then don't try to bring it up again
2492         PUSHJ P,IMPINI
2493 IFN NCPP,PUSHJ P,LSWCLR         ;Restart old network users
2494         PUSHJ P,WARMTTY
2495         MOVEI I,[ASCIZ /IMP up again./]
2496         JRST SYSSTD             ;Print and return
2497
2498 IFN NCPP,[
2499 SYSNT3: HRRZ C,(R)
2500         CAIL C,NETDUI
2501          CAILE C,NETDBO
2502           POPJ P,       ;NOT A NETWORK CHANNEL
2503         HLRE C,(R)      ;SOCKET MAP INDEX
2504         JUMPL C,CPOPJ
2505         HRROS (R)       ;SET LH OF IOCHNM TO -1
2506         HRRZ C,R
2507         SUBI C,IOCHNM(A)
2508         CAIL C,20
2509          POPJ P,        ;ON IOPDL
2510         MOVE C,CHNBIT(C)
2511         AND C,MSKST2(A)
2512         IORM C,IFPIR(A) ;INTERRUPT USER
2513         POPJ P,
2514 ];NCPP
2515 ];IMPP
2516
2517 ;Try to bring IMP up if desirable
2518 SYSIMU:
2519 IFE IMPP,POPJ P,                ;No IMP, no work
2520 IFN IMPP,[
2521         SKIPGE IMPTCU           ;Already trying to come up?
2522           POPJ P,               ;Yes, no meddling needed
2523         CALL IMPCKR             ;Check if IMP ready line is now 
2524          JRST [ SETZM IMPTCU    ;IMP not ready, we are down and not trying
2525                 POPJ P, ]       ; to come up. Give up now
2526         PUSH P,[-1]             ;Force SYSNT5 to try and restart IMP if called
2527         SKIPGE IMPUP            ;Do this only if imp is temporarily down.
2528          PUSHJ P,SYSNT5         ;Reset world, restart IMP
2529         JRST POP1J              ;Clean up and exit
2530 ];IMPP
2531 \f
2532 ;       PUSHJ P,LSTSTP
2533 ;        LIST           ;WHERE LIST/ <HEAD OF A LIST OF JOBS>
2534 ;STOPS ALL JOBS ON THE LIST, AND PUT THEM ON OUR LSWPR.
2535 ;LIST SHOULD BE LINKED THROUGH THE RH, AND EACH WORD IN THE LIST SHOULD BE
2536 ;IN THE USER VAR BLOCK OF SOME JOB. THAT JOB IS CONSIDERED TO BE ON THE LIST.
2537 ;0 IN THE RH MEANS NIL.
2538 LSTSTP: MOVE T,@(P)     ;POINTER TO FIRST ELEMENT OF LIST
2539         CONO PI,CLKOFF
2540         MOVE T,(T)
2541 LSTST1: HRRZS T
2542         SKIPN A,T       ;ADDRESS OF LSWB BLOCK
2543         JRST CLKOJ1
2544         MOVEI A,-USRSTG(A)
2545         IDIVI A,LUBLK
2546         IMULI A,LUBLK   ;USER INDEX
2547         PUSH P,(T)
2548         PUSHJ P,IFSTOP  ;STOP USER, ADDING HIS USTP TO OUR LSWPR
2549         POP P,T
2550         JRST LSTST1
2551 \fSUBTTL SYSTEM JOB TYPE-OUT ROUTINES
2552
2553 ;PRINT "<A>/    <@D>    <C>" IN OCTAL.
2554 ;USED BY SYSSET. CLOBBERS A,B,T.
2555 SYSSCT: HRRZS A
2556         PUSHJ P,SYSOPT
2557         MOVEI T,"/
2558         PUSHJ P,STYO
2559         PUSHJ P,STYOT   ;TAB
2560         MOVE A,(D)      ;GET CURRENT VALUE
2561         PUSHJ P,SYSFWP
2562         PUSHJ P,STYOT
2563         MOVE A,C        ;GET NEW VALUE
2564         JRST SYSFWP
2565
2566 ;STRING <- I, SPACE, TIME AND CRLF.
2567 ;CLOBBERS A THRU E AND T.
2568 SYSSTD: PUSHJ P,SYSSP
2569
2570 ;SPACE, TIME AND CRLF.
2571 ;CLOBBERS A THRU E AND T.
2572 SYSTCR: PUSHJ P,SYSTPT
2573
2574 ;TYPE A CRLF. CLOBBERS T.
2575 SYSCRF: SOS CTLCNT      ;Countdown number of lines printed.
2576         MOVEI T,15
2577         PUSHJ P,STYO
2578         MOVEI T,12
2579         JRST STYO
2580
2581 SYSTPT: PUSHJ P,STYOS   ;TYPE SPACE, TIME
2582         CONSZ PI,200    ;IF IN BUGDD0, MUSTN'T CALL GLPDTM
2583          PUSHJ P,GLPDTM
2584           POPJ P,       ;TIME NOT KNOWN
2585         IDIVI A,SPD
2586         PUSHJ P,RTIME   ;CONVERT TO SIXBIT.
2587         MOVE B,A        ;DROP INTO SYSTCD
2588
2589 SYSTCD: LDB A,[301400,,B]
2590         PUSHJ P,SYSTWR
2591         LDB A,[141400,,B]
2592         PUSHJ P,SYSTWR
2593         MOVE I,[140600,,B]
2594         JRST SYSIX2
2595
2596 ;PREPARE FOR TYPING OUT A MESSAGE ON THE CONSOLE TTY. CALL HERE BEFORE
2597 ;STARTING TO TYPE A LINE, IF THERE IS A CHANCE THAT SYS JOB MIGHT JUST
2598 ;BE STARTING TO TYPE AFTER A PERIOD OF SILENCE.
2599 WARMTTY:PUSHJ P,SYSCOP          ;GET SYSTEM TTY READY TO USE
2600         .IOT STYOC,[^P]         ;ADVANCE TO FRESH LINE
2601         .IOT STYOC,["A]
2602 WARMT2:
2603 IFN 1,  POPJ P,
2604 .ELSE [ MOVE T,SYSCN
2605         MOVE T,TTLTM(T) ;DON'T DO THIS IF THERE'S BEEN ACTIVITY IN 2 MINUTES.
2606         ADDI T,115.*30.
2607         CAML T,TIME
2608          POPJ P,
2609         PUSH P,[[MOVEI T,^H
2610                 JRST WARMT1]]
2611         SKIPA T,[175]   ;WARM UP TELETYPE (ONLY ON AI-KA FOR NOW)
2612 ];END .ELSE
2613 DINGTTY:        SKIPA T,[^G]    ;DING DING
2614 WARMT1: PUSHJ P,.+1
2615         PUSHJ P,.+1
2616         JRST STYO
2617
2618 ;ROUTINE TO "OPEN" A CHANNEL TO THE SYSTEM CONSOLE
2619 ;IT'S DONE THIS WAY SO THAT THE CONSOLE CAN STILL BE
2620 ;USED AS A USER CONSOLE WHEN NECESSARY.  SYSTEM JOB
2621 ;MESSAGES WILL JUST COME OUT FROM TIME TO TIME.
2622
2623 SYSCOP: HRLZ T,SYSCN            ;FAKE UP AN IOCHNM WORD
2624         ADD T,[%TJDIS+%TJMOR,,TYODN]
2625         SKIPGE SYSCN
2626          MOVEI T,NLODN          ;IF NO SYS TTY AVAIL, USE NUL DEVICE
2627         MOVEM T,IOCHNM+STYOC
2628         POPJ P,
2629 \f
2630 ;TYPE OUT THE SIXBIT WORD IN B, QUIT WHEN WHAT IS LEFT IS BLANK
2631 SYS6:   JUMPE B,CPOPJ   ;RETURN WHEN NOTHING LEFT
2632         MOVEI A,0       ;INITIALIZE FOR LSH
2633         LSHC A,6        ;SHIFT A CHARACTER IN
2634         MOVEI T,40(A)   ;CONVERT TO SIXBIT AND GET IN T
2635         PUSHJ P,STYO    ;TYPE OUT THE CHARACTER
2636         JRST SYS6       ;LOOP BACK FOR NEXT CHARACTER
2637
2638 ;PRINT A MESSAGE ON ALL FREE CONSOLES. 40 SET IN LH(I) => IT IS ADDR OF ROUTINE;
2639 ;ELSE IT IS ADDR OF AN ASCIZ STRING TO BE TYPED FOLLOWED BY THE TIME AND A CRLF.
2640 SYALCP: TLNN I,40
2641          HRLI I,440700  ;SYSTEM ALL CONSOLES PRINT
2642         MOVEI A,0
2643 SYALC1: PUSHJ P,SYSTSU
2644          AOJA A,SYALC3
2645         TLNE I,40
2646          JRST SYALC5
2647         MOVE Q,I        ;SO NOT TO MUNG I UNTIL END
2648 SYALC2: ILDB E,Q
2649         JUMPE E,SYALC4  ;JUMP IF DONE
2650         .IOT STYOC,E    ;COPY CHARACTER
2651         JRST SYALC2     ;GO GET NEXT CHARACTER
2652
2653 SYALC5: PUSH P,I
2654         PUSH P,A
2655         PUSHJ P,(I)
2656         POP P,A
2657         POP P,I
2658 SYALC6: MOVSI E,%TACFM
2659         IORM E,TTYSTA(A)        ;DONT NEED CONSOLE FREE MSG ANY MORE
2660         AOS A           ;INCREMENT CONSOLE NUMBER
2661 SYALC3: CAIGE A,NCT+IFN N11TYS,[1-N11TYS]       ;IF MORE CONSOLES LEFT,
2662          JRST SYALC1    ;THEN PRINT OUT ON NEXT ONE
2663         JRST SYSCOP     ;FINALLY RE-OPEN SYSTEM CONSOLE.
2664
2665 SYALC4: PUSH P,[SYALC6] ;PUT TIME AT END OF MESSAGE
2666         PUSH P,A        ;IF WE KNOW WHAT TIME IT IS
2667         PUSH P,B
2668         PUSHJ P,GLPDTM
2669          JRST POPBAJ
2670         PUSH P,I
2671         IRPC A,,[ AT]
2672         .IOT STYOC,["A] ;PUT TIME IN UP/DOWN MESSAGES
2673         TERMIN
2674         PUSHJ P,SYSTPT
2675         POP P,I
2676         JRST POPBAJ
2677
2678 SYSTSU: CONO PI,TTYOFF
2679         MOVE T,TTYSTA(A)
2680         TLZN T,%TACFM
2681          JRST TTYONJ    ;IN USE OR WILL GET CONSOLE FREE MSG => DON'T HACK IT
2682         MOVEM T,TTYSTA(A)
2683         CONO PI,TTYON
2684         AOS (P)         ;TTY NEEDS HACKING, SO SKIP.
2685         HRLZ T,A
2686         ADD T,[%TJDIS+%TJMOR,,TYODN]
2687         MOVEM T,IOCHNM+STYOC    ;"OPEN" THE CHANNEL.
2688 SYSTS1: MOVE T,TTYOPT(A)
2689         TLNN T,%TOIML
2690          TLNN T,%TOMVU
2691           POPJ P,       ;IMLAC OR PRINTING TTY, DON'T CLEAR.
2692         MOVEI T,^P
2693         PUSHJ P,STYO
2694         MOVEI T,"C
2695         JRST STYO
2696 \f
2697         ;SYSTEM JOB RADIX PRINT-OUT ROUTINES
2698         ;FULL WORD (TWO HALFWORD) OCTAL:
2699 SYSFWP: TLNN A,-1       ;IF LH=0,
2700          JRST SYSOPT    ;THEN PRINT ONLY RH
2701         LSHC A,-18.
2702         HLLM B,(P)
2703         PUSHJ P,SYSOPT
2704         HLRZ A,(P)
2705         MOVEI T,",      ;",," BETWEEN HALFWORDS
2706         PUSHJ P,STYO
2707         PUSHJ P,STYO
2708
2709         ;OCTAL PRINTOUT, NO LEADING ZEROS, HALFWORD MAXIMUM
2710 SYSOPT: IDIVI A,10
2711         JUMPE A,SYSRP1
2712         HRLM B,(P)
2713         PUSHJ P,SYSOPT
2714 SYSRP2: HLRZ B,(P)      ;ENTRY POINT FROM DECIMAL TYPEOUT ROUTINE
2715 SYSRP1: MOVEI T,"0(B)   ;" " "
2716         JRST STYO
2717
2718         ;DECIMAL PRINTOUT, COMMAS EVERY 3 DIGITS, FULLWORD MAXIMUM
2719 SYSDPC: MOVE 0,A        ;ROUTINE EXPECTS ARGUMENT IN A, CLOBBERS 0, A(=0+1), B(=A+1)
2720 SYSDP5: IDIVI 0,1000.   ;GET LEAST SIGNIFICANT 3 DIGITS IN A
2721         JUMPE 0,SYSDPT  ;PRINT HIGH ORDER DIGITS WITHOUT LEADING ZEROES
2722         HRLM A,(P)
2723         PUSHJ P,SYSDP5
2724         HLRZ A,(P)
2725         MOVEI T,",      ;SINCE 3*N DIGITS LEFT TO BE TYPED, N>0,
2726         PUSHJ P,STYO    ;PRINT OUT A COMMA
2727         MOVEI T,3       ;NUMBER OF DIGITS TO PRINT OUT
2728         ;ROUTINE TO PRINT OUT AS MANY DECIMAL DIGITS AS SPECIFIED IN T
2729 SYSLZP: IDIVI A,10.
2730         SOJLE T,SYSRP1
2731         HRLM B,(P)
2732         PUSHJ P,SYSLZP
2733         JRST SYSRP2
2734
2735 ;PRINT NUMBER IN A IN DECIMAL; CLOBBERS B, T.
2736 SYSDPT: IDIVI A,10.
2737         JUMPE A,SYSRP1
2738         HRLM B,(P)
2739         PUSHJ P,SYSDPT
2740         JRST SYSRP2
2741 \f
2742 STYOQ:  MOVEI T,"?      ;TYPE OUT "?"
2743         JRST STYO
2744
2745 STYOT:  SKIPA T,[11]    ;TAB
2746 STYOS:  MOVEI T,40      ;TYPE OUT A SPACE
2747 STYO:   CONSO PI,200    ;PI ON?  (SYSTEM UP)
2748          JRST STYO1
2749         .IOT STYOC,T
2750         POPJ P,
2751
2752 ;TYPE OUT DIRECTLY WHILE SYSTEM IS NOT RUNNING
2753 STYO1:  HRLM T,(P)
2754         CAIN T,15
2755          SETZM T00POS
2756         AOS T,T00POS
2757         CAIL T,75.
2758          PUSHJ P,SYSCRF
2759         HLRZ T,(P)
2760 IFN KA10P,[
2761         CONSZ TTY,20
2762          JRST .-1
2763         DATAO TTY,T
2764 ] ;KA10P
2765 IFN KL10P,[
2766         SETZM DTEFLG
2767         MOVEM T,DTECMD
2768         CONO DTE,%DBL11
2769         SKIPN DTEFLG
2770          JRST .-1
2771 ] ;KL10P
2772 IFN KS10P,[
2773         ANDI T,177              ; ASCII for the 8080
2774         IORI T,400              ; Means a character is present
2775         MOVEM T,8CTYOT
2776         CONI T
2777         IORI T,80INT
2778         CONO (T)                ; punch 8080
2779         SKIPE 8CTYOT            ; wait for completion
2780          JRST .-1
2781         HLRZ T,(P)              ; God knows who might look at T...
2782 ] ;KS10P
2783         POPJ P,
2784
2785 ;PRINT WORD IN I AS 12. OCTAL DIGITS. CLOBBERS J,T.
2786 SYSP:   MOVE J,[440300,,I]
2787         MOVE I,T
2788 SYSP1:  ILDB T,J
2789         ADDI T,"0
2790         PUSHJ P,STYO
2791         TLNE J,770000
2792         JRST SYSP1
2793         POPJ P,
2794
2795 SYSSP:  HRLI I,440700   ;ENTRY TO TYPE C(I) AS A POINTER TO ASCIZ
2796 SYSSP2: ILDB T,I
2797         JUMPE T,CPOPJ
2798         PUSHJ P,STYO
2799         JRST SYSSP2
2800
2801 SYSTWR: LSH A,30-18.
2802         ADDI A,(SIXBIT /  :/)
2803         MOVE I,[220600,,A]
2804         JRST SYSIX2
2805 SYSSIX: PUSHJ P,STYOS   ;TYPE A SPACE AND FALL IN
2806 SYSIXP: MOVE I,[440600,,A]      ;ENTRY TO TYPE OUT C(A) AS SIXBIT
2807 SYSIX2: ILDB T,I
2808         ADDI T,40
2809         PUSHJ P,STYO
2810         TLNN I,770000
2811         POPJ P,
2812         JRST SYSIX2