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