1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-24 03:18:05 +00:00
PDP-10.its/src/mudsys/muddle.347
Adam Sampson 2ce999ebd2 Fix two (harmless) incorrect EXPUNGEs.
DOTYPS doesn't exist anywhere. NUMSTA is a typo for NUMSAT.
2018-04-25 09:32:25 +01:00

1255 lines
25 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; THE FOLLOWING INFORMATION IS MEANT AS GUIDE TO THE CARE AND FEEDING
; OF MUDDLE. IT ATTEMPTS TO SPECIFY PROGRAMMING CONVENTIONS AND
; SUPPLY SYMBOLS AND MACROS NEEDED BY ALL MODULES IN A MUDDLE.
; FOR EFFICIENCY THE STANDARD MODE OF RUNNING IS UNINTERRUPTABLE.
; WITH EXPLICIT CHECKS FOR PENDING INTERRUPTS. THE INTGO MACRO
; PERFORMS THE APPROPRIATE CHECK
; FOR INTERRUPTS TO WORK IN INTERRUPTABLE CODE, IT MUST
; BE ABSOLUTELY PURE. BETWEEN ANY TWO INSTRUCTIONS OF
; INTERRUPTABLE CODE THERE MAY BE AN INTERUPT IN WHICH
; A COMPACTING GARBAGE COLLECTION MAY OCCUR.
; NOTE: A SCRATCH AC MAY CONTAIN POINTERS TO GC SPACE IN
; INTERRUPTABLE CODE OR DURING AN INTGO IF THE TYPE CODE FOR THAT AC'S
; SLOT IN THE PROCESS VECTOR IS SET TO REFLECT ITS CONTENTS.
; ALL ATOM POINTERS WILL BE REFERRED TO IN ASSEMBLED CODE BY
; MQUOTE <PNAME> -- FOR NORMAL ATOMS
; EQUOTE <PNAME> -- FOR ERROR COMMENT ATOMS
; FUNCTION CALLS TO INITIAL FUNCTIONS WILL BE CALLED USING THE FOLLOWING:
; MCALL N,<PNAME> ;SEE MCALL MACRO
; ACALL AC,<PNAME> ; SEE ACALL MACRO
; UNLESS PNAME IS NOT A VALID MIDAS SYMBOL, IN WHICH CASE ANOTHER INTERNAL
; NAME WILL BE USED
; WHEN CALLING A SUBR THROUGH AN INDEX OR INDIRECT, THE UUOS GENERATED
; BY THE MACROS SHOULLD BE USED.
; THESE ARE .MCALL AND .ACALL -- EXAMPLE:
; .ACALL A,@(B)
; ORGANIZATION OF CORE STORAGE IN THE MUDDLE SYSTEM (ENVIRONMENT)
; 20: SPECIAL CODE FOR UUO AND INTERUPTS
;CODBOT: WORD CONTAINING LOCATION OF BOTTOMMOST WORD OF IMPURE CODE
; --IMPURE CODE--
;CODTOP: WORD CONTAINING LOCATION OFWORD AFTER LAST WORD OF CODE
;PARBOT: WORD CONTAINING LOCATION OFBOTTOMMOST LIST
; --PAIRSS--
;PARTOP: WORD CONTAINING LOCATION OFWORD AFTER LAST PAIR WORD
;VECBOT: WORD CONTAINING LOCATION OFFIRST WORD OF VECTORS
; --VECTORS--
;VECTOP: WORD CONTAINING LOCATION OFWORD AFTER TOPMOST VECTOR
; THE WORD BEFORE VECTOP IS THE DOPE FOR THE LAST VECTOR
; --GC MARK PDL (SOMETIMES NOT THERE)--
;CORTOP: TOP OF LOW-SEGMENT/IMPURE CORE
;600000: START OF PURE CODE (SHARED ALSO)
; --PURE CODE--
;
; BASIC DATA TYPES PRE-DEFINED IN MUDDLE
; PRIMITIVE DATA TYPES
; IF T IS A DATA TYPE THEN $T=[T,,0]
; DATA TYPES ARE ASSIGNED BY THE TYPMAK MACRO IN SOME ARBITRARY ORDER
;TLOSE ;ILLEGAL TYPE (USED PRIMARILY FOR ERRORS)
;TFIX ;FIXED POINT
;TFLOAT ;FLOATING POINT
;TCHRS ;WORD OF UP TO 5 ASCII CHARACTERS
;TENTRY ; MARKS BEGINNING OF A FRAME ON TP STACK
;TSUBR ;BUILT IN FUNCTION WITH EVALUATED ARGS
;TFSUBR ;BUILT IN FUNCTION WITH UN-EVALUATED ARGS
;TUNBOU ;TYPE GIVEN TO UNBOUND OR UNASSIGNED ATOM
;TBIND ;MARKS BEGINNING OF BINDING BLOCK ON TP STACK
;TILLEG ;POINTER PREVIOUSLY HERE NOW ILLEGAL
;TTIME ;UNIQUE NUMBER (SEE FLOAD)
;TLIST ;POINTER TO LIST ELEMENT
;TFORM ;POINTER TO LIST ELEMENT BUT USED AS AN EXPRESSION
;TSEG ;SAME AS FORM BUT VALUE IS MUST BE STRUCTURED AND IS USED
; ;AS A SEGMENT
;TEXPR ;POINTER TO LIST ELEMENT BUT USED AS AN INTERPRETIVE FUNCTION
;TFUNAR ;LIKE TEXPR BUT HAS PARTIALLY EVALUATED ARGS
;TLOCL ;LOCATIVE TO LIST ELEMENT (SEE AT,IN AND SETLOC)
;TFALSE ;NOT TRUTH
;TDEFER ;POINTER TO REAL VALUE (ONLY APPEARS AS CAR OF LIST)
;TUVEC ;AOBJN POINTER TO UNIFORM VECTOR
;TOBLS ;AOBJN TO UVEC OF LISTS OF ATOMS. USED AS SYMBOL TABLE
;TVEC ;VECTOR (AOBJN POINTER TO GENERALIZED VECTOR)
;TCHAN ;VECTOR OF INFO DESCRIBING AN I/O CHANNEL
;TLOCV ;LOCATIVE TO GENERAL VECTOR (SEE AT,IN AND SETLOC)
;TTVP ;POINTER TO TRANSFER VECTOR
;TBVL ;BEGINS A VECTOR BINDING ON THE TP STACK
;TTAG ;VECTOR OF INFO SPECIFYING A GENERALIZED TAG
;TPVP ;POINTER TO PROCESS VECTOR
;TLOCI ;POINTER TO ATOM VALUE ON STACK (INTERNAL NOT SEEN BY USER)
;TTP ;POINTER TO MAIN MARKED STACK
;TSP ;POINTER TO CURRENT BINDINGS ON STACK
;TLOCS ;LOCATIVE TO STACK (NOT CURRENTLY USED)
;TPP ;POINTER TO PLANNER PDL (NOT CURRENTLY USED)
;TPLD ;POINTER TO P-STACK (UNMARKED)
;TARGS ;POINTER TO AN ARG BLOCK (HAIRY KLUDGE)
;TAB ;SAVED AB (NOT GIVEN TO USER)
;TTB ;SAVED TB (NOT GIVEN TO USER)
;TFRAME ;USER POINTER TO STACK FRAME
;TCHSTR ;BYTE POINTER TO STRING OF CHARS (COUNT ALSO INCLUDED)
;TATOM ;POINTER TO ATOM
;TLOCD ;USER LOCATIVE TO ATOM VALUE
;TBYTE :POINTER TO ARBITRARY BYTE STRING (NOT CURRENTLY USED)
;TENV ;USER POINTER TO FRAME USED AS AN ENVIRONMENT
;TACT ;USER POINTER TO FRAME FOR A NAMED ACTIVATION
;TASOC ;ASSOCIATION TRIPLE
;TLOCU ;LOCATIVE TO UVECTOR ELEMENT (SEE AT,IN AND SETLOC)
;TLOCS ;LOCATIVE TO A BYTE IN A CHAR STRING (SEE AT,IN AND SETLOC)
;TLOCA ;LOCATIVE TO ELEMENT IN ARG BLOCK
;TENTS ;NOT USED
;TBS ; ""
;TPLDS ; ""
;TPC ; ""
;TINFO ;POINTER TO LIST ELEMENT USED WITH ARG POINTERS
;TNBS ;NOT USED
;TBVLS ;NOT USED
;TCSUBR ;CARE SUBR (USED ONLY WITH CUDDLE SEE -- WJL)
;TWORD ;36-BIT WORD
;TRSUBR ;COMPILED PROGRAM (ACTUALLY A VECTOR POINTER)
;TCODE ;UNIFORM VECTOR OF INSTRUCTIONS
;TCLIST ;NOT USED
;TBITS ;GENERAL BYTE POINTER
;TSTORA ;POINTER TO NON GC IMPURE STUFF
;TPICTU ;E&S CODE IN NON GC SPACE
;TSKIP ;ENVIRONMENT SPLICE
;TLINK ;LEXICAL LINK
;TINTH ;INTERRUPT HEADER
;THAND ;INTERRUPT HANDLER
;TLOCN ;LOCATIVE TO ASSOCIATION
;TDECL ;POINTER TO LIST OF ATOMS AND TYPE DECLARATIONS
;TDISMI ;TYPE MEANING DONT RUN REST OF HANDLERS
;TDCLI ; INTERNAL TYPE FOR SAVED FUNCTION BODY
;TMENT ; POINTER TO MAIN ENTRY OF WHICH THIS IS PART
;TENTER ; NON-MAIN ENTRY TO AN RSUBR
;TSPLICE ; RETURN FROM READ MACRO MEANS SPLICE SUBELEMENTS IN
;TPCODE ; PURE CODE POINTER IN FUNNY FORMAT
;TTYPEW : TYPE WORD
;TTYPEC ; TYPE CODE
;TGATOM ; ATOM WITH GVALUE
;TREADA ; READ ACTIVATION HACK
;TUNWIN ; INTERNAL FOR UNWIND SPEC ON STACK
;TUBIND ; BINDING OF UNSPECIAL ATOM
;TMACRO ; EVAL MACRO
;TOFFS ; OFFSET FOR NTHING AND PUTTING
; STORGE ALLOCATION TYPES. ALLOCATED BY AN "IRP" LATER IN THIS FILE
;S1WORD ;UNMARKED STUFF OF NO INTEREST TO AGC
;S2WORD ;POINTERS TO ELEMENTS IN PAIR SPACE (LIST, FORM, EXPR ETC.)
;S2DEFR ;DEFERRED LIST VALUES
;SNWORD ;POINTERS TO UNIFORM VECTORS
;S2NWOR ;POINTERS TO GENERAL VECTORS
;STPSTK ;STACK POINTERS
;SPSTK ;UNMARKED STACK POINTERS
;SARGS ;POINTERS TO ARG BLOCKS (USER)
;SABASE ;POINTER TO ARG BLOCK (INTERNAL)
;STBASE ;POINTER TO FRAME (INTERNAL)
;SFRAME ;POINTER TO FRAME (USER)
;SBYTE ;GENERAL BYTE POINTER
;SATOM ;POINTER TO ATOM
;SLOCID ;POINTER TO VALUE CELL OF ATOM
;SPVP ;PROCESS VECTORS
;SCHSTR ;ASCII BYTE POINTER
;SASOC ;POINTER TO ASSOCIATION BLOCK
;SINFO ;LIST CELL CONTAINING EXTRA ARGBLOCK INFO
;SSTORE ;NON GC STORGAGE POINTER
;SLOCA ;ARG BLOCK LOCATIVE
;SLOCD ;USER VALUE CELL LOCATIVE
;SLOCS ;LOCATIVE TO STRING
;SLOCU ;LOCATIVE TO UVECTOR
;SLOCV ;LOCATIVE TO GENERAL VECTOR
;SLOCL ;LOCATIVE TO LIST ELEENT
;SLOCN ;LOCATIVE TO ASSOCIATION
;SGATOM ;REALLY ATOM BUT SPECIAL GC HACK
;SOFFS ;OFFSET (SAT BECAUSE LIST IN LH, FIX IN RH)
;NOTE: TO FIND OUT IF A GIVEN STORAGE ALLOCATION TYPE NEEDS TO BE DEFERRED, REFER TO
;LOCATION "MKTBS:" OFFSET BY THE STORAGE TYPE. IF IT IS <0, THAT SAT NEEDS TO BE DEFERRED.
;
;ONE WAY TO DO THIS IS TO PUT A REAL TYPE CODE IN AC A AND PUHSJ P,NWORDT
; A WILL CONTAIN 1 IF NO DEFERRED NEEDED OR 2 IF DEFER IS NEEDED
; SOME MUDDLE DATA FORMATS
; FORMAT OF LIST ELEMENT
; WORD 1: SIGN BIT, RESERVED FOR GARBAGE COLLECTOR
; BITS 1-17 TYPE OF FIRST ELEMENT OF LIST
; BITS 18-35 POINTS TO REST OF LIST (ALWAYS ANOTHER LIST OR 0)
;
; WORD 2: DATUM OF FIRST ELEMENT OF LIST OF TYPE SPECIFIED
;
; IF DATUM REQUIRES 54 BITS TO SPECIFY, TYPE WILL BE "TDEFER" AND
; VALUE WILL BE AN 18 BIT POINTER TO FULL 2 WORD PAIR
;FORMAT OF GENERAL VECTOR (OF N ELEMENTS)
;POINTED INTO BY AOBJN POINTER
;A GENERAL VECTOR HAS FEWER THAN 2^16 ELEMENTS
; TYPE<1> TYPE OF FIRST OBJECT (THE RIGHT HALF OF THE TYPE WORD MIGHT BE NONZERO)
; OBJ<1> OBJECT OF SPECIFIED TYPE
; TYPE<2>
; OBJ<2>
; .
; .
; .
; TYPE<N>
; OBJ<N>
; VD(1)-VECTOR DOPE--SIGN-NOT UNIFORM, BITS 1-17 TYPE,,18-35 GROWTH/SHRINKAGE
; VD(2)-VECTOR DOPE--SIGN-G.C.; BITS 1-17 ARE 2*N+1,,18-35 G.C. RELOCATION EITHER UP OR DOWN
;SPECIAL VECTORS IN THE INITIAL SYSTEM
;THE SYSTEM KEEPS RELEVANT INFORMATION CONCERNING ALL TYPES
;IN A TYPE VECTOR, TYPVEC, WHICH MAY BE INDEXED BY THE TYPE NUMBER
;FOUND IN THE TYPE FIELD OF ANY GOODIE. TABLES APLTYP AND EVLTYP ALSO EXIST
;THEY SPECIFY HOW DIFFERENT TYPES EVAL AND APPLY.
;TYPE IN AC A, PUSHJ P,SAT RETURNS STORAGE TYPE IN A
;TYPE TO NAME OF TYPE TRANSLATION TABLE
; TATOM,,<STORAGE ALLOCATION TYPE>+CHBIT+TMPLBT
; ATOMIC NAME
; CHBIT ON MEANS YOU CANT RANDOMLY CHTYPE INTO THIS TYPE
; TMPLBT ON MEANS A TEMPLATE EXISTS DESCRIBING THIS
;AN ATOM IS A BLOCK IN VECTOR SPACE WITH THE FOLLOWING FORMAT
; <TUNBOU OR TLOCI>,,<0 OR BINDID> ; TLOCI MEANS VAL EXISTS.
; 0 MEANS GLOBAL
; ; BINDID SPECS ENV IN
; WHICH LOCAL VAL EXISTS
; <LOCATIVE TO VALUE OR 0>
; <POINTER TO OBLIST OR 0>
; <ASCII /PNAME/>
; <400000+SATOM,,0>
; <LNTH>,,0 (SIGN BIT FOR G.C. RH FOR G.C. RELOCATION)
;POINTERS TO INITIAL STRUCTURES AND ATOMS NEEDED BY COMPILED CODE
;WILL BE POINTED TO BY THE TRANSFER VECTOR
;A POINTER TO THIS VECTOR ALWAYS EXISTS IN AC TVP
;THE FORMAT OF THIS VECTOR IS:
; TYPE,,0
; VALUE
; .
; .
; .
; TV DOPE WORDS
;INFORMATION CONCERNING EACH PROCESS IS KEPT IN THE PROCESS VECTOR
;A POINTER TO THE CURRENT PROCESS ALWAYS EXISTS IN AC PVP
;THE FORMAT OF A PROCESS VECTOR IS:
; TFIX,,0
; PROCID ;UNIQUE ID OF THIS PROCESS
; 20 ELEMENTS (I.E. 40 WORDS) CONTAINIG SAVED ACS
; CAN BE REFERENCED SYMBOLICALLY USING SYMBOLS
; OF THE FORM AC!STO(PVP)
; OTHER PROCESS LOCAL INFO LIKE LEXICAL STATE, PROCESS STATE,LAST RESUMER
; .
; .
; .
; PV DOPE WORDS
;FORMAT OF PUSH DOWN STACKS USED AND CONVENTIONS
IF1 [
PRINTC /MUDDLE - INSERT FILE FOR ALL PROGRAMS
/
]
IF2 [PRINTC /MUDDLE
/
]
;AC ASSIGNMNETS
P"=17 ;THE UNMARKED PDL POINTER (USED BY THE OUTSIDE WORLD AND MUDDLE)
R"=16 ;REFERENCE BASE FOR RSUBRS
M"=15 ;CODE BASE FOR RSUBRS
SP"=10 ;SPECIAL PDL (USED BY MUDDLE FOR VARIABLE BINDINGS)(SPECIAL PDL IS PART OF TP)
TP"=13 ;MARKED PDL (USED BY MUDDLE FOR ARGS TO FUNCTIONS
;AND MARKED TEMPORARIES)
TB"=12 ;MARKED PDL BASE POINTER AND CURRENT FRAME POINTER
AB"=11 ;ARGUMENT PDL BASE (MARKED)
;AB IS AN AOBJN POINTER TO THE ARGUMENTS
FRM"=14 ;FUNNY FRAME POINTER
TVP"=7 ;TRANSFER VECTOR POINTER
PVP"=6 ;PROCESS VECTOR POINTER
;THE FOLLOWING ACS ARE 'SCRATCH' FOR MUDDLE
A"=1 ; A AND B CONTAIN TYPE AND VALUE UPON FUNCTION RETURNS
B"=2
C"=3
D"=4
E"=5
NIL"=0 ;END OF LIST MARKER
;MACRO TO DEFINE MAIN IF NOT DEFINED
IF1 [
DEFINE SYSQ
ITS==1
; IFE <<<.AFNM1>_-24.>-<SIXBIT / T./>>,ITS==0
IFN ITS,[PRINTC /ITS VERSION
/]
IFE ITS,[PRINTC /TENEX VERSION
/]
TERMIN
; SEGMENT INFO IF TOPS 20
FSEG==1
MAXSEG==30
GCSEG==36 ; GC COPY SEGMENT
STATM==40 ; STORED IN GC DUMP BYTE POINTER TO SAY
; ITS AN ATOM (LH)
DEFINE DEFMAI ARG,\D
D==.TYPE ARG
IFE <D-17>,ARG==0
EXPUNGE D
TERMIN
]
DEFMAI MAIN
DEFMAI READER
IF2,EXPUNGE DEFMAI
;DEFINE TYPES AND $TYPES AND IF MAIN NOT 0, MAKE THE $TYPE WORDS
IFN MAIN,NUMPRI==-1
IF1 [
NUMPRI==-1 ;NUMBER OF PRIMITIVE TYPES
DEFINE TYPMAK SAT,LIST
IRP A,,[LIST]
NUMPRI==NUMPRI+1
IRP B,,[A]
T!B==NUMPRI
.GLOBAL $!T!B
IFN MAIN,[$!T!B=[T!B,,0]
]
.ISTOP
TERMIN
IFN MAIN,[
RMT [ADDTYP SAT,A
]]
TERMIN
TERMIN
;MACRO TO ADD STUFF TO TYPE VECTOR
IFN MAIN,[
DEFINE ADDTYP SAT,TYPE,NAME,CHF,IMP,\CH
IFSE [CHF],CH==0
IFSN [CHF],CH==CHBIT
IFSE [NAME]IN,CH==CHBIT
TATOM,,CH+SAT
IFSN [NAME],[IFSE [NAME]IN,MQUOTE INTERNAL
IFSN [NAME]IN,[IFSE [IMP],MQUOTE [NAME]
IFSN [IMP],IMQUOTE [NAME]
]
]
IFSE [NAME],[IFSE [IMP],MQUOTE TYPE
IFSN [IMP],IMQUOTE TYPE
]
TERMIN
]
]
IF2 [IFE MAIN,[DEFINE TYPMAK SAT,LIST
RMT [EXPUN [LIST]
]
TERMIN
]
]
;DEFINE THE STORAGE ALLOCATION TYPES IN THE WORLD
NUMSAT==0
GENERAL==440000,,0 ;FLAG FOR BEING A GENERAL VECTOR
.VECT.==40000
IF1 [
DEFINE PRMACR HACKER
IRP A,,[1WORD,2WORD,2DEFRD,NWORD,2NWORD,TPSTK,PSTK,ARGS
ABASE,TBASE,FRAME,BYTE,ATOM,LOCID,PVP,CHSTR,ASOC,INFO,STORE
LOCA,LOCD,LOCS,LOCU,LOCV,LOCL,LOCN,GATOM,LOCR,LOCT,RDTB,LOCB
DEFQ,OFFS]
HACKER A
TERMIN
TERMIN
DEFINE DEFINR B
NUMSAT==NUMSAT+1
S!B==NUMSAT
TERMIN
]
PRMACR DEFINR
STMPLT==NUMSAT+1
;MACRO FOR SAVING STUFF TO DO LATER
.GSSET 4
DEFINE HERE G00002,G00003
G00002!G00003!TERMIN
IF1 [
DEFINE RMT A
HERE [DEFINE HERE G00002,G00003
G00002!][A!G00003!TERMIN]
TERMIN
]
RMT [EXPUNGE GENERAL,NUMSAT
]
DEFINE XPUNGR A
EXPUNGE S!A
TERMIN
IFE MAIN,[
RMT [PRMACR XPUNGR
]
]
C.BUF==1
C.PRIN==2
C.BIN==4
C.OPN==10
C.READ==40
C.LAST==100
C.INTL==200 ; INTERRUPT ON LINE FEEDS
C.ASCII==400
C.DISK==1000
C.RAND==2000
C.TTY==4000
; FLAG INDICATING VECTOR FOR GCHACK
.VECT.==40000
; DEFINE SYMBLOS FOR VARIOUS OBLISTS
SYSTEM==0 ;MAIN SYSTEM OBLIST
ERRORS==1 ;ERROR COMMENT OBLIST
INTRUP==2 ;INERRUPT OBLIST
MUDDLE==3 ;MUDDLE GLOBAL SYMBOLS (ADDRESSES)
RMT [EXPUNGE SYSTEM,ERRORS,INTRUP
]
; DEFINE SYMBOLS FOR PROCESS STATES
RUNABL==1
RESMBL==2
RUNING==3
DEAD==4
BLOCKED==5
IFE MAIN,[RMT [EXPUNGE RESMBL,RUNABL,RUNING,DEAD,BLOCKED
]
] ;BUILD THE TYPE CODES AND ADD STUFF TO TYPVEC AND DEFINE $!TYPE)
IFN MAIN,[RMT [SAVE==.
LOC TYPVLC
]
]
TYPMAK S1WORD,[[LOSE],[FIX,,,1],[FLOAT,,,1],[CHRS,CHARACTER,,1],[ENTRY,IN],[SUBR,,1]]
TYPMAK S1WORD,[[FSUBR,,1]]
TYPMAK S1WORD,[[UNBOUND,,1],[BIND,IN],[ILLEGAL,,1],TIME]
TYPMAK S2WORD,[[LIST,,,1],[FORM,,,1],[SEG,SEGMENT,,1],[EXPR,FUNCTION,,1]]
TYPMAK S2WORD,[[FUNARG,CLOSURE]]
TYPMAK SLOCL,[[LOCL,,,1]]
TYPMAK S2WORD,[[FALSE,,,1]]
TYPMAK S2DEFRD,[[DEFER,IN]]
TYPMAK SNWORD,[[UVEC,UVECTOR,,1],[OBLS,OBLIST,1,1]]
TYPMAK S2NWORD,[[VEC,VECTOR,,1],[CHAN,CHANNEL,1,1]]
TYPMAK SLOCV,[[LOCV,,,1]]
TYPMAK S2NWORD,[[TVP,IN],[BVL,IN],[TAG,,1]]
TYPMAK SPVP,[[PVP,PROCESS]]
TYPMAK STPSTK,[[LOCI,IN],[TP,IN],[SP,IN],[LOCS,IN]]
TYPMAK S2WORD,[[MACRO]]
TYPMAK SPSTK,[[PDL,IN]]
TYPMAK SARGS,[[ARGS,TUPLE,1,1]]
TYPMAK SABASE,[[AB,IN]]
TYPMAK STBASE,[[TB,IN]]
TYPMAK SFRAME,[[FRAME,,,1]]
TYPMAK SCHSTR,[[CHSTR,STRING,,1]]
TYPMAK SATOM,[[ATOM,,,1]]
TYPMAK SLOCID,[[LOCD,,,1]]
TYPMAK SBYTE,[[BYTE,BYTES]]
TYPMAK SFRAME,[[ENV,ENVIRONMENT],[ACT,ACTIVATION,1,1]]
TYPMAK SASOC,[ASOC]
TYPMAK SLOCU,[[LOCU,,,1]]
TYPMAK SLOCS,[[LOCS,,,1]]
TYPMAK SLOCA,[[LOCA,,,1]]
TYPMAK S1WORD,[[CBLK,IN]]
TYPMAK STMPLT,[[TMPLT,TEMPLATE,1,1]]
TYPMAK SLOCT,[[LOCT]]
TYPMAK SLOCR,[[LOCR,,,1]]
TYPMAK SINFO,[[INFO,IN]]
TYPMAK S2NWORD,[[QRSUBR,QUICK-RSUBR,1],[QENT,QUICK-ENTRY,1]]
TYPMAK SRDTB,[[RDTB,IN]]
TYPMAK S1WORD,[[WORD,,,1]]
TYPMAK S2NWORD,[[RSUBR,,,1]]
TYPMAK SNWORD,[[CODE,,,1]]
TYPMAK S1WORD,[[SATC,PRIMTYPE-C,1]]
TYPMAK S1WORD,[[BITS]]
TYPMAK SSTORE,[[STORAGE,,,1],PICTURE]
TYPMAK STPSTK,[[SKIP,IN]]
TYPMAK SATOM,[[LINK,,1]]
TYPMAK S2NWORD,[[INTH,IHEADER,1],[HAND,HANDLER,1]]
TYPMAK SLOCN,[[LOCN,LOCAS,,1]]
TYPMAK S2WORD,[[DECL,,,1]]
TYPMAK SATOM,[DISMISS]
TYPMAK S2WORD,[[DCLI,IN]]
TYPMAK S2NWORD,[[ENTER,RSUBR-ENTRY,1,1]]
TYPMAK S2WORD,[SPLICE]
TYPMAK S1WORD,[[PCODE,PCODE,1],[TYPEW,TYPE-W,1],[TYPEC,TYPE-C,1]]
TYPMAK SGATOM,[[GATOM,IN]]
TYPMAK SFRAME,[[READA,,1]]
TYPMAK STBASE,[[UNWIN,IN]]
TYPMAK S1WORD,[[UBIND,IN]]
TYPMAK SLOCB,[LOCB]
TYPMAK SDEFQ,[[DEFQ,IN]]
TYPMAK SOFFS,[[OFFS,OFFSET]]
IFN MAIN,[RMT [LOC SAVE
]
]
IF2,EXPUNGE TYPMAK
RMT [EQUALS XP EXPUNGE
IF2,XP STMPLT
]
IF1 [
DEFINE EXPUN LIST
IRP A,,[LIST]
IRP B,,[A]
EXPUNGE T!B
.ISTOP
TERMIN
TERMIN
TERMIN
]
TYPMSK==17777
MONMSK==TYPMSK#777777
SATMSK==777
CHBIT==1000
TMPLBT==2000
IF1 [
DEFINE GETYP AC,ADR
LDB AC,[221500,,ADR]
TERMIN
DEFINE PUTYP AC,ADR
DPB AC,[221500,,ADR]
TERMIN
DEFINE GETYPF AC,ADR
LDB AC,[003700,,ADR]
TERMIN
DEFINE MONITO
.WRMON==200000
.RDMON==100000
.EXMON== 40000
.GLOBAL .MONWR,.MONRD,.MONEX
RMT [IF2 IFE MAIN, XP .WRMON,.RDMON,.EXMON
]
TERMIN
]
IFN MAIN,MONITO
IFE MAIN,[RMT [XP SATMSK,TYPMSK,MONMSK,CHBIT
]
]
;MUDDLE WIDE GLOBALS
;DEFINE ENTRIES IN PROCESS VECTOR AS BEING GLOBAL
IF1 [
IRP A,,[0,A,B,C,D,E,PVP,TVP,TP,TB,AB,P,PB,SP,M,R,FRM]
.GLOBAL A!STO
TERMIN
.GLOBAL CALER1,FINIS,VECTOP,VECBOT,INTFLG
;GLOBALS FOR MACROS IN VECTOR AND PAIR SPACE
.GLOBAL VECLOC,PARLOC,TVBASE,TVLOC,PVLOC,PVBASE,SQUTBL,SQULOC
.GLOBAL PARTOP,CODTOP,HITOP,HIBOT,SPECBIND,LCKINT
.GLOBAL GETWNA,WNA,TFA,TMA,WRONGT,WTYP,WTYP1,WTYP2,WTYP3,CALER,CALER1
]
;STORAGE ALLOCATIN SPECIFICATION GLOBALS
NSUBRS==600. ; ESTIMATE OF # OF SUBRS IN WOLD
TPLNT"==2000 ;TEMP PDL LENGTHH
GSPLNT==2000 ;INITIAL GLOBAL SP
GCPLNT"==100. ;GARBAGE COLLECTOR'S PDL LENGTH
PVLNT"==100 ;LENGTH OF INITIAL PROCESS VECTOR
TVLNT"==6000 ;MAX TRANSFER VECTOR
ITPLNT"==100 ;TP FOR GC
PLNT"==1000 ;PDL FOR USER PROCESS
;LOCATIONS OF VARIOUS STORAGE AREAS
PARBASE"==32000 ;START OF PAIR SPACE
VECBASE"==44000 ;START OF VECTOR SPACE
IFN MAIN,[PARLOC"==PARBASE
VECLOC"==VECBASE
]
;INITIAL MACROS
;SYMBLOS ASSOCIATED WITH STACK FRAMES
;TB POINTS TO CURRENT FRAME, THE SYMBOLS BELOW ARE OFFSETS ON TB
FRAMLN==7 ;LENGTH OF A FRAME
FSAV==-7 ;POINT TO CALLED FUNCTION
OTBSAV==-6 ;POINT TO PREVIOUS FRAME AND CONTAINS TIME
ABSAV==-5 ;ARGUMENT POINTER
SPSAV==-4 ;BINDING POINTER
PSAV==-3 ;SAVED P-STACK
TPSAV==-2 ;TOP OF STACK POINTER
PCSAV==-1 ;PCWORD
RMT [EXPUNGE FRAMLN
]
IFE MAIN,[RMT [EXPUNGE PCSAV TPSAV SPSAV PSAV ABSAV FSAV OTBSAV
]
]
;CALL MACRO
; ARGS ARE PUSHED ON THE STACK AS TYPE VALUE PAIRS
.GLOBAL .MCALL,.ACALL,FINIS,CONTIN,.ECALL,FATINS,.ERRUU
; CALL WITH AN ASSEMBLE TIME KNOWN NUMBER OF ARGUMENTS
IF1 [
DEFINE ERRUUO X
.ERRUU X
TERMIN
DEFINE MCALL N,F
.GLOBAL F
IFGE <17-N>,.MCALL N,F
IFL <17-N>,[PRINTC /LOSSAGE AT MCALL - TOO MANY ARGS
/
.MCALL F
]
TERMIN
; CALL WITH RUN TIME KNOWN NUMBER OF ARGS IN AC SPECIFIED BY N
DEFINE ACALL N,F
.GLOBAL F
.ACALL N,F
TERMIN
; STANDARD SUBROUTINE RETURN
; JRST FINIS
; ARGUMENTS WILL NO LONGER BE ON THE STACK WHEN RETURN HAS HAPPENED
; VALUE SHOULD BE IN A AND B
;CHECK THAT THE ENTRY POINT WAS CALLED WITH N ARGUMENTS
DEFINE ENTRY N
IFSN N,,[
HLRZ A,AB
CAIE A,-2*N
JSP E,GETWNA]
TERMIN
; MACROS ASSOCIATED WIT INTERRUPT PROCESSING
;INTERRUPT IF THERE IS A WAITING INTERRUPT
DEFINE INTGO
SKIPGE INTFLG
JSR LCKINT
TERMIN
;TO BECOME INTERRUPTABLE
DEFINE ENABLE
AOSN INTFLG
JSR LCKINT
TERMIN
;TO BECOME UNITERRUPTABLE
DEFINE DISABLE
SETZM INTFLG
TERMIN
]
IF1 [
;MACRO TO BUILD TYPE DISPATCH TABLES EASILY
DEFINE TBLDIS NAME,DEFAULT,LIST,LNTH,LH,\NN,FLG
NN==0
NAME:
REPEAT LNTH+1,[
FLG==0
IRP A,,[LIST]
IRP TYPE,LOCN,[A]
IFE <NN-TYPE>,[FLG==1
IFE LH,<LOCN>
IFN LH,<LH,,LOCN>
]
.ISTOP
TERMIN
TERMIN
IFE FLG,[
IFE LH,<DEFAULT>
IFN LH,<LH,,DEFAULT>
]
NN==NN+1
] LOC NAME+LNTH+1
TERMIN
; DISPATCH FOR NUMPRI GOODIES
DEFINE DISTBL NAME,DEFAULT,LIST
TBLDIS NAME,DEFAULT,[LIST]NUMPRI,0
TERMIN
DEFINE DISTBS NAME,DEFAULT,LIST
TBLDIS NAME,DEFAULT,[LIST]NUMSAT,0
TERMIN
DEFINE DISTB2 NAME,DEFAULT,LIST
TBLDIS NAME,DEFAULT,[LIST]NUMSAT,400000
TERMIN
]
VECFLG==0
PARFLG==0
;MACROS FOR INITIIAL MUDDLE LIST STRUCTURE
;CHAR STRING MAKER, RETURNS POINTER AND TYPE
IF1 [
DEFINE MACHAR NAME,TYPE,VAL,\LNT,WHERE,LAST
TYPE==TCHSTR
VECTGO WHERE
LNT==.LENGTH \NAME!\
ASCII \NAME!\
LAST==$."
TCHRS,,0
$."-WHERE+1,,0
VAL==LNT,,WHERE
VECRET
TERMIN
;MACRO TO DEFINE ATOMS
DEFINE MAKAT NAME,TYAT,VALU,OBLIS,REFER,LOCN,\TVENT,FIRST
FIRST==.
TYAT,,OBLIS
VALU
0
ASCII \NAME!\
400000+SATOM,,0
.-FIRST+1,,0
TVENT==FIRST-.+2,,FIRST
IFSN [LOCN],LOCN==TVENT
ADDTV TATOM,TVENT,REFER
TERMIN
;MACROS TO SWITCH BACK AND FORTH INTO AND OUT OF VECTOR AND PAIR SPACE
;GENERAL SWITCHER
DEFINE LOCSET LOCN,RETNAM,NEWLOC,OTHLOC,F1,F2,TOPWRD,\SAVE,SAVEF1,SAVEF2,NEW
IFE F1,[SAVE==.
LOC NEWLOC
SAVEF2==F2
IFN F2,OTHLOC==SAVE
F2==0
DEFINE RETNAM
F1==F1-1
IFE F1,[NEWLOC==.
F2==SAVEF2
LOC TOPWRD
NEWLOC
LOC SAVE
]
TERMIN
]
IFN F1,[F1==F1+1
]
IFSN LOCN,,LOCN==.
IFE F1,F1==1
TERMIN
DEFINE VECTGO LOCN
LOCSET LOCN,VECRET,VECLOC,PARLOC,VECFLG,PARFLG,VECTOP
TERMIN
DEFINE PARGO LOCN
LOCSET LOCN,PARRET,PARLOC,VECLOC,PARFLG,VECFLG,PARTOP
TERMIN
DEFINE ADDSQU NAME,\SAVE
SAVE==.
LOC SQULOC
SQUOZE 0,NAME
NAME
SQULOC==.
LOC SAVE
TERMIN
DEFINE ADDTV TYPE,GOODIE,REFER,\SAVE
SAVE==.
LOC TVLOC
TVOFF==.-TVBASE+1
TYPE,,REFER
GOODIE
TVLOC==.
LOC SAVE
TERMIN
;MACRO TO ADD TO PROCESS VECTOR
DEFINE ADDPV TYPE,GOODIE,OFFS,\SAVE
SAVE==.
LOC PVLOC
PVOFF==.-PVBASE
IFSN OFFS,,OFFS==PVOFF
TYPE,,0
GOODIE
PVLOC==.
LOC SAVE
TERMIN
;MACRO TO DEFINE A FUNCTION ATOM
DEFINE MFUNCTION NAME,TYPE,PNAME
XMFUNCTION NAME,TYPE,PNAME,0
TERMIN
DEFINE IMFUNCTION NAME,TYPE,PNAME
XMFUNCTION NAME,TYPE,PNAME,400000
TERMIN
DEFINE XMFUNCTION NAME,TYPE,PNAME,IMP
(TVP)
NAME":
VECTGO DUMMY1
ADDSQU NAME
IFSE [PNAME],MAKAT NAME,T!TYPE+IMP,NAME,SYSTEM,<NAME-1>
IFSN [PNAME],MAKAT [PNAME]T!TYPE+IMP,NAME,SYSTEM,<NAME-1>
VECRET
TERMIN
; VERSION OF MQUOTE WITH IMPURE BIT ON
DEFINE IMQUOTE ARG,PNAME,OBLIS,\LOCN
(TVP)
LOCN==.-1
VECTGO DUMMY1
IFSE [PNAME],MAKAT [ARG]<400000+TUNBOU>,0,OBLIS,LOCN
IFSN [PNAME],MAKAT [PNAME]<400000+TUNBOU>,0,OBLIS,LOCN
VECRET
TERMIN
;MACRO TO DEFINE QUOTED GOODIE
DEFINE MQUOTE ARG,PNAME,OBLIS,\LOCN
(TVP)
LOCN==.-1
VECTGO DUMMY1
IFSE [PNAME],MAKAT [ARG]TUNBOU,0,OBLIS,LOCN
IFSN [PNAME],MAKAT [PNAME]TUNBOU,0,OBLIS,LOCN
VECRET
TERMIN
DEFINE CHQUOTE NAME,\LOCN,TYP,VAL
(TVP)
LOCN==.-1
MACHAR [NAME]TYP,VAL
ADDTV TYP,VAL,LOCN
TERMIN
; SPECIAL ERROR MQUOTE
DEFINE EQUOTE ARG,PNAME
MQUOTE ARG,[PNAME]ERRORS TERMIN
; MACRO DO .CALL UUOS
DEFINE DOTCAL NM,LIST,\LOCN
.CALL LOCN
RMT [LOCN==.
SETZ
SIXBIT /NM/
IRP Q,R,[LIST]
IFSN [R][][Q
]
IFSE [R][][<SETZ>\<Q>
]
TERMIN
]
TERMIN
; MACRO TO HANDLE FATAL ERRORS
DEFINE FATAL MSG/
FATINS [ASCIZ /: FATAL ERROR MSG 
/]
TERMIN
]
CHRWD==5
IFN READER,[
NCHARS==377
;CHARACTER TABLE GENERATING MACROS
DEFINE SETSYM WRDL,BYTL,COD
WRD!WRDL==<WRD!WRDL>&<MSK!BYTL>
WRD!WRDL==<WRD!WRDL>\<<COD&177>_<<4-BYTL>*7+1>>
TERMIN
DEFINE INIWRD N,INIT
WRD!N==INIT
TERMIN
DEFINE OUTWRD N
WRD!N
TERMIN
;MACRO TO KILL THESE SYMBOLS LATER
DEFINE KILLWD N
EXPUNGE WRD!N
TERMIN
DEFINE SETMSK N
MSK!N==<177_<<4-N>*7+1>>#<-1>
TERMIN
;MACRO TO KILL MASKS LATER
DEFINE KILMSK N
EXPUNGE MSK!N
TERMIN
NWRDS==<NCHARS+CHRWD-1>/CHRWD
REPEAT CHRWD,SETMSK \.RPCNT
REPEAT NWRDS,INIWRD \.RPCNT,004020100402
DEFINE OUTTBL
REPEAT NWRDS,OUTWRD \.RPCNT
TERMIN
;MACRO TO GENERATE THE DUMMIES EASLILIER
DEFINE INITCH \DUM1,DUM2,DUM3
DEFINE SETCOD COD,LIST
IRP CHAR,,[LIST]
DUM1==<CHAR+CHROFF>/5
DUM2==CHROFF+CHAR-DUM1*5
SETSYM \DUM1,\DUM2,COD
IFE CHROFF,[DUM1==<CHAR+200>/5
DUM2==<CHAR+200-<DUM1*5>>
SETSYM \DUM1,\DUM2,COD
]
TERMIN
TERMIN
DEFINE SETCHR COD,LIST
IRPC CHAR,,[LIST]
DUM3==<"CHAR>+CHROFF
DUM1==DUM3/5
DUM2==DUM3-DUM1*5
SETSYM \DUM1,\DUM2,COD
IFE CHROFF,[DUM3==DUM3+200
DUM1==DUM3/5
DUM2==DUM3-DUM1*5
SETSYM \DUM1,\DUM2,COD
]
TERMIN
TERMIN
DEFINE INCRCO OCOD,LIST
IRP CHAR,,[LIST]
DUM1==<CHAR+CHROFF>/5
DUM2==CHROFF+CHAR-DUM1*5
SETSYM \DUM1,\DUM2,\<OCOD+.IRPCN>
IFE CHROFF,[DUM1==<CHAR+200>/5
DUM2==<CHAR+200-<DUM1*5>>
SETSYM \DUM1,\DUM2,<OCOD.IRPCN>
]
TERMIN
TERMIN
DEFINE INCRCH OCOD,LIST
IRPC CHAR,,[LIST]
DUM3==<"CHAR>+CHROFF
DUM1==DUM3/5
DUM2==DUM3-DUM1*5
SETSYM \DUM1,\DUM2,\<OCOD+.IRPCN>
IFE CHROFF,[DUM3==DUM3+200
DUM1==DUM3/5
DUM2==DUM3-DUM1*5
SETSYM \DUM1,\DUM2,<OCOD+.IRPCN>
]
TERMIN
TERMIN
RMT [EXPUNGE DUM1,DUM2,DUM3
REPEAT NWRDS,KILLWD \.RPCNT
REPEAT CHRWD,KILMSK \.RPCNT
]
TERMIN
INITCH
]
;REDEFINE END DO ALL THE REMOTES (ON LAST PASS ONLY)
EQUALS E.END END
EXPUNG END
DEFINE END ARG
EQUALS END E.END
CONSTANTS
IMPURE
VARIABLES
PURE
HERE
.LNKOT
IF2 GEXPUN
CONSTANTS
IMPURE
VARIABLES
CODEND==.
LOC CODTOP
CODEND
LOC CODEND
PURE
CODEND==.
LOC HITOP
CODEND
LOC CODEND
IF2 EXPUNGE PARFLG,VECFLG,CHRWD,NN,NUMPRI,PURITY,EAD,ACD,PUSHED
IF2 EXPUNGE INSTNT,DUMMY1,PRIM,PPLNT,GSPLNT,MEDIAT
END ARG
TERMIN
;MACROS TO PRINT VERSIONS OF PROGRAMS DURING ASSEMBLY
IF1 [
DEFINE NUMGEN SYM,\REST,N
NN==NN-1
N==<SYM_-30.>&77
REST==<SYM_6>
IFN N,IFGE <31-N>,IFGE <N-20>,TOTAL==TOTAL*10.+<N-20>
IFN NN,NUMGEN REST
EXPUNGE N,REST
TERMIN
DEFINE VERSIO N
PRINTC /VERSION = N
/
TERMIN
]
TOTAL==0
NN==7
NUMGEN .FNAM2
IF1 [
RADIX 10.
VERSIO \TOTAL
RADIX 8
PROGVN==TOTAL
DEFINE VATOM SYM,\LOCN,TV,A,B
VECTGO
LOCN==.
TFIX,,MUDDLE
PROGVN
0
A==<<<<SYM_-30.>&77>+40>_29.>
B==<<SYM_-24.>&77>
IFN B,A==A+<<B+40>_22.>
B==<<SYM_-18.>&77>
IFN B,A==A+<<B+40>_15.>
B==<<SYM_-12.>&77>
IFN B,A==A+<<B+40>_8.>
B==<<SYM_-6.>&77>
IFN B,A==A+<<B+40>_1.>
A
IFN <SYM&77>,<<SYM&77>+40>_29.
400000+SATOM,,
.-LOCN+1,,0
TV==LOCN-.+2,,LOCN
ADDTV TATOM,TV,0
VECRET
TERMIN
;VATOM .FNAM1 ;"HACK REMOVED FOR EFFICIENCY"
;MACRO TO REMMVE SYMBOLS OF THE FORM "GXXXXX"
DEFINE GEXPUN \SYM
NN==7
TOTAL==0
NUMGEN \<SIXBIT /SYM!/>
RADIX 10.
.GSSET 0
REPEAT TOTAL,XXP
RADIX 8
TERMIN
DEFINE XXP \A
EXPUNGE A
TERMIN
DEFINE ..LOC NEW,OLD
.LIFS .LPUR"+.LIMPU"
OLD!"==$."
LOC NEW!"
.ELDC
.LIFS -.LPUR"
LOC $."
.ELDC
.LIFS -.LIMPU
LOC $."
.ELDC
TERMIN
; PURE - MACRO TO SWITCH LOADING TO PURE CORE.
DEFINE PURE
IFE PURITY-1, ..LOC .LPUR,.LIMPU
PURITY==0
TERMIN
; IMPURE - MACRO TO SWITCH LOADING TO IMPURE CORE.
DEFINE IMPURE
IFE PURITY, ..LOC .LIMPU,.LPUR
PURITY==1
TERMIN
]
PURITY==0
; BLOCK MACRO
DEFINE SPBLOK N
OFFSET 0
LOC .+N
OFFSET OFFS
TERMIN