mirror of
https://github.com/PDP-10/its.git
synced 2026-01-17 08:43:21 +00:00
2060 lines
39 KiB
Plaintext
2060 lines
39 KiB
Plaintext
TITLE MAIN LOOP AND GLOBALLY REFERENCED SUBROUTINES
|
||
|
||
RELOCA
|
||
|
||
.SYMTAB 3337.
|
||
|
||
.GLOBAL TBINIT,PIDSTO,PROCID,PTIME,GCPDL,PBASE,TYPTOP,RERR,FRMSTK,EMERGE
|
||
.GLOBAL PDLBUF,INTINT,START,SWAP,ICR,SPBASE,TPBASE,TPBAS,CURPRI,CHFINI,MKTBS
|
||
.GLOBAL TOPLEVEL,INTOBL,INITIA,ERROBL,MAINPR,RESFUN,STATUS,TYPVEC,ROOT,TTICHN,TTOCHN
|
||
.GLOBAL TTYOPE,MOPEN,MCLOSE,MIOT,ILVAL,MESS,ERROR,CHFRM,IGVAL,TYPBOT,ASOVEC
|
||
.GLOBAL PRINT,PRIN1,PRINC,MUDSTR,VECBOT,CSTACK,IFALSE,TYPLOO,RCALL,SWAPIN,CTMPLT
|
||
.GLOBAL IDPROC,CHFSWP,ILOC,MAKACT,BNDV,SPECSTORE,BINDID,IGLOC,MTYO,MSGTYP,CAFRE1,CPOPJ
|
||
.GLOBAL EVATYP,EVTYPE,APLTYP,APTYPE,PRNTYP,PRTYPE,AGC,SGSNAM,NAPT,APLQ,STRTO6
|
||
.GLOBAL 6TOCHS,TYPFND,STBL,CHNL0,N.CHNS,CLOSAL,%LOGOUT,%SSNAM,%RSNAM,%KILLM,SAT
|
||
.GLOBAL MAKINF,%VALRET,COMPERR,IPUT,IGET,TMATCH,INITIZ,IPCINI,%UNAM,%JNAM,%RUNAM,%RJNAM,%RXUNA,%RXJNA,%VALFI
|
||
.GLOBAL NOTTY,DEMFLG,CFRAME,CARGS,CFUNCT,CITYPE,CTYPEQ,CPTYPE,CTYPEP,CUTYPE,
|
||
.GLOBAL CCHUTY,RTFALS,PGINT,PURCLN,CTYPEC,CTYPEW,IDVAL1,CALLTY,MESSAG,INITFL,WHOAMI
|
||
.GLOBAL %SLEEP,%HANG,%TOPLQ,ONINT,CHUNW,CURFCN,BUFRIN,TD.LNT,TD.GET,TD.AGC,TD.PUT,MPOPJ
|
||
.GLOBAL PURVEC,PLOAD,SSPECS,OUTRNG,CVTYPE,FSTART,CKVRS,CPRTYC,PVSTOR,SPSTOR
|
||
.GLOBAL TYPIC,CISET,LSTUF,IMPURI,REALTV
|
||
.INSRT MUDDLE >
|
||
|
||
;MAIN LOOP AND STARTUP
|
||
|
||
START: MOVEI 0,0 ; SET NO HACKS
|
||
JUMPE 0,START1
|
||
TLNE 0,-1 ; SEE IF CHANNEL
|
||
JRST START1
|
||
MOVE P,GCPDL
|
||
MOVE A,0
|
||
PUSH P,A
|
||
PUSHJ P,CKVRS ; CHECK VERSION NUMBERS
|
||
POP P,A
|
||
JRST FSTART ; GO RESTORE
|
||
START1: MOVEM 0,WHOAMI ; HACK FOR TS FOO linked to TS MUDDLE
|
||
MOVE PVP,MAINPR ; MAKE SURE WE START IN THE MAIN PROCESS
|
||
JUMPE 0,INITIZ ; MIGHT BE RESTART
|
||
MOVE P,PSTO+1(PVP) ; SET UP FOR BOOTSTRAP HACK
|
||
MOVE TP,TPSTO+1(PVP)
|
||
INITIZ: MOVE PVP,MAINPR
|
||
SKIPN P ; IF NO CURRENT P
|
||
MOVE P,PSTO+1(PVP) ; PDL TO GET OFF THE GROUND
|
||
SKIPN TP ; SAME FOR TP
|
||
MOVE TP,TPSTO+1(PVP) ; GET A TP TO WORK WITH
|
||
SETZB R,M ; RESET RSUBR AC'S
|
||
PUSHJ P,%RUNAM
|
||
JFCL
|
||
PUSHJ P,%RJNAM
|
||
PUSHJ P,TTYOPE ;OPEN THE TTY
|
||
MOVEI B,MUDSTR
|
||
SKIPE WHOAMI ; SKIP IF THIS IS MUDDLE
|
||
JRST NODEMT ; ELSE NO MESSAGE
|
||
SKIPE DEMFLG ; SKIP IF NOT DEMON
|
||
JRST NODEMT
|
||
SKIPN NOTTY ; IF NO TTY, IGNORE
|
||
PUSHJ P,MSGTYP ;TYPE OUT TO USER
|
||
|
||
NODEMT: XCT MESSAG ;MAYBE PRINT A MESSAGE
|
||
PUSHJ P,INTINT ;INITIALIZE INTERRUPT HANDLER
|
||
XCT IPCINI
|
||
PUSHJ P,PURCLN ; CLEAN UP PURE SHARED AREA
|
||
RESTART: ;RESTART A PROCESS
|
||
STP: MOVEI C,0
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE B,TBINIT+1(PVP) ;POINT INTO STACK AT START
|
||
PUSHJ P,CHUNW ; LEAVE WHILE DOING UNWIND CHECK
|
||
XMOVEI E,TOPLEV
|
||
MOVEI A,TFALSE ; IN CASE FALLS OFF PROCESS
|
||
MOVEI B,0
|
||
MOVEM E,-1(TB)
|
||
JRST CONTIN
|
||
|
||
IMQUOTE TOPLEVEL
|
||
TOPLEVEL:
|
||
MCALL 0,LISTEN
|
||
JRST TOPLEVEL
|
||
|
||
|
||
IMFUNCTION LISTEN,SUBR
|
||
|
||
ENTRY
|
||
PUSH P,[0] ;FLAG: DON'T PRINT ERROR MSG
|
||
JRST ER1
|
||
|
||
; USER SUPPLIED ERROR HANDLER, TEMPORARY KLUDGE
|
||
IMQUOTE ERROR
|
||
|
||
ERROR: MOVE B,IMQUOTE ERROR
|
||
PUSHJ P,IGVAL ; GET VALUE
|
||
GETYP C,A
|
||
CAIN C,TSUBR ; CHECK FOR NO CHANGE
|
||
CAIE B,RERR1 ; SKIP IF NOT CHANGED
|
||
JRST .+2
|
||
JRST RERR1 ; GO TO THE DEFAULT
|
||
PUSH TP,A ; SAVE VALUE
|
||
PUSH TP,B
|
||
MOVE C,AB ; SAVE AB
|
||
MOVEI D,1 ; AND COUNTER
|
||
USER1: PUSH TP,(C) ; PUSH THEM
|
||
PUSH TP,1(C)
|
||
ADD C,[2,,2] ; BUMP
|
||
ADDI D,1
|
||
JUMPL C,USER1
|
||
ACALL D,APPLY ; EVAL USERS ERROR
|
||
JRST FINIS
|
||
|
||
|
||
|
||
IMFUNCTION ERROR%,SUBR,ERROR
|
||
|
||
RERR1: ENTRY
|
||
PUSH TP,$TATOM
|
||
PUSH TP,MQUOTE ERROR,ERROR,INTRUP
|
||
PUSHJ P,FRMSTK ; PUT ERROR'S FRAME ON STACK
|
||
MOVEI D,2
|
||
MOVE C,AB
|
||
RERR2: JUMPGE C,RERR22
|
||
PUSH TP,(C)
|
||
PUSH TP,1(C)
|
||
ADD C,[2,,2]
|
||
AOJA D,RERR2
|
||
RERR22: ACALL D,EMERGENCY
|
||
JRST RERR
|
||
|
||
IMQUOTE ERROR
|
||
RERR: ENTRY
|
||
PUSH P,[-1] ;PRINT ERROR FLAG
|
||
|
||
ER1: MOVE B,IMQUOTE INCHAN
|
||
PUSHJ P,ILVAL ; CHECK INPUT CHANNEL IS SOME KIND OF TTY
|
||
GETYP A,A
|
||
CAIE A,TCHAN ; SKIP IF IT IS A CHANNEL
|
||
JRST ER2 ; NO, MUST REBIND
|
||
CAMN B,TTICHN+1
|
||
JRST NOTINC
|
||
ER2: MOVE B,IMQUOTE INCHAN
|
||
MOVEI C,TTICHN ; POINT TO VALU
|
||
PUSHJ P,PUSH6 ; PUSH THE BINDING
|
||
MOVE B,TTICHN+1 ; GET IN CHAN
|
||
NOTINC: SKIPN DEMFLG ; SKIP IF DEMON
|
||
SKIPE NOTTY
|
||
JRST NOECHO
|
||
PUSH TP,$TCHAN
|
||
PUSH TP,B
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE T
|
||
MCALL 2,TTYECH ; ECHO INPUT
|
||
NOECHO: MOVE B,IMQUOTE OUTCHAN
|
||
PUSHJ P,ILVAL ; GET THE VALUE
|
||
GETYP A,A
|
||
CAIE A,TCHAN ; SKIP IF OK CHANNEL
|
||
JRST ER3 ; NOT CHANNEL, MUST REBIND
|
||
CAMN B,TTOCHN+1
|
||
JRST NOTOUT
|
||
ER3: MOVE B,IMQUOTE OUTCHAN
|
||
MOVEI C,TTOCHN
|
||
PUSHJ P,PUSH6 ; PUSH THE BINDINGS
|
||
NOTOUT: MOVE B,IMQUOTE OBLIST
|
||
PUSHJ P,ILVAL ; GET THE VALUE OF OBLIST
|
||
PUSHJ P,OBCHK ; IS IT A WINNER ?
|
||
SKIPA A,$TATOM ; NO, SKIP AND CONTINUE
|
||
JRST NOTOBL ; YES, DO NOT DO REBINDING
|
||
MOVE B,IMQUOTE OBLIST
|
||
PUSHJ P,IGLOC
|
||
GETYP 0,A
|
||
CAIN 0,TUNBOU
|
||
JRST MAKOB ; NO GLOBAL OBLIST, MAKE ONE
|
||
MOVEI C,(B) ; COPY ADDRESS
|
||
MOVE A,(C) ; GET THE GVAL
|
||
MOVE B,(C)+1
|
||
PUSHJ P,OBCHK ; IS IT A WINNER ?
|
||
JRST MAKOB ; NO, GO MAKE A NEW ONE
|
||
MOVE B,IMQUOTE OBLIST
|
||
PUSHJ P,PUSH6
|
||
|
||
NOTOBL: PUSH TP,[TATOM,,-1] ;FOR BINDING
|
||
PUSH TP,IMQUOTE LER,[LERR ]INTRUP
|
||
PUSHJ P,MAKACT
|
||
HRLI A,TFRAME ; CORRCT TYPE
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
MOVE A,PVSTOR+1 ; GET PROCESS
|
||
ADD A,[PROCID,,PROCID] ; POINT TO ID (ALSO LEVEL)
|
||
PUSH TP,BNDV
|
||
PUSH TP,A
|
||
MOVE A,PROCID(PVP)
|
||
ADDI A,1 ; BUMP ERROR LEVEL
|
||
PUSH TP,A
|
||
PUSH TP,PROCID+1(PVP)
|
||
PUSH P,A
|
||
|
||
MOVE B,IMQUOTE READ-TABLE
|
||
PUSHJ P,IGVAL
|
||
PUSH TP,[TATOM,,-1]
|
||
PUSH TP,IMQUOTE READ-TABLE
|
||
GETYP C,A ; TO GVAL OF READ-TABLE ON ERROR AND
|
||
CAIE C,TVEC ; TOP ERRET'S
|
||
JRST .+4
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
JRST .+3
|
||
PUSH TP,$TUNBOUND
|
||
PUSH TP,[-1]
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
|
||
PUSHJ P,SPECBIND ;BIND THE CRETANS
|
||
MOVE A,-1(P) ;RESTORE SWITHC
|
||
JUMPE A,NOERR ;IF 0, DONT PRINT ERROR MESS
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE *ERROR*
|
||
MCALL 0,TERPRI
|
||
MCALL 1,PRINC ;PRINT THE MESSAGE
|
||
NOERR: MOVE C,AB ;GET A COPY OF AB
|
||
|
||
ERRLP: JUMPGE C,LEVPRT ;IF NONE, RE-ENTER READ-EVAL-PRINT LOOP
|
||
PUSH TP,$TAB
|
||
PUSH TP,C
|
||
MOVEI B,PRIN1
|
||
GETYP A,(C) ; GET ARGS TYPE
|
||
CAIE A,TATOM
|
||
JRST ERROK
|
||
MOVE A,1(C) ; GET ATOM
|
||
HRRO A,2(A)
|
||
CAME A,[-1,,ERROBL+1]
|
||
CAMN A,ERROBL+1 ; DONT SKIP IF IN ERROR OBLIST
|
||
MOVEI B,PRINC ; DONT PRINT TRAILER
|
||
ERROK: PUSH P,B ; SAVE ROUTINE POINTER
|
||
PUSH TP,(C)
|
||
PUSH TP,1(C)
|
||
MCALL 0,TERPRI ; CRLF
|
||
POP P,B ; GET ROUTINE BACK
|
||
.MCALL 1,(B)
|
||
POP TP,C
|
||
SUB TP,[1,,1]
|
||
ADD C,[2,,2] ;BUMP SAVED AB
|
||
JRST ERRLP ;AND CONTINUE
|
||
|
||
|
||
LEVPRT: XCT INITFL ;LOAD MUDDLE INIT FILE IF FIRST TIME
|
||
MCALL 0,TERPRI
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE [LISTENING-AT-LEVEL ]
|
||
MCALL 1,PRINC ;PRINT LEVEL
|
||
PUSH TP,$TFIX ;READY TO PRINT LEVEL
|
||
HRRZ A,(P) ;GET LEVEL
|
||
SUB P,[2,,2] ;AND POP STACK
|
||
PUSH TP,A
|
||
MCALL 1,PRIN1 ;PRINT WITHOUT SPACES ETC.
|
||
PUSH TP,$TATOM ;NOW PROCESS
|
||
PUSH TP,EQUOTE [ PROCESS ]
|
||
MCALL 1,PRINC ;DONT SLASHIFY SPACES
|
||
MOVE PVP,PVSTOR+1
|
||
PUSH TP,PROCID(PVP) ;NOW ID
|
||
PUSH TP,PROCID+1(PVP)
|
||
MCALL 1,PRIN1
|
||
SKIPN C,CURPRI
|
||
JRST MAINLP
|
||
PUSH TP,$TFIX
|
||
PUSH TP,C
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE [ INT-LEVEL ]
|
||
MCALL 1,PRINC
|
||
MCALL 1,PRIN1
|
||
JRST MAINLP ; FALL INTO MAIN LOOP
|
||
|
||
;ROUTINES FOR ERROR-LISTEN
|
||
|
||
OBCHK: GETYP 0,A
|
||
CAIN 0,TOBLS
|
||
JRST CPOPJ1 ; WIN FOR SINGLE OBLIST
|
||
CAIE 0,TLIST ; IF LIST, MAKE SURE EACH IS AN OBLIST
|
||
JRST CPOPJ ; ELSE, LOSE
|
||
|
||
JUMPE B,CPOPJ ; NIL ,LOSE
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH P,[0] ;FLAG FOR DEFAULT CHECKING
|
||
MOVEI 0,1000 ; VERY BIG NUMBER FOR CIRCULARITY TEST
|
||
|
||
OBCHK0: INTGO
|
||
SOJE 0,OBLOSE ; CIRCULARITY TEST
|
||
HRRZ B,(TP) ; GET LIST POINTER
|
||
GETYP A,(B)
|
||
CAIE A,TOBLS ; SKIP IF WINNER
|
||
JRST DEFCHK ; CHECK FOR SPECIAL ATOM DEFAULT
|
||
HRRZ B,(B)
|
||
MOVEM B,(TP)
|
||
JUMPN B,OBCHK0
|
||
OBWIN: AOS (P)-1
|
||
OBLOSE: SUB TP,[2,,2]
|
||
SUB P,[1,,1]
|
||
POPJ P,
|
||
|
||
DEFCHK: SKIPN (P) ; BEEN HERE BEFORE ?
|
||
CAIE A,TATOM ; OR, NOT AN ATOM ?
|
||
JRST OBLOSE ; YES, LOSE
|
||
MOVE A,(B)+1
|
||
CAME A,MQUOTE DEFAULT
|
||
JRST OBLOSE ; LOSE
|
||
SETOM (P) ; SET FLAG
|
||
HRRZ B,(B) ; CHECK FOR END OF LIST
|
||
MOVEM B,(TP)
|
||
JUMPN B,OBCHK0 ; NOT THE END, CONTINUE LOOKING
|
||
JRST OBLOSE ; LOSE FOR DEFAULT AT THE END
|
||
|
||
|
||
|
||
PUSH6: PUSH TP,[TATOM,,-1]
|
||
PUSH TP,B
|
||
PUSH TP,(C)
|
||
PUSH TP,1(C)
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
POPJ P,
|
||
|
||
|
||
MAKOB: PUSH TP,INITIAL
|
||
PUSH TP,INITIAL+1
|
||
PUSH TP,ROOT
|
||
PUSH TP,ROOT+1
|
||
MCALL 2,LIST
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE OBLIST
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 2,SETG
|
||
PUSH TP,[TATOM,,-1]
|
||
PUSH TP,IMQUOTE OBLIST
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
JRST NOTOBL
|
||
|
||
|
||
;THIS IS IT FOLKS...THE MAIN LOOP. READ, EVAL, PRINT
|
||
|
||
MAINLP: MOVE A,$TATOM ;KLUDGE BY NDR LIKE ERROR TO LET LOOSER REDEFINE
|
||
MOVE B,IMQUOTE REP
|
||
PUSHJ P,ILVAL ;GET ITS LVAL TO SEE IF REDEFINED
|
||
GETYP C,A
|
||
CAIE C,TUNBOUND
|
||
JRST REPCHK
|
||
MOVE A,$TATOM ;SEE IF IT HAS GVAL SINCE NO LVAL
|
||
MOVE B,IMQUOTE REP
|
||
PUSHJ P,IGVAL
|
||
GETYP C,A
|
||
CAIN C,TUNBOUN
|
||
JRST IREPER
|
||
REPCHK: CAIN C,TSUBR
|
||
CAIE B,REPER
|
||
JRST .+2
|
||
JRST IREPER
|
||
REREPE: PUSH TP,A
|
||
PUSH TP,B
|
||
GETYP A,-1(TP)
|
||
PUSHJ P,APLQ
|
||
JRST ERRREP
|
||
MCALL 1,APPLY ;LOOSER HAS REDEFINED SO CALL HIS
|
||
JRST MAINLP
|
||
IREPER: PUSH P,[0] ;INDICATE FALL THROUGH
|
||
JRST REPERF
|
||
|
||
ERRREP: PUSH TP,[TATOM,,-1]
|
||
PUSH TP,IMQUOTE REP
|
||
PUSH TP,$TSUBR
|
||
PUSH TP,[REPER]
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
PUSHJ P,SPECBIN
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE NON-APPLICABLE-REP
|
||
PUSH TP,-11(TP)
|
||
PUSH TP,-11(TP)
|
||
MCALL 2,ERROR
|
||
SUB TP,[6,,6]
|
||
PUSHJ P,SSPECS
|
||
JRST REREPE
|
||
|
||
|
||
IMFUNCTION REPER,SUBR,REP
|
||
REPER: ENTRY 0
|
||
PUSH P,[1] ;INDICATE DIRECT CALL
|
||
REPERF: MCALL 0,TERPRI
|
||
MCALL 0,READ
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE B,IMQUOTE L-INS
|
||
PUSHJ P,ILVAL ; ASSIGNED?
|
||
GETYP 0,A
|
||
CAIN 0,TLIST
|
||
|
||
PUSHJ P,LSTTOF ; PUT LAST AS FIRST
|
||
MCALL 0,TERPRI
|
||
MCALL 1,EVAL
|
||
MOVE C,IMQUOTE LAST-OUT
|
||
PUSHJ P,CISET
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE B,IMQUOTE L-OUTS
|
||
PUSHJ P,ILVAL ; ASSIGNED?
|
||
GETYP 0,A
|
||
CAIN 0,TLIST
|
||
|
||
CAME B,(TP) ; DONT STUFF IT INTO ITSELF
|
||
JRST STUFIT ; STUFF IT IN
|
||
GETYP 0,-1(TP)
|
||
CAIE 0,TLIST ; IF A LIST THE L-OUTS
|
||
STUFIT: PUSHJ P,LSTTOF ; PUT LAST AS FIRST
|
||
MCALL 1,PRIN1
|
||
POP P,C ;FLAG FOR FALL THROUGH OR CALL
|
||
JUMPN C,FINIS ;IN CASE LOOSER CALLED REP
|
||
JRST MAINLP
|
||
|
||
LSTTOF: SKIPN A,B
|
||
POPJ P,
|
||
|
||
HRRZ C,(A)
|
||
JUMPE C,LSTTO2
|
||
MOVEI D,(C) ; SAVE PTR TO 2ND ELEMENT
|
||
MOVEI 0,-1 ; LET THE LOSER LOSE (HA HA HA)
|
||
|
||
LSTTO1: HRRZ C,(C) ; START SCAN
|
||
JUMPE C,GOTIT
|
||
HRRZ A,(A)
|
||
SOJG 0,LSTTO1
|
||
|
||
GOTIT: HRRZ C,(A)
|
||
HLLZS (A)
|
||
CAIE D,(C) ; AVOID CIRCULARITY
|
||
HRRM D,(C)
|
||
HRRM C,(B)
|
||
MOVE D,1(B)
|
||
MOVEM D,1(C)
|
||
GETYP D,(B)
|
||
PUTYP D,(C)
|
||
|
||
LSTTO2: MOVSI A,TLIST
|
||
MOVE C,-1(TP)
|
||
MOVE D,(TP)
|
||
JRST LSTUF
|
||
|
||
;FUNCTION TO RETRY A PREVIOUS FUNCTION CALL
|
||
|
||
MFUNCTION RETRY,SUBR
|
||
|
||
ENTRY
|
||
JUMPGE AB,RETRY1 ; USE MOST RECENT
|
||
CAMGE AB,[-2,,0]
|
||
JRST TMA
|
||
GETYP A,(AB) ; CHECK TYPE
|
||
CAIE A,TFRAME
|
||
JRST WTYP1
|
||
MOVEI B,(AB) ; POINT TO ARG
|
||
JRST RETRY2
|
||
RETRY1: MOVE B,IMQUOTE LER,[LERR ]INTRUP
|
||
PUSHJ P,ILOC ; LOCATIVE TO FRAME
|
||
RETRY2: PUSHJ P,CHFSWP ; CHECK VALIDITY AND SWAP IF NECESSARY
|
||
HRRZ 0,OTBSAV(B) ; CHECK FOR TOP
|
||
JUMPE 0,RESTAR ; YES RE-ENTER TOP LEVEL
|
||
PUSH TP,$TTB
|
||
PUSH TP,B ; SAVE FRAME
|
||
MOVE B,OTBSAV(B) ; GET PRVIOUS FOR UNBIND HACK
|
||
MOVEI C,-1(TP)
|
||
PUSHJ P,CHUNW ; CHECK ANY UNWINDING
|
||
CAME SP,SPSAV(TB) ; UNBINDING NEEDED?
|
||
PUSHJ P,SPECSTORE
|
||
MOVE P,PSAV(TB) ; GET OTHER STUFF
|
||
MOVE AB,ABSAV(B)
|
||
HLRE A,AB ; COMPUTE # OF ARGS
|
||
MOVNI A,-FRAMLN(A) ; MAKE TP POINT PAST FRAME
|
||
HRLI A,(A)
|
||
MOVE C,TPSAV(TB) ; COMPUTE TP
|
||
ADD C,A
|
||
MOVE TP,C
|
||
MOVE TB,B ; FIX UP TB
|
||
HRRZ C,FSAV(TB) ; GET FUNCTION
|
||
CAIL C,HIBOT
|
||
JRST (C) ; GO
|
||
GETYP 0,(C) ; RSUBR OR ENTRY?
|
||
CAIE 0,TATOM
|
||
CAIN 0,TRSUBR
|
||
JRST RETRNT
|
||
MOVS R,(C) ; SET UP R
|
||
HRRI R,(C)
|
||
MOVEI C,0
|
||
JRST RETRN3
|
||
|
||
RETRNT: CAIE 0,TRSUBR
|
||
JRST RETRN1
|
||
MOVE R,1(C)
|
||
RETRN4: HRRZ C,2(C) ; OFFSET
|
||
RETRN3: SKIPL M,1(R)
|
||
JRST RETRN5
|
||
RETRN7: ADDI C,(M)
|
||
JRST (C)
|
||
|
||
RETRN5: MOVEI D,(M) ; TOTAL OFFSET
|
||
MOVSS M
|
||
ADD M,PURVEC+1
|
||
SKIPL M,1(M)
|
||
JRST RETRN6
|
||
ADDI M,(D)
|
||
JRST RETRN7
|
||
|
||
RETRN6: HLRZ A,1(R)
|
||
PUSH P,D
|
||
PUSH P,C
|
||
PUSHJ P,PLOAD
|
||
JRST RETRER ; LOSER
|
||
POP P,C
|
||
POP P,D
|
||
MOVE M,B
|
||
JRST RETRN7
|
||
|
||
RETRN1: HRL C,(C) ; FIX LH
|
||
MOVE B,1(C)
|
||
PUSH TP,$TVEC
|
||
PUSH TP,C
|
||
PUSHJ P,IGVAL
|
||
GETYP 0,A
|
||
MOVE C,(TP)
|
||
SUB TP,[2,,2]
|
||
CAIE 0,TRSUBR
|
||
JRST RETRN2
|
||
MOVE R,B
|
||
JRST RETRN4
|
||
|
||
RETRN2: ERRUUO EQUOTE CANT-RETRY-ENTRY-GONE
|
||
|
||
RETRER: ERRUUO EQUOTE PURE-LOAD-FAILURE
|
||
|
||
|
||
;FUNCTION TO DO ERROR RETURN
|
||
|
||
IMFUNCTION ERRET,SUBR
|
||
|
||
ENTRY
|
||
HLRE A,AB ; -2*# OF ARGS
|
||
JUMPGE A,STP ; RESTART PROCESS
|
||
ASH A,-1 ; -# OF ARGS
|
||
AOJE A,ERRET2 ; NO FRAME SUPPLIED
|
||
AOJL A,TMA
|
||
ADD AB,[2,,2]
|
||
PUSHJ P,OKFRT
|
||
JRST WTYP2
|
||
SUB AB,[2,,2]
|
||
PUSHJ P,CHPROC ; POINT TO FRAME SLOT
|
||
JRST ERRET3
|
||
ERRET2: MOVE B,IMQUOTE LER,[LERR ]INTRUP
|
||
PUSHJ P,ILVAL ; GET ITS VALUE
|
||
ERRET3: PUSH TP,A
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP)
|
||
PUSHJ P,CHFSWP ; CHECK VALIDITY AND SWAP IF NECESSARY
|
||
HRRZ 0,OTBSAV(B) ; TOP LEVEL?
|
||
JUMPE 0,TOPLOS
|
||
PUSHJ P,CHUNW ; ANY UNWINDING
|
||
JRST CHFINIS
|
||
|
||
|
||
; FUNCTION TO RETURN LAST ERROR FRAME OR PREVIOUS FRAME
|
||
|
||
IMFUNCTION FRAME,SUBR
|
||
ENTRY
|
||
SETZB A,B
|
||
JUMPGE AB,FRM1 ; DEFAULT CASE
|
||
CAMG AB,[-3,,0] ; SKIP IF OK ARGS
|
||
JRST TMA
|
||
PUSHJ P,OKFRT ; A FRAME OR SIMILAR THING?
|
||
JRST WTYP1
|
||
|
||
FRM1: PUSHJ P,CFRAME ; GO TO INTERNAL
|
||
JRST FINIS
|
||
|
||
CFRAME: JUMPN A,FRM2 ; ARG SUPPLIED?
|
||
MOVE B,IMQUOTE LER,[LERR ]INTRUP
|
||
PUSHJ P,ILVAL
|
||
JRST FRM3
|
||
FRM2: PUSHJ P,CHPROC ; CHECK FOR PROCESS
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP) ; POINT TO SLOT
|
||
PUSHJ P,CHFRM ; CHECK IT
|
||
MOVE C,(TP) ; GET FRAME BACK
|
||
MOVE B,OTBSAV(C) ;GET PREVIOUS FRAME
|
||
SUB TP,[2,,2]
|
||
TRNN B,-1 ; SKIP IF OK
|
||
JRST TOPLOSE
|
||
|
||
FRM3: JUMPN B,FRM4 ; JUMP IF WINNER
|
||
MOVE B,IMQUOTE THIS-PROCESS
|
||
PUSHJ P,ILVAL ; GET PROCESS OF INTEREST
|
||
GETYP A,A ; CHECK IT
|
||
CAIN A,TUNBOU
|
||
MOVE B,PVSTOR+1 ; USE CURRENT
|
||
MOVEI A,PVLNT*2+1(B) ; POINT TO DOPE WORDS
|
||
MOVE B,TBINIT+1(B) ; AND BASE FRAME
|
||
FRM4: HLL B,OTBSAV(B) ;TIME
|
||
HRLI A,TFRAME
|
||
POPJ P,
|
||
|
||
OKFRT: AOS (P) ;ASSUME WINNAGE
|
||
GETYP 0,(AB)
|
||
MOVE A,(AB)
|
||
MOVE B,1(AB)
|
||
CAIE 0,TFRAME
|
||
CAIN 0,TENV
|
||
POPJ P,
|
||
CAIE 0,TPVP
|
||
CAIN 0,TACT
|
||
POPJ P,
|
||
SOS (P)
|
||
POPJ P,
|
||
|
||
CHPROC: GETYP 0,A ; TYPE
|
||
CAIE 0,TPVP
|
||
POPJ P, ; OK
|
||
MOVEI A,PVLNT*2+1(B)
|
||
CAMN B,PVSTOR+1 ; THIS PROCESS?
|
||
JRST CHPRO1
|
||
MOVE B,TBSTO+1(B)
|
||
JRST FRM4
|
||
|
||
CHPRO1: MOVE B,OTBSAV(TB)
|
||
JRST FRM4
|
||
|
||
; FUNCTION TO RETURN ARGS TUPLE FOR A FRAME
|
||
|
||
MFUNCTION ARGS,SUBR
|
||
ENTRY 1
|
||
PUSHJ P,OKFRT ; CHECK FRAME TYPE
|
||
JRST WTYP1
|
||
PUSHJ P,CARGS
|
||
JRST FINIS
|
||
|
||
CARGS: PUSHJ P,CHPROC
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP) ; POINT TO FRAME SLOT
|
||
PUSHJ P,CHFRM ; AND CHECK FOR VALIDITY
|
||
MOVE C,(TP) ; FRAME BACK
|
||
MOVSI A,TARGS
|
||
CARGS1: GETYP 0,FSAV(C) ; IS THIS A FUNNY ONE
|
||
CAIE 0,TCBLK ; SKIP IF FUNNY
|
||
JRST .+3 ; NO NORMAL
|
||
MOVE C,OTBSAV(C) ; ASSOCIATE WITH PREVIOUS FRAME
|
||
JRST CARGS1
|
||
HLR A,OTBSAV(C) ; TIME IT AND
|
||
MOVE B,ABSAV(C) ; GET POINTER
|
||
SUB TP,[2,,2] ; FLUSH CRAP
|
||
POPJ P,
|
||
|
||
; FUNCTION TO RETURN FUNCTION ASSOCIATED WITH A FRAME
|
||
|
||
MFUNCTION FUNCT,SUBR
|
||
ENTRY 1 ; FRAME ARGUMENT
|
||
PUSHJ P,OKFRT ; CHECK TYPE
|
||
JRST WTYP1
|
||
PUSHJ P,CFUNCT
|
||
JRST FINIS
|
||
|
||
CFUNCT: PUSHJ P,CHPROC
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP)
|
||
PUSHJ P,CHFRM ; CHECK IT
|
||
MOVE C,(TP) ; RESTORE FRAME
|
||
HRRZ A,FSAV(C) ;FUNCTION POINTER
|
||
CAIL A,HIBOT
|
||
SKIPA B,@-1(A) ;NO, GET SUBR'S NAME POINTER
|
||
MOVE B,(A)+3 ;YES, GET RSUBR'S NAME ENTRY
|
||
MOVSI A,TATOM
|
||
SUB TP,[2,,2]
|
||
POPJ P,
|
||
|
||
BADFRAME:
|
||
ERRUUO EQUOTE FRAME-NO-LONGER-EXISTS
|
||
|
||
|
||
TOPLOSE:
|
||
ERRUUO EQUOTE TOP-LEVEL-FRAME
|
||
|
||
|
||
|
||
|
||
; ROUTINE TO HANG INDEFINITELY WITH INTERRUPTS ENABLED
|
||
|
||
MFUNCTION HANG,SUBR
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,HANG1 ; NO PREDICATE
|
||
CAMGE AB,[-3,,]
|
||
JRST TMA
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
PUSHJ P,CHKPRD
|
||
REHANG: MOVE A,[PUSHJ P,CHKPRH]
|
||
MOVEM A,ONINT ; CHECK PREDICATE AFTER ANY INTERRUPT
|
||
HANG1: ENABLE ;LET OURSELVES BE INTERRUPTED OUT
|
||
PUSHJ P,%HANG
|
||
DISABLE ;PREVENT INTERRUPTS AT RANDOM TIMES
|
||
SETZM ONINT
|
||
MOVE A,$TATOM
|
||
MOVE B,IMQUOTE T
|
||
JRST FINIS
|
||
|
||
|
||
; ROUTINE TO SLEEP FOR POSITIVE NUMBER OF SECONDS WITH INTERRUPTS ENABLED
|
||
; ARGUMENT SHOULD BE OF TYPE FIX OR FLOAT AND NON-NEGATIVE
|
||
|
||
MFUNCTION SLEEP,SUBR
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,TFA
|
||
CAML AB,[-3,,]
|
||
JRST SLEEP1
|
||
CAMGE AB,[-5,,]
|
||
JRST TMA
|
||
PUSH TP,2(AB)
|
||
PUSH TP,3(AB)
|
||
PUSHJ P,CHKPRD
|
||
SLEEP1: GETYP 0,(AB)
|
||
CAIE 0,TFIX
|
||
JRST .+5
|
||
MOVE B,1(AB)
|
||
JUMPL B,OUTRNG ;ARG SHOULDNT BE NEGATIVE
|
||
IMULI B,30. ;CONVERT TO # OF THIRTIETHS OF A SECOND
|
||
JRST SLEEPR ;GO SLEEP
|
||
CAIE 0,TFLOAT ;IF IT WASNT FIX MAKE SURE IT IS FLOAT
|
||
JRST WTYP1 ;WRONG TYPE ARG
|
||
MOVE B,1(AB)
|
||
FMPR B,[30.0] ;CONVERT TO FLOATING # OF THIRTIETHS OF A SECOND
|
||
MULI B,400 ;KLUDGE TO FIX IT
|
||
TSC B,B
|
||
ASH C,(B)-243
|
||
MOVE B,C ;MOVE THE FIXED NUMBER INTO B
|
||
JUMPL B,OUTRNG ;CHECK TO SEE THAT WE HAVE POSITIVE NUMBER
|
||
SLEEPR: MOVE A,B
|
||
RESLEE: MOVE B,[PUSHJ P,CHKPRS]
|
||
CAMGE AB,[-3,,]
|
||
MOVEM B,ONINT
|
||
ENABLE
|
||
PUSHJ P,%SLEEP
|
||
DISABLE
|
||
SETZM ONINT
|
||
MOVE A,$TATOM
|
||
MOVE B,IMQUOTE T
|
||
JRST FINIS
|
||
|
||
CHKPRH: PUSH P,B
|
||
MOVEI B,HANGP
|
||
JRST .+3
|
||
|
||
CHKPRS: PUSH P,B
|
||
MOVEI B,SLEEPP
|
||
HRRM B,LCKINT
|
||
SETZM ONINT ; TURN OFF FEATURE FOR NOW
|
||
POP P,B
|
||
POPJ P,
|
||
|
||
HANGP: SKIPA B,[REHANG]
|
||
SLEEPP: MOVEI B,RESLEE
|
||
PUSH P,B
|
||
CHKPRD: PUSH P,A
|
||
DISABLE
|
||
PUSH TP,(TB)
|
||
PUSH TP,1(TB)
|
||
MCALL 1,EVAL
|
||
GETYP 0,A
|
||
CAIE 0,TFALSE
|
||
JRST FINIS
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
MFUNCTION VALRET,SUBR
|
||
; SUBR TO VALRET A STRING TO SUPERIOR ITS PROCESS
|
||
|
||
ENTRY 1
|
||
GETYP A,(AB) ; GET TYPE OF ARGUMENT
|
||
CAIN A,TFIX ; FIX?
|
||
JRST VALRT1
|
||
CAIE A,TCHSTR ; IS IT A CHR STRING?
|
||
JRST WTYP1 ; NO...ERROR WRONG TYPE
|
||
PUSHJ P,CSTACK ; COPY THE CHR STRING TO THE STACK
|
||
; CSTACK IS IN ATOMHK
|
||
MOVEI B,0 ; ASCIZ TERMINATOR
|
||
EXCH B,(P) ; STORE AND RETRIEVE COUNT
|
||
|
||
; CALCULATE THE BEGINNING ADDR OF THE STRING
|
||
MOVEI A,-1(P) ; GET ADDR OF TOP OF STACK
|
||
SUBI A,-1(B) ; GET STARTING ADDR
|
||
PUSHJ P,%VALRE ; PASS UP TO MONITOR
|
||
JRST IFALSE ; IF HE RETURNS, RETURN FALSE
|
||
|
||
VALRT1: MOVE A,1(AB)
|
||
PUSHJ P,%VALFI
|
||
JRST IFALSE
|
||
|
||
MFUNCTION LOGOUT,SUBR
|
||
|
||
; SUBR TO DO A .LOGOUT (VALID ONLY AT TOP LEVEL)
|
||
ENTRY 0
|
||
PUSHJ P,%TOPLQ ; SKIP IF AT TOP LEVEL
|
||
JRST IFALSE
|
||
PUSHJ P,CLOSAL
|
||
PUSHJ P,%LOGOUT ; TRY TO FLUSH
|
||
JRST IFALSE ; COULDN'T DO IT...RETURN FALSE
|
||
|
||
; FUNCTS TO GET UNAME AND JNAME
|
||
|
||
; GET XUNAME (REAL UNAME)
|
||
MFUNCTION XUNAME,SUBR
|
||
|
||
ENTRY 0
|
||
|
||
PUSHJ P,%RXUNA
|
||
JRST RSUJNM
|
||
JRST FINIS ; 10X ROUTINES SKIP
|
||
|
||
MFUNCTION UNAME,SUBR
|
||
|
||
ENTRY 0
|
||
|
||
PUSHJ P,%RUNAM
|
||
JRST RSUJNM
|
||
JRST FINIS
|
||
|
||
; REAL JNAME
|
||
MFUNCTION XJNAME,SUBR
|
||
|
||
ENTRY 0
|
||
|
||
PUSHJ P,%RXJNA
|
||
JRST RSUJNM
|
||
|
||
MFUNCTION JNAME,SUBR
|
||
|
||
ENTRY 0
|
||
|
||
PUSHJ P,%RJNAM
|
||
JRST RSUJNM
|
||
|
||
; FUNCTION TO SET AND READ GLOBAL SNAME
|
||
|
||
MFUNCTION SNAME,SUBR
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,SNAME1
|
||
CAMG AB,[-3,,]
|
||
JRST TMA
|
||
GETYP A,(AB) ; ARG MUST BE STRING
|
||
CAIE A,TCHSTR
|
||
JRST WTYP1
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE SNM
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
MCALL 2,SETG
|
||
JRST FINIS
|
||
|
||
SNAME1: MOVE B,IMQUOTE SNM
|
||
PUSHJ P,IDVAL1
|
||
GETYP 0,A
|
||
CAIN 0,TCHSTR
|
||
JRST FINIS
|
||
MOVE A,$TCHSTR
|
||
MOVE B,CHQUOTE
|
||
JRST FINIS
|
||
|
||
RSUJNM: PUSHJ P,6TOCHS ; CONVERT IT
|
||
JRST FINIS
|
||
|
||
|
||
SGSNAM: MOVE B,IMQUOTE SNM
|
||
PUSHJ P,IDVAL1
|
||
GETYP 0,A
|
||
CAIE 0,TCHSTR
|
||
JRST SGSN1
|
||
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
PUSHJ P,STRTO6
|
||
POP P,A
|
||
SUB TP,[2,,2]
|
||
JRST .+2
|
||
|
||
SGSN1: MOVEI A,0
|
||
PUSHJ P,%SSNAM ; SET SNAME IN SYSTEM
|
||
POPJ P,
|
||
|
||
|
||
|
||
;THIS SUBROUTINE ALLOCATES A NEW PROCESS
|
||
;TAKES TP-STACK SIZE (2*WORDS) IN A AND P-STACK SIZE (WORDS) IN B
|
||
;IS CALLED BY PUSHJ P,. RETURNS IN A AND B A NEW PROCESS.
|
||
|
||
ICR: PUSH P,A
|
||
PUSH P,B
|
||
MOVEI A,PVLNT ;SETUP CALL TO VECTOR FOR PVP
|
||
PUSHJ P,IVECT ;GOBBLE A VECTOR
|
||
HRLI C,PVBASE ;SETUP A BLT POINTER
|
||
HRRI C,(B) ;GET INTO ADDRESS
|
||
BLT C,PVLNT*2-1(B) ;COPY A PROTOTYPE INTO NEW PVP
|
||
MOVSI C,400000+SPVP+.VECT. ;SET SPECIAL TYPE
|
||
MOVEM C,PVLNT*2(B) ;CLOBBER IT IN
|
||
PUSH TP,A ;SAVE THE RESULTS OF VECTOR
|
||
PUSH TP,B
|
||
|
||
PUSH TP,$TFIX ;GET A UNIFORM VECTOR
|
||
POP P,B
|
||
PUSH TP,B
|
||
MCALL 1,UVECTOR
|
||
ADD B,[PDLBUF-2,,-1] ;FUDGE WITH BUFFER
|
||
MOVE C,(TP) ;REGOBBLE PROCESS POINTER
|
||
MOVEM B,PSTO+1(C) ;STORE IN ALL HOMES
|
||
MOVEM B,PBASE+1(C)
|
||
|
||
|
||
POP P,A ;PREPARE TO CREATE A TEMPORARY PDL
|
||
PUSHJ P,IVECT ;GET THE TEMP PDL
|
||
ADD B,[PDLBUF,,0] ;PDL GROWTH HACK
|
||
MOVE C,(TP) ;RE-GOBBLE NEW PVP
|
||
SUB B,[1,,1] ;FIX FOR STACK
|
||
MOVEM B,TPBASE+1(C)
|
||
|
||
;SETUP INITIAL BINDING
|
||
|
||
PUSH B,$TBIND
|
||
MOVEM B,SPBASE+1(C) ;SAVE AS BASE OF SP
|
||
MOVEM B,SPSTO+1(C) ;AND CURRENT THEREOF
|
||
MOVEM B,CURFCN+1(C) ; AND AS CURRENT FCN FOR SPEC/UNSPEC LOGIC
|
||
PUSH B,IMQUOTE THIS-PROCESS
|
||
PUSH B,$TPVP ;GIVE IT PROCESS AS VALUE
|
||
PUSH B,C
|
||
ADD B,[2,,2] ;FINISH FRAME
|
||
MOVEM B,TPSTO+1(C) ;MAKE THIS THE CURRENT STACK POINTER
|
||
MOVEM C,PVPSTO+1(C) ;SAVE THE NEW PVP ITSELF
|
||
AOS A,IDPROC ;GOBBLE A UNIQUE PROCESS I.D.
|
||
MOVEM A,PROCID+1(C) ;SAVE THAT ALSO
|
||
AOS A,PTIME ; GET A UNIQUE BINDING ID
|
||
MOVEM A,BINDID+1(C)
|
||
|
||
MOVSI A,TPVP ;CLOBBER THE TYPE
|
||
MOVE B,(TP) ;AND POINTER TO PROCESS
|
||
SUB TP,[2,,2]
|
||
POPJ P,
|
||
|
||
;MINI ROUTINE TO CALL VECTOR WITH COUNT IN A
|
||
|
||
IVECT: PUSH TP,$TFIX
|
||
PUSH TP,A
|
||
MCALL 1,VECTOR ;GOBBLE THE VECTOR
|
||
POPJ P,
|
||
|
||
|
||
;SUBROUTINE TO SWAP A PROCESS IN
|
||
;CALLED WITH JSP A,SWAP AND NEW PVP IN B
|
||
|
||
SWAP: ;FIRST STORE ALL THE ACS
|
||
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE SP,$TSP ; STORE SPSAVE
|
||
MOVEM SP,SPSTO(PVP)
|
||
MOVE SP,SPSTOR+1
|
||
IRP A,,[SP,AB,TB,TP,P,M,R,FRM]
|
||
MOVEM A,A!STO+1(PVP)
|
||
TERMIN
|
||
|
||
SETOM 1(TP) ; FENCE POST MAIN STACK
|
||
MOVEM TP,TPSAV(TB) ; CORRECT FRAME
|
||
SETZM PSAV(TB) ; CLEAN UP CURRENT FRAME
|
||
SETZM SPSAV(TB)
|
||
SETZM PCSAV(TB)
|
||
|
||
MOVE E,PVP ;RETURN OLD PROCESS IN E
|
||
MOVE PVP,D ;AND MAKE NEW ONE BE D
|
||
MOVEM PVP,PVSTOR+1
|
||
|
||
SWAPIN:
|
||
;NOW RESTORE NEW PROCESSES AC'S
|
||
|
||
MOVE PVP,PVSTOR+1
|
||
IRP A,,[AB,TB,SP,TP,P,M,R,FRM]
|
||
MOVE A,A!STO+1(PVP)
|
||
TERMIN
|
||
|
||
SETZM SPSTO(PVP)
|
||
MOVEM SP,SPSTOR+1
|
||
JRST (C) ;AND RETURN
|
||
|
||
|
||
|
||
|
||
;SUBRS ASSOCIATED WITH TYPES
|
||
|
||
;TYPE (ITYPE) ARE FUNCTIONS TO RETURN THE ATOMIC NAME OF THE
|
||
;TYPE OF A GOODIE. TYPE TAKES ITS ARGS ON AP AND RETURNS IN A AND B.
|
||
;ITYPE TAKES ITS ARGS IN A AND B AND RETURNS IN SAME (B=0) FOR INVALID
|
||
;TYPECODE.
|
||
MFUNCTION TYPE,SUBR
|
||
|
||
ENTRY 1
|
||
GETYP A,(AB) ;TYPE INTO A
|
||
TYPE1: PUSHJ P,ITYPE ;GO TO INTERNAL
|
||
JUMPN B,FINIS ;GOOD RETURN
|
||
TYPERR: ERRUUO EQUOTE TYPE-UNDEFINED
|
||
|
||
CITYPE: GETYP A,A ; GET TYPE FOR COMPILER CALL
|
||
ITYPE: LSH A,1 ;TIMES 2
|
||
HRLS A ;TO BOTH SIDES
|
||
ADD A,TYPVEC+1 ;GET ACTUAL LOCATION
|
||
JUMPGE A,TYPERR ;LOST, TYPE OUT OF BOUNDS
|
||
MOVE B,1(A) ;PICKUP TYPE
|
||
HLLZ A,(A)
|
||
POPJ P,
|
||
|
||
; PREDICATE -- IS OBJECT OF TYPE SPECIFIED
|
||
|
||
MFUNCTION %TYPEQ,SUBR,[TYPE?]
|
||
|
||
ENTRY
|
||
|
||
MOVE D,AB ; GET ARGS
|
||
ADD D,[2,,2]
|
||
JUMPGE D,TFA
|
||
MOVE A,(AB)
|
||
HLRE C,D
|
||
MOVMS C
|
||
ASH C,-1 ; FUDGE
|
||
PUSHJ P,ITYPQ ; GO INTERNAL
|
||
JFCL
|
||
JRST FINIS
|
||
|
||
ITYPQ: GETYP A,A ; OBJECT
|
||
PUSHJ P,ITYPE
|
||
TYPEQ0: SOJL C,CIFALS
|
||
GETYP 0,(D)
|
||
CAIE 0,TATOM ; Type name must be an atom
|
||
JRST WRONGT
|
||
CAMN B,1(D) ; Same as the OBJECT?
|
||
JRST CPOPJ1 ; Yes, return type name
|
||
ADD D,[2,,2]
|
||
JRST TYPEQ0 ; No, continue comparing
|
||
|
||
CIFALS: MOVEI B,0
|
||
MOVSI A,TFALSE
|
||
POPJ P,
|
||
|
||
CTYPEQ: SOJE A,CIFALS ; TREAT NO ARGS AS FALSE
|
||
MOVEI D,1(A) ; FIND BASE OF ARGS
|
||
ASH D,1
|
||
HRLI D,(D)
|
||
SUBM TP,D ; D POINTS TO BASE
|
||
MOVE E,D ; SAVE FOR TP RESTORE
|
||
ADD D,[3,,3] ; FUDGE
|
||
MOVEI C,(A) ; NUMBER OF TYPES
|
||
MOVE A,-2(D)
|
||
PUSHJ P,ITYPQ
|
||
JFCL ; IGNORE SKIP FOR NOW
|
||
MOVE TP,E ; SET TP BACK
|
||
JUMPL B,CPOPJ1 ; SKIP
|
||
POPJ P,
|
||
|
||
; Entries to get type codes for types for fixing up RSUBRs and assembling
|
||
|
||
MFUNCTION %TYPEC,SUBR,[TYPE-C]
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,TFA
|
||
GETYP 0,(AB)
|
||
CAIE 0,TATOM
|
||
JRST WTYP1
|
||
MOVE B,1(AB)
|
||
CAMGE AB,[-3,,0] ; skip if only type name given
|
||
JRST GTPTYP
|
||
MOVE C,IMQUOTE ANY
|
||
|
||
TYPEC1: PUSHJ P,CTYPEC ; go to internal
|
||
JRST FINIS
|
||
|
||
GTPTYP: CAMGE AB,[-5,,0]
|
||
JRST TMA
|
||
GETYP 0,2(AB)
|
||
CAIE 0,TATOM
|
||
JRST WTYP2
|
||
MOVE C,3(AB)
|
||
JRST TYPEC1
|
||
|
||
CTYPEC: PUSH P,C ; save primtype checker
|
||
PUSHJ P,TYPFND ; search type vector
|
||
JRST CTPEC2 ; create the poor loser
|
||
POP P,B
|
||
CAMN B,IMQUOTE ANY
|
||
JRST CTPEC1
|
||
CAMN B,IMQUOTE TEMPLATE
|
||
JRST TCHK
|
||
PUSH P,D
|
||
HRRZ A,(A)
|
||
ANDI A,SATMSK
|
||
PUSH P,A
|
||
PUSHJ P,TYPLOO
|
||
HRRZ 0,(A)
|
||
ANDI 0,SATMSK
|
||
CAME 0,(P)
|
||
JRST TYPDIF
|
||
MOVE D,-1(P)
|
||
SUB P,[2,,2]
|
||
CTPEC1: MOVEI B,(D)
|
||
MOVSI A,TTYPEC
|
||
POPJ P,
|
||
TCHK: PUSH P,D ; SAVE TYPE
|
||
MOVE A,D ; GO TO SAT
|
||
PUSHJ P,SAT
|
||
CAIG A,NUMSAT ; SKIP IF A TEMPLATE
|
||
JRST TYPDIF
|
||
POP P,D ; RESTORE TYPE
|
||
JRST CTPEC1
|
||
|
||
CTPEC2: POP P,C ; GET BACK PRIMTYPE
|
||
SUBM M,(P)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
CAMN C,IMQUOTE ANY
|
||
JRST CTPEC3
|
||
PUSH TP,$TATOM
|
||
PUSH TP,C
|
||
MCALL 2,NEWTYPE ; CREATE THE POOR GUY
|
||
MOVE C,IMQUOTE ANY
|
||
SUBM M,(P) ; UNRELATIVIZE
|
||
JRST CTYPEC
|
||
|
||
CTPEC3: HRRZ 0,FSAV(TB)
|
||
CAIE 0,%TYPEC
|
||
CAIN 0,%TYPEW
|
||
JRST TYPERR
|
||
|
||
MCALL 1,%TYPEC
|
||
JRST MPOPJ
|
||
|
||
MFUNCTION %TYPEW,SUBR,[TYPE-W]
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,TFA
|
||
GETYP 0,(AB)
|
||
CAIE 0,TATOM
|
||
JRST WTYP1
|
||
MOVEI D,0
|
||
MOVE C,IMQUOTE ANY
|
||
MOVE B,1(AB)
|
||
CAMGE AB,[-3,,0]
|
||
JRST CTYPW1
|
||
|
||
CTYPW3: PUSHJ P,CTYPEW
|
||
JRST FINIS
|
||
|
||
CTYPW1: GETYP 0,2(AB)
|
||
CAIE 0,TATOM
|
||
JRST WTYP2
|
||
CAMGE AB,[-5,,0] ; JUMP IF RH IS GIVEN
|
||
JRST CTYPW2
|
||
CTYPW5: MOVE C,3(AB)
|
||
JRST CTYPW3
|
||
|
||
CTYPW2: CAMGE AB,[-7,,0]
|
||
JRST TMA
|
||
GETYP 0,4(AB)
|
||
CAIE 0,TFIX
|
||
JRST WRONGT
|
||
MOVE D,5(AB)
|
||
JRST CTYPW5
|
||
|
||
CTYPEW: PUSH P,D
|
||
PUSHJ P,CTYPEC ; GET CODE IN B
|
||
POP P,B
|
||
HRLI B,(D)
|
||
MOVSI A,TTYPEW
|
||
POPJ P,
|
||
|
||
MFUNCTION %VTYPE,SUBR,[VALID-TYPE?]
|
||
|
||
ENTRY 1
|
||
|
||
GETYP 0,(AB)
|
||
CAIE 0,TATOM
|
||
JRST WTYP1
|
||
MOVE B,1(AB)
|
||
|
||
PUSHJ P,CVTYPE
|
||
JFCL
|
||
JRST FINIS
|
||
|
||
CVTYPE: PUSHJ P,TYPFND ; LOOK IT UP
|
||
JRST PFALS
|
||
|
||
MOVEI B,(D)
|
||
MOVSI A,TTYPEC
|
||
JRST CPOPJ1
|
||
|
||
PFALS: MOVEI B,0
|
||
MOVSI A,TFALSE
|
||
POPJ P,
|
||
|
||
;PRIMTTYPE RETURNS THE TYPE ATOM OF A PRIMITIVE TYPE IN A CLASS
|
||
|
||
STBL: REPEAT NUMSAT,SETZ MQUOTE INTERNAL-TYPE
|
||
|
||
LOC STBL
|
||
|
||
IRP A,,[[1WORD,WORD],[2WORD,LIST],[NWORD,UVECTOR],[2NWORD,VECTOR],[STORE,STORAGE]
|
||
[ARGS,TUPLE],[FRAME,FRAME],[ATOM,ATOM],[LOCID,LOCD],[CHSTR,STRING],[OFFS,OFFSET,1]
|
||
[PVP,PROCESS,1],[ASOC,ASOC,1],[LOCA,LOCA],[LOCS,LOCS],[LOCU,LOCU],[LOCV,LOCV]
|
||
[LOCL,LOCL],[LOCN,LOCAS],[LOCT,LOCT,1],[LOCR,LOCR],[LOCB,LOCB,1],[BYTE,BYTES,1]]
|
||
IRP B,C,[A]
|
||
LOC STBL+S!B
|
||
IRP X,Y,[C]
|
||
IFSE [Y],SETZ IMQUOTE X
|
||
IFSN [Y],SETZ MQUOTE X
|
||
.ISTOP
|
||
TERMIN
|
||
.ISTOP
|
||
|
||
TERMIN
|
||
TERMIN
|
||
|
||
LOC STBL+NUMSAT+1
|
||
|
||
|
||
MFUNCTION TYPEPRIM,SUBR
|
||
|
||
ENTRY 1
|
||
GETYP A,(AB)
|
||
CAIE A,TATOM
|
||
JRST NOTATOM
|
||
MOVE B,1(AB)
|
||
PUSHJ P,CTYPEP
|
||
JRST FINIS
|
||
|
||
CTYPEP: PUSHJ P,TYPLOO ; CONVERT ATOM TO CODE
|
||
HRRZ A,(A) ; SAT TO A
|
||
ANDI A,SATMSK
|
||
JRST PTYP1
|
||
|
||
MFUNCTION PTSATC,SUBR,[PRIMTYPE-C]
|
||
|
||
ENTRY 1
|
||
|
||
GETYP A,(AB)
|
||
CAIE A,TATOM
|
||
JRST WTYP1
|
||
MOVE B,1(AB)
|
||
PUSHJ P,CPRTYC
|
||
JRST FINIS
|
||
|
||
CPRTYC: PUSHJ P,TYPLOO
|
||
MOVE B,(A)
|
||
ANDI B,SATMSK
|
||
MOVSI A,TSATC
|
||
POPJ P,
|
||
|
||
|
||
IMFUNCTION PRIMTYPE,SUBR
|
||
|
||
ENTRY 1
|
||
|
||
MOVE A,(AB) ;GET TYPE
|
||
PUSHJ P,CPTYPE
|
||
JRST FINIS
|
||
|
||
CPTYPE: GETYP A,A
|
||
PUSHJ P,SAT ;GET SAT
|
||
PTYP1: JUMPE A,TYPERR
|
||
MOVE B,IMQUOTE TEMPLATE
|
||
CAIG A,NUMSAT ; IF BIG SAT, THEN TEMPLATE
|
||
MOVE B,@STBL(A)
|
||
MOVSI A,TATOM
|
||
POPJ P,
|
||
|
||
|
||
; RSUBR MAKES A VECTOR INTO AN OBJECT OF TYPE RSUBR, ALSO SLIGHTLY MUNGING IT
|
||
|
||
IMFUNCTION RSUBR,SUBR
|
||
ENTRY 1
|
||
|
||
GETYP A,(AB)
|
||
CAIE A,TVEC ; MUST BE VECTOR
|
||
JRST WTYP1
|
||
MOVE B,1(AB) ; GET IT
|
||
GETYP A,(B) ; CHECK 1ST ELEMENTS TYPE
|
||
CAIN A,TPCODE ; PURE CODE
|
||
JRST .+3
|
||
CAIE A,TCODE
|
||
JRST NRSUBR
|
||
HLRM B,(B) ; CLOBEER SPECIAL COUNT FIELD
|
||
MOVSI A,TRSUBR
|
||
JRST FINIS
|
||
|
||
NRSUBR: ERRUUO EQUOTE FIRST-ELEMENT-OF-VECTOR-NOT-CODE
|
||
|
||
; ROUTINE TO GENERATE ENTRYY OTHER THAN FIRST TO RSUBRR
|
||
|
||
IMFUNCTION MENTRY,SUBR,[RSUBR-ENTRY]
|
||
|
||
ENTRY 2
|
||
|
||
GETYP 0,(AB) ; TYPE OF ARG
|
||
CAIE 0,TVEC ; BETTER BE VECTOR
|
||
JRST WTYP1
|
||
GETYP 0,2(AB)
|
||
CAIE 0,TFIX
|
||
JRST WTYP2
|
||
MOVE B,1(AB) ; GET VECTOR
|
||
CAML B,[-3,,0]
|
||
JRST BENTRY
|
||
GETYP 0,(B) ; FIRST ELEMENT
|
||
CAIE 0,TRSUBR
|
||
JRST MENTR1
|
||
MENTR2: GETYP 0,2(B)
|
||
CAIE 0,TATOM
|
||
JRST BENTRY
|
||
MOVE C,3(AB)
|
||
HRRM C,2(B) ; OFFSET INTO VECTOR
|
||
HLRM B,(B)
|
||
MOVSI A,TENTER
|
||
JRST FINIS
|
||
|
||
MENTR1: CAIE 0,TATOM
|
||
JRST BENTRY
|
||
MOVE B,1(B) ; GET ATOM
|
||
PUSHJ P,IGVAL ; GET VAL
|
||
GETYP 0,A
|
||
CAIE 0,TRSUBR
|
||
JRST BENTRY
|
||
MOVE C,1(AB) ; RESTORE B
|
||
MOVEM A,(C)
|
||
MOVEM B,1(C)
|
||
MOVE B,C
|
||
JRST MENTR2
|
||
|
||
BENTRY: ERRUUO EQUOTE BAD-VECTOR
|
||
|
||
; SUBR TO GET ENTRIES OFFSET
|
||
|
||
MFUNCTION LENTRY,SUBR,[ENTRY-LOC]
|
||
|
||
ENTRY 1
|
||
|
||
GETYP 0,(AB)
|
||
CAIE 0,TENTER
|
||
JRST WTYP1
|
||
MOVE B,1(AB)
|
||
HRRZ B,2(B)
|
||
MOVSI A,TFIX
|
||
JRST FINIS
|
||
|
||
; RETURN FALSE
|
||
|
||
RTFALS: MOVSI A,TFALSE
|
||
MOVEI B,0
|
||
POPJ P,
|
||
|
||
;SUBROUTINE CALL FOR RSUBRs
|
||
RCALL: SUBM M,(P) ;CALCULATE PC's OFFSET IN THE RSUBR
|
||
HRLI 0,400000 ; DONT LOSE IN MULTI SEG MODE
|
||
|
||
PUSHJ P,@0 ;GO TO THE PROPER SUBROUTINE
|
||
SUBM M,(P) ;RECONSTITUTE THE RSUBR's PC
|
||
POPJ P,
|
||
|
||
|
||
|
||
;CHTYPE TAKES TWO ARGUMENTS. ANY GOODIE AND A AN ATOMIC TYPE NAME
|
||
;IT CHECKS THE STORAGE ALLOCATION TYPES OF THE TWO ARE THE SAME AND
|
||
;IF THEY ARE CHANGES THE TYPE OF THE FIRST TO THAT NAME D IN THE SECOND
|
||
|
||
MFUNCTION CHTYPE,SUBR
|
||
|
||
ENTRY 2
|
||
GETYP A,2(AB) ;FIRST CHECK THAT ARG 2 IS AN ATOM
|
||
CAIE A,TATOM
|
||
JRST NOTATOM
|
||
MOVE B,3(AB) ;AND TYPE NAME
|
||
PUSHJ P,TYPLOO ;GO LOOKUP TYPE
|
||
TFOUND: HRRZ B,(A) ;GOBBLE THE SAT
|
||
TRNE B,CHBIT ; SKIP IF CHTYPABLE
|
||
JRST CANTCH
|
||
TRNE B,TMPLBT ; TEMPLAT
|
||
HRLI B,-1
|
||
AND B,[-1,,SATMSK]
|
||
GETYP A,(AB) ;NOW GET TYPE TO HACK
|
||
PUSHJ P,SAT ;FIND OUT ITS SAT
|
||
JUMPE A,TYPERR ;COMPLAIN
|
||
CAILE A,NUMSAT
|
||
JRST CHTMPL ; JUMP IF TEMPLATE DATA
|
||
CAIE A,(B) ;DO THEY AGREE?
|
||
JRST TYPDIF ;NO, COMPLAIN
|
||
CHTMP1: MOVSI A,(D) ;GET NEW TYPE
|
||
HRR A,(AB) ; FOR DEFERRED GOODIES
|
||
JUMPL B,CHMATC ; CHECK IT
|
||
MOVE B,1(AB) ;AND VALUE
|
||
JRST FINIS
|
||
|
||
CHTMPL: MOVE E,1(AB) ; GET ARG
|
||
HLRZ A,(E)
|
||
ANDI A,SATMSK
|
||
MOVE 0,3(AB) ; SEE IF TO "TEMPLATE"
|
||
CAMN 0,IMQUOTE TEMPLATE
|
||
JRST CHTMP1
|
||
TLNN E,-1 ; SKIP IF RESTED
|
||
CAIE A,(B)
|
||
JRST TYPDIF
|
||
JRST CHTMP1
|
||
|
||
CHMATC: PUSH TP,A
|
||
PUSH TP,1(AB) ; SAVE GOODIE
|
||
MOVSI A,TATOM
|
||
MOVE B,3(AB)
|
||
MOVSI C,TATOM
|
||
MOVE D,IMQUOTE DECL
|
||
PUSHJ P,IGET ; FIND THE DECL
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE C,(AB)
|
||
MOVE D,1(AB) ; NOW GGO TO MATCH
|
||
PUSHJ P,TMATCH
|
||
JRST CHMAT1
|
||
SUB TP,[2,,2]
|
||
CHMAT2: POP TP,B
|
||
POP TP,A
|
||
JRST FINIS
|
||
|
||
CHMAT1: POP TP,B
|
||
POP TP,A
|
||
MOVE C,-1(TP)
|
||
MOVE D,(TP)
|
||
PUSHJ P,TMATCH
|
||
JRST TMPLVI
|
||
JRST CHMAT2
|
||
|
||
TYPLOO: PUSHJ P,TYPFND
|
||
ERRUUO EQUOTE BAD-TYPE-NAME
|
||
POPJ P,
|
||
|
||
TYPFND: HLRE A,B ; FIND DOPE WORDS
|
||
SUBM B,A ; A POINTS TO IT
|
||
HRRE D,(A) ; TYPE-CODE TO D
|
||
JUMPE D,CPOPJ
|
||
ANDI D,TYPMSK ; FLUSH FUNNY BITS
|
||
MOVEI A,(D)
|
||
ASH A,1
|
||
HRLI A,(A)
|
||
ADD A,TYPVEC+1
|
||
CPOPJ1: AOS (P)
|
||
POPJ P,
|
||
|
||
|
||
REPEAT 0,[
|
||
MOVE A,TYPVEC+1 ;GOBBLE DOWN TYPE VECTOR
|
||
MOVEI D,0 ;INITIALIZE TYPE COUNTER
|
||
TLOOK: CAMN B,1(A) ;CHECK THIS ONE
|
||
JRST CPOPJ1
|
||
ADDI D,1 ;BUMP COUNTER
|
||
AOBJP A,.+2 ;COUTN DOWN ON VECTOR
|
||
AOBJN A,TLOOK
|
||
POPJ P,
|
||
CPOPJ1: AOS (P)
|
||
POPJ P,
|
||
]
|
||
|
||
TYPDIF: ERRUUO EQUOTE STORAGE-TYPES-DIFFER
|
||
|
||
|
||
TMPLVI: ERRUUO EQUOTE DECL-VIOLATION
|
||
|
||
|
||
; FUNCTION TO ADD A NEW TYPE TO THE WORLD WITH GIVEN PRIMITIVE TYPE
|
||
|
||
MFUNCTION NEWTYPE,SUBR
|
||
|
||
ENTRY
|
||
|
||
HLRZ 0,AB ; CHEC # OF ARGS
|
||
CAILE 0,-4 ; AT LEAST 2
|
||
JRST TFA
|
||
CAIGE 0,-6
|
||
JRST TMA ; NOT MORE THAN 3
|
||
GETYP A,(AB) ; GET 1ST ARGS TYPE (SHOULD BE ATOM)
|
||
GETYP C,2(AB) ; SAME WITH SECOND
|
||
CAIN A,TATOM ; CHECK
|
||
CAIE C,TATOM
|
||
JRST NOTATOM
|
||
|
||
MOVE B,3(AB) ; GET PRIM TYPE NAME
|
||
PUSHJ P,TYPLOO ; LOOK IT UP
|
||
HRRZ A,(A) ; GOBBLE SAT
|
||
ANDI A,SATMSK
|
||
HRLI A,TATOM ; MAKE NEW TYPE
|
||
PUSH P,A ; AND SAVE
|
||
MOVE B,1(AB) ; SEE IF PREV EXISTED
|
||
PUSHJ P,TYPFND
|
||
JRST NEWTOK ; DID NOT EXIST BEFORE
|
||
MOVEI B,2(A) ; FOR POSSIBLE TMPLAT BIT
|
||
HRRZ A,(A) ; GET SAT
|
||
HRRZ 0,(P) ; AND PROPOSED
|
||
ANDI A,SATMSK
|
||
ANDI 0,SATMSK
|
||
CAIN 0,(A) ; SKIP IF LOSER
|
||
JRST NEWTFN ; O.K.
|
||
|
||
ERRUUO EQUOTE TYPE-ALREADY-EXISTS
|
||
|
||
NEWTOK: POP P,A
|
||
MOVE B,1(AB) ; NEWTYPE NAME
|
||
PUSHJ P,INSNT ; MUNG IN NEW TYPE
|
||
|
||
NEWTFN: CAML AB,[-5,,] ; SKIP IF TEMPLAT SUPPLIED
|
||
JRST NEWTF1
|
||
MOVEI 0,TMPLBT ; GET THE BIT
|
||
IORM 0,-2(B) ; INTO WORD
|
||
MOVE A,(AB) ; GET TYPE NAME
|
||
MOVE B,1(AB)
|
||
MOVSI C,TATOM
|
||
MOVE D,IMQUOTE DECL
|
||
PUSH TP,4(AB) ; GET TEMLAT
|
||
PUSH TP,5(AB)
|
||
PUSHJ P,IPUT
|
||
NEWTF1: MOVE A,(AB)
|
||
MOVE B,1(AB) ; RETURN NAME
|
||
JRST FINIS
|
||
|
||
; SET UP GROWTH FIELDS
|
||
|
||
IGROWT: SKIPA A,[111100,,(C)]
|
||
IGROWB: MOVE A,[001100,,(C)]
|
||
HLRE B,C
|
||
SUB C,B ; POINT TO DOPE WORD
|
||
MOVE B,TYPIC ; INDICATED GROW BLOCK
|
||
DPB B,A
|
||
POPJ P,
|
||
|
||
INSNT: PUSH TP,A
|
||
PUSH TP,B ; SAVE NAME OF NEWTYPE
|
||
MOVE C,TYPBOT+1 ; CHECK GROWTH NEED
|
||
CAMGE C,TYPVEC+1
|
||
JRST ADDIT ; STILL ROOM
|
||
GAGN: PUSHJ P,IGROWB ; SETUP BOTTOM GROWTH
|
||
SKIPE C,EVATYP+1
|
||
PUSHJ P,IGROWT ; SET UP TOP GROWTH
|
||
SKIPE C,APLTYP+1
|
||
PUSHJ P,IGROWT
|
||
SKIPE C,PRNTYP+1
|
||
PUSHJ P,IGROWT
|
||
MOVE C,[11.,,5] ; SET UP INDICATOR FOR AGC
|
||
PUSHJ P,AGC ; GROW THE WORLD
|
||
AOJL A,GAGN ; BAD AGC LOSSAGE
|
||
MOVE 0,[-101,,-100]
|
||
ADDM 0,TYPBOT+1 ; FIX UP POINTER
|
||
|
||
ADDIT: MOVE C,TYPVEC+1
|
||
SUB C,[2,,2] ; ALLOCATE ROOM
|
||
MOVEM C,TYPVEC+1
|
||
HLRE B,C ; PREPARE TO BLT
|
||
SUBM C,B ; C POINTS DOPE WORD END
|
||
HRLI C,2(C) ; GET BLT AC READY
|
||
BLT C,-3(B)
|
||
POP TP,-1(B) ; CLOBBER IT IN
|
||
POP TP,-2(B)
|
||
HLRE C,TYPVEC+1 ; GET CODE
|
||
MOVNS C
|
||
ASH C,-1
|
||
SUBI C,1
|
||
MOVE D,-1(B) ; B HAS POINTER TO TYPE VECTOR DOPE WORDS
|
||
MOVEI 0,(D)
|
||
CAIG 0,HIBOT ; IS ATOM PURE?
|
||
JRST ADDNOI ; NO, SO NO HACKING REQUIRED
|
||
PUSH P,C
|
||
MOVE B,D
|
||
PUSHJ P,IMPURIF ; DO IMPURE OF ATOM
|
||
MOVE C,TYPVEC+1
|
||
HLRE B,C
|
||
SUBM C,B ; RESTORE B
|
||
POP P,C
|
||
MOVE D,-1(B) ; RESTORE D
|
||
ADDNOI: HLRE A,D
|
||
SUBM D,A
|
||
TLO C,400000
|
||
HRRM C,(A) ; INTO "GROWTH" FIELD
|
||
POPJ P,
|
||
|
||
|
||
; Interface to interpreter for setting up tables associated with
|
||
; template data structures.
|
||
; A/ <-name of type>-
|
||
; B/ <-length ins>-
|
||
; C/ <-uvector of garbage collector code or 0>
|
||
; D/ <-uvector of GETTERs>-
|
||
; E/ <-uvector of PUTTERs>-
|
||
|
||
CTMPLT: SUBM M,(P) ; could possibly gc during this stuff
|
||
PUSH TP,$TATOM ; save name of type
|
||
PUSH TP,A
|
||
PUSH P,B ; save length instr
|
||
HLRE A,TD.LNT+1 ; check for template slots left?
|
||
HRRZ B,TD.LNT+1
|
||
SUB B,A ; point to dope words
|
||
HLRZ B,1(B) ; get real length
|
||
ADDI A,-2(B)
|
||
JUMPG A,GOODRM ; jump if ok
|
||
|
||
PUSH TP,$TUVEC ; save getters and putters
|
||
PUSH TP,C
|
||
PUSH TP,$TUVEC ; save getters and putters
|
||
PUSH TP,D
|
||
PUSH TP,$TUVEC
|
||
PUSH TP,E
|
||
MOVEI A,10-2(B) ; grow it 10 by copying remember d.w. length
|
||
PUSH P,A ; save new length
|
||
PUSHJ P,CAFRE1 ; get frozen uvector
|
||
ADD B,[10,,10] ; rest it down some
|
||
HRL C,TD.LNT+1 ; prepare to BLT in
|
||
MOVEM B,TD.LNT+1 ; and save as new length vector
|
||
HRRI C,(B) ; destination
|
||
ADD B,(P) ; final destination address
|
||
BLT C,-12(B)
|
||
MOVE A,(P) ; length for new getters
|
||
PUSHJ P,CAFRE1
|
||
HRL C,TD.GET+1 ; get old for copy
|
||
MOVEM B,TD.GET+1
|
||
PUSHJ P,DOBLTS ; go fixup new uvector
|
||
MOVE A,(P) ; finally putters
|
||
PUSHJ P,CAFRE1
|
||
HRL C,TD.PUT+1
|
||
MOVEM B,TD.PUT+1
|
||
PUSHJ P,DOBLTS ; go fixup new uvector
|
||
MOVE A,(P) ; finally putters
|
||
PUSHJ P,CAFRE1
|
||
HRL C,TD.AGC+1
|
||
MOVEM B,TD.AGC+1
|
||
PUSHJ P,DOBLTS ; go fixup new uvector
|
||
SUB P,[1,,1] ; flush stack craft
|
||
MOVE E,(TP)
|
||
MOVE D,-2(TP)
|
||
MOVE C,-4(TP) ;GET TD.AGC
|
||
SUB TP,[6,,6]
|
||
|
||
GOODRM: MOVE B,TD.LNT+1 ; move down to fit new guy
|
||
SUB B,[1,,1] ; will always win due to prev checks
|
||
MOVEM B,TD.LNT+1
|
||
HRLI B,1(B)
|
||
HLRE A,TD.LNT+1
|
||
MOVNS A
|
||
ADDI A,-1(B) ; A/ final destination
|
||
BLT B,-1(A)
|
||
POP P,(A) ; new length ins munged in
|
||
HLRE A,TD.LNT+1
|
||
MOVNS A ; A/ offset for other guys
|
||
PUSH P,A ; save it
|
||
ADD A,TD.GET+1 ; point for storing uvs of ins
|
||
MOVEM D,-1(A)
|
||
MOVE A,(P)
|
||
ADD A,TD.PUT+1
|
||
MOVEM E,-1(A) ; store putter also
|
||
MOVE A,(P)
|
||
ADD A,TD.AGC+1
|
||
MOVEM C,-1(A) ; store putter also
|
||
POP P,A ; compute primtype
|
||
ADDI A,NUMSAT
|
||
PUSH P,A
|
||
MOVE B,(TP) ; ready to mung type vector
|
||
SUB TP,[2,,2]
|
||
PUSHJ P,TYPFND ; CHECK TO SEE WHETHER TEMPLATE EXISTS
|
||
JRST NOTEM
|
||
POP P,C ; GET SAT
|
||
HRRM C,(A)
|
||
JRST MPOPJ
|
||
NOTEM: POP P,A ; RESTORE SAT
|
||
HRLI A,TATOM ; GET TYPE
|
||
PUSHJ P,INSNT ; INSERT INTO VECTOR
|
||
JRST MPOPJ
|
||
|
||
; this routine copies GET and PUT vectors into new ones
|
||
|
||
DOBLTS: HRRI C,(B)
|
||
ADD B,-1(P)
|
||
BLT C,-11(B) ; zap those guys in
|
||
MOVEI A,TUVEC ; mung in uniform type
|
||
PUTYP A,(B)
|
||
MOVEI C,-7(B) ; zero out remainder of uvector
|
||
HRLI C,-10(B)
|
||
SETZM -1(C)
|
||
BLT C,-1(B)
|
||
POPJ P,
|
||
|
||
|
||
; FUNCTIONS TO SET UP EVALUATION AND APPLICATION RULES FOR DATA TYPES
|
||
|
||
MFUNCTION EVALTYPE,SUBR
|
||
|
||
ENTRY
|
||
|
||
PUSHJ P,CHKARG ; VERIFY WINNAGE IN ARGS
|
||
MOVEI A,EVATYP ; POINT TO TABLE
|
||
MOVEI E,EVTYPE ; POINT TO PURE VERSION
|
||
MOVEI 0,EVAL
|
||
TBLCAL: PUSHJ P,TBLSET ; SETUP TABLE ENTRY
|
||
JRST FINIS
|
||
|
||
MFUNCTION APPLYTYPE,SUBR
|
||
|
||
ENTRY
|
||
|
||
PUSHJ P,CHKARG
|
||
MOVEI A,APLTYP ; POINT TO APPLY TABLE
|
||
MOVEI E,APTYPE ; PURE TABLE
|
||
MOVEI 0,APPLY
|
||
JRST TBLCAL
|
||
|
||
|
||
MFUNCTION PRINTTYPE,SUBR
|
||
|
||
ENTRY
|
||
|
||
PUSHJ P,CHKARG
|
||
MOVEI A,PRNTYP ; POINT TO APPLY TABLE
|
||
MOVEI E,PRTYPE ; PURE TABLE
|
||
MOVEI 0,PRINT
|
||
JRST TBLCAL
|
||
|
||
; CHECK ARGS AND SETUP FOR TABLE HACKER
|
||
|
||
CHKARG: JUMPGE AB,TFA
|
||
CAMGE AB,[-5,,]
|
||
JRST TMA
|
||
GETYP A,(AB) ; 1ST MUST BE TYPE NAME
|
||
CAIE A,TATOM
|
||
JRST WTYP1
|
||
MOVE B,1(AB) ; GET ATOM
|
||
PUSHJ P,TYPLOO ; VERIFY THAT IT IS A TYPE
|
||
PUSH P,D ; SAVE TYPE NO.
|
||
MOVEI D,-1 ; INDICATE FUNNYNESS
|
||
CAML AB,[-3,,] ; SKIP IF 2 OR MORE
|
||
JRST TY1AR
|
||
HRRZ A,(A) ; GET SAT
|
||
ANDI A,SATMSK
|
||
PUSH P,A
|
||
GETYP A,2(AB) ; GET 2D TYPE
|
||
CAIE A,TATOM ; EITHER TYPE OR APPLICABLE
|
||
JRST TRYAPL ; TRY APPLICABLE
|
||
MOVE B,3(AB) ; VERIFY IT IS A TYPE
|
||
PUSHJ P,TYPLOO
|
||
HRRZ A,(A) ; GET SAT
|
||
ANDI A,SATMSK
|
||
POP P,C ; RESTORE SAVED SAT
|
||
CAIE A,(C) ; SKIP IF A WINNER
|
||
JRST TYPDIF ; REPORT ERROR
|
||
TY1AR: POP P,C ; GET SAVED TYPE
|
||
MOVEI B,0 ; TELL THAT WE ARE A TYPE
|
||
POPJ P,
|
||
|
||
TRYAPL: PUSHJ P,APLQ ; IS THIS APPLICABLE
|
||
JRST NAPT
|
||
SUB P,[1,,1]
|
||
MOVE B,2(AB) ; RETURN SAME
|
||
MOVE D,3(AB)
|
||
POP P,C
|
||
POPJ P,
|
||
|
||
|
||
; HERE TO PUT ENTRY IN APPROPRIATE TABLE
|
||
|
||
TBLSET: PUSH TP,B
|
||
PUSH TP,D ; SAVE VALUE
|
||
PUSH TP,$TFIX
|
||
PUSH TP,A
|
||
PUSH P,C ; SAVE TYPE BEING HACKED
|
||
PUSH P,E
|
||
SKIPE B,1(A) ; SKIP IF VECTOR DOESN'T EXIST YET
|
||
JRST TBL.OK
|
||
MOVE B,-2(TP) ; CHECK FOR RETURN IT HACK
|
||
SKIPN -3(TP)
|
||
CAIE B,-1
|
||
JRST .+2
|
||
JRST RETPM2
|
||
HLRE A,TYPBOT+1 ; GET CURRENT TABLE LNTH
|
||
MOVNS A
|
||
ASH A,-1
|
||
PUSH P,0
|
||
PUSHJ P,IVECT ; GET VECTOR
|
||
POP P,0
|
||
MOVE C,(TP) ; POINT TO RETURN POINT
|
||
MOVEM B,1(C) ; SAVE VECTOR
|
||
|
||
TBL.OK: POP P,E
|
||
POP P,C ; RESTORE TYPE
|
||
SUB TP,[2,,2]
|
||
POP TP,D
|
||
POP TP,A
|
||
JUMPN A,TBLOK1 ; JUMP IF FUNCTION ETC. SUPPLIED
|
||
CAIN D,-1
|
||
JRST TBLOK1
|
||
CAILE D,NUMPRI ; SKIP IF ORIGINAL TYPE
|
||
MOVNI E,(D) ; CAUSE E TO ENDUP 0
|
||
ADDI E,(D) ; POINT TO PURE SLOT
|
||
TBLOK1: ADDI C,(C) ; POINT TO VECTOR SLOT
|
||
ADDI C,(B)
|
||
CAIN D,-1
|
||
JRST RETCUR
|
||
JUMPN A,OK.SET ; OK TO CLOBBER
|
||
ADDI B,(D) ; POINT TO TARGET TYPE'S SLOT
|
||
ADDI B,(D) ; POINT TO TARGET TYPE'S SLOT
|
||
SKIPN A,(B) ; SKIP IF WINNER
|
||
SKIPE 1(B) ; SKIP IF LOSER
|
||
SKIPA D,1(B) ; SETUP D
|
||
JRST CH.PTB ; CHECK PURE TABLE
|
||
|
||
OK.SET: CAIN 0,(D) ; SKIP ON RESET
|
||
SETZB A,D
|
||
MOVEM A,(C) ; STORE
|
||
MOVEM D,1(C)
|
||
RETAR1: MOVE A,(AB) ; RET TYPE
|
||
MOVE B,1(AB)
|
||
JRST FINIS
|
||
|
||
CH.PTB: MOVEI A,0
|
||
MOVE D,[SETZ NAPT]
|
||
JUMPE E,OK.SET
|
||
MOVE D,(E)
|
||
JRST OK.SET
|
||
|
||
RETPM2: SUB TP,[4,,4]
|
||
SUB P,[2,,2]
|
||
ASH C,1
|
||
SOJA E,RETPM4
|
||
|
||
RETCUR: SKIPN A,(C)
|
||
SKIPE 1(C)
|
||
SKIPA B,1(C)
|
||
JRST RETPRM
|
||
|
||
JUMPN A,CPOPJ
|
||
RETPM1: MOVEI A,0
|
||
JUMPL B,RTFALS
|
||
CAMN B,1(E)
|
||
JRST .+3
|
||
ADDI A,2
|
||
AOJA E,.-3
|
||
|
||
RETPM3: ADD A,TYPVEC+1
|
||
MOVE B,3(A)
|
||
MOVE A,2(A)
|
||
POPJ P,
|
||
|
||
RETPRM: SUBI C,(B) ; UNDO BADNESS
|
||
RETPM4: CAIG C,NUMPRI*2
|
||
SKIPG 1(E)
|
||
JRST RTFALS
|
||
|
||
MOVEI A,-2(C)
|
||
JRST RETPM3
|
||
|
||
CALLTY: MOVE A,TYPVEC
|
||
MOVE B,TYPVEC+1
|
||
POPJ P,
|
||
|
||
MFUNCTION ALLTYPES,SUBR
|
||
|
||
ENTRY 0
|
||
|
||
MOVE A,TYPVEC
|
||
MOVE B,TYPVEC+1
|
||
JRST FINIS
|
||
|
||
;
|
||
|
||
;FUNCTION TO RETURN TYPE OF ELEMENTS IN A UVECTOR
|
||
|
||
MFUNCTION UTYPE,SUBR
|
||
|
||
ENTRY 1
|
||
|
||
GETYP A,(AB) ;GET U VECTOR
|
||
PUSHJ P,SAT
|
||
CAIE A,SNWORD
|
||
JRST WTYP1
|
||
MOVE B,1(AB) ; GET UVECTOR
|
||
PUSHJ P,CUTYPE
|
||
JRST FINIS
|
||
|
||
CUTYPE: HLRE A,B ;GET -LENGTH
|
||
HRRZS B
|
||
SUB B,A ;POINT TO TYPE WORD
|
||
GETYP A,(B)
|
||
JRST ITYPE ; GET NAME OF TYPE
|
||
|
||
; FUNCTION TO CHANGE UNIFORM TYPE OF A VECTOR
|
||
|
||
MFUNCTION CHUTYPE,SUBR
|
||
|
||
ENTRY 2
|
||
|
||
GETYP A,2(AB) ;GET 2D TYPE
|
||
CAIE A,TATOM
|
||
JRST NOTATO
|
||
GETYP A,(AB) ; CALL WITH UVECTOR?
|
||
PUSHJ P,SAT
|
||
CAIE A,SNWORD
|
||
JRST WTYP1
|
||
MOVE A,1(AB) ; GET UV POINTER
|
||
MOVE B,3(AB) ;GET ATOM
|
||
PUSHJ P,CCHUTY
|
||
MOVE A,(AB) ; RETURN UVECTOR
|
||
MOVE B,1(AB)
|
||
JRST FINIS
|
||
|
||
CCHUTY: PUSH TP,$TUVEC
|
||
PUSH TP,A
|
||
PUSHJ P,TYPLOO ;LOOK IT UP
|
||
HRRZ B,(A) ;GET SAT
|
||
TRNE B,CHBIT
|
||
JRST CANTCH
|
||
ANDI B,SATMSK
|
||
SKIPGE MKTBS(B)
|
||
JRST CANTCH
|
||
HLRE C,(TP) ;-LENGTH
|
||
HRRZ E,(TP)
|
||
SUB E,C ;POINT TO TYPE
|
||
GETYP A,(E) ;GET TYPE
|
||
JUMPE A,WIN0 ;ALLOW TYPE "LOSE" TO CHANGE TO ANYTHING
|
||
PUSHJ P,SAT ;GET SAT
|
||
JUMPE A,TYPERR
|
||
CAIE A,(B) ;COMPARE
|
||
JRST TYPDIF
|
||
WIN0: ADDI D,.VECT.
|
||
HRLM D,(E) ;CLOBBER NEW ONE
|
||
POP TP,B
|
||
POP TP,A
|
||
POPJ P,
|
||
|
||
CANTCH: PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE CANT-CHTYPE-INTO
|
||
PUSH TP,2(AB)
|
||
PUSH TP,3(AB)
|
||
MOVEI A,2
|
||
JRST CALER
|
||
|
||
NOTATOM:
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE NON-ATOMIC-ARGUMENT
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
MOVEI A,2
|
||
JRST CALER
|
||
|
||
|
||
|
||
; SUBROUTINE TO LEAVE MUDDLE CLOSING ALL CHANNELS ON THE WAY
|
||
|
||
MFUNCTION QUIT,SUBR
|
||
|
||
ENTRY 0
|
||
|
||
|
||
PUSHJ P,CLOSAL ; DO THE CLOSES
|
||
PUSHJ P,%KILLM
|
||
JRST IFALSE ; JUST IN CASE
|
||
|
||
CLOSAL: MOVEI B,CHNL0+2 ; POINT TO 1ST (NOT INCLUDING TTY I/O)
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE TVP,REALTV+1(PVP)
|
||
SUBI B,(TVP)
|
||
HRLS B
|
||
ADD B,TVP
|
||
PUSH TP,$TVEC
|
||
PUSH TP,B
|
||
PUSH P,[N.CHNS-1] ; MAX NO. OF CHANS
|
||
|
||
CLOSA1: MOVE B,(TP)
|
||
ADD B,[2,,2]
|
||
MOVEM B,(TP)
|
||
HLLZS -2(B)
|
||
SKIPN C,-1(B) ; THIS ONE OPEN?
|
||
JRST CLOSA4 ; NO
|
||
CAME C,TTICHN+1
|
||
CAMN C,TTOCHN+1
|
||
JRST CLOSA4
|
||
PUSH TP,-2(B) ; PUSH IT
|
||
PUSH TP,-1(B)
|
||
MCALL 1,FCLOSE ; CLOSE IT
|
||
CLOSA4: SOSLE (P) ; COUNT DOWN
|
||
JRST CLOSA1
|
||
|
||
|
||
SUB TP,[2,,2]
|
||
SUB P,[1,,1]
|
||
|
||
CLOSA3: SKIPN B,CHNL0+1
|
||
POPJ P,
|
||
PUSH TP,(B)
|
||
HLLZS (TP)
|
||
PUSH TP,1(B)
|
||
HRRZ B,(B)
|
||
MOVEM B,CHNL0+1
|
||
MCALL 1,FCLOSE
|
||
JRST CLOSA3
|
||
|
||
|
||
IMPURE
|
||
|
||
WHOAMI: 0 ; SYAYS WHETHER I AM REALLY A MUDDLE OR SOME HACK
|
||
|
||
|
||
;GARBAGE COLLECTORS PDLS
|
||
|
||
|
||
GCPDL: -GCPLNT,,GCPDL
|
||
|
||
BLOCK GCPLNT
|
||
|
||
|
||
PURE
|
||
|
||
MUDSTR: ASCII /MUDDLE <20><>
|
||
STRNG: -1
|
||
-1
|
||
-1
|
||
ASCIZ / IN OPERATION./
|
||
|
||
;MARKED PDLS FOR GC PROCESS
|
||
|
||
VECTGO
|
||
; DUMMY FRAME FOR INITIALIZER CALLS
|
||
|
||
TENTRY,,LISTEN
|
||
0
|
||
.-3
|
||
0
|
||
0
|
||
-ITPLNT,,TPBAS-1
|
||
0
|
||
|
||
TPBAS: BLOCK ITPLNT+PDLBUF
|
||
GENERAL
|
||
ITPLNT+2+PDLBUF+7,,0
|
||
|
||
|
||
VECRET
|
||
|
||
|
||
$TMATO: TATOM,,-1
|
||
|
||
END
|
||
|