1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-31 14:02:09 +00:00

Twenex MDL 106 files.

This commit is contained in:
Lars Brinkhoff
2018-04-23 15:38:11 +02:00
committed by Adam Sampson
parent 54ac385cb8
commit 30ab750df7
196 changed files with 185798 additions and 0 deletions

BIN
src/mudsys/_chkdcl.temp.1 Normal file

Binary file not shown.

BIN
src/mudsys/_clr.ev.1 Normal file

Binary file not shown.

BIN
src/mudsys/_clr.opcodes.1 Normal file

Binary file not shown.

BIN
src/mudsys/_clr.opcodes.2 Normal file

Binary file not shown.

BIN
src/mudsys/_clr.rmode.1 Normal file

Binary file not shown.

BIN
src/mudsys/agc.bin.16 Normal file

Binary file not shown.

BIN
src/mudsys/agc.bin.21 Normal file

Binary file not shown.

3601
src/mudsys/agc.mid.131 Normal file

File diff suppressed because it is too large Load Diff

3632
src/mudsys/agc.mid.139 Normal file

File diff suppressed because it is too large Load Diff

3632
src/mudsys/agc.mid.140 Normal file

File diff suppressed because it is too large Load Diff

3634
src/mudsys/agc.mid.141 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/agcmrk.bin.3 Normal file

Binary file not shown.

14
src/mudsys/agcmrk.mid.1 Normal file
View File

@@ -0,0 +1,14 @@
TITLE AGCMRK ESTABLISH AGC LOADING POINT
RELOCA
.GLOBAL AGCLD
XX==$.+1777
.LOP ANDCM XX,1777
AGCLD=.LVAL1
END

BIN
src/mudsys/amsgc.bin.12 Normal file

Binary file not shown.

865
src/mudsys/amsgc.mid.107 Normal file
View File

@@ -0,0 +1,865 @@
TITLE AMSGC MUDDLE MARK SWEEP GARBAGE COLLECTOR
RELOCATABLE
.GLOBAL RCL,RCLV,IAMSGC,MAXLEN,REALGC,RGCLEN,GCFLG,SQUPNT,GCMONF,MSGTYP,GCCAUS
.GLOBAL GCCALL,PVSTOR,DSTORE,TYPVEC,N.CHNS,CHNL1,MAINPR,STOGC,CTIME,GCTIM,IMTYO
.GLOBAL FNMSGC,SATMSK,NUMSAT,NUMPRI,PURBOT,GCSTOP,GCSBOT,STOSTR,TYPMSK,PDLBUF,ITEM,INDIC
.GLOBAL VAL,NODPNT,UBIT,ASOLNT,GCHAPN,RBLDM,TOTCNT,MARK2S,MKTBS
.GLOBAL FRMUNG,BYTDOP,TD.GET,TD.LNT,TD.AGC,ABOTN,SLENGC,LENGC,REALGC,AGCLD,RLENGC
.GLOBAL RSLENG
GCST=$.
LOC REALGC+RLENGC
OFFS=AGCLD-$.
OFFSET OFFS
.INSRT MUDDLE >
TYPNT==AB
F==PVP
; THIS IS THE MUDDLE MARK SWEEP GARBAGE COLLECTOR. IT IS MUCH FASTER THAN THE COPYING
; GARBAGE COLLECTOR BUT DOESN'T COMPACT. IT CONSES FREE THINGS ONTO RCL AND RCLV.
; THIS GARBAGE COLLECTOR CAN ONLY BE USED IF THE GARBAGE COLLECT IS A FREE STORAGE
; GARBAGE COLLECT
; FIRST INITIALIZE VARIABLES
IAMSGC: SETZB M,RCL ; CLEAR OUT LIST RECYCLE AND RSUBR BASE
SETZM RCLV ; CLEAR VECTOR RECYCLE
SETZM MAXLEN ; CLEAR MAXIMUM LENGTH FOUND TO RECYCLE
SETOM GCFLG ; A GC HAS HAPPENED
SETZM TOTCNT
HLLZS SQUPNT ; CLEAR OUT SQUOZE TABLE
; SET UP MESSAGE PRINTING AND SAVE CAUSE AND CAUSER
PUSH P,A
PUSH P,B
PUSH P,C ; SAVE ACS
MOVEI B,[ASCIZ /MSGIN / ] ; PRINT GIN IF WINNING
SKIPE GCMONF
PUSHJ P,MSGTYP
HRRZ C,(P) ; GET CAUSE INDICATOR
ADDI B,1 ; AOS TO GET REAL CAUS
MOVEM B,GCCAUS
SKIPN GCMONF
JRST NOMON2
MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
PUSHJ P,MSGTYP
NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
MOVEM C,GCCALL
SKIPN GCMONF ; PRINT IF GCMON IS ON
JRST NOMON3
MOVE B,MSGGFT(C) ; GET POINTER TO MESSAGE
PUSHJ P,MSGTYP
NOMON3: SUB P,[1,,1]
POP P,B ; RESTORE ACS
POP P,A
; MOVE ACS INTO THE PVP
EXCH PVP,PVSTOR+1 ; GET REAL PROCESS VECTOR
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVEM AC,AC!STO+1(PVP)
TERMIN
MOVE 0,PVSTOR+1 ; GET OLD VALUE OF PVP
MOVEM 0,PVPSTO+1(PVP) ; SAVE PVP
MOVE 0,DSTORE ; SAVE D'S TYPE
MOVEM 0,DSTO(PVP)
MOVEM PVP,PVSTOR+1
; SET UP TYPNT TO POINT TO TYPE VECTOR
GETYP E,TYPVEC ; FIRST SEE IF TYPVEC IS A VECTOR
CAIE E,TVEC
FATAL TYPE VECTOR NOT OF TYPE VECTOR
HRRZ TYPNT,TYPVEC+1
HRLI TYPNT,B ; TYPNT IS NOW TYPEVECTOR(B)
; NOW SET UP GCPDL AND FENCE POST PDL'S
MOVEI A,(TB)
MOVE D,P ; SAVE P POINTER
PUSHJ P,FRMUNG
MOVE P,[-2000,,MRKPDL] ; SET UP MARK PDL
MOVEI A,(TB) ; FIXUP TOP FRAME
SETOM 1(TP) ; FENCEPOST TP
SETOM 1(D) ; FENCEPOST P
; NOW SETUP AUTO CHANNEL CLOSE
MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
MOVEI A,CHNL1 ; FIRST CHANNEL SLOT
CHNCLR: SKIPE 1(A) ; IS IT A CHANNEL
SETZM (A) ; CLEAR UP TYPE SLOT
ADDI A,2
SOJG 0,CHNCLR
; NOW DO MARK AND SWEEP PHASES
MOVSI D,400000 ; MARK BIT
MOVEI B,TPVP ; GET TYPE
MOVE A,PVSTOR+1 ; GET VALUE OF CURRENT PROCESS VECTOR
PUSHJ P,MARK
MOVEI B,TPVP ; GET TYPE OF MAIN PROCESS VECTOR
MOVE A,MAINPR
PUSHJ P,MARK ; MARK
PUSHJ P,CHNFLS ; DO CHANNEL FLUSHING
PUSHJ P,STOGC ; FIX UP FROZEN WORLD
PUSHJ P,SWEEP ; SWEEP WORLD
; PRINT GOUT
MOVEI B,[ASCIZ /MSGOUT /] ; PRINT OUT ENDING MESSAGE IF GCMONING
SKIPE GCMONF
PUSHJ P,MSGTYP
; RESTORE ACS
MOVE PVP,PVSTOR+1 ; GET PVP
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVE AC,AC!STO+1(PVP)
TERMIN
SKIPN DSTORE ; CLEAR OUT TYPE IF NO TYPE THERE
SETZM DSTO(PVP)
MOVE PVP,PVPSTO+1(PVP)
; PRINT TIME
PUSH P,A ; SAVE ACS
PUSH P,B
PUSH P,C
PUSH P,D
PUSHJ P,CTIME ; GET CURRENT CPU TIME
FSBR B,GCTIM ; COMPUTE TIME ELAPSED
MOVEM B,GCTIM ; SAVE TIME AWAY
SKIPN GCMONF ; PRINT IT OUT?
JRST GCCONT
PUSHJ P,FIXSEN
MOVEI A,15 ; OUTPUT CR/LF
PUSHJ P,IMTYO
MOVEI A,12
PUSHJ P,IMTYO
GCCONT: POP P,D ; RESTORE ACS
POP P,C
POP P,B
POP P,A
SETZM GCFLG
SETOM GCHAPN
SETOM INTFLG
PUSHJ P,RBLDM
JRST FNMSGC ; DONE
; THIS IS THE MARK PHASE
; GENERAL MARK ROUTINE, CALLED TO MARK ALL THINGS
; /A POINTER TO GOODIE
; /B TYPE OF GOODIE
; FOR MARK2, MARK1 /C POINTER TO PAIR NOT NEEDED FOR CALLS DIRECTLY TO MARK
MARK2S:
MARK2: HLRZ B,(C) ; TYPE
MARK1: MOVE A,1(C) ; VALUE
MARK: JUMPE A,CPOPJ ; DONE IF ZERO
MOVEI 0,1(A) ; SEE IF PURE
CAML 0,PURBOT
JRST CPOPJ
ANDI B,TYPMSK ; FLUSH MONITORS
HRLM C,(P)
CAIG B,NUMPRI ; IS A BASIC TYPE
JRST @MTYTBS(B) ; TYPE DISPATCH
LSH B,1 ; NOW GET PRIMTYPE
HRRZ B,@TYPNT ; GET PRIMTYPE
ANDI B,SATMSK ; FLUSH DOWN TO SAT
CAIG B,NUMSAT ; SKIP IF TEMPLATE DATA
JRST @MSATBS(B) ; JUMP OFF SAT TABLE
JRST TD.MK
GCRET: HLRZ C,(P) ; GET SAVED C
CPOPJ: POPJ P,
; TYPE DISPATCH TABLE
MTYTBS:
OFFSET 0
DUM1:
IRP XX,,[[TLOSE,GCRET],[TFIX,GCRET],[TFLOAT,GCRET],[TCHRS,GCRET]
[TENTRY,GCRET],[TSUBR,GCRET],[TFSUBR,GCRET],[TILLEG,GCRET],[TUNBOU,GCRET]
[TBIND,GCRET],[TTIME,GCRET],[TLIST,PAIRMK],[TFORM,PAIRMK],[TSEG,PAIRMK]
[TEXPR,PAIRMK],[TFUNAR,PAIRMK],[TLOCL,PAIRMK],[TFALSE,PAIRMK],[TDEFER,DEFQMK]
[TUVEC,UVMK],[TOBLS,UVMK],[TVEC,VECMK],[TCHAN,VECMK] ,[TLOCV,VECMK]
[TTVP,VECMK],[TBVL,VECMK],[TTAG,VECMK],[TPVP,VECMK],[TLOCI,TPMK],[TTP,TPMK]
[TSP,TPMK],[TMACRO,PAIRMK],[TPDL,PMK],[TARGS,ARGMK],[TAB,ABMK]
[TTB,TBMK],[TFRAME,FRMK],[TCHSTR,BYTMK],[TATOM,ATOMK],[TLOCD,LOCMK],[TBYTE,BYTMK]
[TENV,FRMK],[TACT,FRMK],[TASOC,ASMK],[TLOCU,UVMK],[TLOCS,BYTMK],[TLOCA,ASMK]
[TCBLK,GCRET],[TTMPLT,TD.MK],[TLOCT,TD.MK],[TLOCR,GCRET],[TINFO,GCRET]
[TRDTB,GCRDMK],[TWORD,GCRET],[TRSUBR,VECMK],[TCODE,UVMK],[TSATC,GCRET]
[TBITS,GCRET],[TSTORA,UVMK],[TPICTU,UVMK],[TSKIP,TPMK],[TLINK,ATOMK]
[TDECL,PAIRMK],[TENTER,VECMK],[THAND,VECMK],[TINTH,VECMK],[TDISMI,ATOMK]
[TDCLI,PAIRMK],[TPCODE,GCRET],[TTYPEW,GCRET],[TTYPEC,GCRET]
[TGATOM,GATOMK],[TREADA,FRMK],[TUBIND,GCRET],[TUNWIN,TBMK],[TLOCB,BYTMK]
[TDEFQ,DEFQMK],[TSPLIC,PAIRMK],[TLOCN,ASMK],[TOFFS,OFFSMK]]
IRP A,B,[XX]
LOC DUM1+A
SETZ B
.ISTOP
TERMIN
TERMIN
LOC DUM1+NUMPRI+1
OFFSET OFFS
; SAT DISPATCH TABLE
MSATBS:
OFFSET 0
DISTB2 DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,UVMK],[STBASE,TBMK]
[STPSTK,TPMK],[SARGS,<SETZ ARGMK>],[S2NWORD,VECMK],[SPSTK,TPMK],[SSTORE,UVMK]
[SFRAME,<SETZ FRMK>],[SBYTE,<SETZ BYTMK>],[SATOM,ATOMK],[SPVP,VECMK],[SGATOM,GATOMK]
[SLOCID,<SETZ LOCMK>],[SCHSTR,<SETZ BYTMK>],[SASOC,ASMK],[SLOCL,PAIRMK],[SABASE,ABMK]
[SLOCA,<SETZ ARGMK>],[SLOCV,VECMK],[SLOCU,UVMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ASMK]
[SRDTB,GCRDMK],[SLOCB,<SETZ BYTMK>],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]
OFFSET OFFS
; ROUTINE TO MARK PAIRS
PAIRMK: MOVEI C,(A)
PAIRM1: CAMG C,GCSTOP ; SEE IF IN RANGE
CAIGE C,STOSTR
JRST BADPTR ; FATAL ERROR
HLRE B,(C) ; SKIP IF NOT MARKED
JUMPL B,GCRET
IORM D,(C) ; MARK IT
PUSHJ P,MARK1 ; MARK THE ITEM
HRRZ C,(C) ; GET NEXT ELEMENT OF LIST
JUMPE C,GCRET
CAML C,PURBOT
JRST GCRET
JRST PAIRM1
; ROUTINE TO MARK DEFERS
DEFMK: HLRE B,(A)
JUMPL B,GCRET
MOVEI C,(A)
IORM D,(C)
PUSHJ P,MARK1
JRST GCRET
; ROUTINE TO MARK POSSIBLE DEFERS DEF?
DEFQMK: GETYP B,(A) ; GET THE TYPE OF THE OBJECT
LSH B,1 ; COMPUTE THE SAT
HRRZ B,@TYPNT
ANDI B,SATMSK
SKIPL MKTBS(B) ; SKIP IF NOT DEFERED
JRST PAIRMK
JRST DEFMK ; GO TO DEFMK
; ROUTINE TO MARK VECTORS
VECMK: HLRE B,A ; GET LENGTH
SUB A,B
MOVEI C,1(A) ; POINT TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE B,(C)
JUMPL B,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(B) ; GET TO BEGINNING
VECMK1: HLRE B,(C) ; GET TYPE AND SKIP IF NOT DOPE WORD
JUMPL B,GCRET ; DONE
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; NEXT ELEMENT
JRST VECMK1
; ROUTINE TO MARK UVECTORS
UVMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE F,(C) ; GET LENGTH
JUMPL F,GCRET
IORM D,(C) ; MARK IT
GETYP B,-1(C) ; GET TYPE
MOVEI E,(B) ; COPY TYPE FOR SAT COMPUTATION
LSH B,1
HRRZ B,@TYPNT ; GET SAT
ANDI B,SATMSK
MOVEI B,@MSATBS(B) ; GET JUMP LOCATION
CAIN B,GCRET
JRST GCRET
SUBI C,(F) ; POINT TO BEGINNING OF UVECTOR
SUBI F,2
JUMPE F,GCRET
PUSH P,F ; SAVE LENGTH
PUSH P,E
UNLOOP: MOVE B,(P)
MOVE A,1(C) ; GET VALUE POINTER
PUSHJ P,MARK
SOSE -1(P) ; SKIP IF NON-ZERO
AOJA C,UNLOOP ; GO BACK AGAIN
SUB P,[2,,2] ; CLEAN OFF STACK
JRST GCRET
; ROUTINE TO INDICATE A BAD POINTER
BADPTR: FATAL POINTER POINTS OUT OF GARBAGE COLLECTED SPACE
JRST GCRET
; ROUTINE TO MARK A TPSTACK
TPMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE A,(C)
JUMPL A,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(A) ; GO TO BEGINNING
TPLP: HLRE B,(C) ; GET TYPE AND MARKING
JUMPL B,GCRET ; EXIT ON FENCE-POST
ANDI B,TYPMSK ; FLUSH MONITORS
CAIE B,TCBLK ; CHECK FOR FRAME
CAIN B,TENTRY
JRST MFRAME ; MARK THE FRAME
CAIE B,TUBIND ; BINDING BLOCK
CAIN B,TBIND
JRST MBIND
PUSHJ P,MARK1 ; NOTHING SPECIAL SO MARK IT
ADDI C,2 ; POINT TO NEXT OBJECT
JRST TPLP ; MARK IT
; MARK A FRAME ON THE STACK, [I.E. ITS FSAV AND PSAV SLOTS]
MFRAME: HRROI C,FRAMLN+FSAV-1(C) ; POINT TO FUNCTION
HRRZ A,1(C) ; GET POINTER
CAIL A,STOSTR ; SEE IF IN GC SPACE
CAMLE A,GCSTOP
JRST MFRAM1 ; SKIP OVER IT, NOT IN GC-SPACE
HRL A,(A) ; GET LENGTH
MOVEI B,TVEC ; TYPE IS VECTOR [RSUBR OR RSUBR-ENTRY]
PUSHJ P,MARK
MFRAM1: MOVE A,PSAV-FSAV+1(C) ; MARK THE PSTACK
MOVEI B,TPDL
PUSHJ P,MARK
HRROI C,-FSAV+1(C) ; POINT PAST FRAME
JRST TPLP ; GO BACK TO START OF LOOP
; MARK A BINDING ON THE STACK [I.E. THE ATOM, VALUE, DECL, AND PREVIOUS BINDING]
MBIND: MOVEI B,TATOM ; START BY MARKING THE ATOM
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; POINT TO VALUE SLOT
PUSHJ P,MARK2 ; MARK THE VALUE
ADDI C,2 ; POINT TO DECL AND PREV BINDING
MOVEI B,TLIST ; MARK DECL
HLRZ A,(C)
PUSHJ P,MARK
SKIPL A,1(C) ; SKIP IF PREVIOUS BINDING
JRST NOTLCI
MOVEI B,TLOCI ; GET TYPE
PUSHJ P,MARK
NOTLCI: ADDI C,2 ; POINT PAST BINDING
JRST TPLP
PMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
IORM D,(C) ; MARK IT
JRST GCRET
; ROUTINE TO MARK TB POINTER
TBMK: HRRZS A ; CHECK FOR NIL POINTER
SKIPN A
JRST GCRET
MOVE A,TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK AB POINTERS
ABMK: HLRE B,A ; GET TO FRAME
SUB A,B
MOVE A,FRAMLN+TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK FRAME POINTERS
FRMK: HRLZ B,A ; GET THE TIME
HLRZ F,OTBSAV(A) ; GET TIME FROM FRAME
CAIE B,(F) ; SKIP IF TIMES AGREE
JRST GCRET ; IGNORE POINTER IF THEY DONT
HRRZ A,(C) ; GET POINTER TO PROCESS
SUBI A,1 ; FUDGE FOR VECTOR MARKING
MOVEI B,TPVP ; TYPE WORD
PUSHJ P,MARK
HRRZ A,1(C) ; GET POINTER TO FRAME
JRST TBMK ; MARK IT
; ROUTINE TO MARK ARGUMENT BLOCKS [TUPLES]
ARGMK: HLRE B,A ; GET LENGTH
SUB A,B ; POINT PAST BLOCK
CAIL A,STOSTR
CAMLE A,GCSTOP ; SEE IF IN GCSPACE
JRST GCRET
HRLZ 0,(A) ; GET TYPE
ANDI 0,TYPMSK ; FLUSH MONITORS
CAIE 0,TENTRY
CAIN 0,TCBLK
JRST ARGMK1 ; AT FRAME
CAIE 0,TINFO ; AT FRAME
JRST GCRET ; NOT A LEGAL TYPE GO AWAY
HRRZ A,1(A) ; POINTING TO FRAME
HRL A,(C) ; GET TIME
JRST TBMK
ARGMK1: HRRI A,FRAMLN(A) ; MAKE POINTER
HRL A,(C) ; GET TIME
JRST TBMK
; ROUTINE TO MARK GLOBAL SLOTS
GATOMK: HRRZ B,(C) ; GET POSSIBLE GDECL
JUMPE B,ATOMK ; NONE GO TO MARK ATOM
CAIN B,-1 ; SKIP IF NOT MANIFEST
JRST ATOMK
PUSH P,A ; I DOUBT THIS IS RIGHT, BUT IT WORKED ONCE--TAA
MOVEI C,(A)
MOVEI A,(B)
MOVEI B,TLIST ; TYPE WORD LIST
PUSHJ P,MARK ; MARK IT
POP P,A
JRST ATOMK5
ATOMK:
ATOMK5: HLRE B,A
SUB A,B ; A POINTS TO DOPE WORD
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET ; EXIT IF MARKED
HLRZ B,1(A)
SUBI B,3
HRLI B,1(B)
MOVEI C,-1(A)
SUB C,B ; IN CASE WAS DW
IORM D,1(A) ; MARK IT
HRRZ A,2(C) ; MARK OBLIST
CAMG A,VECBOT
JRST NOOBL ; NO IMPURE OBLIST
HRLI A,-1
MOVEI B,TOBLS ; MARK THE OBLIST
PUSHJ P,MARK
NOOBL: HLRZ A,2(C) ; GET NEXT ATOM
MOVEI B,TATOM
PUSHJ P,MARK
HLRZ B,(C) ; GET VALUE SLOT
TRZ B,400000 ; TURN OFF MARK BIT
SKIPE B ; SEE IF 0
CAIN B,TUNBOUN ; SEE IF UNBOUND
JRST GCRET
HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
MOVEI B,TVEC ; ASSUME VECTOR
SKIPE 0 ; SKIP IF VECTOR
MOVEI B,TTP ; IT IS A TP POINTER
PUSHJ P,MARK1 ; GO MARK IT
JRST GCRET
; ROUTINE TO MARK BYTE AND STRING POINTERS
BYTMK: PUSHJ P,BYTDOP ; GET TO DOPE WORD INTO A
HRLZ F,-1(A) ; SEE IF SPECIAL ATOM [SPNAME]
ANDI F,SATMSK ; GET SAT
CAIN F,SATOM
JRST ATMSET ; IT IS AN ATOM
IORM D,(A) ; MARK IT
JRST GCRET
ATMSET: HLRZ B,(A) ; GET LENGTH
TRZ B,400000 ; TURN OFF POSSIBLE MARK BIT
MOVNI B,-2(B) ; GENERATE AOBJN POINTER
ADDI A,-1(B) ; GET BACK TO BEGINNING
HRLI A,(B) ; PUT IN LEFT HALF
MOVEI B,TATOM ; MARK AS AN ATOM
PUSHJ P,MARK ; GO MARK
JRST GCRET
; MARK LOCID GOODIES
LOCMK: HRRZ B,(C) ; CHECK FOR TIME
JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
HRRZ 0,2(A) ; GET OTHER TIME
CAIE 0,(B) ; SAME?
JRST GCRET
MOVEI B,TTP
PUSHJ P,MARK1
JRST GCRET
LOCMK1: MOVEI B,TVEC ; GLOBAL
PUSHJ P,MARK1 ; MARK VALUE
JRST GCRET
; MARK ASSOCIATION BLOCK
ASMK: MOVEI C,(A) ; SAVE POINTER TO BEGINNING OF ASSOCATION
ADDI A,ASOLNT ; POINT TO DOPE WORD
HLRE B,1(A) ; GET SECOND D.W.
JUMPL B,GCRET ; MARKED SO LEAVE
IORM D,1(A) ; MARK ASSOCATION
PUSHJ P,MARK2 ; MARK ITEM
MOVEI C,INDIC(C)
PUSHJ P,MARK2
MOVEI C,VAL-INDIC(C)
PUSHJ P,MARK2
HRRZ A,NODPNT-VAL(C) ; GET NEXT IN CHAIN
JUMPN A,ASMK ; GO MARK IT
JRST GCRET
; MARK OFFSETS
OFFSMK: PUSH P,$TLIST
HLRZ 0,1(C) ; PICK UP LIST POINTER
PUSH P,0
MOVEI C,-1(P)
PUSHJ P,MARK2 ; MARK THE LIST
SUB P,[2,,2]
JRST GCRET ; AND RETURN
; HERE TO MARK TEMPLATE DATA STRUCTURES
TD.MK: HLRZ B,(A) ; GET REAL SPEC TYPE
ANDI B,37777 ; KILL SIGN BIT
MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
HRLI E,(E)
ADD E,TD.AGC+1
HRRZS C,A ; FLUSH COUNT AND SAVE
SKIPL E ; WITHIN BOUNDS
FATAL BAD SAT IN AGC
SKIPL 1(A) ; SEE IF MARKED
JRST GCRET ; IF MARKED LEAVE
IORM D,1(A)
SKIPE (E)
JRST USRAGC
SUB E,TD.AGC+1 ; POINT TO LENGTH
ADD E,TD.LNT+1
XCT (E) ; RET # OF ELEMENTS IN B
HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
PUSH P,[0] ; TEMP USED IF RESTS EXIST
PUSH P,D
MOVEI B,(B) ; ZAP TO ONLY LENGTH
PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
PUSH P,B ; SAVE
SUB E,TD.LNT+1
PUSH P,E ; SAVE FOR FINDING OTHER TABLES
JUMPE D,TD.MR2 ; NO REPEATING SEQ
ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
MOVNS E
HRLM E,-3(P) ; SAVE IT AND BASIC
TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
JRST TD.MR1
MOVE E,TD.GET+1
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVEM D,-4(P) ; SAVE ELMENT #
SKIPN B,-3(P) ; SKIP IF "RESTS" EXIST
SOJA D,TD.MR3
MOVEI 0,(B) ; BASIC LNT TO 0
SUBI 0,(D) ; SEE IF PAST BASIC
JUMPGE 0,.-3 ; JUMP IF O.K.
MOVSS B ; REP LNT TO RH, BASIC TO LH
IDIVI 0,(B) ; A==> -WHICH REPEATER
MOVNS A
ADD A,-3(P) ; PLUS BASIC
ADDI A,1 ; AND FUDGE
MOVEM A,-4(P) ; SAVE FOR PUTTER
ADDI E,-1(A) ; POINT
SOJA D,.+2
TD.MR3: ADDI E,(D) ; POINT TO SLOT
XCT (E) ; GET THIS ELEMENT INTO A AND B
JFCL ; NO-OP FOR ANY CASE
EXCH A,B ; REARRANGE
HLRZS B
MOVSI D,400000 ; RESET FOR MARK
PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
MOVE C,-2(P) ; RESTORE POINTER IN CASE MUNGED
JRST TD.MR2
TD.MR1: SUB P,[5,,5]
JRST GCRET
USRAGC: XCT (E) ; MARK THE TEMPLATE
JRST GCRET
; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
; AND UPDATES PTR TO THE TABLE.
GCRDMK: MOVEI C,(A) ; SAVE POINTER TO GCREAD TABLE
HLRE B,A ; GET TO DOPE WORD
SUB A,B
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET
SUBI A,2
MOVE B,ABOTN ; GET TOP OF ATOM TABLE
ADD B,0 ; GET BOTTOM OF ATOM TABLE
GCRD1: CAMG A,B ; DON'T SKIP IF DONE
JRST GCRET
HLRZ C,(A) ; GET MARKING
TRZN C,400000 ; SKIP IF MARKED
JRST GCRD3
MOVEI E,(A)
SUBI A,(C) ; GO BACK ONE ATOM
PUSH P,B ; SAVE B
PUSH P,A ; SAVE POINTER
MOVEI C,-2(E) ; SET UP POINTER
MOVEI B,TATOM ; GO TO MARK
MOVE A,1(C)
PUSHJ P,MARK
POP P,A
POP P,B
JRST GCRD1
GCRD3: SUBI A,(C) ; TO NEXT ATOM
JRST GCRD1
; ROUTINE TO FIX UP CHANNELS
CHNFLS: MOVEI 0,N.CHNS-1
MOVE A,[TCHAN,,CHNL1] ; SET UP POINTER
CHFL1: SKIPN B,1(A) ; GET POINTER TO CHANNEL
JRST CHFL2 ; NO CHANNEL LOOP TO NEXT
HLRE C,B ; POINT TO DOPE WORD OF CHANNEL
SUBI B,(C)
HLLM A,(A) ; PUT TYPE BACK
SKIPL 1(B) ; SKIP IF MARKED
JRST FLSCH ; FLUSH THE CHANNEL
MOVEI F,1 ; MARK THE CHANNEL AS GOOD
HRRM F,(A) ; SMASH IT IN
CHFL2: ADDI A,2
SOJG 0,CHFL1
POPJ P, ; EXIT
FLSCH: HLLOS F,(A) ; -1 INTO SLOT INDICATES LOSSAGE
JRST CHFL2
; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
; POINT.
FIXSEN: PUSH P,B ; SAVE TIME
MOVEI B,[ASCIZ /TIME= /]
PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
POP P,B ; RESTORE B
FMPRI B,(100.0) ; CONVERT TO FIX
MULI B,400
TSC B,B
ASH C,-163.(B)
MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
PUSH P,C
IDIVI C,10. ; START COUNTING
JUMPLE C,.+2
AOJA A,.-2
POP P,C
CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
JRST DOT1
FIXOUT: IDIVI C,10. ; RECOVER NUMBER
HRLM D,(P)
SKIPE C
PUSHJ P,FIXOUT
PUSH P,A ; SAVE A
CAIN A,2 ; DECIMAL POINT HERE?
JRST DOT2
FIX1: HLRZ A,(P)-1 ; GET NUMBER
ADDI A,60 ; MAKE IT A CHARACTER
PUSHJ P,IMTYO ; OUT IT GOES
POP P,A
SOJ A,
POPJ P,
DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
PUSHJ P,IMTYO
MOVEI A,"0
PUSHJ P,IMTYO
JRST FIXOUT ; CONTINUE
DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
PUSHJ P,IMTYO
JRST FIX1
; ROUTINE TO SEEP THROUGH GC SPACE LOOKING FOR FREE SLOTS. PAIRS ARE PLACED ON THE
; RCL LIST, VECTORS ON THE RCLV LIST.
SWEEP: MOVE C,GCSTOP ; GET TOP OF GC SPACE
SUBI C,1 ; POINT TO FIRST OBJECT
SETZB E,F ; CURRENT SLOT AND CURRENT LENGTH
LSWEEP: CAMG C,GCSBOT ; SKIP IF ABOVE GCSBOT
JRST ESWEEP ; DONE
HLRE A,-1(C) ; SEE IF LIST OR VECTOR
TRNE A,UBIT ; SKIP IF LIST
JRST VSWEEP ; IT IS A VECTOR
JUMPGE A,LSWP1 ; JUMP IF NOT MARKED
ANDCAM D,-1(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS ; CONS ON CURRENT OBJECT
SUBI C,2 ; SKIP OVER LIST
JRST LSWEEP
LSWP1: ADDI F,2 ; ADD TO CURRENT OBJECT COUNT
JUMPN E,LSWP2 ; JUMP IF CURRENT OBJECT EXISTS
MOVEI E,(C) ; GET ADDRESS
LSWP2: SUBI C,2
JRST LSWEEP
VSWEEP: HLRE A,(C) ; GET LENGTH
JUMPGE A,VSWP1 ; SKIP IF MARKED
ANDCAM D,(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS
ANDI A,377777 ; GET LENGTH PART
SUBI C,(A) ; GO PAST VECTOR
JRST LSWEEP
VSWP1: ADDI F,(A) ; ADD LENGTH
JUMPN E,VSWP2
MOVEI E,(C) ; GET NEW OBJECT LOCATION
VSWP2: SUBI C,(A) ; GO BACK PAST VECTOR
JRST LSWEEP
ESWEEP:
SWCONS: JUMPE E,CPOPJ
ADDM F,TOTCNT ; HACK TOTCNT
CAMLE F,MAXLEN ; SEE IF NEW MAXIMUM
MOVEM F,MAXLEN
CAIGE F,2 ; MAKE SURE AT LEAST TWO LONG
FATAL SWEEP FAILURE
CAIN F,2
JRST LCONS
SETZM (E)
MOVEI 0,(E)
SUBI 0,-1(F)
SETZM @0
HRLS 0
ADDI 0,1
BLT 0,-2(E)
HRRZ 0,RCLV ; GET VECTOR RECYCLE
HRRM 0,(E) ; SMASH INTO LINKING SLOT
HRRZM E,RCLV ; NEW RECYCLE SLOT
HRLM F,(E)
MOVSI F,UBIT
MOVEM F,-1(E)
SETZB E,F
POPJ P, ; DONE
LCONS: SETZM (E)
SUBI E,1
HRRZ 0,RCL ; GET RECYCLE LIST
HRRZM 0,(E) ; SMASH IN
HRRZM E,RCL
SETZB E,F
POPJ P,
; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
MSGGCT: [ASCIZ /USER CALLED- /]
[ASCIZ /FREE STORAGE- /]
[ASCIZ /TP-STACK- /]
[ASCIZ /TOP-LEVEL LOCALS- /]
[ASCIZ /GLOBAL VALUES- /]
[ASCIZ /TYPES- /]
[ASCIZ /STATIONARY IMPURE STORAGE- /]
[ASCIZ /P-STACK /]
[ASCIZ /BOTH STACKS BLOWN- /]
[ASCIZ /PURE STORAGE- /]
[ASCIZ /GC-RCALL- /]
; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
GCPAT: SPBLOK 100
EGCPAT: -1
MSGGFT: [ASCIZ /GC-READ /]
[ASCIZ /BLOAT /]
[ASCIZ /GROW /]
[ASCIZ /LIST /]
[ASCIZ /VECTOR /]
[ASCIZ /SET /]
[ASCIZ /SETG /]
[ASCIZ /FREEZE /]
[ASCIZ /PURE-PAGE LOADER /]
[ASCIZ /GC /]
[ASCIZ /INTERRUPT-HANDLER /]
[ASCIZ /NEWTYPE /]
[ASCIZ /PURIFY /]
CONSTANTS
HERE
CONSTANTS
OFFSET 0
ZZ==$.+1777
.LOP ANDCM ZZ 1777
ZZ1==.LVAL1
LOC ZZ1
OFFSET OFFS
MRKPDL==.-1
ENDGC:
OFFSET 0
ZZ2==ENDGC-AGCLD
.LOP <ASH @> ZZ2 <,-10.>
SLENGC==.LVAL1
.LOP <ASH @> SLENGC <10.>
RSLENG==.LVAL1
LOC GCST
.LPUR=$.
END

886
src/mudsys/amsgc.mid.108 Normal file
View File

@@ -0,0 +1,886 @@
TITLE AMSGC MUDDLE MARK SWEEP GARBAGE COLLECTOR
RELOCATABLE
.GLOBAL RCL,RCLV,IAMSGC,MAXLEN,REALGC,RGCLEN,GCFLG,SQUPNT,GCMONF,MSGTYP,GCCAUS
.GLOBAL GCCALL,PVSTOR,DSTORE,TYPVEC,N.CHNS,CHNL1,MAINPR,STOGC,CTIME,GCTIM,IMTYO
.GLOBAL FNMSGC,SATMSK,NUMSAT,NUMPRI,PURBOT,GCSTOP,GCSBOT,STOSTR,TYPMSK,PDLBUF,ITEM,INDIC
.GLOBAL VAL,NODPNT,UBIT,ASOLNT,GCHAPN,RBLDM,TOTCNT,MARK2S,MKTBS
.GLOBAL FRMUNG,BYTDOP,TD.GET,TD.LNT,TD.AGC,ABOTN,SLENGC,LENGC,REALGC,AGCLD,RLENGC
.GLOBAL RSLENG
GCST=$.
LOC REALGC+RLENGC
OFFS=AGCLD-$.
OFFSET OFFS
.INSRT MUDDLE >
TYPNT==AB
F==PVP
; THIS IS THE MUDDLE MARK SWEEP GARBAGE COLLECTOR. IT IS MUCH FASTER THAN THE COPYING
; GARBAGE COLLECTOR BUT DOESN'T COMPACT. IT CONSES FREE THINGS ONTO RCL AND RCLV.
; THIS GARBAGE COLLECTOR CAN ONLY BE USED IF THE GARBAGE COLLECT IS A FREE STORAGE
; GARBAGE COLLECT
; FIRST INITIALIZE VARIABLES
IAMSGC: SETZB M,RCL ; CLEAR OUT LIST RECYCLE AND RSUBR BASE
SETZM RCLV ; CLEAR VECTOR RECYCLE
SETZM MAXLEN ; CLEAR MAXIMUM LENGTH FOUND TO RECYCLE
SETOM GCFLG ; A GC HAS HAPPENED
SETZM TOTCNT
HLLZS SQUPNT ; CLEAR OUT SQUOZE TABLE
; SET UP MESSAGE PRINTING AND SAVE CAUSE AND CAUSER
PUSH P,A
PUSH P,B
PUSH P,C ; SAVE ACS
MOVEI B,[ASCIZ /MSGIN / ] ; PRINT GIN IF WINNING
SKIPE GCMONF
PUSHJ P,MSGTYP
HRRZ C,(P) ; GET CAUSE INDICATOR
ADDI B,1 ; AOS TO GET REAL CAUS
MOVEM B,GCCAUS
SKIPN GCMONF
JRST NOMON2
MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
PUSHJ P,MSGTYP
NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
MOVEM C,GCCALL
SKIPN GCMONF ; PRINT IF GCMON IS ON
JRST NOMON3
MOVE B,MSGGFT(C) ; GET POINTER TO MESSAGE
PUSHJ P,MSGTYP
NOMON3: SUB P,[1,,1]
POP P,B ; RESTORE ACS
POP P,A
; MOVE ACS INTO THE PVP
EXCH PVP,PVSTOR+1 ; GET REAL PROCESS VECTOR
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVEM AC,AC!STO+1(PVP)
TERMIN
MOVE 0,PVSTOR+1 ; GET OLD VALUE OF PVP
MOVEM 0,PVPSTO+1(PVP) ; SAVE PVP
MOVE 0,DSTORE ; SAVE D'S TYPE
MOVEM 0,DSTO(PVP)
MOVEM PVP,PVSTOR+1
; SET UP TYPNT TO POINT TO TYPE VECTOR
GETYP E,TYPVEC ; FIRST SEE IF TYPVEC IS A VECTOR
CAIE E,TVEC
FATAL TYPE VECTOR NOT OF TYPE VECTOR
HRRZ TYPNT,TYPVEC+1
HRLI TYPNT,B ; TYPNT IS NOW TYPEVECTOR(B)
; NOW SET UP GCPDL AND FENCE POST PDL'S
MOVEI A,(TB)
MOVE D,P ; SAVE P POINTER
PUSHJ P,FRMUNG
MOVE P,[-2000,,MRKPDL] ; SET UP MARK PDL
MOVEI A,(TB) ; FIXUP TOP FRAME
SETOM 1(TP) ; FENCEPOST TP
SETOM 1(D) ; FENCEPOST P
; NOW SETUP AUTO CHANNEL CLOSE
MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
MOVEI A,CHNL1 ; FIRST CHANNEL SLOT
CHNCLR: SKIPE 1(A) ; IS IT A CHANNEL
SETZM (A) ; CLEAR UP TYPE SLOT
ADDI A,2
SOJG 0,CHNCLR
; NOW DO MARK AND SWEEP PHASES
MOVSI D,400000 ; MARK BIT
MOVEI B,TPVP ; GET TYPE
MOVE A,PVSTOR+1 ; GET VALUE OF CURRENT PROCESS VECTOR
PUSHJ P,MARK
MOVEI B,TPVP ; GET TYPE OF MAIN PROCESS VECTOR
MOVE A,MAINPR
PUSHJ P,MARK ; MARK
PUSHJ P,CHNFLS ; DO CHANNEL FLUSHING
PUSHJ P,CHFIX
PUSHJ P,STOGC ; FIX UP FROZEN WORLD
PUSHJ P,SWEEP ; SWEEP WORLD
; PRINT GOUT
MOVEI B,[ASCIZ /MSGOUT /] ; PRINT OUT ENDING MESSAGE IF GCMONING
SKIPE GCMONF
PUSHJ P,MSGTYP
; RESTORE ACS
MOVE PVP,PVSTOR+1 ; GET PVP
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVE AC,AC!STO+1(PVP)
TERMIN
SKIPN DSTORE ; CLEAR OUT TYPE IF NO TYPE THERE
SETZM DSTO(PVP)
MOVE PVP,PVPSTO+1(PVP)
; PRINT TIME
PUSH P,A ; SAVE ACS
PUSH P,B
PUSH P,C
PUSH P,D
PUSHJ P,CTIME ; GET CURRENT CPU TIME
FSBR B,GCTIM ; COMPUTE TIME ELAPSED
MOVEM B,GCTIM ; SAVE TIME AWAY
SKIPN GCMONF ; PRINT IT OUT?
JRST GCCONT
PUSHJ P,FIXSEN
MOVEI A,15 ; OUTPUT CR/LF
PUSHJ P,IMTYO
MOVEI A,12
PUSHJ P,IMTYO
GCCONT: POP P,D ; RESTORE ACS
POP P,C
POP P,B
POP P,A
SETZM GCFLG
SETOM GCHAPN
SETOM INTFLG
PUSHJ P,RBLDM
JRST FNMSGC ; DONE
; THIS IS THE MARK PHASE
; GENERAL MARK ROUTINE, CALLED TO MARK ALL THINGS
; /A POINTER TO GOODIE
; /B TYPE OF GOODIE
; FOR MARK2, MARK1 /C POINTER TO PAIR NOT NEEDED FOR CALLS DIRECTLY TO MARK
MARK2S:
MARK2: HLRZ B,(C) ; TYPE
MARK1: MOVE A,1(C) ; VALUE
MARK: JUMPE A,CPOPJ ; DONE IF ZERO
MOVEI 0,1(A) ; SEE IF PURE
CAML 0,PURBOT
JRST CPOPJ
ANDI B,TYPMSK ; FLUSH MONITORS
HRLM C,(P)
CAIG B,NUMPRI ; IS A BASIC TYPE
JRST @MTYTBS(B) ; TYPE DISPATCH
LSH B,1 ; NOW GET PRIMTYPE
HRRZ B,@TYPNT ; GET PRIMTYPE
ANDI B,SATMSK ; FLUSH DOWN TO SAT
CAIG B,NUMSAT ; SKIP IF TEMPLATE DATA
JRST @MSATBS(B) ; JUMP OFF SAT TABLE
JRST TD.MK
GCRET: HLRZ C,(P) ; GET SAVED C
CPOPJ: POPJ P,
; TYPE DISPATCH TABLE
MTYTBS:
OFFSET 0
DUM1:
IRP XX,,[[TLOSE,GCRET],[TFIX,GCRET],[TFLOAT,GCRET],[TCHRS,GCRET]
[TENTRY,GCRET],[TSUBR,GCRET],[TFSUBR,GCRET],[TILLEG,GCRET],[TUNBOU,GCRET]
[TBIND,GCRET],[TTIME,GCRET],[TLIST,PAIRMK],[TFORM,PAIRMK],[TSEG,PAIRMK]
[TEXPR,PAIRMK],[TFUNAR,PAIRMK],[TLOCL,PAIRMK],[TFALSE,PAIRMK],[TDEFER,DEFQMK]
[TUVEC,UVMK],[TOBLS,UVMK],[TVEC,VECMK],[TCHAN,VECMK] ,[TLOCV,VECMK]
[TTVP,VECMK],[TBVL,VECMK],[TTAG,VECMK],[TPVP,VECMK],[TLOCI,TPMK],[TTP,TPMK]
[TSP,TPMK],[TMACRO,PAIRMK],[TPDL,PMK],[TARGS,ARGMK],[TAB,ABMK]
[TTB,TBMK],[TFRAME,FRMK],[TCHSTR,BYTMK],[TATOM,ATOMK],[TLOCD,LOCMK],[TBYTE,BYTMK]
[TENV,FRMK],[TACT,FRMK],[TASOC,ASMK],[TLOCU,UVMK],[TLOCS,BYTMK],[TLOCA,ASMK]
[TCBLK,GCRET],[TTMPLT,TD.MK],[TLOCT,TD.MK],[TLOCR,GCRET],[TINFO,GCRET]
[TRDTB,GCRDMK],[TWORD,GCRET],[TRSUBR,VECMK],[TCODE,UVMK],[TSATC,GCRET]
[TBITS,GCRET],[TSTORA,UVMK],[TPICTU,UVMK],[TSKIP,TPMK],[TLINK,ATOMK]
[TDECL,PAIRMK],[TENTER,VECMK],[THAND,VECMK],[TINTH,VECMK],[TDISMI,ATOMK]
[TDCLI,PAIRMK],[TPCODE,GCRET],[TTYPEW,GCRET],[TTYPEC,GCRET]
[TGATOM,GATOMK],[TREADA,FRMK],[TUBIND,GCRET],[TUNWIN,TBMK],[TLOCB,BYTMK]
[TDEFQ,DEFQMK],[TSPLIC,PAIRMK],[TLOCN,ASMK],[TOFFS,OFFSMK]]
IRP A,B,[XX]
LOC DUM1+A
SETZ B
.ISTOP
TERMIN
TERMIN
LOC DUM1+NUMPRI+1
OFFSET OFFS
; SAT DISPATCH TABLE
MSATBS:
OFFSET 0
DISTB2 DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,UVMK],[STBASE,TBMK]
[STPSTK,TPMK],[SARGS,<SETZ ARGMK>],[S2NWORD,VECMK],[SPSTK,TPMK],[SSTORE,UVMK]
[SFRAME,<SETZ FRMK>],[SBYTE,<SETZ BYTMK>],[SATOM,ATOMK],[SPVP,VECMK],[SGATOM,GATOMK]
[SLOCID,<SETZ LOCMK>],[SCHSTR,<SETZ BYTMK>],[SASOC,ASMK],[SLOCL,PAIRMK],[SABASE,ABMK]
[SLOCA,<SETZ ARGMK>],[SLOCV,VECMK],[SLOCU,UVMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ASMK]
[SRDTB,GCRDMK],[SLOCB,<SETZ BYTMK>],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]
OFFSET OFFS
; ROUTINE TO MARK PAIRS
PAIRMK: MOVEI C,(A)
PAIRM1: CAMG C,GCSTOP ; SEE IF IN RANGE
CAIGE C,STOSTR
JRST BADPTR ; FATAL ERROR
HLRE B,(C) ; SKIP IF NOT MARKED
JUMPL B,GCRET
IORM D,(C) ; MARK IT
PUSHJ P,MARK1 ; MARK THE ITEM
HRRZ C,(C) ; GET NEXT ELEMENT OF LIST
JUMPE C,GCRET
CAML C,PURBOT
JRST GCRET
JRST PAIRM1
; ROUTINE TO MARK DEFERS
DEFMK: HLRE B,(A)
JUMPL B,GCRET
MOVEI C,(A)
IORM D,(C)
PUSHJ P,MARK1
JRST GCRET
; ROUTINE TO MARK POSSIBLE DEFERS DEF?
DEFQMK: GETYP B,(A) ; GET THE TYPE OF THE OBJECT
LSH B,1 ; COMPUTE THE SAT
HRRZ B,@TYPNT
ANDI B,SATMSK
SKIPL MKTBS(B) ; SKIP IF NOT DEFERED
JRST PAIRMK
JRST DEFMK ; GO TO DEFMK
; ROUTINE TO MARK VECTORS
VECMK: HLRE B,A ; GET LENGTH
SUB A,B
MOVEI C,1(A) ; POINT TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE B,(C)
JUMPL B,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(B) ; GET TO BEGINNING
VECMK1: HLRE B,(C) ; GET TYPE AND SKIP IF NOT DOPE WORD
JUMPL B,GCRET ; DONE
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; NEXT ELEMENT
JRST VECMK1
; ROUTINE TO MARK UVECTORS
UVMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE F,(C) ; GET LENGTH
JUMPL F,GCRET
IORM D,(C) ; MARK IT
GETYP B,-1(C) ; GET TYPE
MOVEI E,(B) ; COPY TYPE FOR SAT COMPUTATION
LSH B,1
HRRZ B,@TYPNT ; GET SAT
ANDI B,SATMSK
MOVEI B,@MSATBS(B) ; GET JUMP LOCATION
CAIN B,GCRET
JRST GCRET
SUBI C,(F) ; POINT TO BEGINNING OF UVECTOR
SUBI F,2
JUMPE F,GCRET
PUSH P,F ; SAVE LENGTH
PUSH P,E
UNLOOP: MOVE B,(P)
MOVE A,1(C) ; GET VALUE POINTER
PUSHJ P,MARK
SOSE -1(P) ; SKIP IF NON-ZERO
AOJA C,UNLOOP ; GO BACK AGAIN
SUB P,[2,,2] ; CLEAN OFF STACK
JRST GCRET
; ROUTINE TO INDICATE A BAD POINTER
BADPTR: FATAL POINTER POINTS OUT OF GARBAGE COLLECTED SPACE
JRST GCRET
; ROUTINE TO MARK A TPSTACK
TPMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE A,(C)
JUMPL A,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(A) ; GO TO BEGINNING
TPLP: HLRE B,(C) ; GET TYPE AND MARKING
JUMPL B,GCRET ; EXIT ON FENCE-POST
ANDI B,TYPMSK ; FLUSH MONITORS
CAIE B,TCBLK ; CHECK FOR FRAME
CAIN B,TENTRY
JRST MFRAME ; MARK THE FRAME
CAIE B,TUBIND ; BINDING BLOCK
CAIN B,TBIND
JRST MBIND
PUSHJ P,MARK1 ; NOTHING SPECIAL SO MARK IT
ADDI C,2 ; POINT TO NEXT OBJECT
JRST TPLP ; MARK IT
; MARK A FRAME ON THE STACK, [I.E. ITS FSAV AND PSAV SLOTS]
MFRAME: HRROI C,FRAMLN+FSAV-1(C) ; POINT TO FUNCTION
HRRZ A,1(C) ; GET POINTER
CAIL A,STOSTR ; SEE IF IN GC SPACE
CAMLE A,GCSTOP
JRST MFRAM1 ; SKIP OVER IT, NOT IN GC-SPACE
HRL A,(A) ; GET LENGTH
MOVEI B,TVEC ; TYPE IS VECTOR [RSUBR OR RSUBR-ENTRY]
PUSHJ P,MARK
MFRAM1: MOVE A,PSAV-FSAV+1(C) ; MARK THE PSTACK
MOVEI B,TPDL
PUSHJ P,MARK
HRROI C,-FSAV+1(C) ; POINT PAST FRAME
JRST TPLP ; GO BACK TO START OF LOOP
; MARK A BINDING ON THE STACK [I.E. THE ATOM, VALUE, DECL, AND PREVIOUS BINDING]
MBIND: MOVEI B,TATOM ; START BY MARKING THE ATOM
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; POINT TO VALUE SLOT
PUSHJ P,MARK2 ; MARK THE VALUE
ADDI C,2 ; POINT TO DECL AND PREV BINDING
MOVEI B,TLIST ; MARK DECL
HLRZ A,(C)
PUSHJ P,MARK
SKIPL A,1(C) ; SKIP IF PREVIOUS BINDING
JRST NOTLCI
MOVEI B,TLOCI ; GET TYPE
PUSHJ P,MARK
NOTLCI: ADDI C,2 ; POINT PAST BINDING
JRST TPLP
PMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
IORM D,(C) ; MARK IT
JRST GCRET
; ROUTINE TO MARK TB POINTER
TBMK: HRRZS A ; CHECK FOR NIL POINTER
SKIPN A
JRST GCRET
MOVE A,TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK AB POINTERS
ABMK: HLRE B,A ; GET TO FRAME
SUB A,B
MOVE A,FRAMLN+TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK FRAME POINTERS
FRMK: HRLZ B,A ; GET THE TIME
HLRZ F,OTBSAV(A) ; GET TIME FROM FRAME
CAIE B,(F) ; SKIP IF TIMES AGREE
JRST GCRET ; IGNORE POINTER IF THEY DONT
HRRZ A,(C) ; GET POINTER TO PROCESS
SUBI A,1 ; FUDGE FOR VECTOR MARKING
MOVEI B,TPVP ; TYPE WORD
PUSHJ P,MARK
HRRZ A,1(C) ; GET POINTER TO FRAME
JRST TBMK ; MARK IT
; ROUTINE TO MARK ARGUMENT BLOCKS [TUPLES]
ARGMK: HLRE B,A ; GET LENGTH
SUB A,B ; POINT PAST BLOCK
CAIL A,STOSTR
CAMLE A,GCSTOP ; SEE IF IN GCSPACE
JRST GCRET
HRLZ 0,(A) ; GET TYPE
ANDI 0,TYPMSK ; FLUSH MONITORS
CAIE 0,TENTRY
CAIN 0,TCBLK
JRST ARGMK1 ; AT FRAME
CAIE 0,TINFO ; AT FRAME
JRST GCRET ; NOT A LEGAL TYPE GO AWAY
HRRZ A,1(A) ; POINTING TO FRAME
HRL A,(C) ; GET TIME
JRST TBMK
ARGMK1: HRRI A,FRAMLN(A) ; MAKE POINTER
HRL A,(C) ; GET TIME
JRST TBMK
; ROUTINE TO MARK GLOBAL SLOTS
GATOMK: HRRZ B,(C) ; GET POSSIBLE GDECL
JUMPE B,ATOMK ; NONE GO TO MARK ATOM
CAIN B,-1 ; SKIP IF NOT MANIFEST
JRST ATOMK
PUSH P,A ; I DOUBT THIS IS RIGHT, BUT IT WORKED ONCE--TAA
MOVEI C,(A)
MOVEI A,(B)
MOVEI B,TLIST ; TYPE WORD LIST
PUSHJ P,MARK ; MARK IT
POP P,A
JRST ATOMK5
ATOMK:
ATOMK5: HLRE B,A
SUB A,B ; A POINTS TO DOPE WORD
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET ; EXIT IF MARKED
HLRZ B,1(A)
SUBI B,3
HRLI B,1(B)
MOVEI C,-1(A)
SUB C,B ; IN CASE WAS DW
IORM D,1(A) ; MARK IT
HRRZ A,2(C) ; MARK OBLIST
CAMG A,VECBOT
JRST NOOBL ; NO IMPURE OBLIST
HRLI A,-1
MOVEI B,TOBLS ; MARK THE OBLIST
PUSHJ P,MARK
NOOBL: HLRZ A,2(C) ; GET NEXT ATOM
MOVEI B,TATOM
PUSHJ P,MARK
HLRZ B,(C) ; GET VALUE SLOT
TRZ B,400000 ; TURN OFF MARK BIT
SKIPE B ; SEE IF 0
CAIN B,TUNBOUN ; SEE IF UNBOUND
JRST GCRET
HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
MOVEI B,TVEC ; ASSUME VECTOR
SKIPE 0 ; SKIP IF VECTOR
MOVEI B,TTP ; IT IS A TP POINTER
PUSHJ P,MARK1 ; GO MARK IT
JRST GCRET
; ROUTINE TO MARK BYTE AND STRING POINTERS
BYTMK: PUSHJ P,BYTDOP ; GET TO DOPE WORD INTO A
HRLZ F,-1(A) ; SEE IF SPECIAL ATOM [SPNAME]
ANDI F,SATMSK ; GET SAT
CAIN F,SATOM
JRST ATMSET ; IT IS AN ATOM
IORM D,(A) ; MARK IT
JRST GCRET
ATMSET: HLRZ B,(A) ; GET LENGTH
TRZ B,400000 ; TURN OFF POSSIBLE MARK BIT
MOVNI B,-2(B) ; GENERATE AOBJN POINTER
ADDI A,-1(B) ; GET BACK TO BEGINNING
HRLI A,(B) ; PUT IN LEFT HALF
MOVEI B,TATOM ; MARK AS AN ATOM
PUSHJ P,MARK ; GO MARK
JRST GCRET
; MARK LOCID GOODIES
LOCMK: HRRZ B,(C) ; CHECK FOR TIME
JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
HRRZ 0,2(A) ; GET OTHER TIME
CAIE 0,(B) ; SAME?
JRST GCRET
MOVEI B,TTP
PUSHJ P,MARK1
JRST GCRET
LOCMK1: MOVEI B,TVEC ; GLOBAL
PUSHJ P,MARK1 ; MARK VALUE
JRST GCRET
; MARK ASSOCIATION BLOCK
ASMK: MOVEI C,(A) ; SAVE POINTER TO BEGINNING OF ASSOCATION
ADDI A,ASOLNT ; POINT TO DOPE WORD
HLRE B,1(A) ; GET SECOND D.W.
JUMPL B,GCRET ; MARKED SO LEAVE
IORM D,1(A) ; MARK ASSOCATION
PUSHJ P,MARK2 ; MARK ITEM
MOVEI C,INDIC(C)
PUSHJ P,MARK2
MOVEI C,VAL-INDIC(C)
PUSHJ P,MARK2
HRRZ A,NODPNT-VAL(C) ; GET NEXT IN CHAIN
JUMPN A,ASMK ; GO MARK IT
JRST GCRET
; MARK OFFSETS
OFFSMK: PUSH P,$TLIST
HLRZ 0,1(C) ; PICK UP LIST POINTER
PUSH P,0
MOVEI C,-1(P)
PUSHJ P,MARK2 ; MARK THE LIST
SUB P,[2,,2]
JRST GCRET ; AND RETURN
; HERE TO MARK TEMPLATE DATA STRUCTURES
TD.MK: HLRZ B,(A) ; GET REAL SPEC TYPE
ANDI B,37777 ; KILL SIGN BIT
MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
HRLI E,(E)
ADD E,TD.AGC+1
HRRZS C,A ; FLUSH COUNT AND SAVE
SKIPL E ; WITHIN BOUNDS
FATAL BAD SAT IN AGC
SKIPL 1(A) ; SEE IF MARKED
JRST GCRET ; IF MARKED LEAVE
IORM D,1(A)
SKIPE (E)
JRST USRAGC
SUB E,TD.AGC+1 ; POINT TO LENGTH
ADD E,TD.LNT+1
XCT (E) ; RET # OF ELEMENTS IN B
HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
PUSH P,[0] ; TEMP USED IF RESTS EXIST
PUSH P,D
MOVEI B,(B) ; ZAP TO ONLY LENGTH
PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
PUSH P,B ; SAVE
SUB E,TD.LNT+1
PUSH P,E ; SAVE FOR FINDING OTHER TABLES
JUMPE D,TD.MR2 ; NO REPEATING SEQ
ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
MOVNS E
HRLM E,-3(P) ; SAVE IT AND BASIC
TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
JRST TD.MR1
MOVE E,TD.GET+1
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVEM D,-4(P) ; SAVE ELMENT #
SKIPN B,-3(P) ; SKIP IF "RESTS" EXIST
SOJA D,TD.MR3
MOVEI 0,(B) ; BASIC LNT TO 0
SUBI 0,(D) ; SEE IF PAST BASIC
JUMPGE 0,.-3 ; JUMP IF O.K.
MOVSS B ; REP LNT TO RH, BASIC TO LH
IDIVI 0,(B) ; A==> -WHICH REPEATER
MOVNS A
ADD A,-3(P) ; PLUS BASIC
ADDI A,1 ; AND FUDGE
MOVEM A,-4(P) ; SAVE FOR PUTTER
ADDI E,-1(A) ; POINT
SOJA D,.+2
TD.MR3: ADDI E,(D) ; POINT TO SLOT
XCT (E) ; GET THIS ELEMENT INTO A AND B
JFCL ; NO-OP FOR ANY CASE
EXCH A,B ; REARRANGE
HLRZS B
MOVSI D,400000 ; RESET FOR MARK
PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
MOVE C,-2(P) ; RESTORE POINTER IN CASE MUNGED
JRST TD.MR2
TD.MR1: SUB P,[5,,5]
JRST GCRET
USRAGC: XCT (E) ; MARK THE TEMPLATE
JRST GCRET
; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
; AND UPDATES PTR TO THE TABLE.
GCRDMK: MOVEI C,(A) ; SAVE POINTER TO GCREAD TABLE
HLRE B,A ; GET TO DOPE WORD
SUB A,B
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET
SUBI A,2
MOVE B,ABOTN ; GET TOP OF ATOM TABLE
ADD B,0 ; GET BOTTOM OF ATOM TABLE
GCRD1: CAMG A,B ; DON'T SKIP IF DONE
JRST GCRET
HLRZ C,(A) ; GET MARKING
TRZN C,400000 ; SKIP IF MARKED
JRST GCRD3
MOVEI E,(A)
SUBI A,(C) ; GO BACK ONE ATOM
PUSH P,B ; SAVE B
PUSH P,A ; SAVE POINTER
MOVEI C,-2(E) ; SET UP POINTER
MOVEI B,TATOM ; GO TO MARK
MOVE A,1(C)
PUSHJ P,MARK
POP P,A
POP P,B
JRST GCRD1
GCRD3: SUBI A,(C) ; TO NEXT ATOM
JRST GCRD1
; ROUTINE TO FIX UP CHANNELS
CHNFLS: MOVEI 0,N.CHNS-1
MOVEI A,,CHNL1 ; SET UP POINTER
CHFL1: SKIPN B,1(A) ; GET POINTER TO CHANNEL
JRST CHFL2 ; NO CHANNEL LOOP TO NEXT
HLRE C,B ; POINT TO DOPE WORD OF CHANNEL
SUBI B,(C)
MOVEI F,TCHAN
HRLM F,(A) ; PUT TYPE BACK
SKIPL 1(B) ; SKIP IF MARKED
JRST FLSCH ; FLUSH THE CHANNEL
MOVEI F,1 ; MARK THE CHANNEL AS GOOD
HRRM F,(A) ; SMASH IT IN
CHFL2: ADDI A,2
SOJG 0,CHFL1
POPJ P, ; EXIT
FLSCH: HLLOS F,(A) ; -1 INTO SLOT INDICATES LOSSAGE
JRST CHFL2
; THIS ROUTINE MARKS ALL THE CHANNELS
CHFIX: MOVEI 0,N.CHNS-1
MOVEI A,CHNL1 ; SLOTS
DHNFL2: SKIPN 1(A)
JRST DHNFL1
PUSH P,0 ; SAVE 0
PUSH P,A ; SAVE A
MOVEI C,(A)
MOVE A,1(A)
MOVEI B,TCHAN
PUSHJ P,MARK
POP P,A ; RESTORE A
POP P,0 ; RESTORE
DHNFL1: ADDI A,2
SOJG 0,DHNFL2
POPJ P,
; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
; POINT.
FIXSEN: PUSH P,B ; SAVE TIME
MOVEI B,[ASCIZ /TIME= /]
PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
POP P,B ; RESTORE B
FMPRI B,(100.0) ; CONVERT TO FIX
MULI B,400
TSC B,B
ASH C,-163.(B)
MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
PUSH P,C
IDIVI C,10. ; START COUNTING
JUMPLE C,.+2
AOJA A,.-2
POP P,C
CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
JRST DOT1
FIXOUT: IDIVI C,10. ; RECOVER NUMBER
HRLM D,(P)
SKIPE C
PUSHJ P,FIXOUT
PUSH P,A ; SAVE A
CAIN A,2 ; DECIMAL POINT HERE?
JRST DOT2
FIX1: HLRZ A,(P)-1 ; GET NUMBER
ADDI A,60 ; MAKE IT A CHARACTER
PUSHJ P,IMTYO ; OUT IT GOES
POP P,A
SOJ A,
POPJ P,
DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
PUSHJ P,IMTYO
MOVEI A,"0
PUSHJ P,IMTYO
JRST FIXOUT ; CONTINUE
DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
PUSHJ P,IMTYO
JRST FIX1
; ROUTINE TO SEEP THROUGH GC SPACE LOOKING FOR FREE SLOTS. PAIRS ARE PLACED ON THE
; RCL LIST, VECTORS ON THE RCLV LIST.
SWEEP: MOVE C,GCSTOP ; GET TOP OF GC SPACE
SUBI C,1 ; POINT TO FIRST OBJECT
SETZB E,F ; CURRENT SLOT AND CURRENT LENGTH
LSWEEP: CAMG C,GCSBOT ; SKIP IF ABOVE GCSBOT
JRST ESWEEP ; DONE
HLRE A,-1(C) ; SEE IF LIST OR VECTOR
TRNE A,UBIT ; SKIP IF LIST
JRST VSWEEP ; IT IS A VECTOR
JUMPGE A,LSWP1 ; JUMP IF NOT MARKED
ANDCAM D,-1(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS ; CONS ON CURRENT OBJECT
SUBI C,2 ; SKIP OVER LIST
JRST LSWEEP
LSWP1: ADDI F,2 ; ADD TO CURRENT OBJECT COUNT
JUMPN E,LSWP2 ; JUMP IF CURRENT OBJECT EXISTS
MOVEI E,(C) ; GET ADDRESS
LSWP2: SUBI C,2
JRST LSWEEP
VSWEEP: HLRE A,(C) ; GET LENGTH
JUMPGE A,VSWP1 ; SKIP IF MARKED
ANDCAM D,(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS
ANDI A,377777 ; GET LENGTH PART
SUBI C,(A) ; GO PAST VECTOR
JRST LSWEEP
VSWP1: ADDI F,(A) ; ADD LENGTH
JUMPN E,VSWP2
MOVEI E,(C) ; GET NEW OBJECT LOCATION
VSWP2: SUBI C,(A) ; GO BACK PAST VECTOR
JRST LSWEEP
ESWEEP:
SWCONS: JUMPE E,CPOPJ
ADDM F,TOTCNT ; HACK TOTCNT
CAMLE F,MAXLEN ; SEE IF NEW MAXIMUM
MOVEM F,MAXLEN
CAIGE F,2 ; MAKE SURE AT LEAST TWO LONG
FATAL SWEEP FAILURE
CAIN F,2
JRST LCONS
SETZM (E)
MOVEI 0,(E)
SUBI 0,-1(F)
SETZM @0
HRLS 0
ADDI 0,1
BLT 0,-2(E)
HRRZ 0,RCLV ; GET VECTOR RECYCLE
HRRM 0,(E) ; SMASH INTO LINKING SLOT
HRRZM E,RCLV ; NEW RECYCLE SLOT
HRLM F,(E)
MOVSI F,UBIT
MOVEM F,-1(E)
SETZB E,F
POPJ P, ; DONE
LCONS: SETZM (E)
SUBI E,1
HRRZ 0,RCL ; GET RECYCLE LIST
HRRZM 0,(E) ; SMASH IN
HRRZM E,RCL
SETZB E,F
POPJ P,
; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
MSGGCT: [ASCIZ /USER CALLED- /]
[ASCIZ /FREE STORAGE- /]
[ASCIZ /TP-STACK- /]
[ASCIZ /TOP-LEVEL LOCALS- /]
[ASCIZ /GLOBAL VALUES- /]
[ASCIZ /TYPES- /]
[ASCIZ /STATIONARY IMPURE STORAGE- /]
[ASCIZ /P-STACK /]
[ASCIZ /BOTH STACKS BLOWN- /]
[ASCIZ /PURE STORAGE- /]
[ASCIZ /GC-RCALL- /]
; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
GCPAT: SPBLOK 100
EGCPAT: -1
MSGGFT: [ASCIZ /GC-READ /]
[ASCIZ /BLOAT /]
[ASCIZ /GROW /]
[ASCIZ /LIST /]
[ASCIZ /VECTOR /]
[ASCIZ /SET /]
[ASCIZ /SETG /]
[ASCIZ /FREEZE /]
[ASCIZ /PURE-PAGE LOADER /]
[ASCIZ /GC /]
[ASCIZ /INTERRUPT-HANDLER /]
[ASCIZ /NEWTYPE /]
[ASCIZ /PURIFY /]
CONSTANTS
HERE
CONSTANTS
OFFSET 0
ZZ==$.+1777
.LOP ANDCM ZZ 1777
ZZ1==.LVAL1
LOC ZZ1
OFFSET OFFS
MRKPDL==.-1
ENDGC:
OFFSET 0
ZZ2==ENDGC-AGCLD
.LOP <ASH @> ZZ2 <,-10.>
SLENGC==.LVAL1
.LOP <ASH @> SLENGC <10.>
RSLENG==.LVAL1
LOC GCST
.LPUR=$.
END

886
src/mudsys/amsgc.mid.109 Normal file
View File

@@ -0,0 +1,886 @@
TITLE AMSGC MUDDLE MARK SWEEP GARBAGE COLLECTOR
RELOCATABLE
.GLOBAL RCL,RCLV,IAMSGC,MAXLEN,REALGC,RGCLEN,GCFLG,SQUPNT,GCMONF,MSGTYP,GCCAUS
.GLOBAL GCCALL,PVSTOR,DSTORE,TYPVEC,N.CHNS,CHNL1,MAINPR,STOGC,CTIME,GCTIM,IMTYO
.GLOBAL FNMSGC,SATMSK,NUMSAT,NUMPRI,PURBOT,GCSTOP,GCSBOT,STOSTR,TYPMSK,PDLBUF,ITEM,INDIC
.GLOBAL VAL,NODPNT,UBIT,ASOLNT,GCHAPN,RBLDM,TOTCNT,MARK2S,MKTBS
.GLOBAL FRMUNG,BYTDOP,TD.GET,TD.LNT,TD.AGC,ABOTN,SLENGC,LENGC,REALGC,AGCLD,RLENGC
.GLOBAL RSLENG
GCST=$.
LOC REALGC+RLENGC
OFFS=AGCLD-$.
OFFSET OFFS
.INSRT MUDDLE >
TYPNT==AB
F==PVP
; THIS IS THE MUDDLE MARK SWEEP GARBAGE COLLECTOR. IT IS MUCH FASTER THAN THE COPYING
; GARBAGE COLLECTOR BUT DOESN'T COMPACT. IT CONSES FREE THINGS ONTO RCL AND RCLV.
; THIS GARBAGE COLLECTOR CAN ONLY BE USED IF THE GARBAGE COLLECT IS A FREE STORAGE
; GARBAGE COLLECT
; FIRST INITIALIZE VARIABLES
IAMSGC: SETZB M,RCL ; CLEAR OUT LIST RECYCLE AND RSUBR BASE
SETZM RCLV ; CLEAR VECTOR RECYCLE
SETZM MAXLEN ; CLEAR MAXIMUM LENGTH FOUND TO RECYCLE
SETOM GCFLG ; A GC HAS HAPPENED
SETZM TOTCNT
HLLZS SQUPNT ; CLEAR OUT SQUOZE TABLE
; SET UP MESSAGE PRINTING AND SAVE CAUSE AND CAUSER
PUSH P,A
PUSH P,B
PUSH P,C ; SAVE ACS
MOVEI B,[ASCIZ /MSGIN / ] ; PRINT GIN IF WINNING
SKIPE GCMONF
PUSHJ P,MSGTYP
HRRZ C,(P) ; GET CAUSE INDICATOR
ADDI B,1 ; AOS TO GET REAL CAUS
MOVEM B,GCCAUS
SKIPN GCMONF
JRST NOMON2
MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
PUSHJ P,MSGTYP
NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
MOVEM C,GCCALL
SKIPN GCMONF ; PRINT IF GCMON IS ON
JRST NOMON3
MOVE B,MSGGFT(C) ; GET POINTER TO MESSAGE
PUSHJ P,MSGTYP
NOMON3: SUB P,[1,,1]
POP P,B ; RESTORE ACS
POP P,A
; MOVE ACS INTO THE PVP
EXCH PVP,PVSTOR+1 ; GET REAL PROCESS VECTOR
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVEM AC,AC!STO+1(PVP)
TERMIN
MOVE 0,PVSTOR+1 ; GET OLD VALUE OF PVP
MOVEM 0,PVPSTO+1(PVP) ; SAVE PVP
MOVE 0,DSTORE ; SAVE D'S TYPE
MOVEM 0,DSTO(PVP)
MOVEM PVP,PVSTOR+1
; SET UP TYPNT TO POINT TO TYPE VECTOR
GETYP E,TYPVEC ; FIRST SEE IF TYPVEC IS A VECTOR
CAIE E,TVEC
FATAL TYPE VECTOR NOT OF TYPE VECTOR
HRRZ TYPNT,TYPVEC+1
HRLI TYPNT,B ; TYPNT IS NOW TYPEVECTOR(B)
; NOW SET UP GCPDL AND FENCE POST PDL'S
MOVEI A,(TB)
MOVE D,P ; SAVE P POINTER
PUSHJ P,FRMUNG
MOVE P,[-2000,,MRKPDL] ; SET UP MARK PDL
MOVEI A,(TB) ; FIXUP TOP FRAME
SETOM 1(TP) ; FENCEPOST TP
SETOM 1(D) ; FENCEPOST P
; NOW SETUP AUTO CHANNEL CLOSE
MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
MOVEI A,CHNL1 ; FIRST CHANNEL SLOT
CHNCLR: SKIPE 1(A) ; IS IT A CHANNEL
SETZM (A) ; CLEAR UP TYPE SLOT
ADDI A,2
SOJG 0,CHNCLR
; NOW DO MARK AND SWEEP PHASES
MOVSI D,400000 ; MARK BIT
MOVEI B,TPVP ; GET TYPE
MOVE A,PVSTOR+1 ; GET VALUE OF CURRENT PROCESS VECTOR
PUSHJ P,MARK
MOVEI B,TPVP ; GET TYPE OF MAIN PROCESS VECTOR
MOVE A,MAINPR
PUSHJ P,MARK ; MARK
PUSHJ P,CHNFLS ; DO CHANNEL FLUSHING
PUSHJ P,CHFIX
PUSHJ P,STOGC ; FIX UP FROZEN WORLD
PUSHJ P,SWEEP ; SWEEP WORLD
; PRINT GOUT
MOVEI B,[ASCIZ /MSGOUT /] ; PRINT OUT ENDING MESSAGE IF GCMONING
SKIPE GCMONF
PUSHJ P,MSGTYP
; RESTORE ACS
MOVE PVP,PVSTOR+1 ; GET PVP
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVE AC,AC!STO+1(PVP)
TERMIN
SKIPN DSTORE ; CLEAR OUT TYPE IF NO TYPE THERE
SETZM DSTO(PVP)
MOVE PVP,PVPSTO+1(PVP)
; PRINT TIME
PUSH P,A ; SAVE ACS
PUSH P,B
PUSH P,C
PUSH P,D
PUSHJ P,CTIME ; GET CURRENT CPU TIME
FSBR B,GCTIM ; COMPUTE TIME ELAPSED
MOVEM B,GCTIM ; SAVE TIME AWAY
SKIPN GCMONF ; PRINT IT OUT?
JRST GCCONT
PUSHJ P,FIXSEN
MOVEI A,15 ; OUTPUT CR/LF
PUSHJ P,IMTYO
MOVEI A,12
PUSHJ P,IMTYO
GCCONT: POP P,D ; RESTORE ACS
POP P,C
POP P,B
POP P,A
SETZM GCFLG
SETOM GCHAPN
SETOM INTFLG
PUSHJ P,RBLDM
JRST FNMSGC ; DONE
; THIS IS THE MARK PHASE
; GENERAL MARK ROUTINE, CALLED TO MARK ALL THINGS
; /A POINTER TO GOODIE
; /B TYPE OF GOODIE
; FOR MARK2, MARK1 /C POINTER TO PAIR NOT NEEDED FOR CALLS DIRECTLY TO MARK
MARK2S:
MARK2: HLRZ B,(C) ; TYPE
MARK1: MOVE A,1(C) ; VALUE
MARK: JUMPE A,CPOPJ ; DONE IF ZERO
MOVEI 0,1(A) ; SEE IF PURE
CAML 0,PURBOT
JRST CPOPJ
ANDI B,TYPMSK ; FLUSH MONITORS
HRLM C,(P)
CAIG B,NUMPRI ; IS A BASIC TYPE
JRST @MTYTBS(B) ; TYPE DISPATCH
LSH B,1 ; NOW GET PRIMTYPE
HRRZ B,@TYPNT ; GET PRIMTYPE
ANDI B,SATMSK ; FLUSH DOWN TO SAT
CAIG B,NUMSAT ; SKIP IF TEMPLATE DATA
JRST @MSATBS(B) ; JUMP OFF SAT TABLE
JRST TD.MK
GCRET: HLRZ C,(P) ; GET SAVED C
CPOPJ: POPJ P,
; TYPE DISPATCH TABLE
MTYTBS:
OFFSET 0
DUM1:
IRP XX,,[[TLOSE,GCRET],[TFIX,GCRET],[TFLOAT,GCRET],[TCHRS,GCRET]
[TENTRY,GCRET],[TSUBR,GCRET],[TFSUBR,GCRET],[TILLEG,GCRET],[TUNBOU,GCRET]
[TBIND,GCRET],[TTIME,GCRET],[TLIST,PAIRMK],[TFORM,PAIRMK],[TSEG,PAIRMK]
[TEXPR,PAIRMK],[TFUNAR,PAIRMK],[TLOCL,PAIRMK],[TFALSE,PAIRMK],[TDEFER,DEFQMK]
[TUVEC,UVMK],[TOBLS,UVMK],[TVEC,VECMK],[TCHAN,VECMK] ,[TLOCV,VECMK]
[TTVP,VECMK],[TBVL,VECMK],[TTAG,VECMK],[TPVP,VECMK],[TLOCI,TPMK],[TTP,TPMK]
[TSP,TPMK],[TMACRO,PAIRMK],[TPDL,PMK],[TARGS,ARGMK],[TAB,ABMK]
[TTB,TBMK],[TFRAME,FRMK],[TCHSTR,BYTMK],[TATOM,ATOMK],[TLOCD,LOCMK],[TBYTE,BYTMK]
[TENV,FRMK],[TACT,FRMK],[TASOC,ASMK],[TLOCU,UVMK],[TLOCS,BYTMK],[TLOCA,ARGMK]
[TCBLK,GCRET],[TTMPLT,TD.MK],[TLOCT,TD.MK],[TLOCR,GCRET],[TINFO,GCRET]
[TRDTB,GCRDMK],[TWORD,GCRET],[TRSUBR,VECMK],[TCODE,UVMK],[TSATC,GCRET]
[TBITS,GCRET],[TSTORA,UVMK],[TPICTU,UVMK],[TSKIP,TPMK],[TLINK,ATOMK]
[TDECL,PAIRMK],[TENTER,VECMK],[THAND,VECMK],[TINTH,VECMK],[TDISMI,ATOMK]
[TDCLI,PAIRMK],[TPCODE,GCRET],[TTYPEW,GCRET],[TTYPEC,GCRET]
[TGATOM,GATOMK],[TREADA,FRMK],[TUBIND,GCRET],[TUNWIN,TBMK],[TLOCB,BYTMK]
[TDEFQ,DEFQMK],[TSPLIC,PAIRMK],[TLOCN,ASMK],[TOFFS,OFFSMK]]
IRP A,B,[XX]
LOC DUM1+A
SETZ B
.ISTOP
TERMIN
TERMIN
LOC DUM1+NUMPRI+1
OFFSET OFFS
; SAT DISPATCH TABLE
MSATBS:
OFFSET 0
DISTB2 DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,UVMK],[STBASE,TBMK]
[STPSTK,TPMK],[SARGS,<SETZ ARGMK>],[S2NWORD,VECMK],[SPSTK,TPMK],[SSTORE,UVMK]
[SFRAME,<SETZ FRMK>],[SBYTE,<SETZ BYTMK>],[SATOM,ATOMK],[SPVP,VECMK],[SGATOM,GATOMK]
[SLOCID,<SETZ LOCMK>],[SCHSTR,<SETZ BYTMK>],[SASOC,ASMK],[SLOCL,PAIRMK],[SABASE,ABMK]
[SLOCA,<SETZ ARGMK>],[SLOCV,VECMK],[SLOCU,UVMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ASMK]
[SRDTB,GCRDMK],[SLOCB,<SETZ BYTMK>],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]
OFFSET OFFS
; ROUTINE TO MARK PAIRS
PAIRMK: MOVEI C,(A)
PAIRM1: CAMG C,GCSTOP ; SEE IF IN RANGE
CAIGE C,STOSTR
JRST BADPTR ; FATAL ERROR
HLRE B,(C) ; SKIP IF NOT MARKED
JUMPL B,GCRET
IORM D,(C) ; MARK IT
PUSHJ P,MARK1 ; MARK THE ITEM
HRRZ C,(C) ; GET NEXT ELEMENT OF LIST
JUMPE C,GCRET
CAML C,PURBOT
JRST GCRET
JRST PAIRM1
; ROUTINE TO MARK DEFERS
DEFMK: HLRE B,(A)
JUMPL B,GCRET
MOVEI C,(A)
IORM D,(C)
PUSHJ P,MARK1
JRST GCRET
; ROUTINE TO MARK POSSIBLE DEFERS DEF?
DEFQMK: GETYP B,(A) ; GET THE TYPE OF THE OBJECT
LSH B,1 ; COMPUTE THE SAT
HRRZ B,@TYPNT
ANDI B,SATMSK
SKIPL MKTBS(B) ; SKIP IF NOT DEFERED
JRST PAIRMK
JRST DEFMK ; GO TO DEFMK
; ROUTINE TO MARK VECTORS
VECMK: HLRE B,A ; GET LENGTH
SUB A,B
MOVEI C,1(A) ; POINT TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE B,(C)
JUMPL B,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(B) ; GET TO BEGINNING
VECMK1: HLRE B,(C) ; GET TYPE AND SKIP IF NOT DOPE WORD
JUMPL B,GCRET ; DONE
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; NEXT ELEMENT
JRST VECMK1
; ROUTINE TO MARK UVECTORS
UVMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE F,(C) ; GET LENGTH
JUMPL F,GCRET
IORM D,(C) ; MARK IT
GETYP B,-1(C) ; GET TYPE
MOVEI E,(B) ; COPY TYPE FOR SAT COMPUTATION
LSH B,1
HRRZ B,@TYPNT ; GET SAT
ANDI B,SATMSK
MOVEI B,@MSATBS(B) ; GET JUMP LOCATION
CAIN B,GCRET
JRST GCRET
SUBI C,(F) ; POINT TO BEGINNING OF UVECTOR
SUBI F,2
JUMPE F,GCRET
PUSH P,F ; SAVE LENGTH
PUSH P,E
UNLOOP: MOVE B,(P)
MOVE A,1(C) ; GET VALUE POINTER
PUSHJ P,MARK
SOSE -1(P) ; SKIP IF NON-ZERO
AOJA C,UNLOOP ; GO BACK AGAIN
SUB P,[2,,2] ; CLEAN OFF STACK
JRST GCRET
; ROUTINE TO INDICATE A BAD POINTER
BADPTR: FATAL POINTER POINTS OUT OF GARBAGE COLLECTED SPACE
JRST GCRET
; ROUTINE TO MARK A TPSTACK
TPMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE A,(C)
JUMPL A,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(A) ; GO TO BEGINNING
TPLP: HLRE B,(C) ; GET TYPE AND MARKING
JUMPL B,GCRET ; EXIT ON FENCE-POST
ANDI B,TYPMSK ; FLUSH MONITORS
CAIE B,TCBLK ; CHECK FOR FRAME
CAIN B,TENTRY
JRST MFRAME ; MARK THE FRAME
CAIE B,TUBIND ; BINDING BLOCK
CAIN B,TBIND
JRST MBIND
PUSHJ P,MARK1 ; NOTHING SPECIAL SO MARK IT
ADDI C,2 ; POINT TO NEXT OBJECT
JRST TPLP ; MARK IT
; MARK A FRAME ON THE STACK, [I.E. ITS FSAV AND PSAV SLOTS]
MFRAME: HRROI C,FRAMLN+FSAV-1(C) ; POINT TO FUNCTION
HRRZ A,1(C) ; GET POINTER
CAIL A,STOSTR ; SEE IF IN GC SPACE
CAMLE A,GCSTOP
JRST MFRAM1 ; SKIP OVER IT, NOT IN GC-SPACE
HRL A,(A) ; GET LENGTH
MOVEI B,TVEC ; TYPE IS VECTOR [RSUBR OR RSUBR-ENTRY]
PUSHJ P,MARK
MFRAM1: MOVE A,PSAV-FSAV+1(C) ; MARK THE PSTACK
MOVEI B,TPDL
PUSHJ P,MARK
HRROI C,-FSAV+1(C) ; POINT PAST FRAME
JRST TPLP ; GO BACK TO START OF LOOP
; MARK A BINDING ON THE STACK [I.E. THE ATOM, VALUE, DECL, AND PREVIOUS BINDING]
MBIND: MOVEI B,TATOM ; START BY MARKING THE ATOM
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; POINT TO VALUE SLOT
PUSHJ P,MARK2 ; MARK THE VALUE
ADDI C,2 ; POINT TO DECL AND PREV BINDING
MOVEI B,TLIST ; MARK DECL
HLRZ A,(C)
PUSHJ P,MARK
SKIPL A,1(C) ; SKIP IF PREVIOUS BINDING
JRST NOTLCI
MOVEI B,TLOCI ; GET TYPE
PUSHJ P,MARK
NOTLCI: ADDI C,2 ; POINT PAST BINDING
JRST TPLP
PMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
IORM D,(C) ; MARK IT
JRST GCRET
; ROUTINE TO MARK TB POINTER
TBMK: HRRZS A ; CHECK FOR NIL POINTER
SKIPN A
JRST GCRET
MOVE A,TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK AB POINTERS
ABMK: HLRE B,A ; GET TO FRAME
SUB A,B
MOVE A,FRAMLN+TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK FRAME POINTERS
FRMK: HRLZ B,A ; GET THE TIME
HLRZ F,OTBSAV(A) ; GET TIME FROM FRAME
CAIE B,(F) ; SKIP IF TIMES AGREE
JRST GCRET ; IGNORE POINTER IF THEY DONT
HRRZ A,(C) ; GET POINTER TO PROCESS
SUBI A,1 ; FUDGE FOR VECTOR MARKING
MOVEI B,TPVP ; TYPE WORD
PUSHJ P,MARK
HRRZ A,1(C) ; GET POINTER TO FRAME
JRST TBMK ; MARK IT
; ROUTINE TO MARK ARGUMENT BLOCKS [TUPLES]
ARGMK: HLRE B,A ; GET LENGTH
SUB A,B ; POINT PAST BLOCK
CAIL A,STOSTR
CAMLE A,GCSTOP ; SEE IF IN GCSPACE
JRST GCRET
HRLZ 0,(A) ; GET TYPE
ANDI 0,TYPMSK ; FLUSH MONITORS
CAIE 0,TENTRY
CAIN 0,TCBLK
JRST ARGMK1 ; AT FRAME
CAIE 0,TINFO ; AT FRAME
JRST GCRET ; NOT A LEGAL TYPE GO AWAY
HRRZ A,1(A) ; POINTING TO FRAME
HRL A,(C) ; GET TIME
JRST TBMK
ARGMK1: HRRI A,FRAMLN(A) ; MAKE POINTER
HRL A,(C) ; GET TIME
JRST TBMK
; ROUTINE TO MARK GLOBAL SLOTS
GATOMK: HRRZ B,(C) ; GET POSSIBLE GDECL
JUMPE B,ATOMK ; NONE GO TO MARK ATOM
CAIN B,-1 ; SKIP IF NOT MANIFEST
JRST ATOMK
PUSH P,A ; I DOUBT THIS IS RIGHT, BUT IT WORKED ONCE--TAA
MOVEI C,(A)
MOVEI A,(B)
MOVEI B,TLIST ; TYPE WORD LIST
PUSHJ P,MARK ; MARK IT
POP P,A
JRST ATOMK5
ATOMK:
ATOMK5: HLRE B,A
SUB A,B ; A POINTS TO DOPE WORD
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET ; EXIT IF MARKED
HLRZ B,1(A)
SUBI B,3
HRLI B,1(B)
MOVEI C,-1(A)
SUB C,B ; IN CASE WAS DW
IORM D,1(A) ; MARK IT
HRRZ A,2(C) ; MARK OBLIST
CAMG A,VECBOT
JRST NOOBL ; NO IMPURE OBLIST
HRLI A,-1
MOVEI B,TOBLS ; MARK THE OBLIST
PUSHJ P,MARK
NOOBL: HLRZ A,2(C) ; GET NEXT ATOM
MOVEI B,TATOM
PUSHJ P,MARK
HLRZ B,(C) ; GET VALUE SLOT
TRZ B,400000 ; TURN OFF MARK BIT
SKIPE B ; SEE IF 0
CAIN B,TUNBOUN ; SEE IF UNBOUND
JRST GCRET
HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
MOVEI B,TVEC ; ASSUME VECTOR
SKIPE 0 ; SKIP IF VECTOR
MOVEI B,TTP ; IT IS A TP POINTER
PUSHJ P,MARK1 ; GO MARK IT
JRST GCRET
; ROUTINE TO MARK BYTE AND STRING POINTERS
BYTMK: PUSHJ P,BYTDOP ; GET TO DOPE WORD INTO A
HRLZ F,-1(A) ; SEE IF SPECIAL ATOM [SPNAME]
ANDI F,SATMSK ; GET SAT
CAIN F,SATOM
JRST ATMSET ; IT IS AN ATOM
IORM D,(A) ; MARK IT
JRST GCRET
ATMSET: HLRZ B,(A) ; GET LENGTH
TRZ B,400000 ; TURN OFF POSSIBLE MARK BIT
MOVNI B,-2(B) ; GENERATE AOBJN POINTER
ADDI A,-1(B) ; GET BACK TO BEGINNING
HRLI A,(B) ; PUT IN LEFT HALF
MOVEI B,TATOM ; MARK AS AN ATOM
PUSHJ P,MARK ; GO MARK
JRST GCRET
; MARK LOCID GOODIES
LOCMK: HRRZ B,(C) ; CHECK FOR TIME
JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
HRRZ 0,2(A) ; GET OTHER TIME
CAIE 0,(B) ; SAME?
JRST GCRET
MOVEI B,TTP
PUSHJ P,MARK1
JRST GCRET
LOCMK1: MOVEI B,TVEC ; GLOBAL
PUSHJ P,MARK1 ; MARK VALUE
JRST GCRET
; MARK ASSOCIATION BLOCK
ASMK: MOVEI C,(A) ; SAVE POINTER TO BEGINNING OF ASSOCATION
ADDI A,ASOLNT ; POINT TO DOPE WORD
HLRE B,1(A) ; GET SECOND D.W.
JUMPL B,GCRET ; MARKED SO LEAVE
IORM D,1(A) ; MARK ASSOCATION
PUSHJ P,MARK2 ; MARK ITEM
MOVEI C,INDIC(C)
PUSHJ P,MARK2
MOVEI C,VAL-INDIC(C)
PUSHJ P,MARK2
HRRZ A,NODPNT-VAL(C) ; GET NEXT IN CHAIN
JUMPN A,ASMK ; GO MARK IT
JRST GCRET
; MARK OFFSETS
OFFSMK: PUSH P,$TLIST
HLRZ 0,1(C) ; PICK UP LIST POINTER
PUSH P,0
MOVEI C,-1(P)
PUSHJ P,MARK2 ; MARK THE LIST
SUB P,[2,,2]
JRST GCRET ; AND RETURN
; HERE TO MARK TEMPLATE DATA STRUCTURES
TD.MK: HLRZ B,(A) ; GET REAL SPEC TYPE
ANDI B,37777 ; KILL SIGN BIT
MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
HRLI E,(E)
ADD E,TD.AGC+1
HRRZS C,A ; FLUSH COUNT AND SAVE
SKIPL E ; WITHIN BOUNDS
FATAL BAD SAT IN AGC
SKIPL 1(A) ; SEE IF MARKED
JRST GCRET ; IF MARKED LEAVE
IORM D,1(A)
SKIPE (E)
JRST USRAGC
SUB E,TD.AGC+1 ; POINT TO LENGTH
ADD E,TD.LNT+1
XCT (E) ; RET # OF ELEMENTS IN B
HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
PUSH P,[0] ; TEMP USED IF RESTS EXIST
PUSH P,D
MOVEI B,(B) ; ZAP TO ONLY LENGTH
PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
PUSH P,B ; SAVE
SUB E,TD.LNT+1
PUSH P,E ; SAVE FOR FINDING OTHER TABLES
JUMPE D,TD.MR2 ; NO REPEATING SEQ
ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
MOVNS E
HRLM E,-3(P) ; SAVE IT AND BASIC
TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
JRST TD.MR1
MOVE E,TD.GET+1
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVEM D,-4(P) ; SAVE ELMENT #
SKIPN B,-3(P) ; SKIP IF "RESTS" EXIST
SOJA D,TD.MR3
MOVEI 0,(B) ; BASIC LNT TO 0
SUBI 0,(D) ; SEE IF PAST BASIC
JUMPGE 0,.-3 ; JUMP IF O.K.
MOVSS B ; REP LNT TO RH, BASIC TO LH
IDIVI 0,(B) ; A==> -WHICH REPEATER
MOVNS A
ADD A,-3(P) ; PLUS BASIC
ADDI A,1 ; AND FUDGE
MOVEM A,-4(P) ; SAVE FOR PUTTER
ADDI E,-1(A) ; POINT
SOJA D,.+2
TD.MR3: ADDI E,(D) ; POINT TO SLOT
XCT (E) ; GET THIS ELEMENT INTO A AND B
JFCL ; NO-OP FOR ANY CASE
EXCH A,B ; REARRANGE
HLRZS B
MOVSI D,400000 ; RESET FOR MARK
PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
MOVE C,-2(P) ; RESTORE POINTER IN CASE MUNGED
JRST TD.MR2
TD.MR1: SUB P,[5,,5]
JRST GCRET
USRAGC: XCT (E) ; MARK THE TEMPLATE
JRST GCRET
; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
; AND UPDATES PTR TO THE TABLE.
GCRDMK: MOVEI C,(A) ; SAVE POINTER TO GCREAD TABLE
HLRE B,A ; GET TO DOPE WORD
SUB A,B
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET
SUBI A,2
MOVE B,ABOTN ; GET TOP OF ATOM TABLE
ADD B,0 ; GET BOTTOM OF ATOM TABLE
GCRD1: CAMG A,B ; DON'T SKIP IF DONE
JRST GCRET
HLRZ C,(A) ; GET MARKING
TRZN C,400000 ; SKIP IF MARKED
JRST GCRD3
MOVEI E,(A)
SUBI A,(C) ; GO BACK ONE ATOM
PUSH P,B ; SAVE B
PUSH P,A ; SAVE POINTER
MOVEI C,-2(E) ; SET UP POINTER
MOVEI B,TATOM ; GO TO MARK
MOVE A,1(C)
PUSHJ P,MARK
POP P,A
POP P,B
JRST GCRD1
GCRD3: SUBI A,(C) ; TO NEXT ATOM
JRST GCRD1
; ROUTINE TO FIX UP CHANNELS
CHNFLS: MOVEI 0,N.CHNS-1
MOVEI A,,CHNL1 ; SET UP POINTER
CHFL1: SKIPN B,1(A) ; GET POINTER TO CHANNEL
JRST CHFL2 ; NO CHANNEL LOOP TO NEXT
HLRE C,B ; POINT TO DOPE WORD OF CHANNEL
SUBI B,(C)
MOVEI F,TCHAN
HRLM F,(A) ; PUT TYPE BACK
SKIPL 1(B) ; SKIP IF MARKED
JRST FLSCH ; FLUSH THE CHANNEL
MOVEI F,1 ; MARK THE CHANNEL AS GOOD
HRRM F,(A) ; SMASH IT IN
CHFL2: ADDI A,2
SOJG 0,CHFL1
POPJ P, ; EXIT
FLSCH: HLLOS F,(A) ; -1 INTO SLOT INDICATES LOSSAGE
JRST CHFL2
; THIS ROUTINE MARKS ALL THE CHANNELS
CHFIX: MOVEI 0,N.CHNS-1
MOVEI A,CHNL1 ; SLOTS
DHNFL2: SKIPN 1(A)
JRST DHNFL1
PUSH P,0 ; SAVE 0
PUSH P,A ; SAVE A
MOVEI C,(A)
MOVE A,1(A)
MOVEI B,TCHAN
PUSHJ P,MARK
POP P,A ; RESTORE A
POP P,0 ; RESTORE
DHNFL1: ADDI A,2
SOJG 0,DHNFL2
POPJ P,
; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
; POINT.
FIXSEN: PUSH P,B ; SAVE TIME
MOVEI B,[ASCIZ /TIME= /]
PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
POP P,B ; RESTORE B
FMPRI B,(100.0) ; CONVERT TO FIX
MULI B,400
TSC B,B
ASH C,-163.(B)
MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
PUSH P,C
IDIVI C,10. ; START COUNTING
JUMPLE C,.+2
AOJA A,.-2
POP P,C
CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
JRST DOT1
FIXOUT: IDIVI C,10. ; RECOVER NUMBER
HRLM D,(P)
SKIPE C
PUSHJ P,FIXOUT
PUSH P,A ; SAVE A
CAIN A,2 ; DECIMAL POINT HERE?
JRST DOT2
FIX1: HLRZ A,(P)-1 ; GET NUMBER
ADDI A,60 ; MAKE IT A CHARACTER
PUSHJ P,IMTYO ; OUT IT GOES
POP P,A
SOJ A,
POPJ P,
DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
PUSHJ P,IMTYO
MOVEI A,"0
PUSHJ P,IMTYO
JRST FIXOUT ; CONTINUE
DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
PUSHJ P,IMTYO
JRST FIX1
; ROUTINE TO SEEP THROUGH GC SPACE LOOKING FOR FREE SLOTS. PAIRS ARE PLACED ON THE
; RCL LIST, VECTORS ON THE RCLV LIST.
SWEEP: MOVE C,GCSTOP ; GET TOP OF GC SPACE
SUBI C,1 ; POINT TO FIRST OBJECT
SETZB E,F ; CURRENT SLOT AND CURRENT LENGTH
LSWEEP: CAMG C,GCSBOT ; SKIP IF ABOVE GCSBOT
JRST ESWEEP ; DONE
HLRE A,-1(C) ; SEE IF LIST OR VECTOR
TRNE A,UBIT ; SKIP IF LIST
JRST VSWEEP ; IT IS A VECTOR
JUMPGE A,LSWP1 ; JUMP IF NOT MARKED
ANDCAM D,-1(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS ; CONS ON CURRENT OBJECT
SUBI C,2 ; SKIP OVER LIST
JRST LSWEEP
LSWP1: ADDI F,2 ; ADD TO CURRENT OBJECT COUNT
JUMPN E,LSWP2 ; JUMP IF CURRENT OBJECT EXISTS
MOVEI E,(C) ; GET ADDRESS
LSWP2: SUBI C,2
JRST LSWEEP
VSWEEP: HLRE A,(C) ; GET LENGTH
JUMPGE A,VSWP1 ; SKIP IF MARKED
ANDCAM D,(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS
ANDI A,377777 ; GET LENGTH PART
SUBI C,(A) ; GO PAST VECTOR
JRST LSWEEP
VSWP1: ADDI F,(A) ; ADD LENGTH
JUMPN E,VSWP2
MOVEI E,(C) ; GET NEW OBJECT LOCATION
VSWP2: SUBI C,(A) ; GO BACK PAST VECTOR
JRST LSWEEP
ESWEEP:
SWCONS: JUMPE E,CPOPJ
ADDM F,TOTCNT ; HACK TOTCNT
CAMLE F,MAXLEN ; SEE IF NEW MAXIMUM
MOVEM F,MAXLEN
CAIGE F,2 ; MAKE SURE AT LEAST TWO LONG
FATAL SWEEP FAILURE
CAIN F,2
JRST LCONS
SETZM (E)
MOVEI 0,(E)
SUBI 0,-1(F)
SETZM @0
HRLS 0
ADDI 0,1
BLT 0,-2(E)
HRRZ 0,RCLV ; GET VECTOR RECYCLE
HRRM 0,(E) ; SMASH INTO LINKING SLOT
HRRZM E,RCLV ; NEW RECYCLE SLOT
HRLM F,(E)
MOVSI F,UBIT
MOVEM F,-1(E)
SETZB E,F
POPJ P, ; DONE
LCONS: SETZM (E)
SUBI E,1
HRRZ 0,RCL ; GET RECYCLE LIST
HRRZM 0,(E) ; SMASH IN
HRRZM E,RCL
SETZB E,F
POPJ P,
; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
MSGGCT: [ASCIZ /USER CALLED- /]
[ASCIZ /FREE STORAGE- /]
[ASCIZ /TP-STACK- /]
[ASCIZ /TOP-LEVEL LOCALS- /]
[ASCIZ /GLOBAL VALUES- /]
[ASCIZ /TYPES- /]
[ASCIZ /STATIONARY IMPURE STORAGE- /]
[ASCIZ /P-STACK /]
[ASCIZ /BOTH STACKS BLOWN- /]
[ASCIZ /PURE STORAGE- /]
[ASCIZ /GC-RCALL- /]
; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
GCPAT: SPBLOK 100
EGCPAT: -1
MSGGFT: [ASCIZ /GC-READ /]
[ASCIZ /BLOAT /]
[ASCIZ /GROW /]
[ASCIZ /LIST /]
[ASCIZ /VECTOR /]
[ASCIZ /SET /]
[ASCIZ /SETG /]
[ASCIZ /FREEZE /]
[ASCIZ /PURE-PAGE LOADER /]
[ASCIZ /GC /]
[ASCIZ /INTERRUPT-HANDLER /]
[ASCIZ /NEWTYPE /]
[ASCIZ /PURIFY /]
CONSTANTS
HERE
CONSTANTS
OFFSET 0
ZZ==$.+1777
.LOP ANDCM ZZ 1777
ZZ1==.LVAL1
LOC ZZ1
OFFSET OFFS
MRKPDL==.-1
ENDGC:
OFFSET 0
ZZ2==ENDGC-AGCLD
.LOP <ASH @> ZZ2 <,-10.>
SLENGC==.LVAL1
.LOP <ASH @> SLENGC <10.>
RSLENG==.LVAL1
LOC GCST
.LPUR=$.
END

887
src/mudsys/amsgc.mid.110 Normal file
View File

@@ -0,0 +1,887 @@
TITLE AMSGC MUDDLE MARK SWEEP GARBAGE COLLECTOR
RELOCATABLE
.GLOBAL RCL,RCLV,IAMSGC,MAXLEN,REALGC,RGCLEN,GCFLG,SQUPNT,GCMONF,MSGTYP,GCCAUS
.GLOBAL GCCALL,PVSTOR,DSTORE,TYPVEC,N.CHNS,CHNL1,MAINPR,STOGC,CTIME,GCTIM,IMTYO
.GLOBAL FNMSGC,SATMSK,NUMSAT,NUMPRI,PURBOT,GCSTOP,GCSBOT,STOSTR,TYPMSK,PDLBUF,ITEM,INDIC
.GLOBAL VAL,NODPNT,UBIT,ASOLNT,GCHAPN,RBLDM,TOTCNT,MARK2S,MKTBS
.GLOBAL FRMUNG,BYTDOP,TD.GET,TD.LNT,TD.AGC,ABOTN,SLENGC,LENGC,REALGC,AGCLD,RLENGC
.GLOBAL RSLENG
GCST=$.
LOC REALGC+RLENGC
OFFS=AGCLD-$.
OFFSET OFFS
.INSRT MUDDLE >
TYPNT==AB
F==PVP
; THIS IS THE MUDDLE MARK SWEEP GARBAGE COLLECTOR. IT IS MUCH FASTER THAN THE COPYING
; GARBAGE COLLECTOR BUT DOESN'T COMPACT. IT CONSES FREE THINGS ONTO RCL AND RCLV.
; THIS GARBAGE COLLECTOR CAN ONLY BE USED IF THE GARBAGE COLLECT IS A FREE STORAGE
; GARBAGE COLLECT
; FIRST INITIALIZE VARIABLES
IAMSGC: SETZB M,RCL ; CLEAR OUT LIST RECYCLE AND RSUBR BASE
SETZM RCLV ; CLEAR VECTOR RECYCLE
SETZM MAXLEN ; CLEAR MAXIMUM LENGTH FOUND TO RECYCLE
SETOM GCFLG ; A GC HAS HAPPENED
SETZM TOTCNT
HLLZS SQUPNT ; CLEAR OUT SQUOZE TABLE
; SET UP MESSAGE PRINTING AND SAVE CAUSE AND CAUSER
PUSH P,A
PUSH P,B
PUSH P,C ; SAVE ACS
MOVEI B,[ASCIZ /MSGIN / ] ; PRINT GIN IF WINNING
SKIPE GCMONF
PUSHJ P,MSGTYP
HRRZ C,(P) ; GET CAUSE INDICATOR
ADDI B,1 ; AOS TO GET REAL CAUS
MOVEM B,GCCAUS
SKIPN GCMONF
JRST NOMON2
MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
PUSHJ P,MSGTYP
NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
MOVEM C,GCCALL
SKIPN GCMONF ; PRINT IF GCMON IS ON
JRST NOMON3
MOVE B,MSGGFT(C) ; GET POINTER TO MESSAGE
PUSHJ P,MSGTYP
NOMON3: SUB P,[1,,1]
POP P,B ; RESTORE ACS
POP P,A
; MOVE ACS INTO THE PVP
EXCH PVP,PVSTOR+1 ; GET REAL PROCESS VECTOR
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVEM AC,AC!STO+1(PVP)
TERMIN
MOVE 0,PVSTOR+1 ; GET OLD VALUE OF PVP
MOVEM 0,PVPSTO+1(PVP) ; SAVE PVP
MOVE 0,DSTORE ; SAVE D'S TYPE
MOVEM 0,DSTO(PVP)
MOVEM PVP,PVSTOR+1
; SET UP TYPNT TO POINT TO TYPE VECTOR
GETYP E,TYPVEC ; FIRST SEE IF TYPVEC IS A VECTOR
CAIE E,TVEC
FATAL TYPE VECTOR NOT OF TYPE VECTOR
HRRZ TYPNT,TYPVEC+1
HRLI TYPNT,B ; TYPNT IS NOW TYPEVECTOR(B)
; NOW SET UP GCPDL AND FENCE POST PDL'S
MOVEI A,(TB)
MOVE D,P ; SAVE P POINTER
PUSHJ P,FRMUNG
MOVE P,[-2000,,MRKPDL] ; SET UP MARK PDL
MOVEI A,(TB) ; FIXUP TOP FRAME
SETOM 1(TP) ; FENCEPOST TP
SETOM 1(D) ; FENCEPOST P
; NOW SETUP AUTO CHANNEL CLOSE
MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
MOVEI A,CHNL1 ; FIRST CHANNEL SLOT
CHNCLR: SKIPE 1(A) ; IS IT A CHANNEL
SETZM (A) ; CLEAR UP TYPE SLOT
ADDI A,2
SOJG 0,CHNCLR
; NOW DO MARK AND SWEEP PHASES
MOVSI D,400000 ; MARK BIT
MOVEI B,TPVP ; GET TYPE
MOVE A,PVSTOR+1 ; GET VALUE OF CURRENT PROCESS VECTOR
PUSHJ P,MARK
MOVEI B,TPVP ; GET TYPE OF MAIN PROCESS VECTOR
MOVE A,MAINPR
PUSHJ P,MARK ; MARK
PUSHJ P,CHNFLS ; DO CHANNEL FLUSHING
PUSHJ P,CHFIX
PUSHJ P,STOGC ; FIX UP FROZEN WORLD
PUSHJ P,SWEEP ; SWEEP WORLD
; PRINT GOUT
MOVEI B,[ASCIZ /MSGOUT /] ; PRINT OUT ENDING MESSAGE IF GCMONING
SKIPE GCMONF
PUSHJ P,MSGTYP
; RESTORE ACS
MOVE PVP,PVSTOR+1 ; GET PVP
IRP AC,,[0,A,B,C,D,E,TVP,SP,AB,TB,TP,FRM,M,R,P]
MOVE AC,AC!STO+1(PVP)
TERMIN
SKIPN DSTORE ; CLEAR OUT TYPE IF NO TYPE THERE
SETZM DSTO(PVP)
MOVE PVP,PVPSTO+1(PVP)
; PRINT TIME
PUSH P,A ; SAVE ACS
PUSH P,B
PUSH P,C
PUSH P,D
PUSHJ P,CTIME ; GET CURRENT CPU TIME
FSBR B,GCTIM ; COMPUTE TIME ELAPSED
MOVEM B,GCTIM ; SAVE TIME AWAY
SKIPN GCMONF ; PRINT IT OUT?
JRST GCCONT
PUSHJ P,FIXSEN
MOVEI A,15 ; OUTPUT CR/LF
PUSHJ P,IMTYO
MOVEI A,12
PUSHJ P,IMTYO
GCCONT: POP P,D ; RESTORE ACS
POP P,C
POP P,B
POP P,A
SETZM GCFLG
SETOM GCHAPN
SETOM INTFLG
PUSHJ P,RBLDM
JRST FNMSGC ; DONE
; THIS IS THE MARK PHASE
; GENERAL MARK ROUTINE, CALLED TO MARK ALL THINGS
; /A POINTER TO GOODIE
; /B TYPE OF GOODIE
; FOR MARK2, MARK1 /C POINTER TO PAIR NOT NEEDED FOR CALLS DIRECTLY TO MARK
MARK2S:
MARK2: HLRZ B,(C) ; TYPE
MARK1: MOVE A,1(C) ; VALUE
MARK: JUMPE A,CPOPJ ; DONE IF ZERO
MOVEI 0,1(A) ; SEE IF PURE
CAML 0,PURBOT
JRST CPOPJ
ANDI B,TYPMSK ; FLUSH MONITORS
HRLM C,(P)
CAIG B,NUMPRI ; IS A BASIC TYPE
JRST @MTYTBS(B) ; TYPE DISPATCH
LSH B,1 ; NOW GET PRIMTYPE
HRRZ B,@TYPNT ; GET PRIMTYPE
ANDI B,SATMSK ; FLUSH DOWN TO SAT
CAIG B,NUMSAT ; SKIP IF TEMPLATE DATA
JRST @MSATBS(B) ; JUMP OFF SAT TABLE
JRST TD.MK
GCRET: HLRZ C,(P) ; GET SAVED C
CPOPJ: POPJ P,
; TYPE DISPATCH TABLE
MTYTBS:
OFFSET 0
DUM1:
IRP XX,,[[TLOSE,GCRET],[TFIX,GCRET],[TFLOAT,GCRET],[TCHRS,GCRET]
[TENTRY,GCRET],[TSUBR,GCRET],[TFSUBR,GCRET],[TILLEG,GCRET],[TUNBOU,GCRET]
[TBIND,GCRET],[TTIME,GCRET],[TLIST,PAIRMK],[TFORM,PAIRMK],[TSEG,PAIRMK]
[TEXPR,PAIRMK],[TFUNAR,PAIRMK],[TLOCL,PAIRMK],[TFALSE,PAIRMK],[TDEFER,DEFQMK]
[TUVEC,UVMK],[TOBLS,UVMK],[TVEC,VECMK],[TCHAN,VECMK] ,[TLOCV,VECMK]
[TTVP,VECMK],[TBVL,VECMK],[TTAG,VECMK],[TPVP,VECMK],[TLOCI,TPMK],[TTP,TPMK]
[TSP,TPMK],[TMACRO,PAIRMK],[TPDL,PMK],[TARGS,ARGMK],[TAB,ABMK]
[TTB,TBMK],[TFRAME,FRMK],[TCHSTR,BYTMK],[TATOM,ATOMK],[TLOCD,LOCMK],[TBYTE,BYTMK]
[TENV,FRMK],[TACT,FRMK],[TASOC,ASMK],[TLOCU,UVMK],[TLOCS,BYTMK],[TLOCA,ARGMK]
[TCBLK,GCRET],[TTMPLT,TD.MK],[TLOCT,TD.MK],[TLOCR,GCRET],[TINFO,GCRET]
[TRDTB,GCRDMK],[TWORD,GCRET],[TRSUBR,VECMK],[TCODE,UVMK],[TSATC,GCRET]
[TBITS,GCRET],[TSTORA,UVMK],[TPICTU,UVMK],[TSKIP,TPMK],[TLINK,ATOMK]
[TDECL,PAIRMK],[TENTER,VECMK],[THAND,VECMK],[TINTH,VECMK],[TDISMI,ATOMK]
[TDCLI,PAIRMK],[TPCODE,GCRET],[TTYPEW,GCRET],[TTYPEC,GCRET]
[TGATOM,GATOMK],[TREADA,FRMK],[TUBIND,GCRET],[TUNWIN,TBMK],[TLOCB,BYTMK]
[TDEFQ,DEFQMK],[TSPLIC,PAIRMK],[TLOCN,ASMK],[TOFFS,OFFSMK]]
IRP A,B,[XX]
LOC DUM1+A
SETZ B
.ISTOP
TERMIN
TERMIN
LOC DUM1+NUMPRI+1
OFFSET OFFS
; SAT DISPATCH TABLE
MSATBS:
OFFSET 0
DISTB2 DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,UVMK],[STBASE,TBMK]
[STPSTK,TPMK],[SARGS,<SETZ ARGMK>],[S2NWORD,VECMK],[SPSTK,TPMK],[SSTORE,UVMK]
[SFRAME,<SETZ FRMK>],[SBYTE,<SETZ BYTMK>],[SATOM,ATOMK],[SPVP,VECMK],[SGATOM,GATOMK]
[SLOCID,<SETZ LOCMK>],[SCHSTR,<SETZ BYTMK>],[SASOC,ASMK],[SLOCL,PAIRMK],[SABASE,ABMK]
[SLOCA,<SETZ ARGMK>],[SLOCV,VECMK],[SLOCU,UVMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ASMK]
[SRDTB,GCRDMK],[SLOCB,<SETZ BYTMK>],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]
OFFSET OFFS
; ROUTINE TO MARK PAIRS
PAIRMK: MOVEI C,(A)
PAIRM1: CAMG C,GCSTOP ; SEE IF IN RANGE
CAIGE C,STOSTR
JRST BADPTR ; FATAL ERROR
HLRE B,(C) ; SKIP IF NOT MARKED
JUMPL B,GCRET
IORM D,(C) ; MARK IT
PUSHJ P,MARK1 ; MARK THE ITEM
HRRZ C,(C) ; GET NEXT ELEMENT OF LIST
JUMPE C,GCRET
CAML C,PURBOT
JRST GCRET
JRST PAIRM1
; ROUTINE TO MARK DEFERS
DEFMK: HLRE B,(A)
JUMPL B,GCRET
MOVEI C,(A)
IORM D,(C)
PUSHJ P,MARK1
JRST GCRET
; ROUTINE TO MARK POSSIBLE DEFERS DEF?
DEFQMK: GETYP B,(A) ; GET THE TYPE OF THE OBJECT
LSH B,1 ; COMPUTE THE SAT
HRRZ B,@TYPNT
ANDI B,SATMSK
SKIPL MKTBS(B) ; SKIP IF NOT DEFERED
JRST PAIRMK
JRST DEFMK ; GO TO DEFMK
; ROUTINE TO MARK VECTORS
VECMK: HLRE B,A ; GET LENGTH
SUB A,B
MOVEI C,1(A) ; POINT TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE B,(C)
JUMPL B,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(B) ; GET TO BEGINNING
VECMK1: HLRE B,(C) ; GET TYPE AND SKIP IF NOT DOPE WORD
JUMPL B,GCRET ; DONE
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; NEXT ELEMENT
JRST VECMK1
; ROUTINE TO MARK UVECTORS
UVMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE F,(C) ; GET LENGTH
JUMPL F,GCRET
IORM D,(C) ; MARK IT
GETYP B,-1(C) ; GET TYPE
MOVEI E,(B) ; COPY TYPE FOR SAT COMPUTATION
LSH B,1
HRRZ B,@TYPNT ; GET SAT
ANDI B,SATMSK
MOVEI B,@MSATBS(B) ; GET JUMP LOCATION
CAIN B,GCRET
JRST GCRET
SUBI C,(F) ; POINT TO BEGINNING OF UVECTOR
SUBI F,2
JUMPE F,GCRET
PUSH P,F ; SAVE LENGTH
PUSH P,E
UNLOOP: MOVE B,(P)
MOVE A,1(C) ; GET VALUE POINTER
PUSHJ P,MARK
SOSE -1(P) ; SKIP IF NON-ZERO
AOJA C,UNLOOP ; GO BACK AGAIN
SUB P,[2,,2] ; CLEAN OFF STACK
JRST GCRET
; ROUTINE TO INDICATE A BAD POINTER
BADPTR: FATAL POINTER POINTS OUT OF GARBAGE COLLECTED SPACE
JRST GCRET
; ROUTINE TO MARK A TPSTACK
TPMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
HLRE A,(C)
JUMPL A,GCRET
IORM D,(C) ; MARK IT
SUBI C,-1(A) ; GO TO BEGINNING
TPLP: HLRE B,(C) ; GET TYPE AND MARKING
JUMPL B,GCRET ; EXIT ON FENCE-POST
ANDI B,TYPMSK ; FLUSH MONITORS
CAIE B,TCBLK ; CHECK FOR FRAME
CAIN B,TENTRY
JRST MFRAME ; MARK THE FRAME
CAIE B,TUBIND ; BINDING BLOCK
CAIN B,TBIND
JRST MBIND
PUSHJ P,MARK1 ; NOTHING SPECIAL SO MARK IT
ADDI C,2 ; POINT TO NEXT OBJECT
JRST TPLP ; MARK IT
; MARK A FRAME ON THE STACK, [I.E. ITS FSAV AND PSAV SLOTS]
MFRAME: HRROI C,FRAMLN+FSAV-1(C) ; POINT TO FUNCTION
HRRZ A,1(C) ; GET POINTER
CAIL A,STOSTR ; SEE IF IN GC SPACE
CAMLE A,GCSTOP
JRST MFRAM1 ; SKIP OVER IT, NOT IN GC-SPACE
HRL A,(A) ; GET LENGTH
MOVEI B,TVEC ; TYPE IS VECTOR [RSUBR OR RSUBR-ENTRY]
PUSHJ P,MARK
MFRAM1: MOVE A,PSAV-FSAV+1(C) ; MARK THE PSTACK
MOVEI B,TPDL
PUSHJ P,MARK
HRROI C,-FSAV+1(C) ; POINT PAST FRAME
JRST TPLP ; GO BACK TO START OF LOOP
; MARK A BINDING ON THE STACK [I.E. THE ATOM, VALUE, DECL, AND PREVIOUS BINDING]
MBIND: MOVEI B,TATOM ; START BY MARKING THE ATOM
PUSHJ P,MARK1 ; MARK IT
ADDI C,2 ; POINT TO VALUE SLOT
PUSHJ P,MARK2 ; MARK THE VALUE
ADDI C,2 ; POINT TO DECL AND PREV BINDING
MOVEI B,TLIST ; MARK DECL
HLRZ A,(C)
PUSHJ P,MARK
SKIPL A,1(C) ; SKIP IF PREVIOUS BINDING
JRST NOTLCI
MOVEI B,TLOCI ; GET TYPE
PUSHJ P,MARK
NOTLCI: ADDI C,2 ; POINT PAST BINDING
JRST TPLP
PMK: HLRE B,A ; GET LENGTH
SUB A,B ; A POINTS TO FIRST DOPE WORD
MOVEI C,PDLBUF+1(A) ; C POINTS TO SECOND DOPE WORD
CAIL C,STOSTR ; CHECK FOR IN RANGE
CAMLE C,GCSTOP
JRST BADPTR
IORM D,(C) ; MARK IT
JRST GCRET
; ROUTINE TO MARK TB POINTER
TBMK: HRRZS A ; CHECK FOR NIL POINTER
SKIPN A
JRST GCRET
MOVE A,TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK AB POINTERS
ABMK: HLRE B,A ; GET TO FRAME
SUB A,B
MOVE A,FRAMLN+TPSAV(A) ; GET A TP POINTER
MOVEI B,TTP ; TYPE WORD
PUSHJ P,MARK
JRST GCRET
; ROUTINE TO MARK FRAME POINTERS
FRMK: HRLZ B,A ; GET THE TIME
HLRZ F,OTBSAV(A) ; GET TIME FROM FRAME
CAIE B,(F) ; SKIP IF TIMES AGREE
JRST GCRET ; IGNORE POINTER IF THEY DONT
HRRZ A,(C) ; GET POINTER TO PROCESS
SUBI A,1 ; FUDGE FOR VECTOR MARKING
MOVEI B,TPVP ; TYPE WORD
PUSHJ P,MARK
HRRZ A,1(C) ; GET POINTER TO FRAME
JRST TBMK ; MARK IT
; ROUTINE TO MARK ARGUMENT BLOCKS [TUPLES]
ARGMK: HLRE B,A ; GET LENGTH
SUB A,B ; POINT PAST BLOCK
CAIL A,STOSTR
CAMLE A,GCSTOP ; SEE IF IN GCSPACE
JRST GCRET
HRLZ 0,(A) ; GET TYPE
ANDI 0,TYPMSK ; FLUSH MONITORS
CAIE 0,TENTRY
CAIN 0,TCBLK
JRST ARGMK1 ; AT FRAME
CAIE 0,TINFO ; AT FRAME
JRST GCRET ; NOT A LEGAL TYPE GO AWAY
HRRZ A,1(A) ; POINTING TO FRAME
HRL A,(C) ; GET TIME
JRST TBMK
ARGMK1: HRRI A,FRAMLN(A) ; MAKE POINTER
HRL A,(C) ; GET TIME
JRST TBMK
; ROUTINE TO MARK GLOBAL SLOTS
GATOMK: HRRZ B,(C) ; GET POSSIBLE GDECL
JUMPE B,ATOMK ; NONE GO TO MARK ATOM
CAIN B,-1 ; SKIP IF NOT MANIFEST
JRST ATOMK
PUSH P,A ; I DOUBT THIS IS RIGHT, BUT IT WORKED ONCE--TAA
MOVEI C,(A)
MOVEI A,(B)
MOVEI B,TLIST ; TYPE WORD LIST
PUSHJ P,MARK ; MARK IT
POP P,A
JRST ATOMK5
ATOMK:
ATOMK5: HLRE B,A
SUB A,B ; A POINTS TO DOPE WORD
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET ; EXIT IF MARKED
HLRZ B,1(A)
SUBI B,3
HRLI B,1(B)
MOVEI C,-1(A)
SUB C,B ; IN CASE WAS DW
IORM D,1(A) ; MARK IT
HRRZ A,2(C) ; MARK OBLIST
CAMG A,VECBOT
JRST NOOBL ; NO IMPURE OBLIST
HRLI A,-1
MOVEI B,TOBLS ; MARK THE OBLIST
PUSHJ P,MARK
NOOBL: HLRZ A,2(C) ; GET NEXT ATOM
MOVEI B,TATOM
PUSHJ P,MARK
HLRZ B,(C) ; GET VALUE SLOT
TRZ B,400000 ; TURN OFF MARK BIT
SKIPE B ; SEE IF 0
CAIN B,TUNBOUN ; SEE IF UNBOUND
JRST GCRET
HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
MOVEI B,TVEC ; ASSUME VECTOR
SKIPE 0 ; SKIP IF VECTOR
MOVEI B,TTP ; IT IS A TP POINTER
PUSHJ P,MARK1 ; GO MARK IT
JRST GCRET
; ROUTINE TO MARK BYTE AND STRING POINTERS
BYTMK: PUSHJ P,BYTDOP ; GET TO DOPE WORD INTO A
HRLZ F,-1(A) ; SEE IF SPECIAL ATOM [SPNAME]
ANDI F,SATMSK ; GET SAT
CAIN F,SATOM
JRST ATMSET ; IT IS AN ATOM
IORM D,(A) ; MARK IT
JRST GCRET
ATMSET: HLRZ B,(A) ; GET LENGTH
TRZ B,400000 ; TURN OFF POSSIBLE MARK BIT
MOVNI B,-2(B) ; GENERATE AOBJN POINTER
ADDI A,-1(B) ; GET BACK TO BEGINNING
HRLI A,(B) ; PUT IN LEFT HALF
MOVEI B,TATOM ; MARK AS AN ATOM
PUSHJ P,MARK ; GO MARK
JRST GCRET
; MARK LOCID GOODIES
LOCMK: HRRZ B,(C) ; CHECK FOR TIME
JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
HRRZ 0,2(A) ; GET OTHER TIME
CAIE 0,(B) ; SAME?
JRST GCRET
MOVEI B,TTP
PUSHJ P,MARK1
JRST GCRET
LOCMK1: MOVEI B,TVEC ; GLOBAL
PUSHJ P,MARK1 ; MARK VALUE
JRST GCRET
; MARK ASSOCIATION BLOCK
ASMK: MOVEI C,(A) ; SAVE POINTER TO BEGINNING OF ASSOCATION
ADDI A,ASOLNT ; POINT TO DOPE WORD
HLRE B,1(A) ; GET SECOND D.W.
JUMPL B,GCRET ; MARKED SO LEAVE
IORM D,1(A) ; MARK ASSOCATION
PUSHJ P,MARK2 ; MARK ITEM
MOVEI C,INDIC(C)
PUSHJ P,MARK2
MOVEI C,VAL-INDIC(C)
PUSHJ P,MARK2
HRRZ A,NODPNT-VAL(C) ; GET NEXT IN CHAIN
JUMPN A,ASMK ; GO MARK IT
JRST GCRET
; MARK OFFSETS
OFFSMK: PUSH P,$TLIST
HLRZ 0,1(C) ; PICK UP LIST POINTER
PUSH P,0
MOVEI C,-1(P)
PUSHJ P,MARK2 ; MARK THE LIST
SUB P,[2,,2]
JRST GCRET ; AND RETURN
; HERE TO MARK TEMPLATE DATA STRUCTURES
TD.MK: HLRZ B,(A) ; GET REAL SPEC TYPE
ANDI B,37777 ; KILL SIGN BIT
MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
HRLI E,(E)
ADD E,TD.AGC+1
HRRZS C,A ; FLUSH COUNT AND SAVE
SKIPL E ; WITHIN BOUNDS
FATAL BAD SAT IN AGC
SKIPL 1(A) ; SEE IF MARKED
JRST GCRET ; IF MARKED LEAVE
IORM D,1(A)
SKIPE (E)
JRST USRAGC
SUB E,TD.AGC+1 ; POINT TO LENGTH
ADD E,TD.LNT+1
XCT (E) ; RET # OF ELEMENTS IN B
HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
PUSH P,[0] ; TEMP USED IF RESTS EXIST
PUSH P,D
MOVEI B,(B) ; ZAP TO ONLY LENGTH
PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
PUSH P,B ; SAVE
SUB E,TD.LNT+1
PUSH P,E ; SAVE FOR FINDING OTHER TABLES
JUMPE D,TD.MR2 ; NO REPEATING SEQ
ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
MOVNS E
HRLM E,-3(P) ; SAVE IT AND BASIC
TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
JRST TD.MR1
MOVE E,TD.GET+1
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVEM D,-4(P) ; SAVE ELMENT #
SKIPN B,-3(P) ; SKIP IF "RESTS" EXIST
SOJA D,TD.MR3
MOVEI 0,(B) ; BASIC LNT TO 0
SUBI 0,(D) ; SEE IF PAST BASIC
JUMPGE 0,.-3 ; JUMP IF O.K.
MOVSS B ; REP LNT TO RH, BASIC TO LH
IDIVI 0,(B) ; A==> -WHICH REPEATER
MOVNS A
ADD A,-3(P) ; PLUS BASIC
ADDI A,1 ; AND FUDGE
MOVEM A,-4(P) ; SAVE FOR PUTTER
ADDI E,-1(A) ; POINT
SOJA D,.+2
TD.MR3: ADDI E,(D) ; POINT TO SLOT
XCT (E) ; GET THIS ELEMENT INTO A AND B
JFCL ; NO-OP FOR ANY CASE
EXCH A,B ; REARRANGE
HLRZS B
MOVSI D,400000 ; RESET FOR MARK
PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
MOVE C,-2(P) ; RESTORE POINTER IN CASE MUNGED
JRST TD.MR2
TD.MR1: SUB P,[5,,5]
JRST GCRET
USRAGC: XCT (E) ; MARK THE TEMPLATE
JRST GCRET
; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
; AND UPDATES PTR TO THE TABLE.
GCRDMK: MOVEI C,(A) ; SAVE POINTER TO GCREAD TABLE
HLRE B,A ; GET TO DOPE WORD
SUB A,B
SKIPGE 1(A) ; SKIP IF NOT MARKED
JRST GCRET
IORM D,1(A) ; MARK THE CHOMPER!!!
SUBI A,2
MOVE B,ABOTN ; GET TOP OF ATOM TABLE
ADD B,0 ; GET BOTTOM OF ATOM TABLE
GCRD1: CAMG A,B ; DON'T SKIP IF DONE
JRST GCRET
HLRZ C,(A) ; GET MARKING
TRZN C,400000 ; SKIP IF MARKED
JRST GCRD3
MOVEI E,(A)
SUBI A,(C) ; GO BACK ONE ATOM
PUSH P,B ; SAVE B
PUSH P,A ; SAVE POINTER
MOVEI C,-2(E) ; SET UP POINTER
MOVEI B,TATOM ; GO TO MARK
MOVE A,1(C)
PUSHJ P,MARK
POP P,A
POP P,B
JRST GCRD1
GCRD3: SUBI A,(C) ; TO NEXT ATOM
JRST GCRD1
; ROUTINE TO FIX UP CHANNELS
CHNFLS: MOVEI 0,N.CHNS-1
MOVEI A,,CHNL1 ; SET UP POINTER
CHFL1: SKIPN B,1(A) ; GET POINTER TO CHANNEL
JRST CHFL2 ; NO CHANNEL LOOP TO NEXT
HLRE C,B ; POINT TO DOPE WORD OF CHANNEL
SUBI B,(C)
MOVEI F,TCHAN
HRLM F,(A) ; PUT TYPE BACK
SKIPL 1(B) ; SKIP IF MARKED
JRST FLSCH ; FLUSH THE CHANNEL
MOVEI F,1 ; MARK THE CHANNEL AS GOOD
HRRM F,(A) ; SMASH IT IN
CHFL2: ADDI A,2
SOJG 0,CHFL1
POPJ P, ; EXIT
FLSCH: HLLOS F,(A) ; -1 INTO SLOT INDICATES LOSSAGE
JRST CHFL2
; THIS ROUTINE MARKS ALL THE CHANNELS
CHFIX: MOVEI 0,N.CHNS-1
MOVEI A,CHNL1 ; SLOTS
DHNFL2: SKIPN 1(A)
JRST DHNFL1
PUSH P,0 ; SAVE 0
PUSH P,A ; SAVE A
MOVEI C,(A)
MOVE A,1(A)
MOVEI B,TCHAN
PUSHJ P,MARK
POP P,A ; RESTORE A
POP P,0 ; RESTORE
DHNFL1: ADDI A,2
SOJG 0,DHNFL2
POPJ P,
; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
; POINT.
FIXSEN: PUSH P,B ; SAVE TIME
MOVEI B,[ASCIZ /TIME= /]
PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
POP P,B ; RESTORE B
FMPRI B,(100.0) ; CONVERT TO FIX
MULI B,400
TSC B,B
ASH C,-163.(B)
MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
PUSH P,C
IDIVI C,10. ; START COUNTING
JUMPLE C,.+2
AOJA A,.-2
POP P,C
CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
JRST DOT1
FIXOUT: IDIVI C,10. ; RECOVER NUMBER
HRLM D,(P)
SKIPE C
PUSHJ P,FIXOUT
PUSH P,A ; SAVE A
CAIN A,2 ; DECIMAL POINT HERE?
JRST DOT2
FIX1: HLRZ A,(P)-1 ; GET NUMBER
ADDI A,60 ; MAKE IT A CHARACTER
PUSHJ P,IMTYO ; OUT IT GOES
POP P,A
SOJ A,
POPJ P,
DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
PUSHJ P,IMTYO
MOVEI A,"0
PUSHJ P,IMTYO
JRST FIXOUT ; CONTINUE
DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
PUSHJ P,IMTYO
JRST FIX1
; ROUTINE TO SEEP THROUGH GC SPACE LOOKING FOR FREE SLOTS. PAIRS ARE PLACED ON THE
; RCL LIST, VECTORS ON THE RCLV LIST.
SWEEP: MOVE C,GCSTOP ; GET TOP OF GC SPACE
SUBI C,1 ; POINT TO FIRST OBJECT
SETZB E,F ; CURRENT SLOT AND CURRENT LENGTH
LSWEEP: CAMG C,GCSBOT ; SKIP IF ABOVE GCSBOT
JRST ESWEEP ; DONE
HLRE A,-1(C) ; SEE IF LIST OR VECTOR
TRNE A,UBIT ; SKIP IF LIST
JRST VSWEEP ; IT IS A VECTOR
JUMPGE A,LSWP1 ; JUMP IF NOT MARKED
ANDCAM D,-1(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS ; CONS ON CURRENT OBJECT
SUBI C,2 ; SKIP OVER LIST
JRST LSWEEP
LSWP1: ADDI F,2 ; ADD TO CURRENT OBJECT COUNT
JUMPN E,LSWP2 ; JUMP IF CURRENT OBJECT EXISTS
MOVEI E,(C) ; GET ADDRESS
LSWP2: SUBI C,2
JRST LSWEEP
VSWEEP: HLRE A,(C) ; GET LENGTH
JUMPGE A,VSWP1 ; SKIP IF MARKED
ANDCAM D,(C) ; TURN OFF MARK BIT
PUSHJ P,SWCONS
ANDI A,377777 ; GET LENGTH PART
SUBI C,(A) ; GO PAST VECTOR
JRST LSWEEP
VSWP1: ADDI F,(A) ; ADD LENGTH
JUMPN E,VSWP2
MOVEI E,(C) ; GET NEW OBJECT LOCATION
VSWP2: SUBI C,(A) ; GO BACK PAST VECTOR
JRST LSWEEP
ESWEEP:
SWCONS: JUMPE E,CPOPJ
ADDM F,TOTCNT ; HACK TOTCNT
CAMLE F,MAXLEN ; SEE IF NEW MAXIMUM
MOVEM F,MAXLEN
CAIGE F,2 ; MAKE SURE AT LEAST TWO LONG
FATAL SWEEP FAILURE
CAIN F,2
JRST LCONS
SETZM (E)
MOVEI 0,(E)
SUBI 0,-1(F)
SETZM @0
HRLS 0
ADDI 0,1
BLT 0,-2(E)
HRRZ 0,RCLV ; GET VECTOR RECYCLE
HRRM 0,(E) ; SMASH INTO LINKING SLOT
HRRZM E,RCLV ; NEW RECYCLE SLOT
HRLM F,(E)
MOVSI F,UBIT
MOVEM F,-1(E)
SETZB E,F
POPJ P, ; DONE
LCONS: SETZM (E)
SUBI E,1
HRRZ 0,RCL ; GET RECYCLE LIST
HRRZM 0,(E) ; SMASH IN
HRRZM E,RCL
SETZB E,F
POPJ P,
; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
MSGGCT: [ASCIZ /USER CALLED- /]
[ASCIZ /FREE STORAGE- /]
[ASCIZ /TP-STACK- /]
[ASCIZ /TOP-LEVEL LOCALS- /]
[ASCIZ /GLOBAL VALUES- /]
[ASCIZ /TYPES- /]
[ASCIZ /STATIONARY IMPURE STORAGE- /]
[ASCIZ /P-STACK /]
[ASCIZ /BOTH STACKS BLOWN- /]
[ASCIZ /PURE STORAGE- /]
[ASCIZ /GC-RCALL- /]
; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
GCPAT: SPBLOK 100
EGCPAT: -1
MSGGFT: [ASCIZ /GC-READ /]
[ASCIZ /BLOAT /]
[ASCIZ /GROW /]
[ASCIZ /LIST /]
[ASCIZ /VECTOR /]
[ASCIZ /SET /]
[ASCIZ /SETG /]
[ASCIZ /FREEZE /]
[ASCIZ /PURE-PAGE LOADER /]
[ASCIZ /GC /]
[ASCIZ /INTERRUPT-HANDLER /]
[ASCIZ /NEWTYPE /]
[ASCIZ /PURIFY /]
CONSTANTS
HERE
CONSTANTS
OFFSET 0
ZZ==$.+1777
.LOP ANDCM ZZ 1777
ZZ1==.LVAL1
LOC ZZ1
OFFSET OFFS
MRKPDL==.-1
ENDGC:
OFFSET 0
ZZ2==ENDGC-AGCLD
.LOP <ASH @> ZZ2 <,-10.>
SLENGC==.LVAL1
.LOP <ASH @> SLENGC <10.>
RSLENG==.LVAL1
LOC GCST
.LPUR=$.
END

BIN
src/mudsys/arith.bin.4 Normal file

Binary file not shown.

856
src/mudsys/arith.mid.94 Normal file
View File

@@ -0,0 +1,856 @@
TITLE ARITHMETIC PRIMITIVES FOR MUDDLE
.GLOBAL HI,RLOW,CPLUS,CMINUS,CTIMES,CDIVID,CFIX,CFLOAT
.GLOBAL CLQ,CGQ,CLEQ,CGEQ,C1Q,C0Q,CMAX,CMIN,CABS,CMOD,CCOS,CSIN,CATAN,CLOG
.GLOBAL CEXP,CSQRT,CTIME,CORB,CXORB,CANDB,CEQVB,CRAND,CLSH,CROT,
.GLOBAL SAT,BFLOAT,FLGSET
;BKD
;DEFINES MUDDLE PRIMITIVES: FIX,FLOAT,ATAN,IEXP,LOG,
; G?,L?,0?,1?,+,-,*,/,MAX,MIN,ABS,SIN,COS,SQRT,RANDOM,
; TIME,SORT.
RELOCATABLE
.INSRT MUDDLE >
O=0
DEFINE TYP1
(AB) TERMIN
DEFINE VAL1
(AB)+1 TERMIN
DEFINE TYP2
(AB)+2 TERMIN
DEFINE VAL2
(AB)+3 TERMIN
DEFINE TYP3
(AB)+4 TERMIN
DEFINE VAL3
(AB)+5 TERMIN
DEFINE TYPN
(D) TERMIN
DEFINE VALN
(D)+1 TERMIN
YES: MOVSI A,TATOM ;RETURN PATH FOR 'TRUE'
MOVE B,IMQUOTE T
AOS (P)
POPJ P,
NO: MOVSI A,TFALSE ;RETURN PATH FOR 'FALSE'
MOVEI B,NIL
POPJ P,
;ERROR RETURNS AND OTHER UTILITY ROUTINES
OVRFLW==10
OVRFLD: ERRUUO EQUOTE OVERFLOW
CARGCH: GETYP 0,A ; GET TYPE
CAIN 0,TFLOAT
POPJ P,
JSP A,BFLOAT
POPJ P,
ARGCHK: ;CHECK FOR SINGLE FIXED OR FLOATING
;ARGUMENT IF FIXED CONVERT TO FLOATING
;RETURN FLOATING ARGRUMENT IN B ALWAYS
ENTRY 1
GETYP C,TYP1
MOVE B,VAL1
CAIN C,TFLOAT ;FLOATING?
POPJ P, ;YES, RETURN
CAIE C,TFIX ;FIXED?
JRST WTYP1 ;NO, ERROR
JSP A,BFLOAT ;YES, CONVERT TO FLOATING AND RETURN
POPJ P,
OUTRNG: ERRUUO EQUOTE ARGUMENT-OUT-OF-RANGE
NSQRT: ERRUUO EQUOTE NEGATIVE-ARGUMENT
DEFINE MFLOAT AC
IDIVI AC,400000
FSC AC+1,233
FSC AC,254
FADR AC,AC+1
TERMIN
BFLOAT: MFLOAT B
JRST (A)
OFLOAT: MFLOAT O
JRST (C)
BFIX: MULI B,400
TSC B,B
ASH C,(B)-243
MOVE B,C
JRST (A)
;DISPATCH TABLES USED TO CONTROL THE FLOW OF THE VARIOUS PRIMITIVES
TABLE2: SETZ NO ;TABLE2 (0)
TABLE3: SETZ YES ;TABLE2 (1) & TABLE3 (0)
SETZ NO ;TABLE2 (2)
SETZ YES
SETZ NO
TABLE4: SETZ NO
SETZ NO
SETZ YES
SETZ YES
FUNC: JSP A,BFIX
JSP A,BFLOAT
SUB B,VALN
IDIV B,VALN
ADD B,VALN
IMUL B,VALN
JSP C,SWITCH
JSP C,SWITCH
FLFUNC==.-2
FSBR B,O
FDVR B,O
FADR B,O
FMPR B,O
JSP C,FLSWCH
JSP C,FLSWCH
DEFVAL==.-2
0
1
0
1
377777,,-1
400000,,1
DEFTYP==.-2
TFIX,,
TFIX,,
TFIX,,
TFIX,,
TFLOAT,,
TFLOAT,,
;PRIMITIVES FLOAT AND FIX
IMFUNCTION FIX,SUBR
ENTRY 1
JSP C,FXFL
MOVE B,1(AB)
CAIE A,TFIX
JSP A,BFIX
MOVSI A,TFIX
JRST FINIS
IMFUNCTION FLOAT,SUBR
ENTRY 1
JSP C,FXFL
MOVE B,1(AB)
CAIE A,TFLOAT
JSP A,BFLOAT
MOVSI A,TFLOAT
JRST FINIS
CFIX: GETYP 0,A
CAIN 0,TFIX
POPJ P,
JSP A,BFIX
MOVSI A,TFIX
POPJ P,
CFLOAT: GETYP 0,A
CAIN 0,TFLOAT
POPJ P,
JSP A,BFLOAT
MOVSI A,TFLOAT
POPJ P,
FXFL: GETYP A,(AB)
CAIE A,TFIX
CAIN A,TFLOAT
JRST (C)
JRST WTYP1
MFUNCTION ABS,SUBR
ENTRY 1
GETYP A,TYP1
CAIE A,TFIX
CAIN A,TFLOAT
JRST MOVIT
JRST WTYP1
MOVIT: MOVM B,VAL1 ;GET ABSOLUTE VALUE OF ARGUMENT
AFINIS: HRLZS A ;MOVE TYPE CODE INTO LEFT HALF
JRST FINIS
MFUNCTION MOD,SUBR
ENTRY 2
GETYP A,TYP1
CAIE A,TFIX ;FIRST ARG FIXED ?
JRST WTYP1
GETYP A,TYP2
CAIE A,TFIX ;SECOND ARG FIXED ?
JRST WTYP2
MOVE A,VAL1
IDIV A,VAL2 ;FORM QUOTIENT & REMAINDER
JUMPGE B,.+2 ;Only return positive remainders
ADD B,VAL2
MOVSI A,TFIX
JRST FINIS
;PRIMITIVES PLUS, DIFFERENCE, TIMES, DIVIDE, MIN, AND MAX
MFUNCTION MIN,SUBR
ENTRY
MOVEI E,6
JRST GOPT
IMFUNCTION MAX,SUBR
ENTRY
MOVEI E,7
JRST GOPT
MFUNCTION DIVIDE,SUBR,[/]
ENTRY
MOVEI E,3
JRST GOPT
MFUNCTION DIFFERENCE,SUBR,[-]
ENTRY
MOVEI E,2
JRST GOPT
IMFUNCTION TIMES,SUBR,[*]
ENTRY
MOVEI E,5
JRST GOPT
MFUNCTION PLUS,SUBR,[+]
ENTRY
MOVEI E,4
GOPT: MOVE D,AB ;ARGUMENT POINTER
HLRE A,AB
MOVMS A
ASH A,-1
PUSHJ P,CARITH
JRST FINIS
; BUILD COMPILER ENTRIES TO THESE ROUTINES
IRP NAME,,[CMINUS,CDIVID,CPLUS,CTIMES,CMIN,CMAX]CODE,,[2,3,4,5,6,7]
NAME: MOVEI E,CODE
JRST CARIT1
TERMIN
CARIT1: MOVEI D,(A)
ASH D,1 ; TIMES 2
HRLI D,(D)
SUBM TP,D ; POINT TO ARGS
PUSH TP,$TTP
AOBJN D,.+1
PUSH TP,D
PUSHJ P,CARITH
MOVE TP,(TP)
SUB TP,[1,,1]
POPJ P,
CARITH: MOVE B,DEFVAL(E) ; GET VAL
JFCL OVRFLW,.+1
MOVEI 0,TFIX ; FIX UNTIL CHANGE
JUMPN A,ARITH0 ; AT LEAST ONE ARG
MOVE A,DEFTYP(E)
POPJ P,
ARITH0: SOJE A,ARITH1 ; FALL IN WITH ONE ARG
MOVE B,1(D)
GETYP C,(D) ; TYPE OF 1ST ARG
ADD D,[2,,2] ; GO TO NEXT
CAIN C,TFLOAT
JRST ARITH3
CAIN C,TFIX
JRST ARITH1
JRST WRONGT
ARITH1: GETYP C,0(D) ; GET NEXT TYPE
CAIE C,TFIX
JRST ARITH2 ; TO FLOAT LOOP
XCT FUNC(E) ; DO IT
ADD D,[2,,2]
SOJG A,ARITH1 ; KEEP ADDING OR WHATEVER
SKIPE OVFLG
JFCL OVRFLW,OVRFLD
MOVSI A,TFIX
POPJ P,
ARITH3: GETYP C,0(D)
MOVE 0,1(D) ; GET ARG
CAIE C,TFIX
JRST ARITH4
PUSH P,A
JSP C,OFLOAT ; FLOAT IT
POP P,A
JRST ARITH5
ARITH4: CAIE C,TFLOAT
JRST WRONGT
JRST ARITH5
ARITH2: CAIE C,TFLOAT ; FLOATER?
JRST WRONGT
PUSH P,A
JSP A,BFLOAT
POP P,A
MOVE 0,1(D)
ARITH5: XCT FLFUNC(E)
ADD D,[2,,2]
SOJG A,ARITH3
SKIPE OVFLG
JFCL OVRFLW,OVRFLD
MOVSI A,TFLOAT
POPJ P,
SWITCH: XCT COMPAR(E) ;FOR MAX & MIN TESTING
MOVE B,VALN
JRST (C)
COMPAR==.-6
CAMLE B,VALN
CAMGE B,VALN
FLSWCH: XCT FLCMPR(E)
MOVE B,O
JRST (C)
FLCMPR==.-6
CAMLE B,O
CAMGE B,O
;PRIMITIVES ONEP AND ZEROP
MFUNCTION ONEP,SUBR,[1?]
MOVEI E,1
JRST JOIN
MFUNCTION ZEROP,SUBR,[0?]
MOVEI E,
JOIN: ENTRY 1
GETYP A,TYP1
CAIN A,TFIX ;fixed ?
JRST TESTFX
CAIE A,TFLOAT ;floating ?
JRST WTYP1
MOVE B,VAL1
CAMN B,NUMBR(E) ;equal to correct value ?
JRST YES1
JRST NO1
TESTFX: CAMN E,VAL1 ;equal to correct value ?
JRST YES1
NO1: MOVSI A,TFALSE
MOVEI B,0
JRST FINIS
YES1: MOVSI A,TATOM
MOVE B,IMQUOTE T
JRST FINIS
NUMBR: 0 ;FLOATING PT ZERO
201400,,0 ;FLOATING PT ONE
;PRIMITIVES LESSP AND GREATERP
MFUNCTION LEQP,SUBR,[L=?]
MOVEI E,3
JRST ARGS
MFUNCTION GEQP,SUBR,[G=?]
MOVEI E,2
JRST ARGS
MFUNCTION LESSP,SUBR,[L?]
MOVEI E,1
JRST ARGS
MFUNCTION GREATERP,SUBR,[G?]
MOVEI E,0
ARGS: ENTRY 2
MOVE B,VAL1
MOVE A,TYP1
GETYP 0,A
PUSHJ P,CMPTYP
JRST WTYP1
MOVE D,VAL2
MOVE C,TYP2
GETYP 0,C
PUSHJ P,CMPTYP
JRST WTYP2
PUSHJ P,ACOMPS
JFCL
JRST FINIS
; COMPILERS ENTRIES TO THESE GUYS
IRP NAME,,[CGQ,CLQ,CGEQ,CLEQ]COD,,[0,1,2,3]
NAME: MOVEI E,COD
JRST ACOMPS
TERMIN
ACOMPS: GETYP A,A
GETYP 0,C
CAIE 0,(A)
JRST COMPD ; COMPARING FIX AND FLOAT
TEST: CAMN B,D
JRST @TABLE4(E)
CAMG B,D
JRST @TABLE2(E)
JRST @TABLE3(E)
CMPTYP: CAIE 0,TFIX
CAIN 0,TFLOAT
AOS (P)
POPJ P,
COMPD: EXCH B,D
CAIN A,TFLOAT
JSP A,BFLOAT
EXCH B,D
CAIN 0,TFLOAT
JSP A,BFLOAT
COMPF: JRST TEST
MFUNCTION RANDOM,SUBR
ENTRY
HLRE A,AB
CAMGE A,[-4] ;At most two arguments to random to set seeds
JRST TMA
JRST RANDGO(A)
MOVE B,VAL2 ;Set second seed
MOVEM B,RLOW
MOVE A,VAL1 ;Set first seed
MOVEM A,RHI
RANDGO: PUSHJ P,CRAND
JRST FINIS
CRAND: MOVE A,RHI
MOVE B,RLOW
MOVEM A,RLOW ;Update Low seed
LSHC A,-1 ;Shift both right one bit
XORB B,RHI ;Generate output and update High seed
MOVSI A,TFIX
POPJ P,
MFUNCTION SQRT,SUBR
PUSHJ P,ARGCHK
JUMPL B,NSQRT
PUSHJ P,ISQRT
JRST FINIS
ISQRT: MOVE A,B
ASH B,-1
FSC B,100
SQ2: MOVE C,B ;NEWTON'S METHOD, SPECINER'S HACK.
FDVRM A,B
FADRM C,B
FSC B,-1
CAME C,B
JRST SQ2
MOVSI A,TFLOAT
POPJ P,
MFUNCTION COS,SUBR
PUSHJ P,ARGCHK
FADR B,[1.570796326] ;COS(X)=SIN (X+PI/2)
PUSHJ P,.SIN
MOVSI A,TFLOAT
JRST FINIS
MFUNCTION SIN,SUBR
PUSHJ P,ARGCHK
PUSHJ P,.SIN
MOVSI A,TFLOAT
JRST FINIS
.SIN: MOVM A,B
CAMG A,[.0001]
POPJ P, ;GOSPER'S RECURSIVE SIN.
FDVR B,[-3.0] ;SIN(X)=4*SIN(X/-3)**3-3*SIN(X/-3)
PUSHJ P,.SIN
FSC A,1
FMPR A,A
FADR A,[-3.0]
FMPRB A,B
POPJ P,
CSQRT: PUSHJ P,CARGCH
JUMPL B,NSQRT
JRST ISQRT
CSIN: PUSHJ P,CARGCH
CSIN1: PUSHJ P,.SIN
MOVSI A,TFLOAT
POPJ P,
CCOS: PUSHJ P,CARGCH
FADR B,[1.570796326]
JRST CSIN1
MFUNCTION LOG,SUBR
PUSHJ P,ARGCHK ;LEAVES ARGUMENT IN B
PUSHJ P,ILOG
JRST FINIS
CLOG: PUSHJ P,CARGCH
ILOG: JUMPLE B,OUTRNG
LDB D,[331100,,B] ;GRAB EXPONENT
SUBI D,201 ;REMOVE BIAS
TLZ B,777000 ;SET EXPONENT
TLO B,201000 ; TO 1
MOVE A,B
FSBR A,RT2
FADR B,RT2
FDVB A,B
FMPR B,B
MOVE C,[0.434259751]
FMPR C,B
FADR C,[0.576584342]
FMPR C,B
FADR C,[0.961800762]
FMPR C,B
FADR C,[2.88539007]
FMPR C,A
FADR C,[0.5]
MOVE B,D
FSC B,233
FADR B,C
FMPR B,[0.693147180] ;LOG E OF 2
MOVSI A,TFLOAT
POPJ P,
RT2: 1.41421356
MFUNCTION ATAN,SUBR
PUSHJ P,ARGCHK
PUSHJ P,IATAN
JRST FINIS
CATAN: PUSHJ P,CARGCH
IATAN: PUSH P,B
MOVM D,B
CAMG D,[0.4^-8] ;SMALL ENOUGH SO ATAN(X)=X?
JRST ATAN3 ;YES
CAML D,[7.0^7] ;LARGE ENOUGH SO THAT ATAN(X)=PI/2?
JRST ATAN1 ;YES
MOVN C,[1.0]
CAMLE D,[1.0] ;IS ABS(X)<1.0?
FDVM C,D ;NO,SCALE IT DOWN
MOVE B,D
FMPR B,B
MOVE C,[1.44863154]
FADR C,B
MOVE A,[-0.264768620]
FDVM A,C
FADR C,B
FADR C,[3.31633543]
MOVE A,[-7.10676005]
FDVM A,C
FADR C,B
FADR C,[6.76213924]
MOVE B,[3.70925626]
FDVR B,C
FADR B,[0.174655439]
FMPR B,D
JUMPG D,ATAN2 ;WAS ARG SCALED?
FADR B,PI2 ;YES, ATAN(X)=PI/2-ATAN(1/X)
JRST ATAN2
ATAN1: MOVE B,PI2
ATAN2: SKIPGE (P) ;WAS INPUT NEGATIVE?
MOVNS B ;YES,COMPLEMENT
ATAN3: MOVSI A,TFLOAT
SUB P,[1,,1]
POPJ P,
PI2: 1.57079632
MFUNCTION IEXP,SUBR,[EXP]
PUSHJ P,ARGCHK ;LEAVE FLOATING POINT ARG IN B
PUSHJ P,IIEXP
JRST FINIS
CEXP: PUSHJ P,CARGCH
IIEXP: PUSH P,B
MOVM A,B
SETZM B
FMPR A,[0.434294481] ;LOG BASE 10 OF E
MOVE D,[1.0]
CAMG A,D
JRST RATEX
MULI A,400
ASHC B,-243(A)
CAILE B,43
JRST OUTRNG
CAILE B,7
JRST EXPR2
EXPR1: FMPR D,FLOAP1(B)
LDB A,[103300,,C]
SKIPE A
TLO A,177000
FADR A,A
RATEX: MOVEI B,7
SETZM C
RATEY: FADR C,COEF2-1(B)
FMPR C,A
SOJN B,RATEY
FADR C,[1.0]
FMPR C,C
FMPR D,C
MOVE B,[1.0]
SKIPL (P) ;SKIP IF INPUT NEGATIVE
SKIPN B,D
FDVR B,D
MOVSI A,TFLOAT
SUB P,[1,,1]
POPJ P,
EXPR2: LDB E,[030300,,B]
ANDI B,7
MOVE D,FLOAP1(E)
FMPR D,D ;TO THE 8TH POWER
FMPR D,D
FMPR D,D
JRST EXPR1
COEF2: 1.15129278
0.662730884
0.254393575
0.0729517367
0.0174211199
2.55491796^-3
9.3264267^-4
FLOAP1: 1.0
10.0
100.0
1000.0
10000.0
100000.0
1000000.0
10000000.0
;LSH AND ROT (ERB WOULD BE PLEASED) PDL 2/22/79
MFUNCTION %LSH,SUBR,LSH
ENTRY 2
MOVE C,[LSH B,(A)]
JRST LSHROT
MFUNCTION %ROT,SUBR,ROT
ENTRY 2
MOVE C,[ROT B,(A)]
LSHROT: GETYP A,(AB)
PUSHJ P,SAT
CAIE A,S1WORD
JRST WRONGT
GETYP A,2(AB)
CAIE A,TFIX
JRST WTYP2
MOVE A,3(AB)
MOVE B,1(AB)
XCT C
MOVE A,$TWORD
JRST FINIS
;BITWISE BOOLEAN FUNCTIONS
MFUNCTION %ANDB,SUBR,ANDB
ENTRY
HRREI B,-1 ;START ANDING WITH ALL ONES
MOVE D,[AND B,A] ;LOGICAL INSTRUCTION
JRST LOGFUN ;DO THE OPERATION
MFUNCTION %ORB,SUBR,ORB
ENTRY
MOVEI B,0
MOVE D,[IOR B,A]
JRST LOGFUN
MFUNCTION %XORB,SUBR,XORB
ENTRY
MOVEI B,0
MOVE D,[XOR B,A]
JRST LOGFUN
MFUNCTION %EQVB,SUBR,EQVB
ENTRY
HRREI B,-1
MOVE D,[EQV B,A]
LOGFUN: JUMPGE AB,ZROARG
LOGTYP: GETYP A,(AB) ;GRAB THE TYPE
PUSHJ P,SAT ;STORAGE ALLOCATION TYPE
CAIE A,S1WORD
JRST WRONGT ;WRONG TYPE...LOSE
MOVE A,1(AB) ;LOAD ARG INTO A
XCT D ;DO THE LOGICAL OPERATION
AOBJP AB,.+2 ;ADD ONE TO BOTH HALVES
AOBJN AB,LOGTYP ;ADD AGAIN AND LOOP IF NEEDED
ZROARG: MOVE A,$TWORD
JRST FINIS
REPEAT 0,[
;routine to sort lists or vectors of either fixed point or floating numbers
;the components are interchanged repeatedly to acheive the sort
;first arg: the structure to be sorted
;if no second arg sort in descending order
;second arg: if false then sort in ascending order
; else sort in descending order
MFUNCTION SORT,SUBR
ENTRY
HLRZ A,AB
CAIGE A,-4 ;Only two arguments allowed
JRST TMA
MOVE O,DESCEND ;Set up "O" to test for descending order as default condition
CAIE A,-4 ;Optional second argument?
JRST .+4
GETYP B,TYP2 ;See if it is other than false
CAIN B,TFALSE
MOVE O,ASCEND ;Set up "O" to test for ascending order
GETYP A,TYP1 ;CHECK TYPE OF FIRST ARGUMENT
CAIN A,TLIST
JRST LSORT
CAIN A,TVEC
JRST VSORT
JRST WTYP1
GOBACK: MOVE A,TYP1 ;RETURN THE SORTED ARGUMENT AS VALUE
MOVE B,VAL1
JRST FINIS
DESCEND: CAMG C,(A)+1
ASCEND: CAML C,(A)+1
;ROUTINE TO SORT LISTS IN NUMERICAL ORDER
LSORT: MOVE A,VAL1
JUMPE A,GOBACK ;EMPTY LIST?
HLRZ B,(A) ;TYPE OF FIRST COMPONENT
CAIE B,TFIX
CAIN B,TFLOAT
SKIPA
JRST WRONGT
MOVEI E,0 ;FOR COUNT OF LENGTH OF LIST
LCOUNT: JUMPE A,LLSORT ;REACHED END OF LIST?
MOVE A,(A) ;NEXT COMPONENT
TLZ A,(B) ;SAME TYPE AS FIRST COMPONENT?
TLNE A,-1
JRST WRONGT
AOJA E,LCOUNT ;INCREMENT COUNT AND CONTINUE
LLSORT: SOJE E,GOBACK ;FINISHED WITH SORTING?
HRRZ A,VAL1 ;START THIS LOOP OF SORTING AT THE BEGINNING
MOVEM E,(P)+1 ;Save the iteration depth
CLSORT: HRRZ B,(A) ;NEXT COMPONENT
MOVE C,(B)+1 ;ITS VALUE
XCT O ;ARE THESE TWO COMPONENTS IN ORDER?
JRST .+4
MOVE D,(A)+1 ;INTERCHANGE THEM
MOVEM D,(B)+1
MOVEM C,(A)+1
MOVE A,B ;MAKE THE COMPONENT IN "B" THE CURRENT ONE
SOJG E,CLSORT
MOVE E,(P)+1 ;Restore the iteration depth
JRST LLSORT
;ROUTINE TO SORT VECTORS IN NUMERICAL ORDER
VSORT: HLRE D,VAL1 ;GET COUNT FIELD OF VECTOR
IDIV D,[-2] ;LENGTH
JUMPE D,GOBACK ;EMPTY VECTOR?
MOVE E,D ;SAVE LENGTH IN "E"
HRRZ A,VAL1 ;POINTER TO VECTOR
MOVE B,(A) ;TYPE OF FIRST COMPONENT
CAME B,$TFIX
CAMN B,$TFLOAT
SKIPA
JRST WRONGT
SOJLE D,GOBACK ;IF ONLY ONE COMPONENT THEN FINISHED
VCOUNT: ADDI A,2 ;CHECK NEXT COMPONENT
CAME B,(A) ;SAME TYPE AS FIRST COMPONENT?
JRST WRONGT
SOJG D,VCOUNT ;CONTINUE WITH NEXT COMPONENT
VVSORT: SOJE E,GOBACK ;FINISHED SORTING?
HRRZ A,VAL1 ;START THIS LOOP OF SORTING AT THE BEGINNING
MOVEM E,(P)+1 ;Save the iteration depth
CVSORT: MOVE C,(A)+3 ;VALUE OF NEXT COMPONENT
XCT O ;ARE THESE TWO COMPONENTS IN ORDER?
JRST .+4
MOVE D,(A)+1 ;INTERCHANGE THEM
MOVEM D,(A)+3
MOVEM C,(A)+1
ADDI A,2 ;UPDATE THE CURRENT COMPONENT
SOJG E,CVSORT
MOVE E,(P)+1 ;Restore the iteration depth
JRST VVSORT
]
MFUNCTION OVERFLOW,SUBR
ENTRY
MOVEI E,OVFLG
JRST FLGSET
MFUNCTION TIME,SUBR
ENTRY
PUSHJ P,CTIME
JRST FINIS
IMPURE
RHI: 267762113337
RLOW: 155256071112
OVFLG: -1
PURE
END

115
src/mudsys/assem.all.7 Normal file
View File

@@ -0,0 +1,115 @@
LOGIN CLRt
CONN INT:
MIDAS
AGC BIN_AGC MID
RESET MIDAS
MIDAS
AGCMRK BIN_AGCMRK MID
RESET MIDAS
MIDAS
AMSGC BIN_AMSGC MID
RESET MIDAS
MIDAS
ARITH BIN_ARITH MID
RESET MIDAS
MIDAS
ATOMHK BIN_ATOMHK MID
RESET MIDAS
MIDAS
BUFMOD BIN_BUFMOD MID
RESET MIDAS
MIDAS
CORE BIN_CORE MID
RESET MIDAS
MIDAS
CREATE BIN_CREATE MID
RESET MIDAS
MIDAS
DECL BIN_DECL MID
RESET MIDAS
MIDAS
EVAL BIN_EVAL MID
RESET MIDAS
MIDAS
FOPEN BIN_FOPEN MID
RESET MIDAS
MIDAS
GCHACK BIN_GCHACK MID
RESET MIDAS
MIDAS
INITM BIN_INITM MID
RESET MIDAS
MIDAS
INTERR BIN_INTERR MID
RESET MIDAS
MIDAS
IPC BIN_IPC MID
RESET MIDAS
MIDAS
LDGC BIN_LDGC MID
RESET MIDAS
MIDAS
MAIN BIN_MAIN MID
RESET MIDAS
MIDAS
MAPPUR BIN_MAPPUR MID
RESET MIDAS
MIDAS
MAPS BIN_MAPS MID
RESET MIDAS
MIDAS
MUDEX BIN_MUDEX MID
RESET MIDAS
MIDAS
MUDITS BIN_MUDITS MID
RESET MIDAS
MIDAS
MUDSQU BIN_MUDSQU MID
RESET MIDAS
MIDAS
NFREE BIN_NFREE MID
RESET MIDAS
MIDAS
PRIMIT BIN_PRIMIT MID
RESET MIDAS
MIDAS
PRINT BIN_PRINT MID
RESET MIDAS
MIDAS
PURE BIN_PURE MID
RESET MIDAS
MIDAS
PUTGET BIN_PUTGET MID
RESET MIDAS
MIDAS
PXCORE BIN_PXCORE MID
RESET MIDAS
MIDAS
READCH BIN_READCH MID
RESET MIDAS
MIDAS
READER BIN_READER MID
RESET MIDAS
MIDAS
SAVE BIN_SAVE MID
RESET MIDAS
MIDAS
SPECS BIN_SPECS MID
RESET MIDAS
MIDAS
STBUIL BIN_STBUIL MID
RESET MIDAS
MIDAS
STENEX BIN_STENEX MID
RESET MIDAS
MIDAS
TMUDV BIN_TMUDV MID
RESET MIDAS
MIDAS
TXPURE BIN_TXPURE MID
RESET MIDAS
MIDAS
UTILIT BIN_UTILIT MID
RESET MIDAS
MIDAS
UUOH BIN_UUOH MID

BIN
src/mudsys/atomhk.bin.6 Normal file

Binary file not shown.

BIN
src/mudsys/atomhk.bin.7 Normal file

Binary file not shown.

1185
src/mudsys/atomhk.mid.144 Normal file

File diff suppressed because it is too large Load Diff

1193
src/mudsys/atomhk.mid.149 Normal file

File diff suppressed because it is too large Load Diff

1198
src/mudsys/atomhk.mid.150 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/bufmod.bin.2 Normal file

Binary file not shown.

18
src/mudsys/bufmod.mid.4 Normal file
View File

@@ -0,0 +1,18 @@
TITLE BUFMOD BUFFER MODULE
RELOCA
; HERE TO DEFINE MUDDLES BUFFER SPACE
.GLOBAL STRBUF,STRPAG
HERE==$.+1777
.LOP ANDCM HERE 1777
STRBUF==.LVAL1
.LOP <ASH @> STRBUF <,-10.>
STRPAG==.LVAL1
END


171
src/mudsys/chess.script.1 Normal file
View File

@@ -0,0 +1,171 @@
%% 30 December 1980 23:47:54
Type ? for help.
White to move: p-k4
Black to move: pb
1. ... P-K4 ; (1.0 85%)
White to move: p-q3
2. ... P-Q4 ; (1.7 93%)
White to move: n-kb4
; Impossible
White to move: n-kb3
; T-reject B-Q3
3. ... N-QB3 ; (3.8 91%)
White to move: b-k2
4. ... P-Q5 ; (3.0 94%)
White to move: o-o
; T-reject N-QN5
5. ... B-Q3 ; (6.9 94%)
White to move: p-qb3
; Foo!
6. ... PxP ; (3.0 91%)
White to move: nxp(qb3)
; T-reject N-Q5
7. ... B-QN5 ; (8.3 88%)
White to move: b-n5
8. ... N-KB3 ; (3.4 91%)
White to move: p-qr3
9. ... B-QB4 ; (5.1 95%)
White to move: p-qn4
10. ... B-QN3 ; (5.4 92%)
White to move: q-r4
11. ... O-O ; (4.4 92%)
White to move: p-n5
; T-reject N-Q5 N-QR4 N-QN1 ...
; Foo!
12. ... N-Q5 ; (11.6 90%)
White to move: r-k1
; Ambiguous
White to move: r(b1)-k1
13. ... NxB+ ; (3.9 94%)
White to move: rxn
14. ... QxP ; (4.6 77%)
White to move: q-b2
15. ... Q-Q3 ; (6.3 87%)
White to move: r-q1
; T-reject QxP
16. ... Q-QB4 ; (9.5 91%)
White to move: r(k2)-q2
; T-reject QxP(QR6)
17. ... B-QR4 ; (7.0 92%)
White to move: r-q8
18. ... QxN ; (6.1 95%)
White to move: qxq
19. ... BxQ ; (3.5 92%)
White to move: b-k3
20. ... NxP ; (5.4 90%)
White to move: nxp
21. ... BxN ; (4.5 91%)
White to move: p-b3
22. ... N-QB6 ; (4.6 95%)
White to move: r-q2
; Ambiguous
White to move: r(q1)-q2
; T-reject NxP
; M-reject RxR
23. ... NxP ; (6.3 86%)
White to move: b-b5
; M-reject RxR
24. ... B-Q3 ; (19.7 91%)
White to move: bxb
25. ... RxR ; (2.8 92%)
White to move: u
Black to move: u
White to move: rxr
Black to move: pb
25. ... BxR ; (1.6 95%)
White to move: bxb
26. ... KxB ; (2.2 94%)
White to move: r-q8
27. ... K-K2 ; (0.0 92%)
White to move: r-r8
28. ... NxP ; (1.6 94%)
White to move: rxp
29. ... P-KN4 ; (3.2 91%)
White to move: r-r6
30. ... R-QN1 ; (1.9 90%)
White to move: k-b2
31. ... K-Q2 ; (3.2 89%)
White to move: r-b6
; Ambiguous
White to move: r-kb6
32. ... K-K2 ; (1.6 93%)
White to move: r-b5
33. ... BxR ; (1.4 96%)
White to move: u
Black to move: u
White to move: r-r6
; Ambiguous
White to move: r-kr6
Black to move: pb
33. ... K-Q2 ; (3.2 95%)
White to move: k-k3
34. ... P-QB4 ; (5.0 91%)
White to move: k-q3
35. ... K-QB2 ; (1.8 88%)
White to move: k-b3
36. ... P-QB5 ; (2.2 87%)
White to move: k-n4
; T-reject N-QN8 N-QB7+
; Foo!
37. ... N-QN8 ; (3.2 88%)
White to move: kxp
38. ... P-QN4+ ; (1.8 96%)
White to move: k-n4
; T-reject K-QN2 R-QR1
39. ... P-KB4 ; (3.4 92%)
White to move: r-kn6
40. ... P-KN5 ; (2.0 76%)
White to move: pxp
41. ... PxP ; (1.8 95%)
White to move: r-n7
42. ... K-QN3 ; (1.2 96%)
White to move: r-b7
; Ambiguous
White to move: r-kb7
43. ... R-QR1 ; (2.3 95%)
White to move: r-b1
44. ... N-Q7 ; (2.4 85%)
White to move: r-q1
45. ... N-K5 ; (3.7 72%)
White to move: p-r3
46. ... PxP ; (2.7 95%)
White to move: pxp
47. ... BxP ; (2.5 90%)
White to move: r-q3
48. ... N-KB7 ; (4.4 87%)
White to move: rq-6
; Move what??
White to move: r-q6
; T-reject K-QB2 K-QN2
; Foo!
49. ... K-QB2 ; (2.2 85%)
White to move: r-kr6
50. ... P-QR3 ; (2.3 92%)
White to move: r-r7
51. ... K-QN3 ; (1.4 95%)
White to move: r-kb7
52. ... N-K5 ; (5.0 93%)
White to move: r-b5
53. ... BxR ; (2.0 92%)
White to move: u
Black to move: u
White to move: r-b4
Black to move: pb
53. ... N-Q7 ; (4.6 95%)
White to move: r-b6
54. ... K-QN2 ; (1.3 88%)
White to move: k-r5
55. ... N-K5 ; (2.9 94%)
White to move: r-b7
56. ... K-QB3 ; (1.0 95%)
White to move: r-r7
; Ambiguous
White to move: r-kr7
57. ... N-KN4 ; (2.8 93%)
White to move: r-r5
; T-reject N-KB6 N-K5 N-K3 ...
; Foo!
58. ... R-KN1 ; (4.4 85%)
White to move: kxp
59. ... R-QR1+ ; (0.7 8%)
; Checkmate.

1319
src/mudsys/chkdcl.mud.2 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/chkdcl.nbin.2 Normal file

Binary file not shown.

BIN
src/mudsys/const.bin.4 Normal file

Binary file not shown.

26
src/mudsys/const.mid.5 Normal file
View File

@@ -0,0 +1,26 @@
TITLE CONSTS
RELOCA
DEFINE C%MAKE A,B
.GLOBAL A
IRP LH,RH,[B]
A==[LH,,RH]
.ISTOP
TERMIM
TERMIN
TERMIN
IRP X,,[[C%11,1,1],[C%22,2,2],[C%33,3,3],[C%44,4,4],[C%55,5,5],[C%66,6,6]
[C%0,0,0],[C%1,0,1],[C%2,0,2],[C%3,0,3],[C%M1,-1,-1],[C%M2,-1,-2]
[C%M10,-1,0],[C%M20,-2,0],[C%M30,-3,0],[C%M40,-4,0],[C%M60,-6,0]]
IRP A,B,[X]
C%MAKE A,[B]
.ISTOP
TERMIN
TERMIN
TERMIN
END

BIN
src/mudsys/core.bin.4 Normal file

Binary file not shown.

145
src/mudsys/core.mid.13 Normal file
View File

@@ -0,0 +1,145 @@
TITLE CORE
RELOCATABLE
.INSRT MUDDLE >
SYSQ
IF1,[
IFE ITS,.INSRT STENEX >
]
.GLOBAL P.CORE,P.TOP,PHIBOT,PURBOT,FRETOP,SQKIL,GCFLG,KILBUF
.GLOBAL MULTSG
; .CORE AND .SUSET [.RMEMT,,---] FOR PAGED ENVIRONMENT
IFN ITS,[
P.CORE: PUSH P,0
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
SKIPN GCFLG
PUSHJ P,SQKIL
MOVE A,-4(P)
ASH A,10. ; CHECK IT
CAMLE A,PURBOT ; A CAML HERE IS OBSERVED TO LOSE
FATAL BAD ARG TO GET CORE
MOVE A,-4(P) ; RESTORE A
HRRZ B,P.TOP ; GET FIRST ADDRESS ABOVE TOP
ASH B,-10. ; TO BLOCKS
CAIG A,(B) ; SKIP IF GROWING
JRST P.COR1
SUBM B,A ; A/ -NUMBER OF BLOCKS TO GET
HRLI B,(A) ; AOBJN TO BLOCKS
.CALL P.CORU ; TRY
JRST POPBJ ; LOSE
MOVE A,B
P.COR2: ASH B,10. ; TO WORDS
MOVEM B,P.TOP ; NEW TOP
POPBJ1: AOS -6(P) ; SKIP RETURN ON SUCCESS
POPBJ: POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
POP P,0
POPJ P,
; HERE TO CORE DOWN
P.COR1: SUBM A,B
JUMPE B,POPBJ1 ; SUCCESS, YOU ALREADY HAVE WHAT YOU WANT
HRLI A,(B)
MOVEI B,(A)
.CALL P.CORD
JRST POPBJ
JRST P.COR2
P.CORU: SETZ
SIXBIT /CORBLK/
1000,,100000
1000,,-1
B
401000,,400001
P.CORD: SETZ
SIXBIT /CORBLK/
1000,,0
1000,,-1
SETZ A
]
IFE ITS,[
MFORK==400000
P.CORE: JRST @[.+1]
ASH A,10. ; CHECK IT
CAMLE A,PURBOT
FATAL BAD ARG TO GET CORE
ASH A,-9. ; TO PAGES
PUSH P,D
PUSH P,A
SKIPN GCFLG
PUSHJ P,SQK
SETOM A ; FLUSH PAGES
HRRZ B,P.TOP ; GET P.TOP
ASH B,-9. ; TO PAGES
CAMLE B,(P)
SOJA B,P.CORD ; CORING DOWN
HRLI B,MFORK ; SET UP FORK POINTER
P.COR2: HRRZ D,B
CAML D,(P) ; SEE IF DONE
JRST P.COR1
PMAP ; MAP OUT PAGE
ADDI B,1 ; NEXT PAGE
JRST P.COR2 ; LOOP BACK
P.COR1: POP P,A ; RESTORE NEW P.TOP
POP P,D
ASH A,9. ; TO WORDS
MOVEM A,P.TOP
AOS (P)
POPJA: ASH A,-10.
SKIPN MULTSG
POPJ P,
POP P,21
SETZM 20
JRST 5,20
P.CORD: HRLI B,400000
PMAP
MOVEI D,-1(B)
CAMLE D,(P)
SOJA B,.-3
JRST P.COR1
SQK: PUSH P,0
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
PUSHJ P,SQKIL
POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
POP P,0
POPJ P,
]
IMPURE
P.TOP==FRETOP
PURE
END

BIN
src/mudsys/create.bin.3 Normal file

Binary file not shown.

376
src/mudsys/create.mid.40 Normal file
View File

@@ -0,0 +1,376 @@
TITLE PROCESS-HACKER FOR MUDDLE
RELOCATABLE
.INSRT MUDDLE >
.GLOBAL ICR,NAPT,IGVAL,CHKARG,RESFUN,RETPROC,SWAP,MAINPR,PROCHK,NOTRES
.GLOBAL PSTAT,LSTRES,TOPLEV,MAINPR,1STEPR,INCONS
.GLOBAL TBINIT,APLQ,PVSTOR,SPSTOR
MFUNCTION PROCESS,SUBR
ENTRY 1
GETYP A,(AB) ;GET TYPE OF ARG
;MUST BE SOME APPLIABLE TYPE
PUSHJ P,APLQ
JRST NAPT ;NO, ERROR - NON-APPLIABLE TYPE
OKFUN:
MOVEI A,TPLNT/2 ;SMALL STACK PARAMETERS
MOVEI B,PLNT/2
PUSHJ P,ICR ;CREATE A NEW PROCESS
MOVE C,TPSTO+1(B) ;GET ITS SRTACK
PUSH C,[TENTRY,,TOPLEV]
PUSH C,[1,,0] ;TIME
PUSH C,[0]
PUSH C,SPSTO(B)
PUSH C,PSTO+1(B)
MOVE D,C
ADD D,[3,,3]
PUSH C,D ;SAVED STACK POINTER
PUSH C,[SUICID]
MOVEM C,TPSTO+1(B) ;STORE NEW TP
HRRI D,1(C) ;MAKE A TB
HRLI D,400002 ;WITH A TIME
MOVEM D,TBINIT+1(B)
MOVEM D,TBSTO+1(B) ;SAVE ALSO FOR SIMULATED START
MOVE C,(AB) ;STORE ARG
MOVEM C,RESFUN(B) ;INTO PV
MOVE C,1(AB)
MOVEM C,RESFUN+1(B)
MOVEI 0,RUNABL
MOVEM 0,PSTAT+1(B)
JRST FINIS
REPEAT 0,[
MFUNCTION RETPROC,SUBR
; WHO KNOWS WHAT THIS SHOULD REALLY DO
;PROBABLY, JUST AN EXIT
;FOR NOW, PRINT OUT AN ERROR MESSAGE
ERRUUO EQUOTE ATTEMPT-TO-RETURN-OUT-OF-PROCESS
MFUNCTION RESUME,FSUBR
;RESUME IS CALLED WITH TWO ARGS
;THE FIRST IS A PROCESS FORM OF THE PROCESS TO BE RESUMED
;THE SECOND IS A FUNCTION TO BE CALLED WHEN THIS PROCESS
; (THE PARENT) IS ITSELF RESUMED
;IF THE FUNCTION IS NOT GIVEN SOME STANDARD FUNCTION IS
;PLUGGED IN
;
; NOTE - TYPE AND NUMBER OF ARGS CHECKS MUST BE ADDED TO BOTH RESUME AND CREATE
ENTRY 1
HRRZ C,@1(AB) ;GET CDR ADDRESS
JUMPE C,NOFUN ;IF NO SECOND ARG, SUPPLY STANDARD
HLLZ A,(C) ;GET CDR TYPE
CAME A,$TATOM ;ATOMIC?
JRST RES2 ;NO, MUST EVAL TO GET FUNCTION
MOVE B,1(C) ;YES
PUSHJ P,IGVAL ;TRY TO GET GLOBAL VALUE
CAMN A,$TUNBOUND ;GLOBALLY UNBOUND?
JRST LFUN ;YES, TRY FOR LOCAL VALUE
RES1: MOVE PVP,PVSTOR+1
MOVEM A,RESFUN(PVP) ;STORE IN THIS PROCESS
MOVEM B,RESFUN+1(PVP)
HRRZ C,1(AB) ;GET CAR ADDRESS
PUSH TP,(C) ;PUSH PROCESS FORM
PUSH TP,1(C)
JSP E,CHKARG ;CHECK FOR DEFERED TYPE
;INSERT CHECKS FOR PROCESS FORM
MCALL 1,EVAL ;EVAL PROCESS FORM WHICH WILL SWITCH
; PROCESSES
JRST FINIS
RES2: PUSH TP,(C) ;PUSH FUNCTION ARG
PUSH TP,1(C)
JSP E,CHKARG ;CHECK FOR DEFERED
MCALL 1,EVAL ;EVAL TO GET FUNCTION
JRST RES1
LFUN: HRRZ C,1(AB) ;GET CDR ADDRESS
PUSH TP,(C)
PUSH TP,1(C)
MCALL 1,VALUE ;GET LOCAL VALUE OF ATOM FOR FUNCTION
JRST RES1
NOFUN: MOVSI A,TUNBOUND ;MAKE RESUME FUNCTION UNBOUND
JRST RES1
]
; PROCHK - SETUP LAST RESUMER SLOT
PROCHK: MOVE PVP,PVSTOR+1
CAME B,MAINPR ; MAIN PROCESS?
MOVEM PVP,LSTRES+1(B)
POPJ P,
; THIS FUNCTION RESUMES A PROCESS, CALLED WITH ONE OR TWO ARGS
; THE FIRST IS A VALUE TO RETURN TO THE OTHER PROCESS OR PASS TO ITS
; RESFUN
; THE SECOND IS THE PROCESS TO RESUME (IF NOT SUPPLIED, USE THE LSTRES)
MFUNCTION RESUME,SUBR
ENTRY
JUMPGE AB,TFA
CAMGE AB,[-4,,0]
JRST TMA
CAMGE AB,[-2,,0]
JRST CHPROC ; VALIDITY CHECK ON PROC
MOVE PVP,PVSTOR+1
SKIPN B,LSTRES+1(PVP) ; ANY RESUMERS?
JRST NORES ; NO, COMPLAIN
GOTPRO: MOVE C,AB
CAMN B,PVSTOR+1 ; DO THEY DIFFER?
JRST RETARG
MOVE A,PSTAT+1(B) ; CHECK STATE
CAIE A,RUNABL ; MUST BE RUNABL
CAIN A,RESMBL ; OR RESUMABLE
JRST RESUM1
NOTRES:
NOTRUN: ERRUUO EQUOTE PROCESS-NOT-RUNABLE-OR-RESUMABLE
RESUM1: PUSHJ P,PROCHK ; FIX LISTS UP
MOVEI A,RESMBL ; GET NEW STATE
MOVE D,B ; FOR SWAP
STRTN: JSP C,SWAP ; SWAP THEM
MOVEM A,PSTAT+1(E) ; CLOBBER OTHER STATE
MOVE PVP,PVSTOR+1
MOVE A,PSTAT+1(PVP) ; DECIDE HOW TO PROCEED
MOVEI 0,RUNING
MOVEM 0,PSTAT+1(PVP) ; NEW STATE
MOVE C,ABSTO+1(E) ; OLD ARGS
CAIE A,RESMBL
JRST DORUN ; THEY DO RUN RUN, THEY DO RUN RUN
RETARG: MOVE A,(C)
MOVE B,1(C) ; RETURN
JRST FINIS
DORUN: PUSH TP,RESFUN(PVP)
PUSH TP,RESFUN+1(PVP)
PUSH TP,(C)
PUSH TP,1(C)
MCALL 2,APPLY
PUSH TP,A ; CALL SUICIDE WITH THESE ARGS
PUSH TP,B
MCALL 1,SUICID ; IF IT RETURNS, KILL IT
JRST FINIS
CHPROC: GETYP A,2(AB)
CAIE A,TPVP
JRST WTYP2
MOVE B,3(AB)
JRST GOTPRO
NORES: ERRUUO EQUOTE NO-PROCESS-TO-RESUME
; FUNCTION TO CAUSE PROCESSES TO SELF DESTRUCT
MFUNCTION SUICIDE,SUBR
ENTRY
JUMPGE AB,TFA
HLRE A,AB
ASH A,-1 ; DIV BY 2
AOJE A,NOPROC ; NO PROCESS GIVEN
AOJL A,TMA
GETYP A,2(AB) ; MAKE SURE OF PROCESS
CAIE A,TPVP
JRST WTYP2
MOVE C,3(AB)
JRST SUIC2
NOPROC: MOVE PVP,PVSTOR+1
SKIPN C,LSTRES+1(PVP)
MOVE C,MAINPR ; IF NOT DEFAULT TO MAIN
SUIC2: CAMN C,PVP ; DONT SUICIDE TO SELF
JRST SUSELF
MOVE B,PSTAT+1(C)
CAIE B,RUNABL
CAIN B,RESMBL
JRST .+2
JRST NOTRUN
MOVE B,C
PUSHJ P,PROCHK
MOVE D,B ; RESTORE NEWPROCESS
MOVEI A,DEAD
JRST STRTN
SUSELF: ERRUUO EQUOTE ATTEMPT-TO-SUICIDE-TO-SELF
MFUNCTION RESER,SUBR,RESUMER
ENTRY
MOVE B,PVSTOR+1
JUMPGE AB,GTLAST
CAMGE AB,[-2,,0]
JRST TMA
GETYP A,(AB) ; CHECK FOR PROCESS
CAIE A,TPVP
JRST WTYP1
MOVE B,1(AB) ; GET PROCESS
GTLAST: MOVSI A,TFALSE ; ASSUME NONE
SKIPN B,LSTRES+1(B) ; GET IT IF IT EXISTS
JRST FINIS
MOVSI A,TPVP ; GET TYPE
JRST FINIS
; FUNCTION TO PUT AN EVAL CALL ON ANOTHER PROCESSES STACK
MFUNCTION BREAKSEQ,SUBR,BREAK-SEQ
ENTRY 2
GETYP A,2(AB) ; 2D ARG MUST BE PROCESS
CAIE A,TPVP
JRST WTYP2
MOVE B,3(AB) ; GET PROCESS
CAMN B,PVSTOR+1 ; SKIP IF NOT ME
JRST BREAKM
MOVE A,PSTAT+1(B) ; CHECK STATE
CAIE A,RESMBL ; BEST BE RESUMEABLE
JRST NOTRUN
MOVE C,TBSTO+1(B) ; GET SAVE ACS TO BUILD UP A DUMMY FRAME
MOVE D,TPSTO+1(B) ; STACK POINTER
MOVE E,SPSTO+1(B) ; FIX UP OLD FRAME
MOVEM E,SPSAV(C)
MOVEI E,CALLEV ; FUNNY PC
MOVEM E,PCSAV(C)
MOVE E,PSTO+1(B) ; SET UP P,PP AND TP SAVES
MOVEM E,PSAV(C)
PUSH D,[0] ; ALLOCATES SOME SLOTS
PUSH D,[0]
PUSH D,(AB) ; NOW THAT WHIC IS TO BE EVALLED
PUSH D,1(AB)
MOVEM D,TPSAV(C)
HRRI E,-1(D) ; BUILD UP ARG POINTER
HRLI E,-2
PUSH D,[TENTRY,,BREAKE]
PUSH D,C ; OLD TB
PUSH D,E ; NEW ARG POINTER
REPEAT 4,PUSH D,[0] ; OTHER SLOTS
MOVEM D,TPSTO+1(B)
MOVEI C,(D) ; BUILD NEW AB
AOBJN C,.+1
MOVEM C,TBSTO+1(B) ; STORE IT
MOVE A,2(AB) ; RETURN PROCESS
MOVE B,3(AB)
JRST FINIS
MQUOTE BREAKER
BREAKE:
CALLEV: MOVEM A,-3(TP) ; HERE TO EVAL THE GOODIE (SAVE REAL RESULT)
MOVEM B,-2(TP)
MCALL 1,EVAL
POP TP,B
POP TP,A
JRST FINIS
BREAKM: ERRUUO EQUOTE ATTEMPT-TO-BREAK-OWN-SEQUENCE
; FUNCTION TOP PUT PROCESS IN 1 STEP MODE
MFUNCTION 1STEP,SUBR
PUSHJ P,1PROC
MOVE PVP,PVSTOR+1
MOVEM PVP,1STEPR+1(B) ; CLOBBER TARGET PROCESS
JRST FINIS
; FUNCTION TO UNDO ABOVE
MFUNCTION %%FREE,SUBR,FREE-RUN
PUSHJ P,1PROC
MOVE PVP,PVSTOR+1
CAME PVP,1STEPR+1(B)
JRST FNDBND
SETZM 1STEPR+1(B)
JRST FINIS
FNDBND: SKIPE 1STEPR+1(B) ; DOES IT HAVE ANY 1STEPPER?
JRST NOTMIN ; YES, COMPLAIN
MOVE D,B ; COPY PROCESS
ADD D,[1STEPR,,1STEPR] ; POINTER FOR SEARCH
HRRZ C,SPSTO+1(B) ; GET THIS BINDING STACK
FNDLP: GETYP 0,(C) ; IS THIS A TBVL?
CAIN 0,TBVL
CAME D,1(C) ; SKIP IF THIS IS SAVED 1STEP SLOT
JRST FNDNXT
SKIPN 3(C) ; IS IT SAVING A REAL 1STEPPER?
JRST FNDNXT
MOVE PVP,PVSTOR+1
CAME PVP,3(C) ; IS IT ME?
JRST NOTMIN
SETZM 3(C) ; CLEAR OUT SAVED 1STEPPER
JRST FINIS
FNDNXT: HRRZ C,(C) ; NEXT BINDING
JUMPN C,FNDLP
NOTMIN: MOVE C,$TCHSTR
MOVE D,CHQUOTE NOT-YOUR-1STEPEE
PUSHJ P,INCONS
MOVSI A,TFALSE
JRST FINIS
1PROC: ENTRY 1
GETYP A,(AB)
CAIE A,TPVP
JRST WTYP1
MOVE B,1(AB)
MOVE A,(AB)
POPJ P,
; FUNCTION TO RETRUN THE MAIN PROCESS
MFUNCTION MAIN%%,SUBR,MAIN
ENTRY 0
MOVE B,MAINPR
MAIN1: MOVSI A,TPVP
JRST FINIS
; FUNCTION TO RETURN THE CURRENT PROCESS
MFUNCTION ME,SUBR
ENTRY 0
MOVE B,PVSTOR+1
JRST MAIN1
; FUNCTION TO RETURN THE STATE OF A PROCESS
MFUNCTION STATE,SUBR
ENTRY 1
GETYP A,(AB)
CAIE A,TPVP
JRST WTYP1
MOVE A,1(AB) ; GET PROCESS
MOVE A,PSTAT+1(A)
MOVE B,@STATES(A) ; GET STATE
MOVSI A,TATOM
JRST FINIS
STATES:
IRP A,,[ILLEGAL,RUNABLE,RESUMABLE,RUNNING,DEAD,BLOCKED]
MQUOTE A
TERMIN
END

BIN
src/mudsys/decl.bin.3 Normal file

Binary file not shown.

1064
src/mudsys/decl.mid.102 Normal file

File diff suppressed because it is too large Load Diff

1091
src/mudsys/decl.mid.103 Normal file

File diff suppressed because it is too large Load Diff

0
src/mudsys/ecagc.bin.1 Normal file
View File

BIN
src/mudsys/eval.bin.13 Normal file

Binary file not shown.

BIN
src/mudsys/eval.bin.14 Normal file

Binary file not shown.

4211
src/mudsys/eval.mid.122 Normal file

File diff suppressed because it is too large Load Diff

4217
src/mudsys/eval.mid.123 Normal file

File diff suppressed because it is too large Load Diff

4245
src/mudsys/eval.mid.124 Normal file

File diff suppressed because it is too large Load Diff

4245
src/mudsys/eval.mid.125 Normal file

File diff suppressed because it is too large Load Diff

84
src/mudsys/first.cmd.2 Normal file
View File

@@ -0,0 +1,84 @@
CONN INT:
DEL MDLXXX.*.*
DELVER
YY*.*.*
EXP
DEL MDL:MDLXXX.*.*
DEL MDL:*.SAV00.*
EXP MDL:
STINK
MMUD105.STINK@MMDLXXX.EXEYRESET .
NDDT
;YMDLXXX.EXE
;UMDLXXX.EXE
;OMDLXXX.SYMBOLS
INTFCNK
NAME1K
BUFRINK
PROCIDK
IOIN2K
ITEMK
NILK
TYPVECK
INAMEK
ECHOK
CHANNOK
VALK
CHRCNTK
0STOK
TYPBOTK
ERASCHK
DIRECTK
INDICK
INTFCNK
KILLCHK
TTICHNK
ASTOK
BRKCHK
NODPNTK
ESCAPK
BSTOK
TTOCHNK
SYSCHRK
BRFCHRK
CSTOK
ROOTK
ASOLNTK
BRFCH2K
BYTPTRK
INITIAK
DSTOK
ESTOK
INTOBLK
PVPSTOK
ERROBLK
MUDOBLK
TVPSTOK
ABSTOK
INTNUMK
STATUSK
INTVECK
QUEUESK
TBSTOK
CHNL1K
.LIST.K
GCPDLK
CONADJK
T.CHANK
N.CHNSK
SLENGCK
LENGCK
SECLENK
;WMDLXXX.SYMBOLS
;H
RESET .
NDDT
;YMDLXXX.EXE
;OMDLXXX.SYMBOLS
NSEGS/3
MASK1/700541,,2007
;UMDLXXX.EXE
;H
LOGOUT

BIN
src/mudsys/fopen.bin.16 Normal file

Binary file not shown.

BIN
src/mudsys/fopen.bin.22 Normal file

Binary file not shown.

4538
src/mudsys/fopen.mid.35 Normal file

File diff suppressed because it is too large Load Diff

4686
src/mudsys/fopen.mid.54 Normal file

File diff suppressed because it is too large Load Diff

4686
src/mudsys/fopen.mid.56 Normal file

File diff suppressed because it is too large Load Diff

4703
src/mudsys/fopen.mid.57 Normal file

File diff suppressed because it is too large Load Diff

4703
src/mudsys/fopen.mid.58 Normal file

File diff suppressed because it is too large Load Diff

4703
src/mudsys/fopen.mid.59 Normal file

File diff suppressed because it is too large Load Diff

4712
src/mudsys/fopen.mid.60 Normal file

File diff suppressed because it is too large Load Diff

4715
src/mudsys/fopen.mid.61 Normal file

File diff suppressed because it is too large Load Diff

4722
src/mudsys/fopen.mid.62 Normal file

File diff suppressed because it is too large Load Diff

186
src/mudsys/gcgdgl.mud.1 Normal file
View File

@@ -0,0 +1,186 @@
<PACKAGE "GC-GRLOAD">
<ENTRY GC-GROUP-LOAD GC-GROUP-DUMP>
<USE "EDIT">
<COND (<G? ,MUDDLE 100> <SETG TNM1 "ETMP"> <SETG TNM2 "MUDT">)
(ELSE <SETG TNM1 "_ETMP_"> <SETG TNM2 ">">)>
<SETG VCOMP
<FORM COND
(<FORM N==? ,MUDDLE <FORM GVAL MUDDLE>>
<FORM ERROR RSUBR-CANT-RUN-IN-THIS-VERSION-OF-MUDDLE!-ERRORS>)>>
<DEFINE GC-GROUP-LOAD (STR
"OPTIONAL" NAM
"AUX" (CHN <OPEN "READB" .STR>) FSP (REDEFINE T))
#DECL ((REDEFINE) <SPECIAL ANY>)
<PROG ()
<COND (<NOT <TYPE? .CHN CHANNEL>> <RETURN .CHN>)>
<COND (<NOT <ASSIGNED? NAM>>
<SET NAM
<PARSE <MAPF ,STRING
<FUNCTION (C) <MAPRET !"\\ .C>>
<7 .CHN>>>>)>
;"To hack ugly file names. (TT, 75/10/07)"
<PUT .NAM
CHANNEL
<SET FSP <LIST <7 .CHN> <8 .CHN> <9 .CHN> <10 .CHN>>>>
<EVAL <GC-READ .CHN>>
<CLOSE .CHN>
.NAM>>
<DEFINE GC-GROUP-DUMP (STR
"OPTIONAL" NM (BKILLER T)
"AUX" (CHN <CHANNEL "PRINTB" .STR>)
(NAM
<COND (<ASSIGNED? NM> .NM)
(ELSE <PARSE <7 .CHN>>)>)
(OC
<OPEN "PRINTB" ,TNM1 ,TNM2 <9 .CHN> <10 .CHN>>)
(FIXERS ()) FUNC BKS TEM TT HOLDANY GRP FIXES)
#DECL ((CHN) CHANNEL (NAM) ATOM (OC) <OR CHANNEL FALSE> (FIXERS) LIST)
<PROG ()
<COND (<NOT .OC> <RETURN .OC>)>
<COND (<OR <NOT <ASSIGNED? .NAM>> <NOT <TYPE? ..NAM LIST>>>
<CLOSE .OC>
<RETURN #FALSE ("Not a valid group name")>)>
<SET GRP ..NAM>
<SET FIXERS
(<FORM PUT .NAM BLOCK <FORM UNGET <UNGET <GET .NAM BLOCK '.OBLIST>>>>
!.FIXERS)>
<MAPR <>
<FUNCTION (OBP "AUX" (OB <1 .OBP>))
<COND (<SET TEM <GET <FORM QUOTE .OBP> COMMENT>>
<SET FIXERS
(<FORM PUT <FORM QUOTE .OBP> COMMENT .TEM> !.FIXERS)>)>
<COND (<SET TEM <GET .OBP BLOCK>>
<SET FIXERS
(<FORM PUT
<FORM QUOTE .OBP>
BLOCK
<FORM UNGET <UNGET .TEM>>>
!.FIXERS)>)>
<COND
(<AND <TYPE? .OB FORM> <NOT <EMPTY? .OB>>>
<COND
(<OR <==? <SET TEM <1 .OB>> DEFINE> <==? .TEM DEFMAC>>
<COND
(<AND
.BKILLER ;"Breakpoint killer"
<G? <LENGTH .OB> 1>
<SET BKS
<GETPROP
<AND <GASSIGNED? <SET FUNC <GET <2 .OB> VALUE '<2
.OB>>>>
<GLOC .FUNC>>
BREAKS>>>
<PUTPROP <GLOC .FUNC> BREAKS>
<REPEAT ()
<COND (<EMPTY? .BKS> <RETURN>)>
<COND (<TYPE? <SET HOLDANY <IN <1 .BKS>>> BREAK>
<SETLOC <1 .BKS> <2 .HOLDANY>>)>
<SET BKS <REST .BKS>>>)>
<SET TEM <COMMENT-ON .OB>>
<COND (<NOT <EMPTY? .TEM>>
<PUTREST <REST .TEM <- <LENGTH .TEM> 1>> .FIXERS>
<SET FIXERS .TEM>)>)
(<AND <==? .TEM SETG>
<==? <LENGTH .OB> 3>
<TYPE? <SET NM <GET <2 .OB> VALUE '<2 .OB>>> ATOM>
<OR <TYPE? <SET TEM <3 .OB>> RSUBR>
<AND <GASSIGNED? .NM> <TYPE? <SET TEM ,.NM> RSUBR>>>
<==? .NM <2 .TEM>>>
<COND (<AND <TYPE? <1 .TEM> CODE> <SET FIXES <GET .TEM RSUBR>>>
<SET FIXERS
(<FORM FIXIT <FORM QUOTE .TEM> .FIXES> !.FIXERS)>)
(<TYPE? <1 .TEM> CODE>
<PRINC
"Warning: RSUBR lacks fixups, only use in same MUDDLE version. ">
<PRIN1 .NM>
<CRLF>
<SET FIXERS (,VCOMP !.FIXERS)>)>
<COND (<NOT <EMPTY? <SET TT <ANON-SRCH .TEM>>>>
<PUTREST <REST .TT <- <LENGTH .TT> 1>> .FIXERS>
<SET FIXERS .TT>)>
<COND (<TYPE? <SET TT <1 .TEM>> PCODE>
<SET FIXERS
(<FORM PUT
<FORM QUOTE .TEM>
1
<PARSE <REST <UNPARSE .TT>>>>
!.FIXERS)>)>)>)>>
.GRP>
<GC-DUMP (<FORM MAPF
<>
<FORM GVAL EVAL>
<FORM SET .NAM <FORM QUOTE .GRP>>>
.FIXERS)
.OC>
<RENAME .OC .STR>
<CLOSE .OC>
.NAM>>
<DEFINE COMMENT-ON (OB "AUX" (L ()) TEM TT)
<COND
(<NOT <MONAD? .OB>>
<MAPR <>
<FUNCTION (OBP)
<COND (<SET TEM <GET .OBP COMMENT>>
<SET L
(<FORM PUT <FORM QUOTE .OBP> COMMENT .TEM>
!.L)>)>
<COND (<NOT <EMPTY? <SET TEM <COMMENT-ON <1 .OBP>>>>>
<PUTREST <REST .TEM <- <LENGTH .TEM> 1>> .L>
<SET L .TEM>)>>
<REST .OB>>
<COND (<SET TEM <GET <1 .OB> COMMENT>>
<SET L (<FORM PUT <FORM QUOTE <1 .OB>> COMMENT .TEM> !.L)>)>
<COND (<OR <SET TEM <GET <SET TT .OB> COMMENT>>
<SET TEM <GET <SET TT <REST .OB 0>> COMMENT>>>
<SET L (<FORM PUT <FORM QUOTE .TT> COMMENT .TEM> !.L)>)>)
(<SET TEM <GET .OB COMMENT>> <SET L (.TEM)>)>
.L>
<DEFINE ANON-SRCH (R "AUX" (L ()) TEM)
#DECL ((R) <PRIMTYPE VECTOR> (L) LIST)
<MAPR <>
<FUNCTION (THP "AUX" (THING <1 .THP>))
<COND (<AND <TYPE? .THING RSUBR>
<G? <LENGTH .THING> 1>
<TYPE? <SET TEM <2 .THING>> ATOM>
<OR <NOT <GASSIGNED? .TEM>> <N==? ,.TEM .THING>>>
<COND (<AND <TYPE? <1 .THING> CODE>
<SET TEM <GET .THING RSUBR>>>
<SET L (<FORM FIXIT <FORM QUOTE .THING> .TEM> !.L)>)
(<TYPE? <1 .THING> CODE>
<PRINC
"Warning: RSUBR lacks fixups, only use in same MUDDLE version. ">
<PRIN1 <2 .THING>>
<CRLF>)>)>
<COND (<AND <TYPE? .THING RSUBR> <TYPE? <1 .THING> PCODE>>
<SET L
(<FORM PUT
<FORM QUOTE .THING>
1
<PARSE <REST <UNPARSE <1 .THING>>>>>
!.L)>)>
<COND (<TYPE? .THING LOCD LOCR TYPE-W TYPE-C>
<SET L
(<FORM PUT
<FORM QUOTE .THP>
1
<PARSE <REST <UNPARSE .THING>>>>
!.L)>
<COND (<TYPE? .THING LOCD>
<PUT .THP 1 LOCD>)>)>>
.R>
.L>
<DEFINE UNGET (O)
<MAPF ,LIST <FUNCTION (X) <GET .X OBLIST>> .O>>
<ENDPACKAGE>


BIN
src/mudsys/gcgdgl.nbin.1 Normal file

Binary file not shown.

0
src/mudsys/gcgld.mud.1 Normal file
View File

BIN
src/mudsys/gchack.bin.2 Normal file

Binary file not shown.

BIN
src/mudsys/gchack.bin.3 Normal file

Binary file not shown.

538
src/mudsys/gchack.mid.45 Normal file
View File

@@ -0,0 +1,538 @@
TITLE GCHACK
RELOCATABLE
.INSRT MUDDLE >
.GLOBAL FRMUNG,PARBOT,TYPVEC,GCHACK,REHASH,IMPURI,NWORDT,GCDFLG
.GLOBAL TD.LNT,TD.GET,TD.PUT,GCSTOP,GCSBOT,GCHK10,STOSTR,UBIT,PVSTOR,SPSTOR
UBIT==40000 ; BIT INDICATING VECTOR
.LIST.==400000
; THIS IS AN INTERNAL MUDDLE SUBROUTINE TO RUN AROUND GC SPACE DOING
; SOMETHING ARBITRARY TO EVERY ENTITY THEREIN
; CALL --
; A/ INSTRUCTION TO BE EXECUTED
; PVP/ NON-ZERO OPTIMIZE--ONLY LOOK AT ATOMS
; PUSHJ P,GCHACK
; HERE FOR SPECIAL HACKS WHICH DON'T TOUCH STOAGE
GCHK10: PUSHJ P,GHSTUP
JRST GCHK1
GCHACK: PUSHJ P,GHSTUP ; SETUP
MOVE B,CODTOP ; START OFF WITH IMPURE STORAGE
SUBI B,1 ; START AT FIRST WORD
LOPSTO: CAIG B,STOSTR
JRST GCHK1
HRRE 0,1(B) ; GET INDICATOR OF MODIFICATION
JUMPGE 0,LOSTO ; JUMP IF GARBAGE
PUSHJ P,VHACK ; VHACK
JRST LOPSTO
LOSTO: HLRZ C,1(B) ; BACK OF VECTOR
TRZ C,400000
SUBI B,(C) ; SKIP OVER VECTOR
JRST LOPSTO
GCHK1: MOVE B,VECTOP ; NO LOOP THRU GCS
MOVEI B,-2(B)
LOOPHK: MOVE C,SVTAB
MOVEM B,(C)
EXCH C,NXTTAB ; SWAP LOCATIONS
EXCH C,SVTAB
TLZ B,.LIST. ; TURN OFF LIST BIT
CAMGE B,GCSBOT ; SEE IF DONE
JRST REHASQ ; SEE IF ASSOCIATIONS ARE GOOD
MOVE C,(B) ; GET ELEMENT
TLNE C,.VECT. ; SEE IF IT IS A VECTOR
JRST VHCK ; JUMP IF IT IS
GLSTHK: GETYP C,(B) ; TYPE OF CURRENT PAIR
MOVE D,1(B) ; AND ITS DATUM
TLO B,.LIST. ; INDICATE A LIST
SKIPL (B) ; SKIP IF MARKED
XCT A ; APPLY INS
SUBI B,2
JRST LOOPHK
VHCK: PUSHJ P,VHACK ; TO VHACK
JRST LOOPHK
; NOW DO THE SAME THING TO VECTOR SPACE
VHACK: HLRE D,(B) ; GET TYPE FROM D.W.
TRZ D,.VECT. ; GET RID OF VECTOR INDICATION BIT
HLRZ C,1(B) ; AND TOTAL LENGTH
TRZE C,400000 ; GET RID OF POSSIBLE MARK BIT
JRST MKHAK ; JUMP IF MARKED
SUBI B,(C)-2 ; POINT TO START OF VECTOR
PUSH P,B
SUBI C,2 ; CHECK WINNAGE
JUMPL C,BADV ; FATAL LOSSAGE
PUSH P,C ; SAVE COUNT
JUMPE C,VHACK1 ; EMPTY VECTOR, FINISHED
; DECIDE BASED ON TYPE WHETHER GENERAL,UNIFORM OR SPECIAL
JUMPGE D,UHACK ; UNIFORM
TRNE D,377777 ; SKIP IF GENERAL
JRST SHACK ; SPECIAL
; FALL THROUGH TO GENERAL
GHACK1: SKIPGE (B) ; CHECK FOR FENCE POST
JRST VHACK1
GETYP C,(B) ; LOOK A T 1ST ELEMENT
CAIE C,TCBLK
CAIN C,TENTRY ; FRAME ON STACK
SOJA B,EHACK
CAIE C,TUBIND
CAIN C,TBIND ; BINDING BLOCK
JRST BHACK
CAIN C,TGATOM ; ATOM WITH GDECL?
JRST GDHACK
MOVE D,1(B) ; GET DATUM
XCT A ; USER INS
GDHCK1: ADDI B,2 ; NEXT ELEMENT
SOS (P)
SOSLE (P) ; COUNT ELEMENTS
SKIPGE (B) ; OR FENCE POST HIT
JRST VHACK1
JRST GHACK1
; HERE TO GO OVER UVECTORS
UHACK: CAMN A,[PUSHJ P,SBSTIS]
JRST VHACK1 ; IF THIS SUBSTITUTE, DONT DO UVEC
MOVEI C,(D) ; COPY UNIFORM TYPE
JUMPE PVP,UHACKX ; JUMP IF NOT ONLY ATOMS
ASH C,1 ; COMPUTE SAT
ADD C,TYPVEC+1
HRRZ C,(C)
ANDI C,SATMSK ; GOT ITS SAT
CAIE C,SATOM ; DON'T BOTHER IF NOT ALL ATOMS
JRST VHACK1
MOVEI C,(D)
UHACKX: PUSH P,C ; ATFIX CLOBBERS C
SUBI B,1 ; BACK OFF
UHACK1: MOVE C,(P)
TLO B,UBIT ; TURN ON BIT INDICATING UVECTOR
MOVE D,1(B) ; DATUM
XCT A
SOSLE -1(P) ; COUNT DOEN
AOJA B,UHACK1
TLZ UBIT
POP P,C
JRST VHACK1
; HERE TO HACK VARIOUS FLAVORS OF SPECIAL GOODIES
SHACK: ANDI D,377777 ; KILL EXTRA CRUFT
CAIN D,SATOM
JRST ATHACK
CAIE D,STPSTK ; STACK OR
CAIN D,SPVP ; PROCESS
JRST GHACK1 ; TREAT LIKE GENERAL
CAIN D,SASOC ; ASSOCATION
JRST ASHACK
CAIG D,NUMSAT ; TEMPLATE MAYBE?
JRST BADV ; NO CHANCE
ADDI C,(B) ; POINT TO DOPE WORDS
SUBI D,NUMSAT+1
HRLI D,(D)
ADD D,TD.LNT+1
JUMPGE D,BADV ; JUMP IF INVALID TEMPLATE HACKER
CAMN A,[PUSHJ P,SBSTIS]
JRST VHACK1
TD.UPD: PUSH P,A ; INS TO EXECUTE
XCT (D)
HLRZ E,B ; POSSIBLE BASIC LENGTH
PUSH P,[0]
PUSH P,E
MOVEI B,(B) ; ISOLATE LENGTH
PUSH P,C ; SAVE POINTER TO OBJECT
PUSH P,[0] ; HOME FOR VALUES
PUSH P,[0] ; SLOT FOR TEMP
PUSH P,B ; SAVE
SUB D,TD.LNT+1
PUSH P,D ; SAVE FOR FINDING OTHER TABLES
JUMPE E,TD.UP2 ; NO REPEATING SEQ
ADD D,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
HLRE D,(D) ; D ==> - LNTH OF TEMPLATE
ADDI D,(E) ; D ==> -LENGTH OF REP SEQ
MOVNS D
HRLM D,-5(P) ; SAVE IT AND BASIC
TD.UP2: SKIPG D,-1(P) ; ANY LEFT?
JRST TD.UP1
MOVE E,TD.GET+1
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVEM D,-6(P) ; SAVE ELMENT #
SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
SOJA D,TD.UP3
MOVEI 0,(B) ; BASIC LNT TO 0
SUBI 0,(D) ; SEE IF PAST BASIC
JUMPGE 0,.-3 ; JUMP IF O.K.
MOVSS B ; REP LNT TO RH, BASIC TO LH
IDIVI 0,(B) ; A==> -WHICH REPEATER
MOVNS A
ADD A,-5(P) ; PLUS BASIC
ADDI A,1 ; AND FUDGE
MOVEM A,-6(P) ; SAVE FOR PUTTER
ADDI E,-1(A) ; POINT
SOJA D,.+2
TD.UP3: ADDI E,(D) ; POINT TO SLOT
XCT (E) ; GET THIS ELEMENT INTO A AND B
TLO A,UBIT ; INDICATE ITS A ANY
MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
MOVEM B,-2(P)
GETYP C,A ; TYPE TO C
MOVE D,B ; DATUME
MOVEI B,-3(P) ; POINTER TO HOME
MOVE A,-7(P) ; GET INS
XCT A ; AND DO IT
MOVE C,-4(P) ; GET POINTER FOR UPDATE OF ELEMENT
MOVE E,TD.PUT+1
SOS D,-1(P) ; RESTORE COUNT
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVE B,-6(P) ; SAVED OFFSET
ADDI E,(B)-1 ; POINT TO SLOT
MOVE A,-3(P) ; RESTORE TYPE WORD
MOVE B,-2(P)
XCT (E) ; SMASH IT BACK
JRST TD.LOS
TD.WIN: MOVE C,-4(P)
JRST TD.UP2
TD.LOS: SKIPN GCDFLG
FATAL TEMPLATE LOSSAGE
JRST TD.WIN
TD.UP1: MOVE A,-7(P) ; RESTORE INS
SUB P,[10,,10]
MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
JRST VHACK1
; FATAL LOSSAGE ARRIVES HERE
BADV: FATAL GC SPACE IN A BAD STATE
; HERE TO HACK SPECIAL CRUFT IN GENERAL VECTORS (STACKS)
EHACK: JUMPE PVP,EHACKX
ADDI B,FRAMLN+1 ; SKIP THE FRAME
JRST GHACK1
EHACKX: HRRZ D,1(B)
CAILE D,HIBOT
JRST EHCK10
PUSH P,1(B)
HRL D,(D)
MOVEI C,TVEC
CAME A,[PUSHJ P,SBSTIS]
XCT A ; XCT SUBSTITUTE
POP P,C ; RESTORE TYPE
HLLM C,1(B) ; SMASH BACK
EHCK10: ADDI B,1
MOVSI D,-FRAMLN+1 ; SET UP AOBJN PNTR
EHACK1: HRRZ C,ETB(D) ; GET 1ST TYPE
PUSH P,D ; SAVE AOBJN
MOVE D,1(B) ; GET ITEM
CAME A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
XCT A ; USER GOODIE
POP P,D ; RESTORE AOBJN
ADDI B,1 ; MOVE ON
SOSLE (P) ; ALSO COUNT IN TOTAL VECTOR
AOBJN D,EHACK1
AOJA B,GHACK1 ; AND GO ON
; TABLE OF ENTRY BLOCK TYPES
ETB: TTB
TAB
TSP
TPDL
TTP
TWORD
; HERE TO GROVEL OVER BINDING BLOCKS
BHACK: MOVEI C,TATOM ; ALSO TREEAT AS ATOM
MOVE D,1(B)
CAME A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
XCT A
PUSHJ P,NXTGDY ; NEXT GOODIE
PUSHJ P,NXTGDY ; AND NEXT
MOVEI C,TSP ; TYPE THE BACK LOCATIVE
SKIPGE D,1(B)
XCT A
PUSHJ P,BMP ; AND NEXT
PUSH P,B
HLRZ D,-2(B) ; DECL POINTER
MOVEI B,0 ; MAKE SURE NO CLOBBER
MOVEI C,TDECL
XCT A ; DO THE THING BEING DONE
POP P,B
HRLM D,-2(B) ; FIX UP IN CASE CHANGED
JRST GHACK1
; HERE TO HACK ATOMS WITH GDECLS
GDHACK: CAMN A,[PUSHJ P,SBSTIS]
JRST GDHCK1
MOVEI C,TATOM ; TREAT LIKE ATOM
MOVE D,1(B)
XCT A
HRRZ D,(B) ; GET DECL
JUMPE D,GDHCK1
CAIN D,-1 ; WATCH OUT FOR MAINFEST
JRST GDHCK1
PUSH P,B ; SAVE POINTER
MOVEI B,0
MOVEI C,TLIST
XCT A
POP P,B
HRRM D,(B) ; RESET
JRST GDHCK1
; HERE TO HACK ATOMS
ATHACK: JUMPN PVP,BUCKHK ; IF ONLY CHANGING ATOMS, IGNROE OBLIST
MOVEI C,TOBLS ; GET TYPE
HRRZ D,2(B) ; AND DATUM
JUMPE D,BUCKHK ; NOT ON OBLIST, SO FLUSH
CAMGE D,VECBOT
MOVE D,(D) ; GET REAL OBLIST POINTER
HRLI D,-1
CAMN A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
JRST VHACK1
PUSH P,B
MOVEI B,0
XCT A
POP P,B
HRRM D,2(B)
BUCKHK: CAMN A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
JRST VHACK1
HLRZ D,2(B)
JUMPE D,VHACK1
PUSH P,B
PUSH P,D
MOVEI B,-1(P) ; FAKE OUT TO MUNG STACK
; HLRZ B,1(D)
; ANDI B,377777
; SUBI B,2
; HRLI B,(B)
; SUB D,B ; D NOW ATOM PNTR
MOVEI C,TATOM
XCT A
; HLRE B,D
; SUB D,B
POP P,D
POP P,B
HRLM D,2(B)
JRST VHACK1
; HERE TO HACK ASSOCIATION BLOCKS
ASHACK: MOVEI D,3 ; COUNT GOODIES TO MARK
ASHAK1: PUSH P,D
MOVE D,1(B)
GETYP C,(B)
PUSH P,D ; SAVE POINTER
XCT A
POP P,D ; GET OLD BACK
CAME D,1(B) ; CHANGED?
TLO E,400000 ; SET NON-VIRGIN FLAG
POP P,D
PUSHJ P,BMP ; TO NEXT
SOJG D,ASHAK1
; HERE TO GOT TO NEXT VECTOR
VHACK1: MOVE B,-1(P) ; GET POINTER
SUB P,[2,,2] ; FLUSH CRUFT
SUBI B,2 ; FIX UP PTR
POPJ P,
; HERE TO SKIP OVER MARKED VECTOR
MKHAK: SUBI B,(C) ; POINT BELOW VECTOR
POPJ P,
; ROUTINE TO GET A GOODIE
NXTGDY: GETYP C,(B)
NXTGD1: MOVE D,1(B)
XCT A ; DO IT TO IT
BMP: SOS -1(P)
SOSG -1(P)
JRST BMP1
ADDI B,2
POPJ P,
BMP1: SUB P,[1,,1]
JRST VHACK1
REHASQ: JUMPL E,REHASH ; HASH TABLE RAPED, FIX IT
POPJ P,
MFUNCTION SUBSTI,SUBR,[SUBSTITUTE]
;THIS FUNCTION CODED BY NDR IS AN INCREDIBLE WAY TO
;KILL YOURSELF, EVEN IF YOU THINK YOU REALLY KNOW WHAT
;YOU ARE DOING.
;IT DOES A MINI-GC CHANGING EACH REFERENCE OF THE
;SECOND ITEM TO A REFERENCE OF THE FIRST ITEM, HA HA HA.
;BOTH ITEMS MUST BE OF THE SAME TYPE OR
;IF NOT, NEITHER CAN BE A TYPE REQUIRING TWO WORDS
; OF STORAGE, AND SUBSTITUTION CANT BE DONE IN
; UVECTORS WHEN THEY ARE DIFFERENT, AS WELL AS IN
; A FEW OTHER YUCKY PLACES.
;RETURNS ITEM TWO--THE ONLY WAY TO GET YOUR HANDS BACK ON IT
ENTRY 2
SBSTI1: GETYP A,2(AB)
CAIE A,TATOM
JRST SBSTI2
MOVE B,3(AB) ; IMPURIFY HASH BUCKET MAYBE?
PUSHJ P,IMPURI
GETYP A,(AB) ; ATOM FOR ATOM SUBS?
CAIE A,TATOM
JRST SBSTI2 ; NO
MOVE B,3(AB) ; SEE IF OLD GUY
HLRE A,B
SUBM B,A ; POINT TO DOPE
HRRZ A,(A) ; POSSIBLE TYPE CODE
JUMPE A,SBSTI2 ; NOT A TYPE, GO
MOVE B,1(AB)
HLRE C,B
SUBM B,C
HRRZ C,(C) ; GET OTHER POSSIBLE CODE
JUMPN C,BADTYP
PUSH P,A
PUSHJ P,IMPURI ; IMPURIFY FOR SMASH
POP P,A
MOVE B,1(AB)
HLRE C,B
SUBM B,C
HRRM A,(C)
SBSTI2: GETYP A,2(AB) ; GET TYPE OF SECOND ARG
MOVE D,A
PUSHJ P,NWORDT ; AND STORAGE ALLOCATION
MOVE E,A
GETYP A,(AB) ; GET TYPE OF FIRST ARG
MOVE B,A
PUSHJ P,NWORDT
CAMN B,D ; IF TYPES SAME, DONT CHECK FOR ALLOCATION
JRST SBSTI3
CAIN E,1
CAIE A,1
JRST SBSTIL ; LOOSE, NOT BOTH ONE WORD GOODIES
SBSTI3: MOVEI C,0
CAIN D,0 ; IF GOODIE IS OF TYPE ZERO
MOVEI C,1 ; USE TYPE 1 TO KEEP INFO FROM CLOBBERAGE
PUSH TP,C
SUBI E,1
PUSH TP,E ; 1=DEFERRED TYPE ITEM, 0=ELSE
PUSH TP,C
PUSH TP,D ; TYPE OF GOODIE
PUSH TP,C
PUSH TP,[0]
CAIN D,TLIST
AOS (TP) ; 1=TYPE LIST, 0=ELSE
PUSH TP,C
PUSH TP,2(AB) ; TYPE-WORD
PUSH TP,C
PUSH TP,3(AB) ; VALUE-WORD
PUSH TP,(AB)
PUSH TP,1(AB) ; TYPE-VALUE OF THINGS TO CHANGE INTO
MOVE A,[PUSHJ P,SBSTIR]
CAME B,D ; IF NOT SAME TYPE, USE DIFF MUNGER
MOVE A,[PUSHJ P,SBSTIS]
MOVEI PVP,0 ; INDICATE NOT SPECIAL ATOM THING
PUSHJ P,GCHACK ; DO-IT
MOVE A,-4(TP)
MOVE B,-2(TP)
JRST FINIS ; GIVE THE LOOSER A HANDLE ON HIS GOODIE
SBSTIR: CAME D,-2(TP)
JRST LSUB ; THIS IS IT
CAME C,-10(TP)
JRST LSUB ; IF ITEM CANT BE SAME CHECK FOR LISTAGE
JUMPE B,LSUB+1 ; WE GOT HOLD OF A FUNNY GOODIE, JUST IGNORE IT
MOVE 0,(TP)
MOVEM 0,1(B) ; SMASH IT
MOVE 0,-1(TP) ; GET TYPE WORD
SKIPE -12(TP) ; IF THIS IS A DEFFERABLE ITEM THEN WE MUST
MOVEM 0,(B) ; ALSO SMASH THE TYPE WORD SLOT
LSUB: SKIPN -6(TP) ; IF WE ARE LOOKING FOR LISTS, LOOK ON
POPJ P, ; ELSE THATS ALL
TLNN B,.LIST. ; SEE IF A LIST
POPJ P, ; WELL NO LIST SMASHING THIS TIME
HRRZ 0,(B) ; GET ITS LIST POINTER
CAME 0,-2(TP)
POPJ P, ; THIS ONE DIDNT MATCH
MOVE 0,(TP) ; GET THE NEW REST OF THE LIST
HRRM 0,(B) ; AND SMASH INTO THE REST OF THE LIST
POPJ P,
SBSTIS: CAMN D,-2(TP)
CAME C,-10(TP)
POPJ P,
SKIPN B ; SEE IF THIS IS A FUNNY GOODIE WE NO TOUCHIE
POPJ P,
MOVE 0,(TP)
MOVEM 0,1(B) ; KLOBBER VALUE CELL
MOVE 0,-1(TP)
HLLM 0,(B) ; KLOBBER TYPE CELL, WHICH WE KNOW IS THERE
POPJ P,
SBSTIL: ERRUUO EQUOTE CANT-SUBSTITUTE-WITH-STRING-OR-TUPLE-AND-OTHER
BADTYP: ERRUUO EQUOTE SUBSTITUTE-TYPE-FOR-TYPE
GHSTUP: HRRZ E,TYPVEC+1 ; SET UP TYPE POINTER
HRLI E,C ; WILL HAVE TYPE CODE IN C
SETOM 1(TP) ; FENCE POST PDL
PUSH P,A
MOVEI A,(TB)
PUSHJ P,FRMUNG ; MUNG CURRENT FRAME
POP P,A
POPJ P,
IMPURE
; LOCATION TO REMEMBER PREVIOUS VALUES
SVTAB: SVLOC1
NXTTAB: SVLOC2
SVLOC1: 0
SVLOC2: 0
PURE
END


540
src/mudsys/gchack.mid.46 Normal file
View File

@@ -0,0 +1,540 @@
TITLE GCHACK
RELOCATABLE
.INSRT MUDDLE >
.GLOBAL FRMUNG,PARBOT,TYPVEC,GCHACK,REHASH,IMPURI,NWORDT,GCDFLG
.GLOBAL TD.LNT,TD.GET,TD.PUT,GCSTOP,GCSBOT,GCHK10,STOSTR,UBIT,PVSTOR,SPSTOR
UBIT==40000 ; BIT INDICATING VECTOR
.LIST.==400000
; THIS IS AN INTERNAL MUDDLE SUBROUTINE TO RUN AROUND GC SPACE DOING
; SOMETHING ARBITRARY TO EVERY ENTITY THEREIN
; CALL --
; A/ INSTRUCTION TO BE EXECUTED
; PVP/ NON-ZERO OPTIMIZE--ONLY LOOK AT ATOMS
; PUSHJ P,GCHACK
; HERE FOR SPECIAL HACKS WHICH DON'T TOUCH STOAGE
GCHK10: PUSHJ P,GHSTUP
JRST GCHK1
GCHACK: PUSHJ P,GHSTUP ; SETUP
MOVE B,CODTOP ; START OFF WITH IMPURE STORAGE
SUBI B,1 ; START AT FIRST WORD
LOPSTO: CAIG B,STOSTR
JRST GCHK1
HRRE 0,1(B) ; GET INDICATOR OF MODIFICATION
JUMPGE 0,LOSTO ; JUMP IF GARBAGE
PUSHJ P,VHACK ; VHACK
JRST LOPSTO
LOSTO: HLRZ C,1(B) ; BACK OF VECTOR
TRZ C,400000
SUBI B,(C) ; SKIP OVER VECTOR
JRST LOPSTO
GCHK1: MOVE B,VECTOP ; NO LOOP THRU GCS
MOVEI B,-2(B)
LOOPHK: MOVE C,SVTAB
MOVEM B,(C)
EXCH C,NXTTAB ; SWAP LOCATIONS
EXCH C,SVTAB
TLZ B,.LIST. ; TURN OFF LIST BIT
CAMGE B,GCSBOT ; SEE IF DONE
JRST REHASQ ; SEE IF ASSOCIATIONS ARE GOOD
MOVE C,(B) ; GET ELEMENT
TLNE C,.VECT. ; SEE IF IT IS A VECTOR
JRST VHCK ; JUMP IF IT IS
GLSTHK: GETYP C,(B) ; TYPE OF CURRENT PAIR
MOVE D,1(B) ; AND ITS DATUM
TLO B,.LIST. ; INDICATE A LIST
SKIPL (B) ; SKIP IF MARKED
XCT A ; APPLY INS
SUBI B,2
JRST LOOPHK
VHCK: PUSHJ P,VHACK ; TO VHACK
JRST LOOPHK
; NOW DO THE SAME THING TO VECTOR SPACE
VHACK: HLRE D,(B) ; GET TYPE FROM D.W.
TRZ D,.VECT. ; GET RID OF VECTOR INDICATION BIT
HLRZ C,1(B) ; AND TOTAL LENGTH
TRZE C,400000 ; GET RID OF POSSIBLE MARK BIT
JRST MKHAK ; JUMP IF MARKED
SUBI B,(C)-2 ; POINT TO START OF VECTOR
PUSH P,B
SUBI C,2 ; CHECK WINNAGE
JUMPL C,BADV ; FATAL LOSSAGE
PUSH P,C ; SAVE COUNT
JUMPE C,VHACK1 ; EMPTY VECTOR, FINISHED
; DECIDE BASED ON TYPE WHETHER GENERAL,UNIFORM OR SPECIAL
JUMPGE D,UHACK ; UNIFORM
TRNE D,377777 ; SKIP IF GENERAL
JRST SHACK ; SPECIAL
; FALL THROUGH TO GENERAL
GHACK1: SKIPGE (B) ; CHECK FOR FENCE POST
JRST VHACK1
GETYP C,(B) ; LOOK A T 1ST ELEMENT
CAIE C,TCBLK
CAIN C,TENTRY ; FRAME ON STACK
SOJA B,EHACK
CAIE C,TUBIND
CAIN C,TBIND ; BINDING BLOCK
JRST BHACK
CAIN C,TGATOM ; ATOM WITH GDECL?
JRST GDHACK
MOVE D,1(B) ; GET DATUM
XCT A ; USER INS
GDHCK1: ADDI B,2 ; NEXT ELEMENT
SOS (P)
SOSLE (P) ; COUNT ELEMENTS
SKIPGE (B) ; OR FENCE POST HIT
JRST VHACK1
JRST GHACK1
; HERE TO GO OVER UVECTORS
UHACK: CAMN A,[PUSHJ P,SBSTIS]
JRST VHACK1 ; IF THIS SUBSTITUTE, DONT DO UVEC
MOVEI C,(D) ; COPY UNIFORM TYPE
JUMPE PVP,UHACKX ; JUMP IF NOT ONLY ATOMS
ASH C,1 ; COMPUTE SAT
ADD C,TYPVEC+1
HRRZ C,(C)
ANDI C,SATMSK ; GOT ITS SAT
CAIE C,SCHSTR ; COULD BE SPNAME
JRST .+3
CAIE C,SATOM ; DON'T BOTHER IF NOT ALL ATOMS
JRST VHACK1
MOVEI C,(D)
UHACKX: PUSH P,C ; ATFIX CLOBBERS C
SUBI B,1 ; BACK OFF
UHACK1: MOVE C,(P)
TLO B,UBIT ; TURN ON BIT INDICATING UVECTOR
MOVE D,1(B) ; DATUM
XCT A
SOSLE -1(P) ; COUNT DOEN
AOJA B,UHACK1
TLZ UBIT
POP P,C
JRST VHACK1
; HERE TO HACK VARIOUS FLAVORS OF SPECIAL GOODIES
SHACK: ANDI D,377777 ; KILL EXTRA CRUFT
CAIN D,SATOM
JRST ATHACK
CAIE D,STPSTK ; STACK OR
CAIN D,SPVP ; PROCESS
JRST GHACK1 ; TREAT LIKE GENERAL
CAIN D,SASOC ; ASSOCATION
JRST ASHACK
CAIG D,NUMSAT ; TEMPLATE MAYBE?
JRST BADV ; NO CHANCE
ADDI C,(B) ; POINT TO DOPE WORDS
SUBI D,NUMSAT+1
HRLI D,(D)
ADD D,TD.LNT+1
JUMPGE D,BADV ; JUMP IF INVALID TEMPLATE HACKER
CAMN A,[PUSHJ P,SBSTIS]
JRST VHACK1
TD.UPD: PUSH P,A ; INS TO EXECUTE
XCT (D)
HLRZ E,B ; POSSIBLE BASIC LENGTH
PUSH P,[0]
PUSH P,E
MOVEI B,(B) ; ISOLATE LENGTH
PUSH P,C ; SAVE POINTER TO OBJECT
PUSH P,[0] ; HOME FOR VALUES
PUSH P,[0] ; SLOT FOR TEMP
PUSH P,B ; SAVE
SUB D,TD.LNT+1
PUSH P,D ; SAVE FOR FINDING OTHER TABLES
JUMPE E,TD.UP2 ; NO REPEATING SEQ
ADD D,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
HLRE D,(D) ; D ==> - LNTH OF TEMPLATE
ADDI D,(E) ; D ==> -LENGTH OF REP SEQ
MOVNS D
HRLM D,-5(P) ; SAVE IT AND BASIC
TD.UP2: SKIPG D,-1(P) ; ANY LEFT?
JRST TD.UP1
MOVE E,TD.GET+1
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVEM D,-6(P) ; SAVE ELMENT #
SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
SOJA D,TD.UP3
MOVEI 0,(B) ; BASIC LNT TO 0
SUBI 0,(D) ; SEE IF PAST BASIC
JUMPGE 0,.-3 ; JUMP IF O.K.
MOVSS B ; REP LNT TO RH, BASIC TO LH
IDIVI 0,(B) ; A==> -WHICH REPEATER
MOVNS A
ADD A,-5(P) ; PLUS BASIC
ADDI A,1 ; AND FUDGE
MOVEM A,-6(P) ; SAVE FOR PUTTER
ADDI E,-1(A) ; POINT
SOJA D,.+2
TD.UP3: ADDI E,(D) ; POINT TO SLOT
XCT (E) ; GET THIS ELEMENT INTO A AND B
TLO A,UBIT ; INDICATE ITS A ANY
MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
MOVEM B,-2(P)
GETYP C,A ; TYPE TO C
MOVE D,B ; DATUME
MOVEI B,-3(P) ; POINTER TO HOME
MOVE A,-7(P) ; GET INS
XCT A ; AND DO IT
MOVE C,-4(P) ; GET POINTER FOR UPDATE OF ELEMENT
MOVE E,TD.PUT+1
SOS D,-1(P) ; RESTORE COUNT
ADD E,(P)
MOVE E,(E) ; POINTER TO VECTOR IN E
MOVE B,-6(P) ; SAVED OFFSET
ADDI E,(B)-1 ; POINT TO SLOT
MOVE A,-3(P) ; RESTORE TYPE WORD
MOVE B,-2(P)
XCT (E) ; SMASH IT BACK
JRST TD.LOS
TD.WIN: MOVE C,-4(P)
JRST TD.UP2
TD.LOS: SKIPN GCDFLG
FATAL TEMPLATE LOSSAGE
JRST TD.WIN
TD.UP1: MOVE A,-7(P) ; RESTORE INS
SUB P,[10,,10]
MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
JRST VHACK1
; FATAL LOSSAGE ARRIVES HERE
BADV: FATAL GC SPACE IN A BAD STATE
; HERE TO HACK SPECIAL CRUFT IN GENERAL VECTORS (STACKS)
EHACK: JUMPE PVP,EHACKX
ADDI B,FRAMLN+1 ; SKIP THE FRAME
JRST GHACK1
EHACKX: HRRZ D,1(B)
CAILE D,HIBOT
JRST EHCK10
PUSH P,1(B)
HRL D,(D)
MOVEI C,TVEC
CAME A,[PUSHJ P,SBSTIS]
XCT A ; XCT SUBSTITUTE
POP P,C ; RESTORE TYPE
HLLM C,1(B) ; SMASH BACK
EHCK10: ADDI B,1
MOVSI D,-FRAMLN+1 ; SET UP AOBJN PNTR
EHACK1: HRRZ C,ETB(D) ; GET 1ST TYPE
PUSH P,D ; SAVE AOBJN
MOVE D,1(B) ; GET ITEM
CAME A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
XCT A ; USER GOODIE
POP P,D ; RESTORE AOBJN
ADDI B,1 ; MOVE ON
SOSLE (P) ; ALSO COUNT IN TOTAL VECTOR
AOBJN D,EHACK1
AOJA B,GHACK1 ; AND GO ON
; TABLE OF ENTRY BLOCK TYPES
ETB: TTB
TAB
TSP
TPDL
TTP
TWORD
; HERE TO GROVEL OVER BINDING BLOCKS
BHACK: MOVEI C,TATOM ; ALSO TREEAT AS ATOM
MOVE D,1(B)
CAME A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
XCT A
PUSHJ P,NXTGDY ; NEXT GOODIE
PUSHJ P,NXTGDY ; AND NEXT
MOVEI C,TSP ; TYPE THE BACK LOCATIVE
SKIPGE D,1(B)
XCT A
PUSHJ P,BMP ; AND NEXT
PUSH P,B
HLRZ D,-2(B) ; DECL POINTER
MOVEI B,0 ; MAKE SURE NO CLOBBER
MOVEI C,TDECL
XCT A ; DO THE THING BEING DONE
POP P,B
HRLM D,-2(B) ; FIX UP IN CASE CHANGED
JRST GHACK1
; HERE TO HACK ATOMS WITH GDECLS
GDHACK: CAMN A,[PUSHJ P,SBSTIS]
JRST GDHCK1
MOVEI C,TATOM ; TREAT LIKE ATOM
MOVE D,1(B)
XCT A
HRRZ D,(B) ; GET DECL
JUMPE D,GDHCK1
CAIN D,-1 ; WATCH OUT FOR MAINFEST
JRST GDHCK1
PUSH P,B ; SAVE POINTER
MOVEI B,0
MOVEI C,TLIST
XCT A
POP P,B
HRRM D,(B) ; RESET
JRST GDHCK1
; HERE TO HACK ATOMS
ATHACK: JUMPN PVP,BUCKHK ; IF ONLY CHANGING ATOMS, IGNROE OBLIST
MOVEI C,TOBLS ; GET TYPE
HRRZ D,2(B) ; AND DATUM
JUMPE D,BUCKHK ; NOT ON OBLIST, SO FLUSH
CAMGE D,VECBOT
MOVE D,(D) ; GET REAL OBLIST POINTER
HRLI D,-1
CAMN A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
JRST VHACK1
PUSH P,B
MOVEI B,0
XCT A
POP P,B
HRRM D,2(B)
BUCKHK: CAMN A,[PUSHJ P,SBSTIS] ; DONT IF SUBSTITUTE DIFFERENT
JRST VHACK1
HLRZ D,2(B)
JUMPE D,VHACK1
PUSH P,B
PUSH P,D
MOVEI B,-1(P) ; FAKE OUT TO MUNG STACK
; HLRZ B,1(D)
; ANDI B,377777
; SUBI B,2
; HRLI B,(B)
; SUB D,B ; D NOW ATOM PNTR
MOVEI C,TATOM
XCT A
; HLRE B,D
; SUB D,B
POP P,D
POP P,B
HRLM D,2(B)
JRST VHACK1
; HERE TO HACK ASSOCIATION BLOCKS
ASHACK: MOVEI D,3 ; COUNT GOODIES TO MARK
ASHAK1: PUSH P,D
MOVE D,1(B)
GETYP C,(B)
PUSH P,D ; SAVE POINTER
XCT A
POP P,D ; GET OLD BACK
CAME D,1(B) ; CHANGED?
TLO E,400000 ; SET NON-VIRGIN FLAG
POP P,D
PUSHJ P,BMP ; TO NEXT
SOJG D,ASHAK1
; HERE TO GOT TO NEXT VECTOR
VHACK1: MOVE B,-1(P) ; GET POINTER
SUB P,[2,,2] ; FLUSH CRUFT
SUBI B,2 ; FIX UP PTR
POPJ P,
; HERE TO SKIP OVER MARKED VECTOR
MKHAK: SUBI B,(C) ; POINT BELOW VECTOR
POPJ P,
; ROUTINE TO GET A GOODIE
NXTGDY: GETYP C,(B)
NXTGD1: MOVE D,1(B)
XCT A ; DO IT TO IT
BMP: SOS -1(P)
SOSG -1(P)
JRST BMP1
ADDI B,2
POPJ P,
BMP1: SUB P,[1,,1]
JRST VHACK1
REHASQ: JUMPL E,REHASH ; HASH TABLE RAPED, FIX IT
POPJ P,
MFUNCTION SUBSTI,SUBR,[SUBSTITUTE]
;THIS FUNCTION CODED BY NDR IS AN INCREDIBLE WAY TO
;KILL YOURSELF, EVEN IF YOU THINK YOU REALLY KNOW WHAT
;YOU ARE DOING.
;IT DOES A MINI-GC CHANGING EACH REFERENCE OF THE
;SECOND ITEM TO A REFERENCE OF THE FIRST ITEM, HA HA HA.
;BOTH ITEMS MUST BE OF THE SAME TYPE OR
;IF NOT, NEITHER CAN BE A TYPE REQUIRING TWO WORDS
; OF STORAGE, AND SUBSTITUTION CANT BE DONE IN
; UVECTORS WHEN THEY ARE DIFFERENT, AS WELL AS IN
; A FEW OTHER YUCKY PLACES.
;RETURNS ITEM TWO--THE ONLY WAY TO GET YOUR HANDS BACK ON IT
ENTRY 2
SBSTI1: GETYP A,2(AB)
CAIE A,TATOM
JRST SBSTI2
MOVE B,3(AB) ; IMPURIFY HASH BUCKET MAYBE?
PUSHJ P,IMPURI
GETYP A,(AB) ; ATOM FOR ATOM SUBS?
CAIE A,TATOM
JRST SBSTI2 ; NO
MOVE B,3(AB) ; SEE IF OLD GUY
HLRE A,B
SUBM B,A ; POINT TO DOPE
HRRZ A,(A) ; POSSIBLE TYPE CODE
JUMPE A,SBSTI2 ; NOT A TYPE, GO
MOVE B,1(AB)
HLRE C,B
SUBM B,C
HRRZ C,(C) ; GET OTHER POSSIBLE CODE
JUMPN C,BADTYP
PUSH P,A
PUSHJ P,IMPURI ; IMPURIFY FOR SMASH
POP P,A
MOVE B,1(AB)
HLRE C,B
SUBM B,C
HRRM A,(C)
SBSTI2: GETYP A,2(AB) ; GET TYPE OF SECOND ARG
MOVE D,A
PUSHJ P,NWORDT ; AND STORAGE ALLOCATION
MOVE E,A
GETYP A,(AB) ; GET TYPE OF FIRST ARG
MOVE B,A
PUSHJ P,NWORDT
CAMN B,D ; IF TYPES SAME, DONT CHECK FOR ALLOCATION
JRST SBSTI3
CAIN E,1
CAIE A,1
JRST SBSTIL ; LOOSE, NOT BOTH ONE WORD GOODIES
SBSTI3: MOVEI C,0
CAIN D,0 ; IF GOODIE IS OF TYPE ZERO
MOVEI C,1 ; USE TYPE 1 TO KEEP INFO FROM CLOBBERAGE
PUSH TP,C
SUBI E,1
PUSH TP,E ; 1=DEFERRED TYPE ITEM, 0=ELSE
PUSH TP,C
PUSH TP,D ; TYPE OF GOODIE
PUSH TP,C
PUSH TP,[0]
CAIN D,TLIST
AOS (TP) ; 1=TYPE LIST, 0=ELSE
PUSH TP,C
PUSH TP,2(AB) ; TYPE-WORD
PUSH TP,C
PUSH TP,3(AB) ; VALUE-WORD
PUSH TP,(AB)
PUSH TP,1(AB) ; TYPE-VALUE OF THINGS TO CHANGE INTO
MOVE A,[PUSHJ P,SBSTIR]
CAME B,D ; IF NOT SAME TYPE, USE DIFF MUNGER
MOVE A,[PUSHJ P,SBSTIS]
MOVEI PVP,0 ; INDICATE NOT SPECIAL ATOM THING
PUSHJ P,GCHACK ; DO-IT
MOVE A,-4(TP)
MOVE B,-2(TP)
JRST FINIS ; GIVE THE LOOSER A HANDLE ON HIS GOODIE
SBSTIR: CAME D,-2(TP)
JRST LSUB ; THIS IS IT
CAME C,-10(TP)
JRST LSUB ; IF ITEM CANT BE SAME CHECK FOR LISTAGE
JUMPE B,LSUB+1 ; WE GOT HOLD OF A FUNNY GOODIE, JUST IGNORE IT
MOVE 0,(TP)
MOVEM 0,1(B) ; SMASH IT
MOVE 0,-1(TP) ; GET TYPE WORD
SKIPE -12(TP) ; IF THIS IS A DEFFERABLE ITEM THEN WE MUST
MOVEM 0,(B) ; ALSO SMASH THE TYPE WORD SLOT
LSUB: SKIPN -6(TP) ; IF WE ARE LOOKING FOR LISTS, LOOK ON
POPJ P, ; ELSE THATS ALL
TLNN B,.LIST. ; SEE IF A LIST
POPJ P, ; WELL NO LIST SMASHING THIS TIME
HRRZ 0,(B) ; GET ITS LIST POINTER
CAME 0,-2(TP)
POPJ P, ; THIS ONE DIDNT MATCH
MOVE 0,(TP) ; GET THE NEW REST OF THE LIST
HRRM 0,(B) ; AND SMASH INTO THE REST OF THE LIST
POPJ P,
SBSTIS: CAMN D,-2(TP)
CAME C,-10(TP)
POPJ P,
SKIPN B ; SEE IF THIS IS A FUNNY GOODIE WE NO TOUCHIE
POPJ P,
MOVE 0,(TP)
MOVEM 0,1(B) ; KLOBBER VALUE CELL
MOVE 0,-1(TP)
HLLM 0,(B) ; KLOBBER TYPE CELL, WHICH WE KNOW IS THERE
POPJ P,
SBSTIL: ERRUUO EQUOTE CANT-SUBSTITUTE-WITH-STRING-OR-TUPLE-AND-OTHER
BADTYP: ERRUUO EQUOTE SUBSTITUTE-TYPE-FOR-TYPE
GHSTUP: HRRZ E,TYPVEC+1 ; SET UP TYPE POINTER
HRLI E,C ; WILL HAVE TYPE CODE IN C
SETOM 1(TP) ; FENCE POST PDL
PUSH P,A
MOVEI A,(TB)
PUSHJ P,FRMUNG ; MUNG CURRENT FRAME
POP P,A
POPJ P,
IMPURE
; LOCATION TO REMEMBER PREVIOUS VALUES
SVTAB: SVLOC1
NXTTAB: SVLOC2
SVLOC1: 0
SVLOC2: 0
PURE
END

BIN
src/mudsys/initm.bin.17 Normal file

Binary file not shown.

1360
src/mudsys/initm.mid.371 Normal file

File diff suppressed because it is too large Load Diff

1360
src/mudsys/initm.mid.373 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/interr.bin.28 Normal file

Binary file not shown.

BIN
src/mudsys/interr.bin.30 Normal file

Binary file not shown.

2890
src/mudsys/interr.mid.419 Normal file

File diff suppressed because it is too large Load Diff

2898
src/mudsys/interr.mid.425 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/ipc.bin.2 Normal file

Binary file not shown.

815
src/mudsys/ipc.mid.19 Normal file
View File

@@ -0,0 +1,815 @@
TITLE IPC -- IPC COMMUNICATIONS HANDLER FOR MUDDLE
RELOCATABLE
; N. RYAN October 1973
.INSRT MUDDLE >
;THIS PROGRAM HAS ENTRIES SEND, SEND-WAIT, IPC-OFF,
; AND IPC-HANDLER.
;THESE HANDLE THE IPC DEVICE.
;SEND AND SEND-WAIT SEND OUT A MESSAGE ON THE IPC DEVICE.
;THEY TAKE 6 ARGUMENTS, THE FIRST THREE OF WHICH ARE NECESSARY
; SEND (<HISNAME1> <HISNAME2> <MESSAGE> <MESSAGE-TYPE> <MYNAME1> <MYNAME2>)
; <HISNAME1> -- STRING USED AS SIXBIT FOR NAME 1
; <HISNAME2> -- STRING USED AS SIXBIT FOR NAME 2
; <MESSAGE> -- THE MESSAGE TO SEND, EITHER A STRING OR A UVECTOR OF TYPE WORD
; <TYPE> -- THE TYPECODE TO SEND, A FIXED NUMBER, DEFAULT 0
; <MYNAME1> -- STRING USED AS SIXBIT FOR MY NAME 1
; <MYNAME2> -- STRING USED AS SIXBIT FOR MY NAME 2
; SEND -- TRIES TO SEND IMMEDIATELY, ELSE RETURNS FALSE WITH MESSAGE
; SEND-WAIT -- HANGS UNTIL MESSAGE CAN BE SENT
; IPC-OFF -- NO ARGUMENTS, CLOSES ALL IPC-RECEIVE CHANNELS
; IPC-ON -- OPENS AN IPC RECEIVE CHANNEL
; IT TAKES 2 OPTIONAL ARGS WHICH ARE THE NAMES TO LISTEN ON,
; THE DEFAULT IS UNAME, JNAME
; DEFINITIONS FOR STRUCTURE OF IPC BUFFER
BUFL==200. ;LENGTH OF IPC BUFFER
BUFHED==3 ;LENGTH OF BUFFER HEADER
CONT==400000 ;LEFT HALF BIT INDICATING THIS IS CONTINUATION
INCOMP==200000 ;LEFT HALF BIT INDICATING MESSAGE COMPLETE
ASCIMS==100000 ;LEFT HALF BIT INDICATING THIS IS PACKED ASCII MESSAGE
MESHED==2 ;LENGTH OF CRUFT AT FRONT OF FIRST MESSAGE
MAXMES==20000. ;MAXIMUM LENGTH IN WORDS OF MESSAGES MUDDLE WILL LIKE
.GLOBAL STRTO6,SAT,IBLOCK,MOPEN,MCLOSE,GFALS,TTOCHN,INCONS,MASK2,INTHLD
.GLOBAL IPCS1,IBLOCK,IPCGOT,DIRQ,GIBLOK,6TOCHS,CAFRE,CAFRET,IPCBLS,PVSTOR,SPSTOR
; DEFINITIONS OF BITS IN THE OPEN BLOCK FOR IPC DEVICE
RFROMA==1 ;READ FROM ANY
RFROMS==2 ;READ FROM SPECIFIC
SANDH==4 ;SEND AND HANG
SIMM==10 ;SEND IMMEDIATE
USEUJ==20 ;USE MY UNAME, JNAME
;BUFFERFORMAT: HISNAME1
; HISNAME2
; COUNT
; BITS,,LENGTH
; TYPE
;WHERE ASCII MESSAGES CONSIST OF A COUNT FOLLOWED BY CHARS
;THE LENGTH IS THE LENGTH OF THE TYPE WORD PLUS ALL THE BODIES
; THE FOLLOWING IS THE HANDLER WHICH WILL NORMALLY BE PUT ON THE
; IPC INTERRUPT AND SO SERVE AS THE DEFAULT HANDLER FOR IPC RECEIVES
; WHICH ARE NOT CAUGHT BY THE USER AND SERVICED IN SOME OTHER MANNER
; NOTE THAT AS AN EXPERIMENT, MESSAGE WHICH ARE ASCII STRINGS WITH TYPE-CODE 1
; ARE CONSIDERED AS EXECUTE COMMANDS. THEY ARE FIRST PRINTED OUT,
; THEN THEY ARE PARSED AND THAT RESULT IS EVALED.
; ALL MESSAGES OF OTHER TYPES ARE CONSIDERED MERELY AS MESSAGES TO BE
; PRINTED OUT WITH AN INDICATING OF WHO THEY ARE FROM
; THE ARGS WHICH THIS SUBROUTINE IS CALLED WITH BY INTERRUPT ARE
; <MESSAGE> <TYPE> <HIS NAME 1> <HIS NAME 2> <MY NAME 1> <MY NAME 2>
; WHERE THE LAST TWO ARE OPTIONAL AND ONLY GIVEN IF THE SOCKET WAS NOT
; LISTENING ON THE DEFAULT UNAME,JNAME COMBINATION.
MFUNCTION IPCH,SUBR,[IPC-HANDLER]
ENTRY
PUSH P,[0] ;SAVE A SLOT FOR LATTER USE
HLRE 0,AB ;CHECK THE NUMBER OF ARGS WE GOT
CAMLE 0,[-8.] ;NEED AT LEAST 4 ARGS
JRST WNA
GETYP E,(AB) ;CHECK TYPE OF FIRST ARG
CAIN E,TCHSTR ;IS IT A CHARACTER STRING
JRST .+3
CAIE E,TUVEC ;IF NOT IT MUST BE A UVECTOR
JRST WTYP1 ;IF NEITHER THEN WE HAVE A LOOSER
GETYP A,2(AB) ;GET TYPE OF MESSAGE TYPE, SHOULD BE A FIX
CAIE A,TFIX
JRST WTYP2 ;IF NOT FIX COMPLAIN
GETYP A,4(AB)
CAIE A,TCHSTR ;HIS NAME 1 SHOULD BE CHAR STRING
JRST WTYP
GETYP A,6(AB)
CAIE A,TCHSTR
JRST WTYP ;HIS NAME 2 SHOULD BE CHAR STRING
CAML 0,[-8.] ;SEE IF WE HAVE 4 OR 6 ARGS
JRST IPCH1 ;WE ONLY HAD 4 ARGS
CAME 0,[-12.] ;THEN WE MUST HAVE EXACTLY 6 ARGS
JRST WNA
GETYP A,(AB)8.
CAIE A,TCHSTR
JRST WTYP ;CHECK TO SEE THE MY NAME 1 IS STRING
GETYP A,10.(AB)
CAIE A,TCHSTR
JRST WTYP ;CHECK TO SEE THAT MY NAME 2 IS STRING
IPCH1: PUSH TP,$TCHAN
PUSH TP,TTOCHN+1 ;PUSH ON TTY OUTPUT CHANNEL TO CALL TERPRI
MCALL 1,TERPRI
PUSH TP,$TCHSTR
PUSH TP,CHQUOTE [IPC MESSAGE FROM ]
PUSH TP,$TCHAN
PUSH TP,TTOCHN+1
MCALL 2,PRINC ;PRINT OUT BLURB TO TELL LOOSER WHATS HAPPENING
PUSH TP,4(AB)
PUSH TP,5(AB) ;OUTPUT HIS NAME 1
PUSHJ P,TO ;JUMP OUT OUTPUTTER OVER TTY OUTPUT CHANNEL
PUSHJ P,STO ;JUMP TO SPACE OUTPUTTER OVER TTY OUTPUT CHANNEL
PUSH TP,6(AB)
PUSH TP,7(AB) ;OUTPUT NAME 2
PUSHJ P,TO
MOVE E,3(AB) ;MESSAGE TYPE
JUMPE E,IPCH3 ;IF MESSAGE TYPE 0 DO NOTHING ABOUT IT
CAIE E,1 ;IF 1 SEE IF THIS IS EXECUTE MESSAGE
JRST IPCH2 ;IF NOT TELL LOOSER ABOUT THIS MESSAGE TYPE
GETYP 0,(AB)
CAIE 0,TCHSTR ;SEE IF WE HAVE STRING
JRST IPCH2 ;IF NOT THIS CANT BE EXECUTE MESSAGE
AOS (P) ;SET FLAG TO INDICATE EXECUTE MESSAGE
PUSH TP,$TCHSTR
PUSH TP,CHQUOTE [ EXECUTE]
PUSHJ P,TO ;TELL THE LOOSER HE IS GETTING WHAT HE DESERVES
JRST IPCH3
IPCH2: PUSH TP,$TCHSTR
PUSH TP,CHQUOTE [ TYPE ]
PUSHJ P,TO
PUSH TP,2(AB)
PUSH TP,3(AB) ;PUSH ON THE MESSAGE TYPE
PUSHJ P,TO
IPCH3: HLRE 0,AB
CAME 0,[-12.] ;SEE IF WE HAVE 6 ARGS AND SO MUST TELL HIM WHO MESS IS FOR
JRST IPCH4 ;IF NOT DONT WORRY
PUSH TP,$TCHSTR
PUSH TP,CHQUOTE [ TO ]
PUSHJ P,TO
PUSH TP,8.(AB)
PUSH TP,9.(AB) ;PUSH ON MY NAME 1
PUSHJ P,TO
PUSHJ P,STO ;LEAVE SPACE BETWEEN NAMES
PUSH TP,10.(AB) ;PUSH ON MY NAME 2
PUSH TP,11.(AB)
PUSHJ P,TO
IPCH4: PUSH TP,(AB) ;PUSH ON THE ACTUAL GOODIE
PUSH TP,1(AB)
PUSH TP,$TCHAN
PUSH TP,TTOCHN+1
MCALL 2,PRINT ;AND PRINT IT OUT
SKIPN (P) ;TEST TO SEE IF WE MUST EXECUTE THIS BAG BITTER
JRST IPCHND
PUSH TP,(AB)
PUSH TP,1(AB)
MCALL 1,PARSE ;PARSE HIS CRUFT
PUSH TP,A
PUSH TP,B
MCALL 1,EVAL ;THEN EVAL THE RESULT
IPCHND: PUSH TP,$TCHAN
PUSH TP,TTOCHN+1
MCALL 1,TERPRI
MOVSI A,TATOM
MOVE B,IMQUOTE T
JRST FINIS ;TO RETURN WITH SOMETHING NICE
STO: PUSH TP,$TCHSTR ;CROCK TO OUTPUT A SPACE ON THE TTY OUTPUT CHANNEL
PUSH TP,CHQUOTE [ ]
TO: PUSH TP,$TCHAN
PUSH TP,TTOCHN+1
MCALL 2,PRINC
POPJ P, ;GO BACK TO WHAT WE WERE DOING
;THESE ARE THE FUNCTIONS TO ACTUALLY STUFF GOODIES OUT
;OVER THE IPC DEVICE
;DESCRIPTION OF CALLING ARGS TO THEM IS AT THE
;FIRST OF THE FILE
MFUNCTION SEND,SUBR
ENTRY
PUSH P,[0] ;FLAG TO INDICATE DONT WAIT
JRST CASND
MFUNCTION SENDW,SUBR,[SEND-WAIT]
ENTRY
PUSH P,[1] ;FLAG TO INDICATE WAITING
CASND: HLRE 0,AB
CAMG 0,[-6] ;NEED AT LEAST 3 ARGS
CAMGE 0,[-12.] ;AND NOT MORE THAN 6 ARGS
JRST WNA
MOVE A,(AB)
MOVE B,1(AB)
PUSHJ P,STRTO6 ;POOF FIRST ARG TO SIXBIT
MOVE A,2(AB)
MOVE B,3(AB)
PUSHJ P,STRTO6 ;POOF SECOND ARG TO SIXBIT
GETYP 0,4(AB)
CAIN 0,TCHSTR
JRST CASND1 ;IF FIRST ARG IS STRING, NO PROBLEMS
CAIE 0,TSTORAGE
CAIN 0,TUVEC
JRST .+2
JRST WTYP3 ;ELSE MUST BE OF TYPE STORAGE OR UVEC
MOVE B,5(AB)
HLRE C,B ;GET COUNT FIELD
SUBI B,(C) ;AND ADD THAT AMOUNT TO FIND DOPE WORD
GETYP A,(B) ;GET TYPE WORD OUT OF DOPE
PUSHJ P,SAT ;GET ITS STORAGE TYPE
CAIE A,S1WORD
JRST WTYP3 ;CRUFT MUST BE OF TYPE WORD
CASND1: PUSH TP,4(AB)
PUSH TP,5(AB) ;SAVE THE STRUCTURE AROUND TO REST OFF AS WE SEND
PUSH P,[0] ;SLOT FOR THIS MESSAGE TYPE, DEFAULT 0
HLRE 0,AB
CAMLE 0,[-8.] ;IF 4 OR MORE ARGS GET THE MESS TYPE
JRST CASND2
GETYP 0,6(AB) ;CHECK TO SEE THAT TYPE IS A FIX
CAIE 0,TFIX
JRST WTYP
MOVE 0,7(AB)
MOVEM 0,(P) ;SMASH IN THE SLOT RESERVED FOR TYPE
CASND2: HLRE 0,AB
CAMN 0,[-10.] ;IF WE HAVE FIVE ARGS WE ARE A GLOBAL LOOSER NEED 4 OR 6
JRST WNA
CAMGE 0,[-8.] ;IF WE HAVE 4 OR LESS DONT WORRY
JRST .+4 ;GO GET LAST TO ARGS
PUSH P,[0] ;NO SIXBIT OF FROM
PUSH P,[0] ;SO SAVE SLOTS ANYWAY
JRST CASND3 ;GO WORRY ABOUT SENDING NOW
MOVE A,8.(AB)
MOVE B,9.(AB)
PUSHJ P,STRTO6 ;CONVERT MY NAME1 TO SIXBIT
MOVE A,10.(AB)
MOVE B,11.(AB) ;CONVERT MY NAME 2 TO SIXBIT
PUSHJ P,STRTO6
CASND3: GETYP 0,-1(TP)
CAIE 0,TCHSTR ;IS THIS A CHAR STRING
JRST .+5
HRRZ A,-1(TP) ;IF SO GET COUNT
ADDI A,9.
IDIVI A,5 ;IF SO ROUND UP AND ADD ONE
JRST .+3
HLRE A,(TP)
MOVN A,A ;IF A VECTOR GET THE WORD COUNT
PUSH P,A ;SAVE COUNT OF WORDS
CAILE A,MAXMES
JRST TOBIGR ;MESS OVER SIZE LIKED BY MUDDLE
CAILE A,BUFL-MESHED ;HOW BIG A BUFFER DO WE NEED?
MOVEI A,BUFL-MESHED ;IF TOO BIG WE USE DEFAULT MAX SIZE, ELSE LESS
ADDI A,MESHED+BUFHED ;PLUS ROOM FOR MESSAGE AND SYSTEM HEADERS
PUSHJ P,IBLOCK
PUSH TP,A
PUSH TP,B ;GET BUFFER OF RIGHT SIZE AND SAVE ON STACK
PUSH TP,A
PUSH TP,B ;SAVE ANOTHER COPY WHICH WILL BE RESTED AT TIMES
MOVE C,-5(P) ;GET HIS NAME 1
MOVEM C,(B) ;AND STUFF IN RIGHT PLACE
MOVE C,-4(P)
MOVEM C,1(B) ;STUFF HIS NAME 2
MOVE C,-3(P)
MOVEM C,4(B) ;STUFF MESSAGE TYPE CODE WORD
GETYP 0,-5(TP) ;IS THIS STRING OR UVECTOR?
CAIE 0,TCHSTR
JRST CASND4
MOVE C,(P) ;GET LENGTH OF CHAR STRING TO SEND
ADDI C,1
MOVEM C,3(B) ;STORE IN LENGTH FIELD IN MESS HEADER
SOS (P) ;DECREMENT FOR COUNT WORD
HRRZ C,-5(TP) ;GET THE CHARACTER COUNT
MOVEM C,5(B) ;STORE IN CORRECT SLOT IN MESSAGE
MOVE D,[6,,6] ;OFFSET FOR INITIAL HEADER ON ASCII MESSAGES
ADDM D,(TP) ;OFFSET BUF PTR 2 BY THIS AMOUNT
JRST CASND5
CASND4: MOVE C,(P) ;GET COUNT OF MESSAGE
ADDI C,1 ;EXTRA FOR TYPE WORD
MOVEM C,3(B) ;STORE IN SLOT FOR COUNT OF WHOLE MESSAGE
MOVE D,[5,,5] ;OFFSET FOR INITIAL HEADER ON UVECTOR MESSAGES
ADDM D,(TP) ;OFFSET BUF PTR 2 BY THIS AMOUNT
CASND5: PUSHJ P,STUFBF ;GO FILL UP THE BUFFER WITH GARBAGE
MOVN 0,A ;GET NEGATIVE THE COUNT OF WORDS STUFFED
ADDM 0,(P) ;THAT MANY LESS WORDS REMAINING TO BE DONE
HRRZ C,-2(TP) ;GET A POINTER TO THE "UNRESTED" BUFFER
HRRZ D,(TP) ;GET A POINTER TO THE "RESTED" BUFFER
SUB D,C ;FIND OUT HOW MUCH WAS RESTED OFF
ADD D,A ;ADD TO THAT THE COUNT OF WORDS STUFFED THIS TIME
SUBI D,BUFHED ;LESS THE SYSTEM CONSTANT HEADER THAT DOENT COUNT
MOVEM D,2(C) ;STORE IN THE BUFFER IN CORRECT SLOT
PUSHJ P,CASIOT ;GO DO THE "IOT"--ACTUALLY AN OPEN
MOVE C,-2(TP)
HRLZI E,CONT ;THE "THIS IS A CONTINUATION" BIT
IORM E,3(C) ;TURN BIT ON IN FUTURE MESSAGES
ADD C,[4,,4] ;REST OFF THE SHORTER HEADER FOR THE REST OF MESSAGES
MOVEM C,(TP) ;STORE THIS IN THE "RESTED" BUFFER SLOT
SKIPLE (P) ;IS THERE MORE TO DO?
JRST CASND5
MOVSI A,TATOM
MOVE B,IMQUOTE T
JRST FINIS ;RETURN HIM SOMETHING NICE
TOBIGR: ERRUUO EQUOTE MESSAGE-TOO-BIG
STUFBF: MOVE C,-2(TP) ;ROUTINE TO FILL UP BUFFER WITH GOODIES
HRLZI E,INCOMP+ASCIMS
ANDCAM E,3(C) ;CLEAR THE INCOMPLETE AND ASCII FLAGS IF SET
HLRE B,(TP) ;GET THE BUFFER LENGTH
MOVN B,B ;MAKE IT A POSITIVE NUMBER
CAML B,-1(P) ;SEE IF THE WHOLE MESSAGE WILL FIT
JRST .+4 ;IT WILL ALL FIT
HRLZI 0,INCOMP ;THE INCOMPLETE FLAG
IORM 0,3(C) ;SET IT
JRST .+2
MOVE B,-1(P) ;ELSE THE WHOLE MESSAGE FITS
GETYP 0,-5(TP)
CAIN 0,TCHSTR
JRST STUFAS
HRLZ D,-4(TP) ;SET UP TO BLT UVECTOR
HRR D,(TP)
HRRZ E,(TP)
ADDI E,(B)-1 ;SET UP BLT POINTERS
SKIPLE B ;IN CASE ZERO LENGTH UVECTOR
BLT D,(E) ;BBBBLLLLLLLLLLLLLLLLLLTTTT?
MOVE A,B ;MOVE COUNT OF WORDS DONE INTO A
HRL B,B
ADDM B,-4(TP) ;REST OFF THIS MUCH OF GOODIE FOR NEXT TIME
POPJ P,
STUFAS: HRLZI 0,ASCIMS
IORM 0,3(C) ;TURN ON THE ASCII BIT IN THE MESSAGE
MOVE A,B ;MOVE COUNT OF NUMBER OF WORDS INTO A
IMULI B,5 ;GET CHAR COUNT IN B
HRRZ C,-5(TP) ;COMPARE THIS WITH COUNT FIELD IN STRING
MOVE D,B
SUB D,C ;SEE HOW MANY EXTRA BLANKS AT END OF MESS
JUMPGE D,.+3
MOVEI D,0 ;NO EXTRA SPACES TO PAD
MOVE C,B ;NOT EXTRA SPACES, DO 5*WORD CHARS
MOVN E,C
ADDM E,-5(TP) ;FIX UP COUNT IN ASCII
HRLZI E,440700 ;GET A IDPB PTR INTO THE BUFFER
HRR E,(TP) ;POINT TO RIGHT PLACE IN BUFFER
JUMPLE C,.+4 ;ARE WE DONE MOVING CHARS?
ILDB 0,-4(TP) ;LOAD A BYTE FROM STRING
IDPB 0,E ;STUFF IN BUFFER
SOJG C,.-2 ;REPEAT THE LOOP
JUMPLE D,.+4 ;SEE IF WE NEED TO FILL OUT WITH NULLS
MOVEI 0,0
IDPB 0,E ;STUFF A NULL IN RIGHT SPOT IN BUFFER
SOJG D,.-1
POPJ P,
CASIOT: HRRZI A,(SIXBIT /IPC/) ;FIX UP OPEN BLOCK IN THE AC'S
MOVE B,-2(TP) ;HOWS THAT FOR SNAZZY?
MOVE C,-3(P) ;MY NAME 1
MOVE D,-2(P) ;MY NAME 2
JUMPN C,.+3
JUMPN D,.+2
TLO A,USEUJ ;IF BOTH ARE ZERO THEN USE DEFAULT UNAME,JNAME
SKIPN -7(P) ;SEE IF SEND AND HANG FLAG IS SET
JRST .+3
TLO A,SANDH ;SET SEND AND HANG FLAG
JRST .+3
TLO A,SIMM ;ELSE WE MUST BE SENDING IMMEDIATE
AOS -7(P) ;IF THERE IS MORE TO DO, IT MUST BE IN HANG MODE
MOVSI 0,TUVEC
MOVE PVP,PVSTOR+1
MOVEM 0,BSTO(PVP) ;IN CASE WE ARE INTERRUPTED OUT WE WANT TO WIN
SETZM E ;FLAG USED TO INDICATE NO SKIPPAGE
ENABLE
.OPEN 0,A ;WELL, THATS ALL THERE IS TO IT.
AOS E ;IF WE DONT SKIP WE HAVE PROBLEMS
DISABLE
MOVE PVP,PVSTOR+1
SETZM BSTO(PVP) ;FIX UP THE SLOT IN PVP
SKIPN E ;SEE IF WE LOST
POPJ P, ;IF NOT WE ARE THROUGH WITH THIS PART
.STATUS 0,A ;FIND OUT REASON FOR LOSSAGE
MOVEI B,0
PUSHJ P,GFALS ;MAKE A FALSE WITH THAT REASON
JRST FINIS ;GIVE THE MAGIC FALSE BACK TO THE LOOSER
MFUNCTION DEMSIG,SUBR
ENTRY 1
MOVE A,(AB)
MOVE B,1(AB)
PUSHJ P,STRTO6 ;GET THE SIXBIT REPRESENTATION
MOVE A,[SETZ] ;FIX UP THE BLOCK IN THE AC'S
MOVE B,[SIXBIT /DEMSIG/]
MOVE C,[SETZ (P)] ;THE SIXBIT IS ON TOP OF P STACK
.CALL A
JRST RFALS ;DIDNT WIN WITH DEMON SIGNAL
RTRUE: MOVSI A,TATOM
MOVE B,IMQUOTE T
JRST FINIS
RFALS: MOVSI A,TFALSE
MOVEI B,0
JRST FINIS ;FALSE INDICATING LACK OF WINNAGE
MFUNCTION IPCON,SUBR,[IPC-ON]
ENTRY
PUSH P,[USEUJ,,0] ;FLAG FOR WHETHER OR NOT TO USE DEFAULT
HLRZ 0,AB
JUMPE 0,IPCON1 ;NO ARGS ARE FINE
CAIE 0,-4 ;ELSE MUST HAVE 2 ARGS
JRST WNA
SETZM (P) ;CLEAR OUR FLAG
MOVE A,(AB)
MOVE B,1(AB)
PUSHJ P,STRTO6 ;GET SIXBIT OF OUR FIRST ARG
MOVE A,2(AB)
MOVE B,3(AB)
PUSHJ P,STRTO6 ;GET SIXBIT OF OUR SECOND ARG
JRST IPCON2
IPCON1: PUSH P,[0] ;SAVE SLOT ON STACK FOR EVENNESS
PUSH P,[0]
IPCON2: MOVEI A,BUFL+BUFHED
PUSHJ P,CAFRE ;GET A BUFFER OF RIGHT LENGTH TO READ INTO
PUSH P,A ;AND SAVE IT AROUND SO WE DONT LOOSE
MOVEI 0,BUFL
MOVEM 0,2(A) ;FILL COUNT IN THE BUFFER SLOT
MOVEI A,5
PUSHJ P,IBLOCK ;GET A BLOCK OF STORE FOR THE OPEN BLOCK
PUSH TP,$TUVEC
PUSH TP,B ;SAVE CRUFT ON TP
TLO 0,RFROMA ;SET THE READ FROM ANY FLAG
IOR 0,-3(P) ;FIX FOR DEFAULT UNAME,JNAME IF FLAG INDICATES
MOVEM 0,(B) ;MAKE OPEN BLOCK
MOVE 0,[SIXBIT /IPC/]
MOVEM 0,1(B)
MOVE 0,-2(P)
MOVEM 0,3(B) ;MY NAME 1
MOVE 0,-1(P)
MOVEM 0,4(B) ;MY NAME 2 IF NOT USING DEFAULT
MOVE 0,(P)
MOVEM 0,2(B) ;PTR TO THE WIRED BUFFER FOR STUFFING CRUFT
MOVE A,B
PUSHJ P,MOPEN ;GO DO THE OPEN
JRST IPCON3 ;OPEN FAILED, FIND OUT WHY
PUSH P,A ;SAVE THE CHANNEL NUMBER
MOVEI E,1
LSH E,(A) ;SET INTERRUPT BITS RIGHT
IORM E,MASK2
.SUSET [.SMSK2,,MASK2]
MOVE C,-1(TP)
MOVE D,(TP) ;GET THE OPEN BLOCK UVECTOR
PUSHJ P,INCONS ;THROW INTO PAIR SPACE
POP P,C ;GET THE CHANNEL #
SUBI C,1
IMULI C,2
MOVEM B,IPCS1+1(C) ;STUFF PTR TO OPEN BLOCK INTO SLOT IN TVP
JRST RTRUE ;WE WON, GO LET LUSER KNOW IT.
IPCON3: PUSH P,A ;WE LOST, LETS FIND OUT WHY
MOVE A,BUFL+BUFHED
MOVE B,-1(P) ;LETS FREE UP OUR WIRED DOWN BUFFER TO BE CLEAN
PUSHJ P,CAFRET
POP P,A ;GET THE CHANNEL # BACK
JUMPL A,NFCHN ;NO FREE CHANNELS?
MOVE B,[.STATUS A] ;MAKE A CALL TO STATUS TO FIND REASON
LSH A,23. ;SHIFT THE CHANNEL NUMBER INTO RIGHT PLACE
IOR B,A ;FIX UP .STATUS
XCT B
MOVEI B,0
PUSHJ P,GFALS
JRST FINIS ;RETURN A LOOSE WITH REASON FOR LOOSAGE
NFCHN: ERRUUO EQUOTE NO-ITS-CHANNELS-FREE
MFUNCTION IPCOFF,SUBR,[IPC-OFF]
ENTRY 0
PUSH TP,$TVEC
MOVE 0,[IPCS1,,IPCS1]
PUSH TP,0 ;SAVE OUR PLACE IN RUNNING THROUGH SLOTS
PUSH P,[1] ;COUNTER OF CHANNEL NUMBER
IPCOF1: MOVE A,(TP) ;GET FIRST GOODIE
SKIPN B,1(A) ;GET THE POINTER TO LIST
JRST IPCOF2
SETZM 1(A) ;ZERO OUT SLOT TO BE CLEAN
MOVE B,1(B) ;GET CAR OF LIST, PTR TO OPEN BLOCK
MOVE C,(P) ;GET THE ACTUAL CHANNEL NUMBER
MOVEI E,1 ;TURN OFF INTERRUPT
LSH E,(C)
ANDCAM E,MASK2
.SUSET [.SMSK2,,MASK2]
MOVE A,C
PUSHJ P,MCLOSE ;CLOSE THIS CHANNEL
JFCL
MOVEI A,BUFL+BUFHED ;LENGTH OF WIRED STORE TO FREE UP
MOVE B,1(B) ;GET THE POINTER TO WIRED STORE
PUSHJ P,CAFRET ;FREE ALREADY
IPCOF2: MOVE 0,[2,,2]
ADDM 0,(TP) ;REST TO NEXT SLOT
AOS D,(P) ;NEXT CHANNEL
CAIG D,15. ;ARE WE THROUGH
JRST IPCOF1
JRST RTRUE ;RETURN HIM A TRUE FOR NICENESS
IPCGOT: MOVEI D,IPCS1+1
ADDI D,(B)
ADDI D,(B)
SKIPN D,-74.(D) ;GET THE GOODIE LIST FOR CHANNEL WE INTERRUPTED ON
JRST DIRQ ;MIX UP MAYBE, LET HIM WORRY ABOUT IT
PUSH P,B ;SAVE THE CHAN #
PUSH TP,$TLIST
PUSH TP,D ;SAVE GOODIE LIST
MOVE E,1(D) ;GET PTR TO OPEN BLOCK
PUSH P,2(E) ;SAVE PTR TO WIRED BUFFER
MOVE E,2(E)
MOVE 0,3(E) ;GET THE MAGIC BITS FOR THIS MESSAGE
TLNE 0,CONT ;IS THIS MESSAGE A CONTINUATION?
JRST IGCON ;YES
MOVEI A,10. ;NO
PUSHJ P,GIBLOK ;GET A BLOCK FOR FUNNY MESSAGE VECTOR
PUSH TP,$TVEC
PUSH TP,B ;SAVE THE BLOCK FOR FUNNY MESSAGE VECTOR
MOVE E,(P) ;GET PTR TO WIRED BUFFER
MOVE 0,3(E) ;GET THE MAGIC BITS AGAIN
HRRZ A,0 ;GET THE LENGTH IN WORDS OF THIS THE WHOLE MESSAGE HE HAS
SUBI A,1 ;MINUS ONE FOR THE TYPE WORD WHICH IS COUNTED
TLNE 0,ASCIMS ;IS THIS ASCII?
SUBI A,1 ;IF YES THEN MUST SUB 1 MORE FOR ASCII CHAR COUNT
CAILE A,MAXMES ;IS THIS BIGGER THAN MUDDLE BLESSES?
JRST TBGMS ;IF SO THEN CLEAN UP AND FORGET ABOUT THE LOOSER
PUSHJ P,IBLOCK
MOVE E,(P)
MOVE D,(TP)
MOVE 0,(E) ;GET HIS NAME 1 OUT OF MESSAGE
MOVEM 0,5(D) ;STORE INTO SLOT IN FUNNY MESSAGE VECTOR
MOVE 0,1(E) ;GET HIS NAME 2 OUT OF MESSAGE
MOVEM 0,7(D)
MOVE 0,4(E) ;GET THE MESSAGE TYPE WORD
MOVEM 0,9(D) ;STORE INTO SLOT IN MESSAGE VECTOR
MOVSI 0,TFIX
MOVE 0,4(D)
MOVE 0,6(D)
MOVE 0,8(D)
MOVE 0,3(E) ;GET THE MESSAGE BITS
TLNE 0,ASCIMS ;IS IT ASCII?
JRST IG1 ;YES
MOVSI 0,TUVEC
MOVEM 0,(D)
MOVEM 0,2(D)
MOVEM B,1(D)
MOVEM B,3(D) ;STORE MESSAGE BLANK TWICE, THE SECOND TO REST THROUGH
HLRE E,B
SUBM B,E
MOVSI 0,TFIX
MOVEM 0,(E) ;SET NICE TYPE TO PRINT GOODER
JRST IGBLT
IG1: MOVSI 0,TUVEC
MOVEM 0,2(D)
MOVEM B,3(D) ;STORE MESSAGE BLANK AS UVECTOR TO REST THROUGH
HLRE A,B
HRLI B,010700 ;MAKE THE ILDB PTR
SUBI B,1
MOVEM B,1(D) ;AND STORE IN THE SLOT
IMUL A,[-5] ;MAX CHAR COUNT FOR STRING
MOVE B,5(E) ;GET THE ACTUAL CHARACTER COUNT HE CLAIMED
MOVE C,A
SUB C,B ;FIND DIFFERENCE BETWEEN MAX AND CLAIMED
JUMPL C,.+2 ;IF COUNT TOO BIG, MUST DO BEST POSSIBLE AND USE MAX COUNT
CAILE C,4 ;NO MORE THAN FOUR EXTRA CHARS IMPLIES GOODNESS
MOVE B,A ;IF LOSSAGE, THEN USE MAX COUNT INSTEAD OF HIS CLAIM
HRLI B,TCHSTR ;MAKE THIS A CHAR STRING TYPE WORD
MOVEM B,(D) ;AND FIX MESSAGE BLANK # 1 TO BE THE BLESSED STRING
JRST IGBLT ;BLT THE MESSAGE INTO THE BLANK
IGCON: MOVE D,(TP) ;GET THE IPC SLOT LIST
MOVE E,(P) ;GET A PTR TO THE MESSAGE BUFFER
HRRZ C,(D) ;CDR THE IPC SLOT LIST TO POINT TO FIRST MESSAGE VECTOR
IGCON1: JUMPE C,IGCONL ;IF NIL, THEN ABANDON ALL HOPE
MOVE B,1(C) ;LOOK AT THE VECTOR
MOVE 0,5(B) ;HIS NAME 1 FOR THIS BLOCK
CAME 0,(E) ;COMPARE WITH HIS NAME 1 IN THIS MESSAGE
JRST IGCON2 ;IMMEDIATE FAILURE, TRY THE NEXT IN THE LIST
MOVE 0,7(B) ;SEE IF HIS NAME 2 ALSO MATCHES
CAME 0,1(E) ;WELL, DOES IT MATCH?
JRST IGCON2 ;NO, TRY THE NEXT ONE
PUSH TP,$TVEC ;WE GOT IT
PUSH TP,1(C) ;SAVE THIS MESSAGE BLOCK ON TP FOR LATER BLTING
HRRZ C,(C) ;CDR TO REST OF LIST
HRRM C,(D) ;AND SPLICE IT RIGHT OUT OF THE LIST, NEAT HUH?
JRST IGBLT ;GO BLT TO OUR HEART'S CONTENT
IGCON2: HRRZ D,(D) ;REST OUR FOLLOW UP POINTER
HRRZ C,(C) ;REST OUR ACTUAL TEST POINTER
JRST IGCON1 ;TRY AGAIN
IGCONL: MOVE A,(TP)
MOVE A,1(A) ;GET PTR TO OPEN BLOCK
MOVE B,-1(P)
SUBI B,36. ;GET CHANNEL NUMBER
HLL B,(A)
MOVE C,(P) ;GET THE WIRED BUFFER
SUB P,[2,,2] ;WE LOST SO CLEAN UP STACKS
SUB TP,[2,,2]
ROPNL: SETZM (C) ;REOPEN CHANNEL SO NOT PERMANENTLY CROGGLED
SETZM 1(C) ;ZERO OUT THE HIS NAME SLOTS
MOVEI 0,BUFL
MOVEM 0,2(C) ;RESET THE LENGTH FIELD IN WIRED BUF
DOTCAL OPEN,[B,1(A),2(A),3(A),4(A)]
FATAL CANT REOPEN IPC CHN
JRST DIRQ ;LEFT IN NICE STATE AFTER LOOSAGE
TBGMS: MOVE A,-2(TP)
MOVE A,1(A) ;GET OPEN BLOCK
MOVE B,-1(P)
SUBI B,36. ;CHANNEL #
HLL B,(A)
MOVE C,(P) ;WIRED BUFFER
SUB P,[2,,2] ;CLEAN UP STACKS
SUB TP,[4,,4]
JRST ROPNL ;REOPEN SO NEXT GUY CAN WIN
IGBLT: MOVE E,(TP) ;POINTER TO MESSAGE VECTOR
MOVE E,3(E) ;GET VECTOR (MAYBE STRING IN DISGUISE) TO BLT IN
MOVE D,(P) ;GET THE WIRED BUFFER
MOVEI C,4(D) ;GET A POINTER TO THE REST OF THE WIRED BUF
MOVEI 0,BUFL-1 ;KLUDGE TO IGNORE ONE EXTRA WORD OF BITS
SUB 0,2(D) ;GET LENGTH OF GOODIE GOT
MOVE A,3(D) ;GET THE RANDOM MESSAGE BITS
TLNE A,CONT ;TEST FOR CONTINUED MESSAGE
JRST .+7 ;IF SO THEN NO NEED TO WORRY
SOS 0
AOS C ;FIX UP FOR ONE LESS WORD TO WORRY WITH
TLNN A,ASCIMS ;TEST FOR ASCII MESSAGE
JRST .+3 ;IF NOT THEN NO WORRY
SOS 0
AOS C ;FIX UP FOR YET 1 FEWER WORD
HLRE A,E
MOVM A,A ;GET LENGTH OF VECTOR TO BLT INTO
CAILE 0,(A) ;CHECK TO SEE WE DONT HAVE TOO MUCH
MOVE 0,A ;IF WE HAVE TOO MUCH, CHOP OFF--HA, HA, HA
MOVEI B,-1(E)
ADD B,0 ;B POINTS TO LAST WORD TO BLT INTO
HRL C,E ;BLT POINTER
MOVSS C ;NDR CANT REMEMBER HOW TO BLT POINTER
BLT C,(B) ;VIOLA
HRL 0,0
MOVE E,(TP) ;GET BACK POINTER TO MESSAGE VECTOR
ADDM 0,3(E) ;REST OFF TO KEEP TRACK OF INCOMPLETE MESSAGE
MOVE A,3(D) ;GET THE RANDOM MESSAGE BITS BACK
TLNE A,INCOMP ;MESSAGE COMPLETE?
JRST IGHALF ;INCOMPLETE
JRST IGMES ;COMPLETE
IGHALF: MOVE C,-1(TP) ;GOT TO SPLICE MESSAGE VECTOR BACK IN
MOVE D,(TP)
PUSHJ P,INCONS ;STICK INTO PAIR SPACE
HRRZ E,-2(TP) ;PTR TO LIST
HRRZ D,(E) ;CDR OF LIST
HRRM D,(B) ;MAKE SPLICE
HRRM B,(E) ;THAT IT
MOVE B,1(E) ;POINT TO OPEN BLOCK
MOVE 0,-1(P) ;GET CHAN #
SUBI 0,36.
HLL 0,(B)
MOVE E,(P) ;GET THE WIRED BUF
MOVEI D,BUFL
MOVEM D,2(E) ;REFIX THE WIRED BUF
SETZM (E)
SETZM 1(E)
DOTCAL OPEN,[0,1(B),2(B),3(B),4(B)]
FATAL CANT REOPEN IPC CHN
SUB P,[2,,2]
SUB TP,[4,,4] ;CLEAN OURSELVES
JRST DIRQ ;THATS ALL THERE IS TO IT
IGMES: HRRZ E,-2(TP) ;PTR TO OUR KLUDGE LIST
MOVE B,1(E) ;PTR TO OPEN BLOCK
MOVE 0,-1(P) ;CHANNEL #
SUBI 0,36.
HLL 0.(B)
MOVE D,(P) ;GET THE WIRED BUF
MOVEI C,BUFL
MOVEM C,2(D)
SETZM (D)
SETZM 1(D) ;BLESS WIRED BUF FOR REOPENING
DOTCAL OPEN,[0,1(B),2(B),3(B),4(B)]
FATAL CANT REOPEN IPC CHN
MOVE E,(TP) ;GET THE MESSAGE VECTOR (ALIAS GOODIE BLOCK)
SUB P,[2,,2] ;BLESS OUR P STACK
PUSH P,5(E) ;SAVE SIXBIT HIS NAME 1
PUSH P,7(E) ;SAVE SIXBIT HIS NAME 2
SUB TP,[4,,4] ;BLESS THE TP STACK
PUSH TP,$TCHSTR
PUSH TP,CHQUOTE IPC
PUSH TP,(E) ;STUFF STUFF ON TO CALL INTERRUPT
PUSH TP,1(E) ;THAT IS THE ACTUAL MESSAGE
MOVE 0,9(E)
CAMN 0,[400000,,0]
JRST IGUG
IGUGN: PUSH P,3(B) ;GET MY NAME 1 OUT OF OPEN BLOCK
PUSH P,4(B) ;GET MY NAME 2 OUT OF OPEN BLOCK
MOVE 0,(B) ;GET SOME OF THE RANDOM OPEN FLAGS
TLNE 0,USEUJ
SETZ -1(P) ;MAKE SURE WE HAVE INDICATOR IF THIS IS TO UNAME,JNAME
PUSH TP,$TFIX
PUSH TP,9(E) ;SAVE THE MESSAGE TYPE
MOVE A,-3(P) ;HIS NAME 1
PUSHJ P,6TOCHS
PUSH TP,A
PUSH TP,B ;GIVE HIM NICE CHAR STRING OF ALL THE NAMES
MOVE A,-2(P)
PUSHJ P,6TOCHS
PUSH TP,A
PUSH TP,B ;NICE CHAR STRING OF HIS NAME 2
SKIPN A,-1(P) ;ISE THIS DEFAULT UNAME, JNAME
JRST IGFOUR ;ONLY FOUR ARGS TO THE IPC INTERRUPT
PUSHJ P,6TOCHS
PUSH TP,A
PUSH TP,B
MOVE A,(P)
PUSHJ P,6TOCHS
PUSH TP,A
PUSH TP,B ;GIVE HIM CHAR STRINGS OF MY NAME 1 AND 2 IF NOT DEFAULT
MOVEI E,7 ;FOR ACALL INDICATING 6 ARGS TO THE IPC INTERRUPT HANDLER
JRST .+2 ;SKIP OVER FIX FOR ONLY 4 ARGS TO IPC INTERRUPT
IGFOUR: MOVEI E,5
SUB P,[4,,4] ;CLEAN UP OUR WHOLE WORLD
ACALL E,INTERR ;THATS IT FOLKS, THE REAL THING
JRST DIRQ
IGUG: .SUSET [.RMARPC,,0]
CAMN 0,[-1]
JRST IGUGN ; DISABLED, SO GO AWAY
SETZM INTHLD ; RE-ENABLEE INTERRUPTS
SUB P,[2,,2]
MCALL 1,PARSE
SUB TP,[2,,2] ;FLUSH OFF STRING "IPC"
PUSH TP,A
PUSH TP,B
MCALL 1,EVAL
JRST DIRQ
IPCBLS: PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E ;PARANOIA STRIKES AGAIN
PUSH P,0
MOVEI E,0 ;CRETIN ASSEMBLER
.SUSET [.SMARPC,,E]
MOVEI E,IPCS1 ;BLESSES ALL CURRENTLY OPEN IPC CHANNELS
MOVEI 0,1
IPCBL1: SKIPN B,1(E)
JRST IPCBL2
HLLZS (B) ;CLEAR OUT ANY PARTIAL BUFFER WE MAY HAVE
HRRZ B,1(B) ;GET A POINTER TO THE OPEN BLOCK
MOVE A,0 ;GET THE CHANNEL NUMBER
HLL A,(B)
MOVE C,2(B) ;GET A POINTER TO THE BUFFER
MOVEI D,BUFL ;TO FIX UP THE BUFFER
MOVEM D,2(C) ;FIX LENGTH UP RIGHT
SETZM (C)
SETZM 1(C) ;FIX UP THE READ FROM FIELDS
DOTCAL OPEN,[A,1(B),2(B),3(B),4(B)]
FATAL IPC DEVICE LOST
IPCBL2: ADDI E,2
ADDI 0,1
CAIG 0,15.
JRST IPCBL1 ;IF ANY MORE GO BLESS THEM
POP P,0
POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
POPJ P,
END


BIN
src/mudsys/ldgc.bin.11 Normal file

Binary file not shown.

504
src/mudsys/ldgc.mid.100 Normal file
View File

@@ -0,0 +1,504 @@
TITLE LOADGC MODULE TO LOAD THE GARBAGE COLLECTOR
RELOCA
.INSRT MUDDLE >
SYSQ
IFE ITS,[
.INSRT STENEX >
XJRST==JRST 5,
]
IFN ITS, PGSZ==10.
IFE ITS, PGSZ==9.
; ROUTINES TO GET THE GC DO PDL OVERFLOWS IN GC AND ALLOCATE SPECIAL
; BUFFERS.
; IMPORTANT VARAIBLES
.GLOBAL PAGEGC ; STARTING PAGE OF GARBAGE COLLECTOR (PAGES)
.GLOBAL LENGC ; LENGTH OF GARBAGE COLLECTOR (PAGES)
.GLOBAL SLENGC ; LENGTH OF MARK/SWEEP GARBAGE COLLECTOR
.GLOBAL MRKPDL ; STARTING LOCATION OF MARK PDL (WORDS)
.GLOBAL STRBUF ; START OF BUFFER LOCATIONS (WORDS)
.GLOBAL SWAPGC ; WHICH GARBAGE COLLECTOR TO LOAD
.GLOBAL MARK2G ; GENERAL MARKING ROUTINE FOR TEMPLATE STUFF
.GLOBAL MARK2A,MARK2S ; SPECIFIC MARKERS IN SGC/AGC
.GLOBAL SECLEN ; LENGTH OF SECTION GC GUY
.GLOBAL MULTSG
.GLOBAL SECBLK,DECBLK,GCDEBU,DEBUGC,NDEBUG
.GLOBAL FRETOP,PURBOT,PURTOP,GCPDL,LPUR,STRPAG,CKPUR,INPLOD,GETPAG,CURPLN,SGCLBK,PGCNT
.GLOBAL LODGC,CKFILE,SLEEPR,KILGC,GETBUF,KILBUF,GPDLOV,GCDIR,INTDIR,GCLDBK
.GLOBAL OPBLK,SJFNS,IJFNS,OPSYS,IJFNS1,RBLDM,ILDBLK,TILDBL
.GLOBAL TMTNXS,C%1
IFN ITS,[
IMAPCH==0 ; INTERNAL MAPPING CHANNEL
MAPCHN==1000,,IMAPCH ; CORBLK CHANNEL
FME==1000,,-1 ; BITS FOR CURRENT JOB
FLS==1000,,0 ; BITS TO FLUSH A PAGE
RDTP==1000,,200000 ; BITS TO MAP IN IN READ-ONLY
WRTP==1000,,100000
CRJB==1000,,400001 ; BITS TO ALLOCATE CORE
CWRITE==1000,,4000
]
IFE ITS,[
MFORK==400000
CTREAD==100000 ; READ BIT
CTEXEC==20000 ; EXECUTE BIT
CTWRIT==40000 ; WRITE BIT
CTCW==400 ; COPY ON WRITE
SGJF==1 ; USE SHORT JFN (LH FLAG)
OLDF==100000 ; REQUIRE OLD (EXISTING FILE) (LH FLAG)
FREAD==200000 ; READ BIT FOR OPENF
FEXEC==40000 ; EXEC BIT FOR OPENF
FTHAW==2000
]
; GENERAL MARK ROUTINE FOR TEMPLATE STUFF. GOES TO RIGHT PLACE IN
; WHICHEVER GC'ER WE'RE USING AT THE MOMENT
MARK2G: SKIPN SWAPGC
JRST MARK2A ; INTO AGC
JRST MARK2S ; INTO SGC
; ROUTINE TO LOAD THE GARBAGE COLLECTOR
LODGC:
IFN ITS,[
MOVEI 0,GCLDBK
SKIPE SWAPGC ; SKIP IF SWAPPED GARBAGE COLLECTOR
MOVEI 0,SGCLBK
MOVEM 0,OPBLK
.SUSET [.RSNAM,,SAVSNM] ; SAVE OLD SNAME
.SUSET [.SSNAM,,GCDIR] ; SET SNAME TO APP DIR
.OPEN IMAPCH,@OPBLK ; OPEN CHANNEL TO FILE
PUSHJ P,CKFILE ; SEE IF REALLY LOSING
HRLZI A,-LENGC+3
SKIPE SWAPGC
HRLZI A,-SLENGC
MOVE B,A ; B WILL CONTAIN PTR TO CORE
HRRI B,PAGEGC
DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
PUSHJ P,SLEEPR
HRLI B,-1
SKIPN SWAPGC ; IF SWAP 1 PAGE FOR CORBLK ELSE 3
HRLI B,-3
GETIT: DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]]
PUSHJ P,SLEEPR
.CLOSE IMAPCH,
MOVEI A,LENGC ; SMASH PAGECOUNT
SKIPE SWAPGC
MOVEI A,SLENGC+1 ; PSTACK
MOVEM A,PGCNT
POPJ P,
; SEE WHY OPEN FAILED
CKFILE: .STATUS IMAPCH,0 ; GET STATUS BITS INTO 0
HRLZS 0
ANDI 0,77 ; AND OF EXTRANEOUS BITS
CAIN 0,4 ; SKIP IF NOT FNF
FATAL CANT OPEN AGC FILE
SLEEPR: MOVEI 0,1 ; SLEEP FOR A WHILE
.SLEEP
SOS (P) ; TRY AGAIN
SOS (P)
POPJ P, ; BYE
]
IFE ITS,[
HRRZ A,IJFNS1
SKIPN MULTSG
HLRZ A,IJFNS
SKIPE SWAPGC
HLRZ A,IJFNS1
JUMPN A,GOTJFN
; HERE TO GET GC JFNS
; GET STRING NAME OF MDL INTERPRETER FILE
HRRZ A,IJFNS ; INTERPRETER JFN
MOVE B,A ; SET UP FOR JFNS
PUSHJ P,TMTNXS ; MAKES A STRING ON P STACK
MOVE D,E ; SAVED VALUE OF P STACK
HRROI A,1(E) ; STRING FOR RESULT
MOVE C,[211000,,1] ; GET "DEV:<DIR>NM1" FROM JFNS
JFNS
MOVE C,A ; SAVE TO REUSE FOR ".SGC"
; GET JFN TO AGC FILE
MOVEI B,[ASCIZ /.AGC/]
SKIPN MULTSG
JRST .+4
MOVEI B,[ASCIZ /.DEC/]
SKIPN GCDEBU
MOVEI B,[ASCIZ /.SEC/]
SKIPE SWAPGC
MOVEI B,[ASCIZ /.SGC/]
HRLI B,440700
ILDB B
IDPB A
JUMPN .-2 ; COPY ".AGC" INTO STRING
HRROI B,1(E) ; GTJFN STRING
MOVSI A,SGJF+OLDF ; GTJFN CONTROL BITSS
GTJFN
FATAL AGC GARBAGE COLLECTOR IS MISSING
SKIPN SWAPGC
JRST .+3
HRLM A,IJFNS1
JRST JFNIN
SKIPE MULTSG
HRRM A,IJFNS1
SKIPN MULTSG
HRLM A,IJFNS
JFNIN: MOVE B,[440000,,FREAD+FEXEC]
OPENF
FATAL CANT OPEN AGC FILE
MOVE P,E
GOTJFN:
MOVEI D,SECLEN+SECLEN-2
SKIPN MULTSG
MOVEI D,LENGC+LENGC-6 ; # OF TENEX PAGES TO GET IT
SKIPE SWAPGC
MOVEI D,SLENGC+SLENGC
MOVSI A,(A) ; JFN TO LH
MOVE B,[MFORK,,PAGEGC+PAGEGC]
MOVSI C,CTREAD+CTEXEC
LDLP: PMAP
ADDI A,1
ADDI B,1
SOJG D,LDLP
MOVEI C,0
MOVEI D,6 ; THESE PAGES WILL BE THE GC PDL
SKIPN MULTSG
SKIPE SWAPGC
MOVEI D,2 ; PDL BUT NO FRONT OR WINDOW
MOVNI A,1
LDLP1: PMAP
ADDI B,1
SOJG D,LDLP1
MOVEI A,SECLEN+1
SKIPN MULTSG
MOVEI A,LENGC ; SMASH PAGECOUNT
SKIPE SWAPGC
MOVEI A,SLENGC+1
MOVEM A,PGCNT
POPJ P,
;ROUTINE TO "SLEEP" FOR A WHILE ON 10X/20X HA HA
SLEEPR: SOS (P)
POPJ P,
]
; ROUTINE TO LOAD THE INTERPRETER
; C=>LENGTH OF PAGES
; D=>START OF PAGES
LODINT:
IFN ITS,[
.SUSET [.RSNAME,,SAVSNM]
LODIN1: .IOPUS IMAPCH,
.SUSET [.SSNAM,,INTDIR]
.OPEN IMAPCH,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK
PUSHJ P,CKFILE
HLRE B,TP ; MAKE SURE BIG ENOUGJ
MOVNS B ; SEE IF WE WIN
CAIGE B,400 ; SKIP IF WINNING
FATAL NO ROOM FOR PAGE MAP
MOVSI A,-400
HRRI A,1(TP)
.ACCES IMAPCH,C%1
.IOT IMAPCH,A ; GET IN PAGE MAP
MOVEI A,1 ; INITIALIZE FILE PAGE COUNT
MOVEI B,0 ; CORE PAGE COUNT
MOVEI E,1(TP)
LOPFND: HRRZ 0,(E)
JUMPE 0,NOPAG ; IF 0 FORGET IT
ADDI A,1 ; AOS FILE MAP
NOPAG: ADDI B,1 ; AOS PAGE MAP
CAIE B,(D) ; SKIP IF DONE
AOJA E,LOPFND
MOVNI 0,(C) ; GET PAGE-COUNT
HRL A,0 ; BUILD FILE PAGE POINTER
HRL B,0 ; BUILD CORE PAGE POINTER
DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
PUSHJ P,SLEEPR ; GO TO SLEEP FOR A WHILE
.CLOSE IMAPCH,
.IOPOP IMAPCH,
.SUSET [.SSNAM,,SAVSNM]
POPJ P, ; DONE
]
IFE ITS,[
HRRZ E,IJFNS
MOVEI A,(E) ; FIND OUT LENGTH OF MAP
MOVEI B,0
SFPTR
FATAL CANNOT RESET FILE POINTER
MOVEI A,(E)
BIN ; GET LENGTH WORD
MOVEI A,(B) ; ISOLATE SIZE OF MAP
HLRZ 0,B
HLRE B,TP ; MUST BE SPACE FOR CRUFT
MOVNS B
CAIGE B,(A) ; ROOM?
FATAL NO ROOM FOR PAGE MAP (GULP)
PUSH P,C ; SAVE # PAGES WANTED
MOVN C,A
MOVEI A,(E) ; READY TO READ IN MAP
MOVEI B,1(TP) ; ONTO TP STACK
HRLI B,444400
SIN ; SNARF IT IN
MOVEI A,1(TP)
CAIE 0,1000 ; CHECK FOR TENEX
JRST TOPS20
LDB 0,[221100,,(A)] ; GET FORK PAGE
CAIE 0,(D) ; GOT IT?
AOJA A,.-2
HRRZ A,(A)
JRST GOTPG
TOPS21: ADDI A,2
TOPS20: HRRZ 0,1(A) ; GET PAGE IN PROCESS
LDB B,[331100,,1(A)] ; GET REPT COUNT
ADD B,0 ; LAST PAGE IN BLOCK
CAIG 0,(D)
CAIGE B,(D) ; WITHIN RANGE?
JRST TOPS21
SUBM D,0
HRRZ A,(A)
ADD A,0
GOTPG: HRLI A,(E)
MOVEI B,(D)
HRLI B,MFORK
MOVSI C,CTREAD+CTEXEC ; BITS
POP P,D ; PAGES
ASH D,1 ; FOR TENEX
MPLP: PMAP
ADDI A,1
ADDI B,1
SOJG D,MPLP ; MAP-EM IN
POPJ P,
]
; ROUTINE TO MAP IN OVER GARBAGE COLLECTOR EXPLICITLY
KILGC:
IFN ITS,[
MOVEI D,PAGEGC
MOVE C,PGCNT
JRST LODIN1
]
IFE ITS,[
MOVEI D,PAGEGC+PAGEGC
MOVE C,PGCNT
JRST LODINT
]
; ROUTINE TO TRY TO ALLOCATE A BUFFER
; 1) IT FIRSTS LOOKS BETWEEN FRETOP AND PURBOT
; 2) LOOKS AT THE INTERPRETER
; A=>NUMBER OF BUFFER PAGES (CURRENTLY ALWAYS 1)
; B=>BUFFER
; BUFFER SAVED IN BUFPTR
GETBUF: ASH A,10. ; CONVERT TO WORDS
MOVE B,PURBOT ; LOOK FOR ROOM IN GCS
SUB B,FRETOP
CAMGE B,A ; SKIP IF WINNING
JRST NOBUF1
MOVE B,FRETOP ; BUFFER IN B
MOVEM B,BUFPTR ; SAVE BUFFER
ASH A,-10. ; TO PAGES
MOVEM A,BUFLT ; LENGTH OF BUFFER
POPJ P,
NOBUF1: ASH A,-10. ; BACK TO WORDS
SKIPE INPLOD ; SKIP IF NOT IN MAPPUR
JRST INTBUF
PUSH P,A
PUSH P,E
JSP E,CKPUR
POP P,E
POP P,A
MOVE B,PURTOP
SUB B,PURBOT
SUB B,CURPLN
ASH B,-10. ; CALCULATE AVAILABLE ROOM
CAIGE B,(A) ; SEE IF ENOUGH
JRST INTBUF ; LOSE LOSE GET BUFFER FROM INTERPRETER
IFE ITS, ASH A,1 ; TENEX PAGES
PUSH P,C
PUSH P,D
PUSH P,E
PUSHJ P,GETPAG ; GET THOSE PAGES
FATAL GETPAG FAILED
POP P,E
POP P,D
POP P,C
IFE ITS, ASH A,-1
JRST GETBUF ; TRY AGAIN
INTBUF: MOVEM A,BUFLT
IFN ITS,[
MOVNS A ; NEGATE
HRLZS A ; SWAP
HRRI A,STRPAG ; AOBJN TO PAGE
MOVE B,A
DOTCAL CORBLK,[[FLS],[FME],A]
FATAL CANT FLUSH PAGE
DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]]
PUSHJ P,SLEEPR
]
IFE ITS,[
PUSH P,C
MOVEI C,(A) ; PAGES TO FLUSH
ASH C,1
MOVNI A,1 ; FLUSH PAGES
MOVE B,[MFORK,,STRPAG+STRPAG] ; WHICH ONES
FLSLP: PMAP
ADDI B,1
SOJG C,FLSLP
POP P,C
]
MOVEI B,STRBUF ; START OF BUFFER
MOVEM B,BUFPTR ; SAVE IN BUFPTR
PUSHJ P,RBLDM
POPJ P,
; ROUTINE TO FLUSH A BUFFER WHEN DONE WITH IT
KILBUF: SKIPN B,BUFPTR ; SEE IF BUFPTR EXISTS
POPJ P,
IFE ITS, JRST @[.+1] ; RUN IN SECTION 0
CAIL B,HIBOT ; SKIP IF NOT PART OF INTERPRETER
JRST HIBUF ; INTERPRETER
IFN ITS,[
ASH B,-10.
MOVN A,BUFLT ; GET LENGTH
HRLI B,(A) ; BUILD PAGE AOBJN
DOTCAL CORBLK,[[FLS],[FME],B]
FATAL CANT FLUSH PAGES
]
IFE ITS,[
ASH B,-9. ; TO PAGES
HRLI B,MFORK
MOVNI A,1
MOVE D,BUFLT
LSH D,1 ; TO TENEX PAGES
PUSH P,C ; SAVE C
MOVEI C,0 ; C CONTAINS SOME FLAGS
FLSLP1: PMAP
ADDI B,1
SOJG D,FLSLP1
POP P,C ; RESTORE C
]
FLEXIT: SETZM BUFPTR
SETZM BUFLT
IFE ITS,[
PUSH P,A
HLRZ A,SJFNS
JUMPE A,.+3
CLOSF
JFCL
SETZM SJFNS
POP P,A
SKIPN MULTSG
POPJ P,
POP P,21
SETZM 20
XJRST 20
]
IFN ITS,[
POPJ P,
]
HIBUF: MOVE C,BUFLT
MOVE D,BUFPTR
IFN ITS, ASH D,-10.
IFE ITS, ASH D,-9.
PUSHJ P,LODINT
JRST FLEXIT
; HERE TO HANDLE GC PDL OVERFLOW. ROUTINE USES A,B AND ASSUMES GCPDL IS THE PDL
GPDLOV: HRRZ A,PGCNT ; # OF PAGES TO A
ADDI A,PAGEGC ; SEE IF ROOM
ASH A,10. ; TO WORDS
CAIL A,LPUR ; HAVE WE LOST
FATAL NO ROOM FOR GCPDL
IFN ITS,[
ASH A,-10. ; GET PAGE NUMBER
AOS PGCNT ; AOS
DOTCAL CORBLK,[[FLS],[FME],A]
FATAL CANT FLUSH PAGE
DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
PUSHJ P,SLEEPR
]
IFE ITS,[
ASH A,-9.
AOS PGCNT
MOVE B,A
MOVNI A,1
HRLI B,MFORK
PUSH P,C ; BETTER HAVE A PDL HERE
MOVEI C,0
PMAP
ADDI B,1
PMAP
POP P,C
]
HRRI A,-2000 ; SMASH PDL
HRLM A,GCPDL
POPJ P, ; EXIT
IFN ITS,[
GCDIR: SIXBIT /MUDSAV/
INTDIR: SIXBIT /MUDSAV/
GCLDBK: SIXBIT / &DSK/
SIXBIT /AGC/
0 ; FILLED IN BY INITM
SGCLBK: SIXBIT / &DSK/
SIXBIT /SGC/
0
ILDBLK: SIXBIT / &DSK/
SIXBIT /TS/
0 ; FILLED IN BY INITM
]
NDEBUG: SETZM GCDEBU
CAIA
DEBUGC: SETOM GCDEBU
HRRZ A,IJFNS1 ; GET GC JFN
SKIPE A
CLOSF
JFCL
POPJ P,
IMPURE
GCDEBU: 0
BUFPTR: 0 ; POINTER TO CURRENTLY ACTIVE BUFFER (WORD)
BUFLT: 0 ; LENGTH OF CURRENTLY ACTIVE BUFFER (PAGES)
PGCNT: 0 ; # OF PAGES OF MAPPED OUT INTERPRETER
SAVSNM: 0
OPBLK: 0 ; BLOCK USED FOR OPEN
PURE
END

BIN
src/mudsys/main.bin.9 Normal file

Binary file not shown.

2056
src/mudsys/main.mid.350 Normal file

File diff suppressed because it is too large Load Diff

2058
src/mudsys/main.mid.351 Normal file

File diff suppressed because it is too large Load Diff

2058
src/mudsys/main.mid.352 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/mappur.bin.34 Normal file

Binary file not shown.

BIN
src/mudsys/mappur.bin.37 Normal file

Binary file not shown.

1928
src/mudsys/mappur.mid.146 Normal file

File diff suppressed because it is too large Load Diff

1972
src/mudsys/mappur.mid.159 Normal file

File diff suppressed because it is too large Load Diff

1974
src/mudsys/mappur.mid.160 Normal file

File diff suppressed because it is too large Load Diff

1975
src/mudsys/mappur.mid.161 Normal file

File diff suppressed because it is too large Load Diff

1986
src/mudsys/mappur.mid.162 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/mudsys/maps.bin.2 Normal file

Binary file not shown.

247
src/mudsys/maps.mid.29 Normal file
View File

@@ -0,0 +1,247 @@
TITLE MAPS -- MAP FUNCTIONS FOR MUDDLE
RELOCATABLE
.INSRT MUDDLE >
.GLOBAL TYPSEG,NXTLM,NAPT,APLQ,INCR1,SPECBI,FRMSTK,MAPPLY
.GLOBAL CHFSWP,SSPEC1,ILVAL,CHUNW,DSTORE,PVSTOR,TVSTOR
; PSTACK OFFSETS
INCNT==0 ; INNER LOOP COUNT
LISTNO==-1 ; ARG NUMBER BEING HACKED
ARGCNT==-2 ; FINAL ARG COUNTER
NARGS==-3 ; NUMBER OF STRUCTURES
NTHRST==-4 ; 0=> MAP REST, OTHERWISE MAP FIRST
; MAP THE "CAR" OF EACH LIST
IMFUNCTION MAPF,SUBR
PUSH P,. ; PUSH NON-ZERO
JRST MAP1
; MAP THE "CDR" OF EACH LIST
IMFUNCTION MAPR,SUBR
PUSH P,[0]
MAP1: ENTRY
HLRE C,AB ; HOW MANY ARGS
ASH C,-1 ; TO # OF PAIRS
ADDI C,2 ; AT LEAST 3
JUMPG C,TFA ; NOT ENOUGH
GETYP A,(AB) ; TYPE OF CONSTRUCTOR
CAIN A,TFALSE ; ANY CONSING NEEDE?
JRST MAP2 ; NO, SKIP CHECK
PUSHJ P,APLQ ; CHECK IF APPLICABLE
JRST NAPT ; NO, ERROR
MAP2: MOVNS C ; POS NO. OF ARGS (-3)
PUSH P,C ; SAVE IT
PUSH TP,[TATOM,,-1] ; ALL **GFP** INSTRUCTIONS ARE TO DO WITH MAPRET
PUSH TP,IMQUOTE LMAP,[LMAP ]INTRUP
PUSHJ P,FRMSTK ; **GFP**
PUSH TP,[0] ; **GFP**
PUSH TP,[0] ; **GFP**
PUSHJ P,SPECBIND ; **GFP**
MOVE C,(P) ; RESTORE COUNT OF ARGS
MOVE A,AB ; COPY ARG POINTER
MOVSI 0,TAB ; CLOBBER A'S TYPE
MOVE PVP,PVSTOR+1
MOVEM 0,ASTO(PVP)
JUMPE C,ARGSDN ; NOA ARGS?
ARGLP: INTGO ; STACK MAY OVERFLOW
PUSH TP,4(A) ; SKIP FCNS
PUSH TP,5(A)
ADD A,[2,,2]
SOJG C,ARGLP ; ALL UP ON STACK
; ALL STRUCTURES ARE ON THE STACK, NOW PUSH THE CONSTRUCTOR
ARGSDN: PUSH TP,(AB) ; CONSTRUCTOR
PUSH TP,1(AB)
MOVE PVP,PVSTOR+1
SETZM ASTO(PVP)
PUSH P,[-1] ; FUNNY TEMPS
PUSH P,[0]
PUSH P,[0]
; OUTER LOOP CDRING EACH STRUCTURE
OUTRLP: SETZM LISTNO(P) ; START AT 0TH LIST
MOVE 0,NARGS(P) ; TOTAL # OF STRUCS
MOVEM 0,INCNT(P) ; AS COUNTER IN INNER LOOP
PUSH TP,2(AB) ; PUSH THE APPLIER
PUSH TP,3(AB)
; INNER LOOP, CONS UP EACH APPLICATION
INRLP: INTGO
SOSGE INCNT(P)
JRST INRLP2
MOVEI E,2 ; READY TO BUMP LISTNO
ADDB E,LISTNO(P) ; CURRENT STORED AND IN C
ADDI E,(TB)4 ; POINT TO A STRUCTURE
MOVE A,(E) ; PICK IT UP
MOVE B,1(E) ; AND VAL
PUSHJ P,TYPSEG ; SETUP TO REST IT ETC.
MOVE E,LISTNO(P)
ADDI E,4(TB)
SKIPL ARGCNT(P) ; DONT INCR THE 1ST TIME
XCT INCR1(C) ; INCREMENT THE LOSER
MOVE 0,DSTORE ; UPDATE THE LIST
MOVEM 0,(E)
MOVEM D,1(E) ; CLOBBER AWAY
PUSH TP,DSTORE ; FOR REST CASE
PUSH TP,D
PUSHJ P,NXTLM ; SKIP IF GOT ONE, ELSE DONT
JRST DONEIT ; FINISHED
SETZM DSTORE
SKIPN NTHRST(P) ; SKIP IF MAP REST
JRST INRLP1
MOVEM A,-1(TP) ; IUSE AS ARG
MOVEM B,(TP)
INRLP1: JRST INRLP ; MORE, GO DO THEM
; ALL ARGS PUSHED, APPLY USER FCN
INRLP2: SKIPGE ARGCNT(P) ; UN NEGATE ARGCNT
SETZM ARGCNT(P)
MOVE A,NARGS(P) ; GET # OF ARGS
ADDI A,1
ACALL A,MAPPLY ; APPLY THE BAG BITER
GETYP 0,(AB) ; GET TYPE OF CONSTRUCTOR
CAIN 0,TFALSE ; SKIP IF ONE IS THERE
JRST OUTRL1
PUSH TP,A
PUSH TP,B
AOS ARGCNT(P)
JRST OUTRLP
OUTRL1: MOVEM A,-1(TP) ; SAVE PARTIAL VALUE
MOVEM B,(TP)
JRST OUTRLP
; HERE IF ALL FINISHED
DONEIT: HRLS C,LISTNO(P) ; HOW MANY DONE
SUB TP,[2,,2] ; FLUSH SAVED VAL
SUB TP,C ; FLUSH TUPLE OF CRUFT
DONEI1: SKIPGE ARGCNT(P)
SETZM ARGCNT(P) ; IN CASE STILL NEGATIVE
SETZM DSTORE ; UNSCREW
GETYP 0,(AB) ; ANY CONSTRUCTOR
CAIN 0,TFALSE
JRST MFINIS ; NO, LEAVE
AOS D,ARGCNT(P) ; IF NO ARGS
ACALL D,APPLY ; APPLY IT
JRST FINIS
; HERE TO FINISH IF CONSTRUCTOR WAS #FALSE ()
MFINIS: POP TP,B
POP TP,A
JRST FINIS
; **GFP** FROM HERE TO THE END
MFUNCTION MAPLEAVE,SUBR
ENTRY
CAMGE AB,[-3,,0]
JRST TMA
MOVE B,IMQUOTE LMAP,[LMAP ]INTRUP
PUSHJ P,ILVAL
GETYP 0,A
CAIE 0,TFRAME ; MAKE SURE WINNER
JRST NOTM
PUSH TP,A
PUSH TP,B
MOVEI B,-1(TP) ; POINT TO FRAME POINTER
PUSHJ P,CHFSWP
PUSHJ P,CHUNW
JUMPL C,MAPL1 ; RET VAL SUPPLIED
MOVSI A,TATOM
MOVE B,IMQUOTE T
JRST FINIS
MAPL1: MOVE A,(C)
MOVE B,1(C)
JRST FINIS
MFUNCTION MAPSTOP,SUBR
ENTRY
PUSH P,[1]
JRST MAPREC
MFUNCTION MAPRET,SUBR
ENTRY
PUSH P,[0]
MAPREC: MOVE B,IMQUOTE LMAP,[LMAP ]INTRUP
PUSHJ P,ILVAL ; GET VALUE
GETYP 0,A ; FRAME?
CAIE 0,TFRAME
JRST NOTM
PUSH TP,A
PUSH TP,B
MOVEI B,-1(TP)
POP P,0 ; RET/STOP SWITCH
JUMPN 0,MAPRC1 ; JUMP IF STOP
PUSHJ P,CHFSWP ; CHECK IT OUT (AND MAYBE SWAP)
PUSH P,[NLOCR]
JRST MAPRC2
MAPRC1: PUSHJ P,CHFSWP
PUSH P,[NLOCR1]
MAPRC2: HRRZ E,SPSAV(B) ; UNBIND BEFORE RETURN
PUSH TP,$TAB
PUSH TP,C
ADDI E,1 ; FUDGE FOR UNBINDER
PUSHJ P,SSPEC1 ; UNBINDER
HLRE D,(TP) ; FIND NUMBER
JUMPE D,MAPRE1 ; SKIP IF NONE TO MOVE
MOVNS E,D ; AND PLUS IT
HRLI E,(E) ; COMPUTE NEW TP
ADD E,TPSAV(B) ; NEW TP
HRRZ C,TPSAV(B) ; GET OLD TOP
MOVEM E,TPSAV(B)
HRL C,(TP) ; AND NEW BOT
ADDI C,1
BLT C,(E) ; BRING IT ALL DOWN
MAPRE1: ASH D,-1 ; NO OF ARGS
HRRI TB,(B) ; PREPARE TO FINIS
MOVSI A,TFIX
MOVEI B,(D)
POP P,0 ; GET PC TO GO TO
MOVEM 0,PCSAV(TB)
JRST CONTIN ; BACK TO MAPPER
NLOCR1: TDZA A,A ; ZER SW
NLOCR: MOVEI A,1
GETYP 0,(AB) ; CHECK IF BUILDING
CAIN 0,TFALSE
JRST FLUSHM ; REMOVE GOODIES
ADDM B,ARGCNT(P) ; BUMP ARG COUNTER
NLOCR2: JUMPE A,DONEI1
JRST OUTRLP
FLUSHM: ASH B,1 ; FLUSH GOODIES DROPPED
HRLI B,(B)
SUB TP,B
JRST NLOCR2
NOTM: ERRUUO EQUOTE NOT-IN-MAP-FUNCTION
END


BIN
src/mudsys/mdl106.agc.1 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.agc.2 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.dec.1 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.dec.2 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.exe.2 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.exe.3 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.exe.4 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.exe.5 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.sec.1 Normal file

Binary file not shown.

BIN
src/mudsys/mdl106.sec.2 Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More