1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-27 20:47:38 +00:00

LD10, Lisp display slave.

This commit is contained in:
Lars Brinkhoff
2018-05-15 11:39:32 +02:00
parent 61b0dd1dfa
commit 88bf6d0461
4 changed files with 3631 additions and 0 deletions

730
src/l/slave.8 Normal file
View File

@@ -0,0 +1,730 @@
;;; **************************************************************
TITLE ***** MACLISP ****** NEWIO DISPLAY SLAVE PACKAGE *************
;;; **************************************************************
;;; ** (C) COPYRIGHT 1976 MASSACHUSETTS INSTITUTE OF TECHNOLOGY **
;;; ****** THIS IS A READ-ONLY FILE! (ALL WRITES RESERVED) *******
;;; **************************************************************
.FASL
IF1, .INSRT SYS:.FASL DEFS
.MLLIT==1
TMPC==0 ;TEMP CHANNEL
VERPRT SLAVE
;;; IMPURE AREA! BEWARE!
SIXOPD: 0
SIXPG: 0
DEFINE FOODEF NAM,PT
DEFINE NAM
@<FOOTBL+PT> TERMIN
TERMIN
ZZ==100
.XCREF ZZ
FOOTBL:
IRP A,,[DENABL,DFUNCTION,ERRLOC,ASTATE,ARYNUM,XARG,YARG,PENPOS,DBRITE
DSCALE,WRDCNT,MORFLG,DBUFFER]
FOODEF A,\.-FOOTBL
ZZ
ZZ==ZZ+1
TERMIN ;ARGUMENT CELLS
LFOOTBL==.-FOOTBL
BFLNTH==1777-ZZ
ZZ==1
.XCREF ZZ
IRP FOO,,[CREATE,DISADD,DISSUB,DFLUSH,DDISALINE,DCLEAR,DMOVE,DGET,DSEND
BLINK,UNBLINK,DCHANGE,DTEXT,DCOPY,WHERE,DPOINT,DNOOP,SHOWPEN,HIDEPEN
LINK,UNLINK,MOTION,DLISTINF,DLIST,DSET,DFRAME]
FOO==ZZ
ZZ=ZZ+1
.XCREF ZZ
TERMIN
DEFINE DISON
.SPECIAL ^F TERMIN
DEFINE DISPON
.SPECIAL ^N TERMIN
DEFINE DISFIL
.SPECIAL THE-DISPLAY-SLAVE-DIS-DEVICE-FILE TERMIN
DEFINE SIXFIL
.SPECIAL THE-DISPLAY-SLAVE-PDP-6-FILE TERMIN
DEFINE SIXCHN
.SPECIAL THE-DISPLAY-SLAVE-PDP-6-CHANNEL TERMIN
.SXEVAL (SETQ ^F NIL
^N NIL
THE-DISPLAY-SLAVE-DIS-DEVICE-FILE NIL
THE-DISPLAY-SLAVE-PDP-6-FILE NIL
THE-DISPLAY-SLAVE-PDP-6-CHANNEL NIL)
.ENTRY DISPLAY SUBR 0003 ;SUBR 2
DISPLAY: MOVEI R,DISADD ;FOR BACKTRACEING PURPOSES, THIS IS HERE
JRST DISP1
.ENTRY THE-DISPLAY-SLAVE-^Y-INTERRUPT SUBR 0003 ;SUBR 2
CN.Y: PUSHJ P,CLZDIS
SKIPE DISON
SKIPN SIXOPD
POPJ P,
SETZM DENABL
SETZM DISON
PUSHJ P,DISLEEP
JRST YF.MES
POPJ P,
.ENTRY THE-DISPLAY-SLAVE-^N-INTERRUPT SUBR 0003 ;SUBR 2
CN.N: SKIPN DISFIL
POPJ P,
SKIPE DISON
SKIPN SIXOPD
JRST CN.N1
SETZM DENABL
PUSHJ P,DISLEEP
JRST DERR0(A)
CN.N1: SETZM DISON
PUSH P,[CN.N2]
PUSH P,[.SX ((DIS)) ]
PUSH P,[.SX (OUT SINGLE ASCII) ]
MOVNI T,2
JCALL 16,.FUNCTION OPEN
CN.N2: MOVEM A,DISFIL
HRRZ B,.SPECIAL OUTFILES
CALL 2,.FUNCTION CONS
MOVEM B,.SPECIAL OUTFILES
MOVEI A,.ATOM T
MOVEM A,DISPON
POPJ P,
.ENTRY THE-DISPLAY-SLAVE-^F-INTERRUPT SUBR 0003 ;SUBR 2
CN.F: SKIPN DISON
SKIPN SIXFIL ;CAUSES SLAVE TO TRY TO GRAB 340
POPJ P, ;IF IT DOESN'T ALREADY HAVE IT
PUSHJ P,CLZDIS
SETOM DENABL
PUSHJ P,DISLEEP
JRST YF.MES
MOVEI A,.ATOM T
MOVEM A,DISON
POPJ P,
YF.MES: STRT @DERR0(A)
POPJ P,
.SXEVAL (SSTATUS TTYINT #6 (QUOTE THE-DISPLAY-SLAVE-^F-INTERRUPT))
.SXEVAL (SSTATUS TTYINT #16 (QUOTE THE-DISPLAY-SLAVE-^N-INTERRUPT))
.SXEVAL (SSTATUS TTYINT #31 (QUOTE THE-DISPLAY-SLAVE-^Y-INTERRUPT))
CLZDIS: SETZM DISPON ;(SETQ ^N NIL)
SETZ A,
EXCH A,DISFIL
JUMPE A,CLZDS2
PUSH P,A
HRRZ B,.SPECIAL OUTFILES
CALL 2,.FUNCTION *DELQ
MOVEM A,.SPECIAL OUTFILES
HRRZ A,(P)
HRRZ B,.SPECIAL ECHOFILES
CALL 2,.FUNCTION *DELQ
MOVEM A,.SPECIAL ECHOFILES
POP P,A
CALL 1,.FUNCTION CLOSE
CLZDS2: POPJ P,
DISLEEP:
MOVEI A,DNOOP
MOVEM A,DFUNCTION
AOS (P) ;SKIPS IF SLAVE IS ALIVE AND WELL
MOVEI T,20. ;ELSE, NOSKIP AND LEAVE ERROR NUMBER IN A
SKIPL SIXOPD
MOVEI T,100. ;FOR PDP10, WAIT UP TO 3.3 SECONDS
DISLP3: MOVEI T,1 ;[FOR PDP6, UP TO .6 SECS] FOR SLAVE TO RESPOND
.SLEEP T,
SKIPE A,ERRLOC
DISLP4: SOSA (P)
SKIPN DFUNCTION
POPJ P,
SOJL T,DISLP4
JRST DISLP3
WAITSK: MOVEI F,1111. ;WAITS 1/30TH OF A SECOND, IN FAST MODE
XCT (T)
SOJN F,.-1
JUMPN F,2(T)
MOVEI F,30. ;JDC SAYS 10. ISN'T ENOUGH
SKIPL SIXOPD
MOVEI F,100. ;SKIP IF XCT'D SKIP WORKS WITHIN SOME
WASKP1: JUMPLE F,1(T) ;REASONABLE QUANTUM. BUT NO SKIP IF
MOVEI D,1 ;IT DOESN'T
.SLEEP D, ;THEN WAITS N 30THS OF A SECOND
WASKP2: XCT (T) ;IN SLOW MODE
SOJA F,WASKP1
JRST 2(T)
CLSSIX: SKIPN SIXOPD
POPJ P,
LOCKI
SETZM DENABL
PUSHJ P,DISLEEP
MOVEI A,NIL
SETZM DISON
SETZM SIXOPD
.CALL CLSSX7
.VALUE
MOVE T,@SIXCHN
LSH T,27
IOR T,[.UCLOSE]
XCT T
SETZM SIXCHN
SETZM SIXFIL
UNLKPOPJ
CLSSX7: SETZ
SIXBIT \CORBLK\ ;HACK CORE PAGE
1000,,0 ;DELETE PAGE
1000,,-1 ;FROM ME
402000,,SIXPG ;THIS PAGE
OPNSIX: SKIPE SIXOPD
POPJ P,
MOVE T,[SIXBIT \USR\]
PUSHJ P,ALFILE
MOVEM A,SIXFIL
MOVE TT,F
JSP T,FXCONS
MOVEM A,SIXCHN
LOCKI ;R<0 => SLAVE IS PDP6, >0 => PDP10
MOVNI R,1 ;R=0 => TRYING TO LOAD 6'S MEMORY AND START UP
.CALL [ SETZ
SIXBIT \OPEN\
5000,,7 ;IMAGE BLOCK OUTPUT
,,@SIXCHN ;CHANNEL #
,,[SIXBIT \USR\] ;USR DEVICE
1000,,0 ;MY UNAME
400000,,[SIXBIT \PDP6\]] ;JNAME=PDP6
JRST OP10
OP6D2: SKIPN SIXPG
JRST OP6D2Q
MOVEI TT,1
PUSHJ P,GETCOR
SKIPN TT
LERR [SIXBIT \NO CORE FOR MAPPING DISPLAY SLAVE!\]
MOVE D,[-LFOOTBL,,FOOTBL]
ADDM TT,(D)
AOBJN D,.-1
LSH TT,-12
MOVEM TT,SIXPG
OP6D2Q: .CALL SIXMAP
.VALUE
OPD62A: MOVEM R,SIXOPD ;IF OPENING 6, THEN R=-1 WILL ALLOW SECOND TRY
OP6A: MOVEI TT,DCLEAR ;R = 0 SAYS TRY 10SLAVE IF NO RESPONSE
MOVEM TT,DFUNCTION
JSP T,WAITSK
SKIPE DFUNCTION
JRST OP6C
AOS DISON
SETZM MORFLG
SKIPL SIXOPD ;CLEARING WORKED, SO SLAVE IS RUNNING WELL
UNLKPOPJ
JSP D,OPDSMS ;ANNOUNCE FACT, IF PDP6 WAS GRABBED
SETZ [SIXBIT \SLAVE GRABBED^M!\]
UNLKPOPJ
OP6C: JUMPGE R,OP6B ;ON FIRST FAILURE, TRY TO LOAD DISPLAY FROM DISK
.OPEN TMPC,[SIXBIT \ &SYSATSIGN6SLAVE\]
OP6C1: LERR DERR1
.CALL [ SETZ
SIXBIT \RESET\
400000,,@SIXCHN ]
.VALUE
.CALL LSIXC ;LOAD UP SIX
.VALUE
.CLOSE TMPC,
MOVE TT,[JRST 2000] ;IF PDP6 IS RUNNING, IT WILL BE AT LOCATION 41
MOVE T,SIXPG
LSH T,12
MOVEM TT,41(T)
AOJA R,OP6A
SIXMAP: SETZ
SIXBIT \CORBLK\ ;HACK CORE PAGE
1000,,300000 ;READ/WRITE ACCESS
1000,,-1 ;MY PAGE
,,SIXPG ;PAGE NUMBER
,,@SIXCHN ;FROM PDP6
401000,,0 ;ITS PAGE 0
OP10: JSP D,OPDSMS
[SIXBIT \NOT AVAILABLE!\]
JRST OPNTEN
OP6B: PUSHJ P,CLSSIX
JUMPN R,DERR0
JSP D,OPDSMS
[SIXBIT \NOT RUNNING!\]
OPNTEN: .CALL [ SETZ
SIXBIT \OPEN\
5000,,6 ;IMAGE BLOCK INPUT
,,@SIXCHN
,,[SIXBIT \USR\] ;USR DEVICE
1000,,0 ;MY UNAME
400000,,[SIXBIT \DSLAVE\]] ;RANDOM JOB
.VALUE
.OPEN TMPC,[SIXBIT \ &SYSATSIGN10SLAV\]
JRST OP6C1
.CALL LSIXC
.VALUE
.CLOSE TMPC,
.CALL SIXMAP
.VALUE
MOVEM F,XARG ;0 => 340 SLAVE, "TNM" => GT40 SLAVE
MOVE T,@SIXCHN
LSH T,27
IOR T,[.USET [.SUPC,,[2000]]] ;LOC OF STARTING ADDRESS
XCT T
MOVE T,@SIXCHN
LSH T,27
IOR T,[.USET [.SUSTP,,[0]]] ;BREATHE SOME LIFE INTO SLAVE
XCT T
MOVEI R,1 ;R=1 SAYS 10SLAVE TAKEN
JRST OP6D2
OPDSMS: PUSHJ P,IOGBND
STRT [SIXBIT \^MPDP6 !\]
STRT @(D)
SKIPL (D) ;SKIP FOLLOWING MSG IF ANNOUNCING PDP6 GRABBED
STRT [SIXBIT \ TRYING PDP10 SLAVE^M!\]
PUSHJ P,UNBIND
JRST 1(D)
LSIXC: SETZ
SIXBIT \LOAD\
,,@SIXCHN ;TO CHANNEL
401000,,TMPC ;FROM CHANNEL
CK6OPN: SKIPE SIXOPD ;QUICK CHECK FOR A WORKING SLAVE
JRST (T)
PUSH P,T
CK6NOPN: SKIPE SIXOPD ;LOOP AROUND THE FAIL-ACT UNTIL SLAVE IS OPENED
CCK6NOPN: POPJ P,CK6NOPN
DISNOPN: PUSH P,CCK6NOPN ;CAUSES RETRY OF TEST, AND EXIT THRU (T) IF WIN
%FAC DERR2
CSENDIT: SKIPN SIXOPD ;CHECK FIRST, THEN SENDIT
PUSHJ P,DISNOPN
MOVEM R,ARYNUM ;ARYNUM ARGUMENT IN R
SENDIT: MOVEM TT,DFUNCTION ;TT=FUNCTION NUMBER
SNDT1: AOS (P) ;SKIP IF WIN
SNDT1A: JSP T,WAITSK
SKIPE DFUNCTION
JRST SNDT2
ERRTST: MOVE TT,ARYNUM ;LEAVE ARYNUM IN TT
SKIPN D,ERRLOC ;MUST BE AN ERROR
POPJ P, ;ERRLOC=0 => NO ERRORS
ERTST1: JSP T,FIX1A
CALL 1,.FUNCTION NCONS
MOVEI B,.ATOM DISPLAY
CALL 2,.FUNCTION XCONS
SOS (P) ;NO SKIP IF LOSE
%FAC @DERR0(D)
SNDT2: SKIPE ERRLOC ;COME HERE WHEN THINGS HAVE BEEN GOING ON FOR A LONG TIME
JRST ERRTST
CAIE TT,DFRAME
CAIN TT,MOTION ;TT STILL HAS DFUNCTION IN IT
JRST SNDT1A ;MOTION IS ALLOWED TO GO ON FOR EVER
SETZB TT,D ;DEAD SLAVE - BOO HOO
JRST ERTST1
.ENTRY DISINI LSUBR 1003 ;LSUBR (0 . 2)
DISINI: AOJG T,DCLR1
AOJL T,DISTMA
SETZ F,
JUMPN T,DCLR5
POP P,A
PUSHJ P,SIXMAK
HLRZ F,TT
PUSHJ P,CLSSIX
LOCKI
PUSHJ P,OPNTEN
JRST DCLR5A
DCLR5: PUSHJ P,OPNSIX ;GRAB SLAVE IF POSSIBLE
DCLR5A: POP P,A ;IF ARGUMENT GIVEN, THEN SET ASTATE
JSP T,FXNV1
DCLR3: JUMPL TT,.+2
CAILE TT,3 ;IF ARG NOT IN RANGE 0 - 3, THEN DONT CHANGE ASTATE
MOVE TT,ASTATE
EXCH TT,ASTATE
JRST FIX1
DCLR1: SKIPN SIXOPD
JRST DCLR4
MOVEI TT,DCLEAR ;OTHERWISE SIMPLY CLEAR AND INITIALIZE
MOVEM TT,DFUNCTION
JSP T,WAITSKP
SKIPE DFUNCTION
JRST SNDT2
JRST DCLR3
DCLR4: SETZ F,
PUSHJ P,OPNSIX
MOVE TT,ASTATE
JRST FIX1
.ENTRY DISCREATE LSUBR 1003 ;LSUBR (0 . 2)
DISCREATE: MOVE TT,T
JSP T,CK6OPN
SETZM XARG
SETZM YARG
AOJG TT,DSCRT1
AOJN TT,DISTMA
POP P,C
POP P,B
PUSHJ P,DISXY
DSCRT1: MOVEI TT,CREATE
PUSHJ P,SENDIT
POPJ P, ;CUT OUT ON FAILURE
JRST FIX1
.ENTRY DISCOPY SUBR 0002 ;SUBR 1
DISCOPY: MOVEI R,DCOPY
PUSHJ P,DISP1B
POPJ P, ;CUT OUT ON FAILURE
JRST FIX1
.ENTRY DISBLINK SUBR 0003 ;SUBR 2
DISBLINK: MOVEI R,BLINK ;DISPLAY ALSO ENTERS HERE
DISP1: SKIPN B ;ENTER WITH FUN NUMBER IN R, LISP NUM FOR ARYNUM IN A
AOSA R ;DISADD ==> DISSUB, BLINK ==> UNBLINK, ETC.
DISP1C: MOVEI B,.ATOM T
PUSHJ P,DISP1B
JFCL
MOVEI A,(B)
POPJ P,
DISP1B: JSP T,FXNV1 ;SKIPS IF ACTION WINS
EXCH TT,R ;ARYNUM IN R, FUNCTION IN TT
DISXIT: PUSHJ P,CSENDIT
POPJ P, ;CUT OUT ON FAILURE
DISXT2: AOS (P)
POPJ P,
.ENTRY DISLINK SUBR 0004 ;SUBR 3
DISLINK: MOVEI R,LINK
JSP T,FXNV2
MOVE B,C
JRST DSMK1
.ENTRY DISMARK SUBR 0003 ;SUBR 2
DISMARK: MOVEI R,SHOWPEN
JSP T,FXNV2
HRLZ B,TT+1 ;IF 2ND ARG IS 0, THEN DO A UNMARK
DSMK1: JSP T,CK6OPN
MOVEM TT+1,XARG
JRST DISP1
.ENTRY DISFRAME SUBR 0002 ;SUBR 1
DISFRAME: JSP T,FXNV1
JSP T,CK6OPN
MOVEM TT,WRDCNT
MOVEI TT,DFRAME
PUSHJ P,SENDIT
JFCL
MOVEI A,.ATOM T
POPJ P,
.ENTRY DISET LSUBR 2004 ;LSUBR (1 . 3)
DISET: MOVEI F,1
MOVNI TT,2
JSP D,PPBSL
MOVEI R,DSET
JRST DAL2
.ENTRY DISFLUSH LSUBR 0 ;LSUBR ANY
DISFLUSH: MOVEI A,NIL
AOJG T,CLSSIX ;(DISFLUSH) SAYS TO FLUSH SLAVE
MOVN C,T
MOVEI R,DFLUSH ;(DISFLUSH N) SAYS FLUSH DISPLAY ITEM N
POP P,A
PUSHJ P,DISP1B
JFCL
SOJGE C,.-3
MOVEI A,.ATOM T
POPJ P,
.ENTRY DISAPOINT LSUBR 4005 ;LSUBR (3 . 4)
DISAPOINT: MOVEI R,DPOINT
JRST DAL0
.ENTRY DISALINE LSUBR 4006 ;LSUBR (3 . 5)
DISALINE: MOVEI R,DDISALINE
DAL0: MOVNI TT,2
MOVEI F,3
JSP D,PPBSL
DAL1: POP P,B
POP P,A
MOVEI T,3
CAMN T,ASTATE
JRST DAL3
DAL4: JSP T,FXNV1
JSP T,FXNV2
DAL5: MOVEM TT,XARG
MOVEM TT+1,YARG
DAL2: POP P,A
JRST DISP1C
DAL3: JSP T,FLTSKP ;OOPS, POLAR COORDINATES
JSP T,DALMES
MOVE A,B
MOVE TT+1,TT
JSP T,FLTSKP
JSP T,DALMES
EXCH TT,TT+1
JRST DAL5
.ENTRY DISLOCATE SUBR 0004 ;SUBR 3
DISLOCATE: PUSHJ P,DISXY
MOVEI R,DMOVE
JRST DISP1C
DISXY: MOVEI F,XARG ;YARG=XARG+1
DISXY1: JSP T,CK6OPN
JSP T,FXNV2
MOVEM D,(F)
JSP T,FXNV3
MOVEM R,1(F)
POPJ P,
DSCLUZ: SUB P,[3,,3] ;LOSE AT DISCUSS
POPJ P,
.ENTRY DISCUSS LSUBR 5006 ;LSUBR (4 . 5)
DISCUSS: MOVEI F,4
MOVNI TT,1
JSP D,PPBSL
POP P,A
DSCS2: MOVEI TT,0
PUSH P,[DSCLUZ] ;JUST IN CASE MFGWT LOSES
JSP T,MFGWT ;SO NOW 6 IS LOCKED OUT OF BUFFER
SUB P,[1,,1]
HRROI R,DSCS1
MOVNI AR1,BFLNTH*BYTSWD
MOVEI AR2A,DBUFFER ;MUST DO IT THIS WAY
HRLI AR2A,440700
PUSHJ P,PRINTA
MOVEI TT,BFLNTH*BYTSWD(AR1) ;# OF BYTES INSRTED
MOVEM TT,WRDCNT
MOVEI R,DTEXT
SETOM MORFLG
JRST DAL1
DSCS1: AOSGE AR1 ;FUNCTION CALLED BY PRINC
IDPB A,AR2A
POPJ P,
PPBSL: SKIPN SIXOPD ;PROCESS OPTIONAL BSL AND PENPOS ARGS
PUSHJ P,DISNOPN ;F HOLDS NUMBER OF REQUIRED ARGS
ADD F,T ;TT HOLDS -<MAXIMUN NUMBER OF OPTIONAL ARGS>
CAML F,TT
CAILE F,0
DISTMA: LERR DERR3 ;WNA - DSLAVE
PPBSL1: JUMPE F,(D)
MOVE A,(P)
JUMPE A,PPBSL2
CALL 1,.FUNCTION TYPEP
CAIN A,.ATOM LIST
JRST PPBSL3
AOJE TT,.+2 ;IF ONLY ONE OPTIONAL PERMITTED, IT MUST BE BSL
CAIE A,.ATOM FIXNUM
JRST PPBSL4
MOVE A,(P)
JSP T,FXNV1
MOVEM TT,PENPOS
PPBSL2: SUB P,[1,,1]
MOVEI TT,0
AOJA F,PPBSL1
PPBSL3: MOVE A,(P) ;PROCESS A BSL LIST
HLRZ A,(A)
JSP T,FXNV1
MOVEM TT,DBRITE
HRRZ A,@(P)
JUMPE A,PPBSL2
HLRZ A,(A)
JSP T,FXNV1
MOVEM TT,DSCALE
JRST PPBSL2
.ENTRY DISCHANGE SUBR 0004 ;SUBR 3
DISCHANGE: MOVEI F,DBRITE ;DSCALE=DBRITE+1
PUSHJ P,DISXY1
MOVEI R,DCHANGE
JRST DISP1C
.ENTRY DISMOTION SUBR 0005 ;SUBR 4
DISMOTION: PUSHJ P,DISXY
EXCH A,AR1
JSP T,FLTSKP
JSP T,IFLOAT
EXCH A,AR1
MOVEM TT,WRDCNT
MOVEI R,MOTION
PUSHJ P,DISP1B
POPJ P, ;CUT OUT ON FAILURE
MOVE D,[-2,,XARG]
JRST DSCB1A
.ENTRY DISLIST LSUBR 1002 ;LSUBR (0 . 1)
DISLIST: AOJG T,DSLS1
JUMPN T,DISTMA
POP P,A
MOVEI R,DLISTINF
PUSHJ P,DISP1B
POPJ P, ;CUT OUT ON FAILURE
JRST DSLS2
DSLS1: MOVEI TT,DLIST
PUSHJ P,CSENDIT
POPJ P, ;CUT OUT ON FAILURE
DSLS2: MOVN D,XARG
JUMPE D,DSLS2Q
HRLI D,DBUFFER
MOVSS D
JRST DSCB1A
DSLS2Q: SETZ A,
POPJ P,
.ENTRY DISCRIBE SUBR 0002 ;SUBR 1
DISCRIBE: MOVEI R,WHERE
PUSHJ P,DISP1B
POPJ P, ;CUT OUT ON FAILURE
MOVEI D,DBUFFER ;MUST DO IT THIS WAY
HRLI D,-10
DSCB1A: MOVEI B,NIL
HLRE R,D
DSCB1: MOVE TT,(D)
JSP T,FIX1A
PUSH P,A
AOBJN D,DSCB1
MOVE T,R
JCALL 16,.FUNCTION LIST
MFGWT: SKIPN MORFLG ;MORFLG WAIT - I.E., WAIT UNTIL MORFLG GOES TO ZERO
JRST (T)
PUSH P,T
JSP T,WAITSK
SKIPE MORFLG
CAIA
POPJ P,
SUB P,[1,,1]
AOS (P)
JRST SNDT2
.ENTRY DISGORGE SUBR 0002 ;SUBR 1
DISGORGE: JSP T,CK6OPN
JSP T,MFGWT
SETOM MORFLG
JSP T,FXNV1
MOVEM TT,ARYNUM
HRLOI R,DSEND
HLRZM R,DFUNCTION
JSP T,MFGWT
MOVE TT,WRDCNT
PUSH P,[DSGQX1]
PUSH P,[NIL]
PUSH P,[.ATOM FIXNUM ]
PUSH FXP,TT
MOVEI A,(FXP)
PUSH P,A
MOVNI T,3
JCALL 16,.FUNCTION *ARRAY
DSGQX1: SUB FXP,[1,,1]
HRRZ R,TTSAR(B)
MOVE TT,WRDCNT
DSGRG1: JSP T,MFGWT
CAIG TT,BFLNTH
SKIPA F,TT
MOVEI F,BFLNTH
ADDI F,-1(R)
HRLI R,DBUFFER
BLT R,(F)
MOVEI R,1(F)
HRREI TT,-BFLNTH(TT)
JUMPLE TT,CPOPJ
SETOM MORFLG
JRST DSGRG1
DSGQX4: SUB P,[1,,1]
WTA [BAD ARG - DISGOBBLE!]
.ENTRY DISGOBBLE SUBR 0002 ;SUBR 1
DISGOBBLE: PUSH P,A
CALL 1,.FUNCTION TYPEP
CAIN A,.ATOM ARRAY
JRST DSGQX3
HRRZ A,(P)
MOVEI A,.ATOM ARRAY
CALL 2,.FUNCTION GET
JUMPE A,DSGQX4
DSGQX3: SUB P,[1,,1]
JSP T,MFGWT
MOVE R,ASAR(A)
HLRE TT,-1(R)
HRRZ R,-1(R)
MOVNS TT
MOVEM TT,WRDCNT
MOVEI F,DGET
MOVEM F,DFUNCTION
DSGBL1: CAIG TT,BFLNTH
SKIPA F,TT
MOVEI F,BFLNTH
MOVEI T,DBUFFER
HRL T,R
ADD R,F
ADDI F,DBUFFER
SUBI F,1 ;MUST DO IT THIS WAY
BLT T,(F)
HRREI TT,-BFLNTH(TT)
SETOM MORFLG
JSP T,MFGWT
JUMPG TT,DSGBL1
PUSHJ P,SNDT1
POPJ P, ;CUT OUT ON FAILURE
JRST FIX1
DERR1: SIXBIT \DSLAVE FILE MISSING!\
DERR2: SIXBIT \DISPLAY SLAVE HAS NOT BEEN OPENED!\
DERR3: [SIXBIT \WRONG NUMBER OF ARGS TO SOME FUNCTION - DSLAVE!\]
DALMES: WTA [FLONUM ARG REQUIRED - DISPLAY SLAVE!]
JRST -1(T)
PPBSL4: MOVE A,(P)
WTA [BAD ARG TO SOME DISPLAY FUN!]
JRST PPBSL1
DERR0: LERR [SIXBIT \SLAVE HAS DIED!\]
DERR: LERR [SIXBIT \TOO MANY DISPLAY ITEMS!\] ;TABLE OF ERRORS
LERR [SIXBIT \DISPLAY MEMORY FULL!\] ;RETURNED FROM SLAVE
LER3 [SIXBIT \ UNKNOWN DISPLAY ITEM!\]
LERR [SIXBIT \ENORMOUS VECTOR!\]
LERR [SIXBIT \BAD RELATIVE VECTOR - DSLAVE!\]
LERR [SIXBIT \BAD FUNCTION - DSLAVE!\]
LERR [SIXBIT \340 NOT AVAILABLE!\]
LER3 [SIXBIT \ HAS TOO MANY DISPLAY INFERIORS!\]
FASEND