ITS Muddle.
[pdp10-muddle.git] / MUDDLE / initm.42
diff --git a/MUDDLE/initm.42 b/MUDDLE/initm.42
new file mode 100644 (file)
index 0000000..72cacb1
--- /dev/null
@@ -0,0 +1,423 @@
+
+TITLE INITIALIZATION FOR MUDDLE
+
+RELOCATABLE
+
+LAST==1        ;POSSIBLE CHECKS DONE LATER
+
+.INSRT MUDDLE >
+
+.LIFL <TVLNT-TVLOC>
+.LOP .VALUE
+.ELDC
+
+
+.GLOBAL SETUP,TPBAS,GCPDL,GCPVP,PVBASE,PVLNT,PARNEW,AGC,ICR,SWAP,OBLNT,MSGTYP
+.GLOBAL ICLOS,OCLOS,GLOBASE,GLOBSP,PARBOT,PARTOP,CODTOP,START,VECBOT,VECTOP,TPBASE
+.GLOBAL LISTEN,ROOT,TBINIT,TOPLEV,INTOBL,ERROBL,TTYOPE
+.GLOBAL IOINS,BUFRIN,IOIN2,ECHO,TYI,TYO
+
+SETUP: MOVE    P,GCPDL         ;GET A PUSH DOWN STACK
+       MOVE    TVP,[-TVLNT,,TVBASE]    ;GET INITIAL TRANSFER VECTOR
+       PUSHJ   P,TTYOPE                ;OPEN THE TTY
+       MOVEI   B,[ASCIZ /MUDDLE INITIALIZATION.
+/]
+       PUSHJ   P,MSGTYP        ;PRINT IT
+       MOVE    A,CODTOP        ;CHECK FOR A WINNING LOAD
+       CAML    A,VECBOT        ;IT BETTER BE LESS
+       JRST    DEATH1          ;LOSE COMPLETELY
+       MOVE    B,PARBOT        ;CHECK FOR ANY PAIRS
+       CAME    B,PARTOP        ;ANY LOAD/ASSEMBLE TIME PAIRS?
+       JRST    PAIRCH          ;YES CHECK THEM
+       ADDI    A,1             ;BUMP UP
+       MOVEM   A,PARBOT        ;UPDATE PARBOT AND TOP
+       MOVEM   A,PARTOP
+SETTV: MOVE    PVP,[-PVLNT*2,,GCPVP]   ;AND A PROCESS VECTOR
+       MOVEI   A,(PVP)         ;SET UP A BLT
+       HRLI    A,PVBASE        ;FROM PROTOTYPE
+       BLT     A,PVLNT*2-1(PVP)        ;INITIALIZE
+       MOVE    TP,[-ITPLNT,,TPBAS]     ;GET A STACK FOR THIS PROCCESS
+       MOVEI   TB,(TP)         ;AND A BASE
+       HRLI    TB,1
+       SUB     TP,[1,,1]       ;POP ONCE
+
+; ALLOCATE SOME OBLISTS FOR INITIAL ATOMS
+
+       PUSH    P,[3]           ;COUNT INITIAL OBLISTS
+
+MAKEOB:        MCALL   0,MOBLIST       ;GOBBLE AN OBLIST
+       PUSH    TP,$TOBLS       ;AND SAVE THEM
+       PUSH    TP,B
+       SOS     A,(P)           ;COUNT DOWN
+       MOVEM   B,@OBTBL(A)     ;STORE
+       JUMPN   A,MAKEOB
+
+       MOVE    C,TVP           ;MAKE 2 COPIES OF XFER VECTOR POINTER
+       MOVE    D,TVP
+
+;MAIN INITIALIZE LOOP - SCAN XFER VECTOR FOR ATOMS, UPDATE
+;OFFSETS IN CODE, UNIQUIFY ATOMS AND COMPACT XFER VECTOR
+
+ILOOP: HLRZ    A,(C)           ;FIRST TYPE
+       JUMPE   A,TVEXAU        ;USEFUL STUFF EXHAUSTED
+       CAIN    A,TCHSTR        ;CHARACTER STRING?
+       JRST    CHACK           ;YES, GO HACK IT
+       CAIN    A,TATOM         ;ATOM?
+       JRST    ATOMHK          ;YES, CHECK IT OUT
+       MOVE    A,(C)           ;MOVE TO NEW HOME (MAY BE SAME)
+       MOVEM   A,(D)
+       MOVE    A,1(C)
+       MOVEM   A,1(D)
+SETLP: AOS     (P)             ;COUNT NUMBER OF PAIRS IN XFER VECTOR
+       ADD     D,[2,,2]        ;OUT COUNTER
+SETLP1:        ADD     C,[2,,2]        ;AND IN COUNTER
+       JUMPL   C,ILOOP         ;JUMP IF MORE TO DO
+\f
+;NEW XFER VECTOR FINISHED, NOW GIVE AWAY THE REST
+
+TVEXAU:        HLRE    B,C             ;GET -LENGTH
+       SUBI    C,(B)           ;POIT TO DOPE WORD
+       ANDI    C,-1            ;NO LH
+       HLRZ    A,1(C)          ;INTIAL LENGTH TO A
+       MOVEI   E,(C)           ;COPY OF POINTER TO DOPW WD
+       SUBI    E,(D)           ;AMOUNT LEFT OVER TO E
+       HRLZM   E,1(C)          ;CLOBBER INTO DOPE WORD FOR GARBAGE
+       MOVSI   E,(E)           ;PREPARE TO UPDATE TVP
+       ADD     TVP,E           ;NOW POINTS TO THE RIGHT AMOUNT
+       HLRE    B,D             ;-AMOUNT LEFT TO B
+       ADD     B,A             ;AMOUNT OF GOOD STUFF
+       HRLZM   B,1(D)          ;STORE IT IN GODD DOPE WORD
+       MOVSI   E,400000        ;CLOBBER TO GENERAL IN BOTH CASES
+       MOVEM   E,(C)
+       MOVEM   E,(D)
+
+
+; FIX UP TYPE VECTOR
+
+       MOVE    A,TYPVEC+1(TVP) ;GET POINTER
+       MOVEI   0,0             ;FOR POSSIBLE NULL SLOTS
+       MOVSI   B,TATOM         ;SET TYPE TO ATOM
+
+TYPLP: HLLM    B,(A)           ;CHANGE TYPE TO ATOM
+       MOVE    C,@1(A)         ;GET ATOM
+       MOVEM   C,1(A)
+       ADD     A,[2,,2]                ;BUMP
+       JUMPL   A,TYPLP
+\f
+;GENERAT THE LOGICAL TTY IN AND OUT CHANNELS
+
+;SETUP CALL TO OPEN OUTPUT TTY CHANNNEL
+
+       IRP     A,,[[PRINT,TCHSTR],[OUTPUT,TCHSTR],[MUDDLE,TCHSTR],[TTY,TCHSTR]]
+       IRP     B,C,[A]
+       PUSH    TP,$!C
+       PUSH    TP,CHQUOTE B
+       .ISTOP
+       TERMIN
+       TERMIN
+
+       MCALL   4,FOPEN         ;OPEN THE OUT PUT CHANNEL
+       MOVEM   B,TTOCHN+1(TVP) ;SAVE IT
+
+;ASSIGN AS GLOBAL VALUE
+
+       PUSH    TP,$TATOM
+       PUSH    TP,MQUOTE OUTCHAN
+       PUSH    TP,A
+       PUSH    TP,B
+       MOVE    A,[PUSHJ P,TYO] ;MORE WINNING INS
+       MOVEM   A,IOINS(B)      ;CLOBBER
+       MCALL   2,SETG
+
+;SETUP A CALL TO OPEN THE TTY CHANNEL
+
+       IRP     A,,[[READ,TCHSTR],[INPUT,TCHSTR],[MUDDLE,TCHSTR],[TTY,TCHSTR]]
+       IRP     B,C,[A]
+       PUSH    TP,$!C
+       PUSH    TP,CHQUOTE B
+       .ISTOP
+       TERMIN
+       TERMIN
+
+       MCALL   4,FOPEN         ;OPEN INPUTCHANNEL
+       MOVEM   B,TTICHN+1(TVP) ;SAVE IT
+       PUSH    TP,$TATOM       ;ASSIGN AS A GLOBAL VALUE
+       PUSH    TP,MQUOTE INCHAN
+       PUSH    TP,A
+       PUSH    TP,B
+       MOVE    C,BUFRIN(B)     ;GET AUX BUFFER PTR
+       MOVE    A,[PUSHJ P,TYI]
+       MOVEM   A,IOIN2(C)      ;MORE OF A WINNER
+       MOVE    A,[PUSHJ P,TYO]
+       MOVEM   A,ECHO(C)       ;ECHO INS
+       MCALL   2,SETG
+
+;GENERATE AN INITIAL PROCESS AND SWAP IT IN
+
+       PUSHJ   P,ICR   ;CREATE IT
+       MOVE    D,B     ;SET UP TO CALL SWAP
+       JSP     C,SWAP  ;AND SWAP IN
+       MOVEM   PVP,MAINPR"     ;SAVE AS THE MAIN PROCESS
+       PUSH    TP,[TENTRY,,TOPLEV]     ;BUILD DUMMY FRAME
+       PUSH    TP,[1,,0]
+       PUSH    TP,[0]
+       PUSH    TP,SP
+       PUSH    TP,P
+       MOVE    C,TP    ;COPY TP
+       ADD     C,[3,,3]        ;FUDGE
+       PUSH    TP,C    ;TPSAV PUSHED
+       PUSH    TP,PP
+       PUSH    TP,[TOPLEV]
+       HRRI    TB,(TP) ;SETUP TB
+       HRLI    TB,2
+       ADD     TB,[1,,1]
+       MOVEM   TB,TBINIT+1(PVP)
+
+; CREATE LIST OF ROOT AND NEW OBLIST
+
+       MCALL   0,MOBLIST       ;MAKE OBLIST
+       PUSH    TP,A    ;SAVE RESULTS
+       PUSH    TP,B
+       PUSH    TP,ROOT(TVP)
+       PUSH    TP,ROOT+1(TVP)
+       MCALL   2,LIST  ;MAKE LIST
+       MOVEM   A,ROOT(TVP)
+       MOVEM   B,ROOT+1(TVP)
+       PUSH    TP,$TATOM       ;ASSIGN TO GLOBAL VALUE
+       PUSH    TP,MQUOTE OBLIST
+       PUSH    TP,A
+       PUSH    TP,B
+       MCALL   2,SETG
+
+
+       PUSH    TP,$TATOM
+       PUSH    TP,MQUOTE QUITTER
+       MCALL   1,LIST
+       PUSH    TP,$TCHAN               ;SET UP CNTL-G INT
+       PUSH    TP,TTICHN+1(TVP)
+       PUSH    TP,$TFORM
+       PUSH    TP,B
+       MCALL   2,ONCHAR                ;TURN ON INTERRUPT
+       MOVEI   A,SETUP         ;POINT TO START
+       MOVEM   A,CODTOP
+       ADDI    A,1
+       SUB     A,PARBOT        ;FIND WHERE PAIRS SHOULD GO
+       MOVEM   A,PARNEW
+       PUSH    P,[14.,,14.]    ;PUSH A SMALL PRGRM ONTO P
+       MOVEI   A,1(P)  ;POINT TO ITS START
+       PUSH    P,[JRST AGC]    ;GO TO AGC
+       PUSH    P,[MOVE B,PSTO+1(PVP)]  ;GET SAVED P
+       PUSH    P,[SUB B,-13.(P)]       ;FUDGE TO POP OFF PROGRAM
+       PUSH    P,[MOVEM B,PSAV(TB)]    ;INTO FRAME
+       PUSH    P,[MOVE B,TPSTO+1(PVP)] ;GET TP
+       PUSH    P,[MOVEM B,TPSAV(TB)]   ;STORE IT
+       PUSH    P,[MOVE B,SPSTO+1(PVP)] ;SP
+       PUSH    P,[MOVEM B,SPSAV(TB)]
+       PUSH    P,[MOVEI B,TOPLEV]      ;WHERE TO GO
+       PUSH    P,[MOVEM B,PCSAV(TB)]
+       PUSH    P,[MOVSI B,(.VALUE )]
+       PUSH    P,[HRRI B,C]
+       PUSH    P,[JRST B]      ;GO DO VALRET
+       PUSH    P,[A]   ;RETURN ADDRESS FOR AGC
+       PUSH    P,A     ;SAVE A
+       MOVE    A,[JRST -11.(P)]        ;WHEER TO START
+       SUB     P,[1,,1]        ;REMOVE LOSSAGE
+       MOVE    0,[JUMPA START]
+       MOVE    B,[.VALUE C]    ;SETUP VALRET
+       MOVE    C,[ASCII \\170/\e9\]
+       MOVE    D,[ASCII \B!\eQî\]
+       MOVE    E,[ASCIZ \\16*\]          ;TERMINATE
+       JRST    @1(P)           ;GO DO IT
+\f
+; CHECK PAIR SPACE
+
+PAIRCH:        CAMG    A,B
+       JRST    SETTV           ;O.K.
+
+DEATH1:        MOVEI   B,[ASCIZ /LOSSAGE--CODE AND DATA OVERLAP
+/]
+       PUSHJ   P,MSGTYP
+       .VALUE
+
+;CHARACTER STRING HACKER
+
+CHACK: MOVE    A,(C)           ;GET TYPE
+       HLLZM   A,(D)           ;STORE IN NEW HOME
+       MOVE    B,1(C)          ;GET POINTER
+       HLRE    E,B             ;-LENGHT
+       SUBM    B,E             ;E POINTS TO DOPE WORDS
+       ADDI    E,1             ;POINT TO 2ND
+       HRRM    E,(D)           ;INTO PE CELL
+       HRLI    B,350700        ;MAKE POINT BYTER
+       MOVEM   B,1(D)          ;AND STORE IT
+       ANDI    A,-1    ;CLEAR LH OF A
+       JUMPE   A,SETLP ;JUMP IF NO REF
+       MOVE    E,(P)           ;GET OFFSET
+       LSH     E,1
+       HRRZ    B,-1(A) ;SEE IF PREVIOUS INSTRUCTION REFERS TO $TCHSTR
+       CAIE    B,$TCHSTR       ;SKIP IF IT DOES
+       JRST    CHACK1  ;NO, JUST DO CHQUOTE PART
+       HRRM    E,-1(A) ;CLOBBER
+       MOVEI   B,TVP
+       DPB     B,[220400,,-1(A)]       ;CLOBBER INDEX FIELD
+CHACK1:        ADDI    E,1
+       HRRM    E,(A)           ;STORE INTO REFERENCE
+       JRST    SETLP
+\f
+; PROCESS AN ATOM AND ADD IT TO AN APPROPRIATE OBLIST IF IT ISN'T
+; ALREADY THERE
+
+ATOMHK:        PUSH    TP,$TVEC        ;SAVE TV POINTERS
+       PUSH    TP,C
+       PUSH    TP,$TVEC
+       PUSH    TP,D
+       MOVE    B,1(C)          ;GET THE ATOM
+       PUSH    TP,$TATOM       ;AND SAVE
+       PUSH    TP,B
+       HRRZ    A,(B)           ;GET OBLIST SPEC FROM ATOM
+       LSH     A,1
+       ADDI    A,1(TB)         ;POINT TO ITS HOME
+       PUSH    TP,$TOBLS
+       PUSH    TP,(A)          ;AND SAV IT
+
+       ADD     B,[2,,2]        ;POINT TO ATOM'S PNAME
+       MOVEI   A,0             ;FOR HASHING
+       XOR     A,(B)
+       AOBJN   B,.-1
+       MOVMS   A               ;FORCE POSITIVE RESULT
+       IDIV    A,OBLNT
+       HRLS    B               ;REMAINDER IN B IS BUCKET
+       ADDB    B,(TP)          ;UPDATE POINTER
+
+       SKIPN   C,(B)           ;GOBBLE BUCKET CONTENTS
+       JRST    USEATM          ;NONE, LEAVE AND USE THIS ATOM
+OBLOO3:        MOVE    E,-2(TP)        ;RE-GOBBLE ATOM
+       ADD     E,[2,,2]        ;POINT TO PNAME
+       SKIPN   D,1(C)          ;CHECK LIST ELEMNT
+       JRST    NXTBCK          ;0, CHECK NEXT IN THIS BUCKET
+       ADD     D,[2,,2]        ;POINT TO PNAME
+OBLOO2:        MOVE    A,(D)           ;GET A WORD
+       CAME    A,(E)           ;COMPARE
+       JRST    NXTBCK          ;THEY DIFFER, TRY NEX
+OBLOOP:        AOBJP   E,CHCKD         ;COULD BE A MATCH, GO CHECK
+       AOBJN   D,OBLOO2        ;HAVEN'T LOST YET
+
+NXTBCK:        HRRZ    C,(C)           ;CDR THE LIST
+       JUMPN   C,OBLOO3        ;IF NOT NIL, KEEP TRYING
+
+;HERE IF THIS ATOM MUST BE PUT ON OBLIST
+
+USEATM:        MOVE    B,(TP)          ;POINTER TO BUCKET
+       HRRZ    C,(B)           ;POINTER TO LIST IN THIS BUCKET
+       PUSH    TP,$TATOM       ;GENERATE CALL TO CONS
+       PUSH    TP,-3(TP)
+       PUSH    TP,$TLIST
+       PUSH    TP,C
+       MCALL   2,CONS          ;CONS IT UP
+       MOVE    C,(TP)          ;REGOBBLE BUCKET POINTER
+       HRRZM   B,(C)           ;CLOBBER
+       MOVE    B,-2(TP)        ;POINT TO ATOM
+       PUSHJ   P,VALMAK        ;MAKE A GLOBAL VALUE FOR THIS LOSER
+       MOVE    C,-6(TP)        ;RESET POINTERS
+       MOVE    D,-4(TP)
+       SUB     TP,[8,,8]
+       MOVE    B,(C)           ;MOVE THE ENTRY
+       HLLZM   B,(D)           ;DON'T WANT REF POINTER STORED
+       MOVE    A,1(C)          ;AND MOVE ATOM
+       MOVEM   A,1(D)
+       MOVE    A,(P)           ;GET CURRENT OFFSET
+       LSH     A,1
+       ADDI    A,1
+       ANDI    B,-1            ;CHECKFOR REAL REF
+       JUMPE   B,SETLP
+       HRRM    A,(B)           ;CLOBBER CODE
+       JRST    SETLP
+
+\f
+; A POSSIBLE MATCH ARRIVES HERE
+
+CHCKD: AOBJN   D,NXTBCK        ;SIZES DIFFER, JUMP
+       MOVE    D,1(C)          ;THEY MATCH!,  GET EXISTING ATOM
+       HLRZ    A,(D)           ;GET TYPE OF IT
+       CAIE    A,TUNBOU        ;UNBOUND?
+       JRST    A1VAL           ;YES, CONTINUE
+       MOVE    B,-2(TP)        ;GET NEW ATOM
+       MOVE    A,(B)           ;MOVE VALUE
+       MOVEM   A,(D)
+       MOVE    A,1(B)
+       MOVEM   A,1(D)
+       MOVE    B,D             ;EXISTING ATOM TO B
+       PUSHJ   P,VALMAK        ;MAKE A VALUE
+
+;NOW FIND ATOMS OCCURENCE IN XFER VECTOR
+
+OFFIND:        MOVE    D,-4(TP)        ;GET CURRENT POINTER INTO TP
+       MOVE    C,TVP           ;AND A COPY OF TVP
+       MOVEI   A,0             ;INITIALIZE COUNTER
+ALOOP: CAMN    B,1(C)          ;IS THIS IT?
+       JRST    AFOUND
+       ADD     C,[2,,2]        ;BUMP COUNTER
+       CAMGE   C,D             ;HAVE WE HIT END
+       AOJA    A,ALOOP         ;NO, KEEP LOOKING
+
+       MOVEI   B,[ASCIZ /LOSSAGE--ATOM DISAPPEARED
+/]
+TYPIT: PUSHJ   P,MSGTYP
+       .VALUE
+
+AFOUND:        LSH     A,1             ;FOUND ATOM, GET REAL OFFSET
+       ADDI    A,1
+       MOVE    C,-6(TP)        ;GET TV POINTER TO NEW ATOM
+       HRRZ    B,(C)           ;POINT TO REFERENCE
+       SKIPE   B               ;ANY THERE?
+       HRRM    A,(B)           ;YES, CLOBBER AWAY
+       SUB     TP,[8,,8]
+       JRST    SETLP1          ;AND GO ON
+
+A1VAL: MOVE    B,-2(TP)        ;GET NEW ATOM POINTER
+       HLRZ    C,(B)           ;GET VALUE'S TYPE
+       MOVE    B,D             ;NOW PUT EXISTING ATOM IN B
+       CAIN    C,TUNBOU        ;UNBOUND?
+       JRST    OFFIND          ;YES, WINNER
+
+       MOVEI   B,[ASCIZ /LOSSAGE--ATOM TRIES TO HAVE 2 VALUES
+/]
+       JRST    TYPIT
+
+\f
+;MAKE A VALUE IN SLOT ON GLOBAL SP
+
+VALMAK:        HLRZ    A,(B)           ;TYPE OF VALUE
+       CAIN    A,TUNBOU        ;VALUE?
+       POPJ    P,              ;NO, ALL DONE
+       MOVE    A,GLOBSP+1(TVP) ;GET POINTER TO GLOBAL SP
+       SUB     A,[4,,4]        ;ALLOCATE SPACE
+       CAMG    A,GLOBAS+1(TVP) ;CHECK FOR OVERFLOW
+       JRST    SPOVFL
+       MOVEM   A,GLOBSP+1(TVP) ;STORE IT BACK
+       MOVE    C,(B)           ;GET TYPE CELL
+       HLLZM   C,2(A)          ;INTO TYPE CELL
+       MOVE    C,1(B)          ;GET VALUE
+       MOVEM   C,3(A)          ;INTO VALUE SLOT
+       MOVSI   C,TATOM         ;GET TATOM,,0
+       MOVEM   C,(A)
+       MOVEM   B,1(A)          ;AND POINTER TO ATOM
+       MOVSI   C,TLOCI         ;NOW CLOBBER THE ATOM
+       MOVEM   C,(B)           ;INTO TYPE CELL
+       ADD     A,[2,,2]        ;POINT TO VALUE
+       MOVEM   A,1(B)
+       POPJ    P,
+
+SPOVFL:        MOVEI   B,[ASCIZ /LOSSAGE--GLOBAL SP OVERFLOW
+/]
+       JRST    TYPIT
+
+
+OBTBL: INTOBL+1(TVP)
+       ERROBL+1(TVP)
+       ROOT+1(TVP)
+
+END SETUP
+
+
+\f\f\ 3\f
\ No newline at end of file