Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / mudits.mcr130.1
1
2 TITLE MUDITS -- ITS  DEPENDANT MUDDLE CODE
3
4 RELOCATABLE
5
6 .INSRT MUDDLE >
7
8
9 .GLOBAL %SSNAM,%RSNAM,%KILLM,%LOGOU,%SLEEP,%VALRE,NOTTY,DEMFLG,MSGTYP
10 .GLOBAL %UNAM,%JNAM,%XUNA,%XJNA,%RUNAM,%RJNAM,%RXUNA,%RXJNA,%GCJB1,%VALFI
11 .GLOBAL %GCJOB,%SHWND,%GETIP,%INFMP
12 .GLOBAL GCHN,WNDP,FRNP,FRONT,MESSAG,INITFL,6TOCHS,SGSNAM,MTYO,PGINT,WHOAMI
13 .GLOBAL %TOPLQ,IPCINI,IPCBLS,%HANG,CTIME,BFLOAT,GCRSET,%MPINT,%GBINT,%SAVIN
14 .GLOBAL %MPIN,%MPINX,%CLSMP,%CLSM1,%MPIN1,%IMSAV,%IMSV1,%PURIF,PSHGCF
15 .GLOBAL %CLSJB,%KILJB,%IFMP1,%OPGFX,%SAVRP,%RSTRP,%CWINF,%FDBUF,BUFGC,P.TOP,P.CORE
16 .GLOBAL PURBOT,SQUPNT,GETSQU,DIR,%LDRDO,%MPRDO,%IFMP2,SQBLK,SQDIR
17 .GLOBAL CERR1,CERR2,CERR3,COMPERR,CALER,CALER1,SQLOD,SQKIL,SLEEPR,GETBUF,KILBUF
18
19
20
21 GCHN==0
22 CWTP==1000,,4000
23 RDTP==1000,,200000
24 WRTP==1000,,100000
25 GCHI==1000,,GCHN
26 CRJB==1000,,400001
27 FME==1000,,-1
28 FLS==1000,,
29
30 %RSTRP:
31 %OPGFX:
32 %SAVRP: POPJ    P,
33
34
35 SQLOD:  MOVEI   A,1                     ; NUMBER OF PAGES OF BUFFER
36         PUSHJ   P,GETBUF
37         HRRM    B,SQUPNT
38         ASH     B,-10.          ; TO PAGES
39         .SUSET  [.RSNAM,,A]             ; OPEN FILE TO SQUOZE TABLE
40         .SUSET  [.SSNAM,,SQDIR]         ; SET SNAME
41         .OPEN   GCHN,SQBLK
42         FATAL SQUOZE TABLE NON EXISTANT
43         .SUSET [.SSNAM,,A]
44         MOVEI   A,0
45         DOTCAL  CORBLK,[[RDTP],[FME],B,[GCHI],A]
46         PUSHJ   P,SLEEPR
47         .CLOSE  GCHN,
48         MOVE    A,B                     ; GET B
49         ASH     A,10.
50         POPJ    P,
51
52 SQKIL:  PUSHJ   P,KILBUF
53         HLLZS   SQUPNT
54         POPJ    P,
55
56 GETSQU: HRRZ    0,SQUPNT
57         JUMPN   0,ATSQ10
58         JRST    SQLOD
59 ATSQ10: POPJ    P,
60
61
62 CTIME:  .SUSET  [.RRUNT,,B]             ; Get user's run time in 4.069 microsecond units
63         IDIVI   B,400000
64         FSC     C,233
65         FSC     B,254
66         FADR    B,C
67         FDVR    B,[250000.00]           ; Change to units of seconds
68         MOVSI   A,TFLOAT
69         POPJ    P,
70
71 ; SET THE SNAME GLOBALLY
72
73 %SSNAM: .SUSET  [.SSNAM,,A]
74         POPJ    P,
75
76 ; READ THE GLOBAL SNAME
77
78 %RSNAM: .SUSET  [.RSNAM,,A]
79         POPJ    P,
80
81 ; KILL THE CURRENT JOB/LOGOUT
82
83 %LOGOU:
84 %KILLM: .LOGOUT 1,
85         POPJ    P,
86
87 ; PASS STRING TO SUPERIOR (MONITOR?)
88
89 %VALRE: .VALUE  (A)
90         POPJ    P,
91
92 ; DO 'KILL'
93 %VALFI: .BREAK  16,(A)
94         POPJ    P,
95
96 ; GO TO SLEEP A WHILE
97
98 %SLEEP: .SLEEP  A,
99         POPJ    P,
100
101 ; HANG FOREVER
102
103 %HANG:  SKIP
104         .HANG
105
106 ; READ JNAME
107
108 %RJNAM: .SUSET  [.RJNAM,,%JNAM]
109         MOVE    A,%JNAM
110         POPJ    P,
111
112 ; READ XJNAME
113
114 %RXJNA: .SUSET  [.RXJNA,,%XJNA]
115         MOVE    A,%XJNA
116         POPJ    P,
117
118 ; READ UNAME
119
120 %RUNAM: .SUSET  [.RUNAM,,%UNAM]
121         MOVE    A,%UNAM
122         POPJ    P,
123
124 ; READ XUNAME
125
126 %RXUNA: .SUSET  [.RXUNA,,%XUNA]
127         MOVE    A,%XUNA
128         POPJ    P,
129
130 ; HERE TO SEE IF WE ARE A TOP LEVEL JOB
131
132 %TOPLQ: PUSH    P,A
133         .SUSET  [.RSUPPR,,A]    ; READ SUPERIOR
134         SKIPGE  A               ; SKIP IF IT EXISTS
135          AOS    -1(P)           ; CAUSE SKIP RET
136         POP     P,A
137         POPJ    P,
138
139 ; ERRORS IN COMPILED CODE MAY END UP HERE
140
141 CERR1:  MOVE    A,EQUOTE NTH-BY-A-NEGATIVE-NUMBER
142         .SUSET  [.RJPC,,B]
143         JRST    CERR
144
145 CERR2:  MOVE    A,EQUOTE NTH-REST-PUT-OUT-OF-RANGE
146         .SUSET  [.RJPC,,B]
147         JRST    CERR
148
149 CERR3:  MOVE    A,EQUOTE UVECTOR-PUT-TYPE-VIOLATION
150         .SUSET  [.RJPC,,B]
151
152 COMPERR:
153         MOVE    A,EQUOTE ERROR-IN-COMPILED-CODE
154         .SUSET  [.RJPC,,B]
155
156 CERR:   PUSH    TP,$TATOM
157         PUSH    TP,A
158         PUSH    TP,$TWORD
159         PUSH    TP,B
160         MOVEI   A,2
161         JRST    CALER
162 \f
163 ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR
164 %GCJB1:
165 %GCJOB: PUSH    P,A
166         PUSH    P,D
167         MOVEI   0,(SIXBIT /USR/)
168         MOVEI   A,0             ; USE SAME UNAME
169         MOVSI   B,(SIXBIT /AGC/)        ; IDENTIFY
170
171 ; ROUTINE TO SEE WHETHER MAPCHN IS ALREADY OPEN
172
173         .STATUS GCHN,D
174         ANDI    D,77
175         MOVEM   D,PSHGCF
176         POP     P,D
177         SKIPN   PSHGCF          ; SKIP IF OPEN
178         JRST    TRYOPN
179         .IOPUSH GCHN            ; PUSH THE CHANNEL
180         MOVSI   B,(SIXBIT /AGE/)
181
182 TRYOPN: HRLI    0,7             ; READ BLOCK OUTPUT
183         .OPEN   GCHN,0          ; TRY IT
184         JRST    .+2
185         JRST    GCJB1           ; OK, GET A PAGE
186
187         HRLI    0,6
188         .OPEN   GCHN,0          ; AND TRY AGAIN
189         AOJA    B,TRYOPN        ; TRY A NEW NAME
190
191         .UCLOSE GCHN,           ; FLUSH JOB
192         .CLOSE  GCHN,           ; AND CHANNEL
193
194         AOJA    B,TRYOPN
195
196 GCJB1:  HRLI    0,6             ; REOPEN IN READ
197         .OPEN GCHN,0
198         FATAL CAN'T REOPEN INFERIOR IN READ
199         POP     P,A             ; RET PAGE TO MAP AS 1ST
200         MOVEI   B,FRNP          ; SET UP FRONTEIR
201         PUSHJ   P,%GETIP                ; GET IT THERE
202         PUSHJ   P,%SHWND
203         POPJ    P,
204
205 ; HERE TO WAIT A WHILE FOR CORE
206
207
208
209 ; HERE TO GET A PAGE FOR THE INFERIOR
210
211 %GETIP: DOTCAL  CORBLK,[[WRTP],[GCHI],A,[CRJB]]
212         PUSHJ   P,SLEEPR
213         POPJ    P,
214
215 ; HERE TO PURIFY A STRUCTURE
216
217 %PURIF: DOTCAL  CORBLK,[[RDTP],[FME],A,[FME],A]
218         FATAL UNABLE TO PURIFY STRUCTURE
219         POPJ    P,
220
221 ; HERE TO SHARE WINDOW
222
223 %SHWND: DOTCAL  CORBLK,[[WRTP],[FME],B,[GCHI],A]
224         FATAL CANT SHARE INFERIOR PAGE
225         POPJ    P,
226
227 ; HERE TO CAUSE INFERIOR TO HOLD ONTO PURE CORE BEING FLUSHED
228
229 %MPINT: PUSH    P,B
230         MOVE    B,A             ; COPY PAGE POINTER
231         DOTCAL  CORBLK,[[RDTP],[GCHI],A,[FME],B]
232         FATAL CANT CAUSE INFERIOR TO SHARE ME
233         POP     P,B
234         POPJ    P,
235
236 ; HERE TO GET BACK WHAT INFERIOR NOW HAS
237
238 %GBINT: PUSH    P,B
239         MOVE    B,A
240         DOTCAL  CORBLK,[[RDTP],[FME],A,[GCHI],B]
241         FATAL CANT GET STUFF BACK
242         POP     P,B
243         POPJ    P,
244
245 ; HERE TO MAP FROM AN INFERIOR TO A NEW BLOCK IN CORE
246
247 %MPINX:
248 %MPIN1: PUSH    P,B
249         EXCH    A,B
250         DOTCAL  CORBLK,[[WRTP],[FME],A,[CRJB]]
251         PUSHJ   P,SLEEPR
252         POP     P,A
253
254 ; HERE TO MAP FROM THE INFERIOR TO THE CORE IMAGE
255
256 %MPIN:  DOTCAL  CORBLK,[[WRTP],[FME],A,[GCHI],B]
257         FATAL CANT GET INFERIOR CORE BACK
258         POPJ    P,
259
260 ; HERE TO PROTECT CORE IMAGE
261
262 %SAVIN: PUSH    P,A
263         MOVEI   0,(SIXBIT /USR/)
264         MOVEI   A,0             ; USE SAME UNAME
265         MOVSI   B,(SIXBIT /AGD/)        ; IDENTIFY
266
267 TRYOP1: HRLI    0,7             ; WRITE BLOCK OUTPUT
268         .OPEN   GCHN,0          ; TRY IT
269         JRST    .+2
270         JRST    GCJB2           ; OK, GET A PAGE
271
272         HRLI    0,6             ; CHANGE TO READ OPEN
273         .OPEN   GCHN,0          ; AND TRY AGAIN
274         AOJA    B,TRYOP1        ; TRY A NEW NAME
275
276         .UCLOSE GCHN,           ; FLUSH JOB
277         .CLOSE  GCHN,           ; AND CHANNEL
278
279         AOJA    B,TRYOP1
280
281 GCJB2:  MOVEM   B,SAVNAM
282         POP     P,A
283 %IMSAV: HRRZ    0,A             ; SEE IF 0
284         CAIE    0,0
285         JRST    IMSAV1
286         ADD     A,[1,,1]        ; TO NEXT PAGE
287         .ACCESS GCHN,[20]               ; ACCESS IN INF
288         PUSH    P,B
289         PUSH    P,A
290         MOVEI   A,0
291         PUSHJ   P,%GETIP        ; GET AROUND SYSTEM LOSSAGE CONCERNING THE FIRST PAGE
292         MOVE    B,[-1760,,20]   ; IOT INTO INFERIOR
293         .IOT    GCHN,B
294         POP     P,A
295         POP     P,B
296 IMSAV1: MOVE    M,A
297         DOTCAL  CORBLK,[[WRTP],[GCHI],A,[FME],A]
298         FATAL UNABLE TO PROTECT CORE IMAGE
299 IMSAV2:
300 ; MAKE CORE IMAGE READ ONLY
301
302         MOVE    A,M             ; RESTORE A
303         DOTCAL  CORBLK,[[RDTP],[FME],A,[FME],A]
304         FATAL   CORBLK FAILED
305         POPJ    P,
306
307 ; MAP A PAGE INTO AGD INFERIOR IN READ ONLY MODE
308 ; PAGE NUMBER IS IN A
309
310 %MPRDO: DOTCAL  CORBLK,[[RDTP],[GCHI],A,[FME],A]
311         FATAL   CORBLK FAILED
312         POPJ    P,
313
314
315 ; HERE TO FIND A BUFFER PAGE FOR C/W HACK
316
317 %FDBUF: HRRZ    A,PURBOT
318         SUB     A,P.TOP         ; CALCULATE ROOM FOR PROSPECTIVE BUFFER
319         CAIG    A,2000          ; SEE IF ROOM
320         JRST    FDBUF1
321         MOVE    A,P.TOP         ; START OF BUFFER
322         HRRM    A,BUFGC
323         POPJ    P,
324 FDBUF1: SETOM   BUFGC           ; INDICATE NO BUFFER FOUND
325         POPJ    P,
326
327 ; HERE TO SIMULATE COPY ON WRITE. THIS ROUTINE TAKES A SOURCE PAGE IN A
328 ; AND A BUFFER PAGE IN B
329
330 %CWINF: PUSH    P,A             ; SAVE SOURCE ADDRESS
331         PUSH    P,B             ; SAVE BUFFER ADDRESS
332         ASH     B,-10.          ; TO PAGES
333         ASH     A,-10.
334         DOTCAL  CORBLK,[[RDTP],[FME],B,[FME],A]
335         FATAL COPY-WRITE CORBLK FAILED
336         DOTCAL  CORBLK,[[WRTP],[FME],A,[CRJB]]
337         PUSHJ   P,SLEEPR        
338         HRLZ    A,(P)           ; GET START OF BUFFER
339         HRR     A,-1(P) ; GET START OF SOURCE PAGE
340         EXCH    B,-1(P)         ; GET BEGINNING OF SOURCE PAGE
341         BLT     A,1777(B)
342         MOVE    B,-1(P)
343         DOTCAL  CORBLK,[[FLS],[FME],B]
344         FATAL CANT FLUSH BUFFER
345         SUB     P,[2,,2]        ; CLEAN OFF STACK
346         POPJ    P,              ; EXIT
347
348
349
350 ; HERE TO PROTECT MUDDLES PURE SPACE
351 %IMSV1: MOVE    M,A
352         PUSHJ   P,%MPINT
353         POPJ    P,
354
355 ; HERE TO CLOSE THE IMAGE SAVING INFERIOR WITHOUT KILLING IT
356
357 %CLSJB: .CLOSE  GCHN,
358         POPJ    P,
359
360 ; HERE TO OPEN AGD INFERIOR IN ORDER TO RESTORE CORE-IMAGE
361
362 %IFMP1: .IOPUSH GCHN            ; PUSH CURRENT CONTENTS OF CHANNEL
363         PUSH    P,A             ; SAVE AC'S
364         PUSH    P,B
365         MOVEI   0,(SIXBIT /USR/)
366         MOVEI   A,0
367         MOVE    B,SAVNAM
368         HRLI    0,6
369         .OPEN   GCHN,0
370         FATAL AGD INFERIOR LOST
371         POP     P,A
372         POP     P,B
373         POPJ    P,
374
375 ; HERE TO MAP IN A PURE PAGE FROM THE AGD INFERIOR
376
377 %LDRDO: DOTCAL  CORBLK,[[RDTP],[FME],A,[GCHI],A]
378         FATAL CORBLK FAILED
379         POPJ    P,
380
381
382
383 ; HERE TO MAP IN FROM AGD INFERIOR AND KILL CORE IMAGE AS WELL
384 ; A HAS SOURCE PAGES AND B DESTINATION PAGES
385
386 %IFMP2: PUSHJ   P,%INFMP
387         .IOPOP  GCHN
388         POPJ    P,
389
390 ;HERE TO KILL AN IMAGE SAVING INFERIOR
391 %KILJB: .IOPUSH GCHN
392         PUSH    P,0
393         PUSH    P,B
394         PUSH    P,C
395         PUSH    P,A
396         MOVEI   0,(SIXBIT /USR/)
397         MOVE    B,SAVNAM
398         HRLI    0,6
399         MOVEI   A,0
400         .OPEN   GCHN,0
401         FATAL AGD INFERIOR LOST
402 CKPGU:  HRRZ    A,(P)
403         DOTCAL  CORTYP,[A,,[2000,,B]]
404         FATAL CORBLK TO UNPURE PAGES FAILED
405         JUMPL   B,PGW
406         DOTCAL  CORBLK,[[WRTP],[FME],A,[GCHI],A]
407         FATAL   CORBLK TO UNPURE PAGES FAILED
408 PGW:    POP     P,A
409         ADD     A,[1,,1]
410         SKIPL   A
411         JRST    KILIT
412         PUSH    P,A             ; REPUSH A
413         JRST    CKPGU
414 KILIT:  .UCLOS  GCHN,
415         .CLOSE  GCHN,
416         POP     P,C
417         POP     P,B
418         POP     P,0
419         .IOPOP  GCHN
420         POPJ    P,
421
422 ; HERE TO MAP INFERIOR BACK AND KILL SAME
423
424 %INFMP: PUSHJ   P,%MPIN         ; MAP IN IMAGE
425         .UCLOSE GCHN,
426         .CLOSE  GCHN,
427         SKIPE   PSHGCF          ; SKIP IF CHANNEL IS NOT PUSHED
428         JRST    INFMPX
429         POPJ    P,
430 INFMPX: .IOPOP  GCHN            ; HAVE MORE THAN ONE GC-INF OPEN IOPOP
431         SETZM   PSHGCF
432         POPJ    P,
433
434
435 ; USED TO MAP INFERIOR CONTAINING CORE IMAGE BACK IN AND KILL SAVE
436
437 %CLSMP: PUSHJ   P,%GBINT
438 %CLSM1: .UCLOSE GCHN,
439         .CLOSE  GCHN,
440         POPJ    P,
441
442 ; HACK TO PRINT MESSAGE OF INTEREST TO USER
443
444 MESOUT: MOVSI   A,(JFCL)
445         MOVEM   A,MESSAG        ; DO ONLY ONCE
446         MOVE    A,P.TOP
447         ADDI    A,1777          ; MAKE SURE ON PAGE BOUNDRY
448         ASH     A,-10.          ; TO PAGES
449         MOVE    B,VECTOP        ; GET VECTOR
450         ADDI    B,1777          ; PAGE AND ROUND
451         ANDCMI  B,1777
452         MOVEM   B,P.TOP
453         PUSHJ   P,P.CORE        ; GET CORE
454         JFCL
455         SETZB   SP,FRM          ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP FIRST TIME
456         PUSHJ   P,PGINT         ; INITIALIZE PAGE MAP
457         PUSHJ   P,GCRSET
458         PUSHJ   P,%RSNAM        ; GET SAVED SNAME
459         PUSH    P,A             ; SAVE IT
460         SKIPE   NOTTY           ; HAVE A TTY?
461         JRST    RESNM           ; NO, SKIP THIS STUFF
462         MOVE    A,[SIXBIT /MUDSYS/]
463         PUSHJ   P,%SSNAM
464         MOVEI   A,(SIXBIT /DSK/)
465         SKIPN   B,WHOAMI
466         MOVE    B,[SIXBIT /MUDDLE/]
467         MOVE    C,[SIXBIT /MESSAG/]
468         .OPEN   0,A
469         JRST    RESNM
470 MESSI:  .IOT    0,A             ; READ A CHAR
471         JUMPL   A,MESCLS        ; DONE, QUIT
472         CAIE    A,14            ; DONT TYPE FF
473         PUSHJ   P,MTYO          ; AND TYPE IT OUT
474         JRST    MESSI           ; UNTIL DONE
475
476 MESCLS: .CLOSE  0,
477
478 RESNM:  POP     P,A             ; GET SAVED SNAME BACK
479         PUSHJ   P,%SSNAM        ; AND SET IT BACK
480 RESNM1: POPJ    P,
481
482 MUDINT: MOVSI   0,(JFCL)        ; CLOBBER MUDDLE INIT SWITCH
483         MOVEM   0,INITFL
484         PUSHJ   P,%RSNAM        ; GET SNAME
485         CAMN    A,[-1]          ; NO SNAME ?
486         MOVE    A,[SIXBIT /MUDSUB/]     ; FOR DEMONS AND THE LIKE
487         PUSHJ   P,6TOCHS        ; TO STRING
488         PUSH    TP,$TATOM
489         PUSH    TP,IMQUOTE SNM
490         PUSH    TP,A
491         PUSH    TP,B
492         MCALL   2,SETG
493         PUSHJ   P,SGSNAM        ; SET TO GLOBAL
494         MOVE    E,A             ; SAVE IN E
495         MOVEI   A,(SIXBIT /DSK/)
496         MOVE    C,[SIXBIT /INIT/]
497         SKIPN   B,WHOAMI        ; SKIP IF NOT A STRAIGHT MUDDLE
498         JRST    STMUDL
499
500         .OPEN   0,A
501         SKIPA   D,E
502         JRST    MUDIN1
503
504         CAMN    D,[SIXBIT /MUDSUB/]
505         POPJ    P,
506         .SUSET  [.SSNAM,,[SIXBIT /MUDSUB/]]
507 MUDIN2: .OPEN   0,A
508         POPJ    P,
509 MUDIN1: .CLOSE  0,
510         PUSH    TP,$TCHSTR      ; ATTEMPT TO LOAD A MUDDLE INIT FILE
511         PUSH    TP,CHQUOTE READ
512         MOVE    A,B
513         PUSHJ   P,6TOCHS
514         PUSH    TP,A
515         PUSH    TP,B
516         PUSH    TP,$TCHSTR
517         PUSH    TP,CHQUOTE INIT
518         PUSH    TP,$TCHSTR
519         PUSH    TP,CHQUOTE DSK
520         .SUSET  [.RSNAM,,A]     ; USE SNAME AROUND
521         PUSHJ   P,6TOCHS
522         PUSH    TP,A
523         PUSH    TP,B
524         MCALL   5,FOPEN
525         GETYP   0,A
526         CAIE    0,TCHAN         ; DID THE CHANNEL OPEN ?
527         POPJ    P,              ; NO, RETURN
528         PUSH    TP,A
529         PUSH    TP,B
530         MOVEI   B,INITSTR       ; TELL USER WHAT'S HAPPENING
531         SKIPE   WHOAMI
532         JRST    .+3
533         SKIPN   NOTTY
534         PUSHJ   P,MSGTYP
535         MCALL   1,MLOAD
536         POPJ    P,
537
538
539 ; BLOCK TO OPEN SQUOZE TABLE
540
541 SQDIR:  SIXBIT /MUDSAV/
542
543 SQBLK:  SIXBIT /  &DSK/
544         SIXBIT /SQUOZE/
545         SIXBIT /TABLE/
546
547 STMUDL: MOVE    B,[SIXBIT /MUDDLE/]
548         JRST    MUDIN2
549
550 IPCINI: PUSHJ   P,IPCBLS
551
552 INITSTR:        ASCIZ /MUDDLE INIT/
553
554 IMPURE
555 SAVNAM: 0               ; SAVED AGD INFERIOR NAME
556 DEMFLG: 0
557
558
559 MESSAG: PUSHJ   P,MESOUT        ; MESSAGE SWITCH
560
561 INITFL: PUSHJ   P,MUDINT        ; MUDDLE INIT SWITCH
562
563 PURE
564
565 END
566 \f\ 3\ 3\ 3