(FILECREATED "15-Feb-85 18:21:43" {ERIS}<LISPCORE>SOURCES>LLNEW.;10 36906 changes to: (FNS \UNCOPY) (VARS LLNEWCOMS) previous date: "12-Feb-85 11:21:19" {ERIS}<LISPCORE>SOURCES>LLNEW.;9) (* Copyright (c) 1981, 1982, 1983, 1984, 1985 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT LLNEWCOMS) (RPAQQ LLNEWCOMS ([COMS (* low level memory access) (FNS \ADDBASE \GETBASE \PUTBASE \PUTBASE.UFN \PUTBASEPTR.UFN \PUTBITS.UFN \GETBASEBYTE \PUTBASEBYTE \GETBASEPTR \PUTBASEPTR \HILOC \LOLOC \VAG2 EQ \RPLPTR \RPLPTR.UFN) (FNS LOC VAG) (FNS CREATEPAGES \NEW4PAGE) (DECLARE: DONTCOPY (EXPORT (RECORDS POINTER WORD) (MACROS PTRGTP .COERCE.TO.SMALLPOSP. .COERCE.TO.BYTE.)) (ADDVARS (INEWCOMS (FNS \GETBASEBYTE \PUTBASEBYTE CREATEPAGES \NEW4PAGE)) (RDCOMS (FNS \CAR.UFN \CDR.UFN) (FNS \COPY \UNCOPY) (FNS \GETBASEBYTE \PUTBASEBYTE)) (INITPTRS (\LISTPDTD)) (MKI.SUBFNS (\ADDBASE . I.ADDBASE) (\\ADDBASE . I.ADDBASE) (\GETBASE . I.GETBASE) (\PUTBASE . I.PUTBASE) (\GETBASEBYTE . I.GETBASEBYTE) (\PUTBASEBYTE . I.PUTBASEBYTE) (\GETBASEPTR . I.GETBASEPTR) (\PUTBASEPTR . I.PUTBASEPTR) (\HILOC . I.HILOC) (\LOLOC . I.LOLOC) (\VAG2 . I.VAG2) (.COERCE.TO.SMALLPOSP. . PROG1) (.COERCE.TO.BYTE. . PROG1) (LOCKEDPAGEP . MKI.LOCKEDPAGEP) (\RPLPTR . I.PUTBASEPTR) (CONS . I.\CONS.UFN)) (RD.SUBFNS (\ADDBASE . VADDBASE) (\\ADDBASE . VADDBASE) (\GETBASE . VGETBASE) (\PUTBASE . VPUTBASE) (\GETBASEPTR . VGETBASEPTR) (\PUTBASEPTR . VPUTBASEPTR) (\HILOC . VHILOC) (\LOLOC . VLOLOC) (\VAG2 . VVAG2) (.COERCE.TO.SMALLPOSP. . PROG1) (.COERCE.TO.BYTE. . PROG1) (CONS . VCONS) (CREATECELL . VCREATECELL) (COPYSTRING . VCOPYSTRING) (PTRGTP . IGREATERP) (\RPLPTR . VPUTBASEPTR) (CAR . V\CAR.UFN) (CDR . V\CDR.UFN) (CAR/CDRERR . T))) EVAL@COMPILE (ADDVARS (DONTCOMPILEFNS CREATEPAGES] [COMS (* cons cells) (FNS CONS \CONS.UFN CAR \CAR.UFN CDR \CDR.UFN RPLACA \RPLACA.UFN RPLACD \RPLACD.UFN DOCOLLECT \RPLCONS ENDCOLLECT \INITCONSPAGE \NEXTCONSPAGE) (INITVARS (CAR/CDRERR (QUOTE CDR))) (DECLARE: DONTCOPY (GLOBALVARS CAR/CDRERR) (EXPORT (RECORDS LISTP CONSPAGE) (CONSTANTS * CONSCONSTANTS)) (MACROS .MAKECONSCELL.) (* for MAKEINIT) (ADDVARS (INEWCOMS (FNS \CONS.UFN \INITCONSPAGE \NEXTCONSPAGE)) (EXPANDMACROFNS .MAKECONSCELL.))) (COMS (* testing out CONSes) (FNS CHECKCONSPAGES \CHECKCONSPAGE) (DECLARE: DONTCOPY (MACROS !CHECK] [COMS (* other random stuff for makeinit) (FNS MAKEINITFIRST MAKEINITLAST \COPY \UNCOPY) (DECLARE: DONTCOPY (EXPORT (MACROS LOCAL ALLOCAL)) (ADDVARS (MKI.SUBFNS (CHECK . *) (RAID . HELP) (UNINTERRUPTABLY . PROGN) (\StatsAdd1 . *) (EVQ . I.\COPY) (COPY . I.\COPY)) (RD.SUBFNS (CHECK . *) (RAID . HELP) (UNINTERRUPTABLY . PROGN) (\StatsAdd1 . *) (EVQ . V\COPY) (COPY . V\COPY) (1ST . V\UNCOPY))) (ADDVARS (INEWCOMS (FNS MAKEINITFIRST \COPY MAKEINITLAST))) EVAL@COMPILE (ADDVARS (DONTCOMPILEFNS MAKEINITFIRST \COPY MAKEINITLAST \UNCOPY] (LOCALVARS . T))) (* low level memory access) (DEFINEQ (\ADDBASE [LAMBDA (X D) (* lmm " 2-NOV-81 18:33") (* usually done in microcode; this version uses only arithmetic and \VAG2) (PROG (NH NL (XH (\HILOC X)) (XL (\LOLOC X))) (.UNBOX. D NH NL) (COND [(IGREATERP XL (IDIFFERENCE MAX.SMALL.INTEGER NL)) (* carry) (add XH 1) (SETQ XL (SUB1 (IDIFFERENCE XL (IDIFFERENCE MAX.SMALL.INTEGER NL] (T (add XL NL))) (COND [(IGREATERP NH MAX.POS.HINUM) (SETQ XH (SUB1 (IDIFFERENCE XH (IDIFFERENCE MAX.SMALL.INTEGER NH] (T (add XH NH))) (RETURN (\VAG2 XH XL]) (\GETBASE [LAMBDA (X D) (* lmm " 2-NOV-81 18:33") (* usually done in microcode; case where D=0 MUST be done in microcode) (\GETBASE (\ADDBASE X D) 0]) (\PUTBASE [LAMBDA (X D V) (* lmm "11-FEB-83 07:35") (* usually done in microcode; case where D=0 MUST be handled there) (\PUTBASE (\ADDBASE X D) 0 (.COERCE.TO.SMALLPOSP. V]) (\PUTBASE.UFN [LAMBDA (X V D) (* lmm "11-FEB-83 07:35") (* usually done in microcode; case where D=0 MUST be handled there) (\PUTBASE (\ADDBASE X D) 0 (.COERCE.TO.SMALLPOSP. V]) (\PUTBASEPTR.UFN [LAMBDA (X V D) (* lmm "10-NOV-81 15:12") (* usually done in microcode; this def uses only PUTBASE, ADDBASE, etc) (\PUTBASE X D (\HILOC V)) (\PUTBASE (\ADDBASE X D) 1 (\LOLOC V)) V]) (\PUTBITS.UFN [LAMBDA (X V N.FD) (* lmm "11-FEB-83 07:35") (PROG ((NV (.COERCE.TO.SMALLPOSP. V)) (WIDTH (ADD1 (LOGAND N.FD 15))) (FIRST (LRSH (LOGAND N.FD 255) 4)) MASK SHIFT) (SETQ SHIFT (IDIFFERENCE 16 (IPLUS FIRST WIDTH))) (SETQ MASK (SUB1 (LLSH 1 WIDTH))) (\PUTBASE (SETQ X (\ADDBASE X (LRSH N.FD 8))) 0 (LOGOR (LOGAND (\GETBASE X 0) (LOGXOR 65535 (LLSH MASK SHIFT))) (LLSH (LOGAND NV MASK) SHIFT))) (RETURN NV]) (\GETBASEBYTE [LAMBDA (PTR N) (* bvm: " 5-Feb-85 12:05") (* usually done in microcode; this def. uses only \GETBASE and arithmetic - used by MAKEINIT too) (COND [(EVENP N) (fetch (WORD HIBYTE) of (\GETBASE PTR (FOLDLO N BYTESPERWORD] (T (fetch (WORD LOBYTE) of (\GETBASE PTR (FOLDLO N BYTESPERWORD]) (\PUTBASEBYTE (LAMBDA (PTR DISP BYTE) (* JonL "31-Dec-83 23:48") (* usually done in microcode - this def used by MAKEINIT too) (SETQ BYTE (.COERCE.TO.BYTE. BYTE)) (\PUTBASE PTR (FOLDLO (SETQ DISP (\DTEST DISP (QUOTE SMALLP))) BYTESPERWORD) (COND ((EVENP DISP BYTESPERWORD) (create WORD using (\GETBASE PTR (FOLDLO DISP BYTESPERWORD)) HIBYTE ← BYTE)) (T (create WORD using (\GETBASE PTR (FOLDLO DISP BYTESPERWORD)) LOBYTE ← BYTE)))) BYTE)) (\GETBASEPTR [LAMBDA (X D) (* lmm " 2-NOV-81 18:34") (* usually done in microcode; this def. uses GETBASE, VAG2, etc. and handles overflows too) (\VAG2 (fetch LOBYTE of (\GETBASE X D)) (\GETBASE (\ADDBASE X 1) D]) (\PUTBASEPTR [LAMBDA (X D V) (* lmm " 2-NOV-81 18:35") (* usually done in microcode; this def uses only PUTBASE, ADDBASE, etc) (\PUTBASE X D (\HILOC V)) (\PUTBASE (\ADDBASE X D) 1 (\LOLOC V)) V]) (\HILOC [LAMBDA (X) (* lmm "10-MAR-81 15:02") (* MUST be handled in microcode) (\HILOC X]) (\LOLOC [LAMBDA (X) (* lmm "10-MAR-81 15:03") (* MUST be handled in microcode) (\LOLOC X]) (\VAG2 (LAMBDA (H L) (* JonL "31-Dec-83 23:39") (* case where H is byte and L is smallposp MUST be handled in microcode. Other cases may run error here.) (\VAG2 (.COERCE.TO.BYTE. H) (.COERCE.TO.SMALLPOSP. L)))) (EQ [LAMBDA (X Y) (* lmm "10-MAR-81 15:04") (* MUST be handled in microcode) (EQ X Y]) (\RPLPTR [LAMBDA (OBJ OFFSET VAL) (* lmm " 3-NOV-81 12:10") (UNINTERRUPTABLY (\ADDREF VAL) (\DELREF (\GETBASEPTR (SETQ OBJ (\ADDBASE OBJ OFFSET)) 0)) (\PUTBASEBYTE OBJ 1 (\HILOC VAL)) (* \PUTBASEPTR smashes the high byte) (\PUTBASE OBJ 1 (\LOLOC VAL)) VAL)]) (\RPLPTR.UFN [LAMBDA (OBJ VAL OFFSET) (* lmm " 3-NOV-81 12:10") (* UFN is different from function since the offset (inline) gets pushed last) (UNINTERRUPTABLY (\ADDREF VAL) (\DELREF (\GETBASEPTR (SETQ OBJ (\ADDBASE OBJ OFFSET)) 0)) (\PUTBASEBYTE OBJ 1 (\HILOC VAL)) (* \PUTBASEPTR smashes the high byte) (\PUTBASE OBJ 1 (\LOLOC VAL)) VAL)]) ) (DEFINEQ (LOC [LAMBDA (X) (* lmm " 2-NOV-81 18:29") (* Return HILOC-LOLOC pair, for easier traffic with RAID. VAG interprets such pairs correctly.) (CONS (\HILOC X) (\LOLOC X]) (VAG [LAMBDA (LOC) (* lmm " 2-NOV-81 18:28") (* LOC can be a HILOC-LOLOC pair) (COND [(LISTP LOC) (\VAG2 (CAR LOC) (OR (FIXP (CDR LOC)) (FIX (CADR LOC] (T (\VAG2 (\HINUM LOC) (\LONUM LOC]) ) (DEFINEQ (CREATEPAGES [LAMBDA (VA N BLANKFLG LOCKFLG) (* bvm: "29-MAR-83 16:35") (* called only under MAKEINIT - BLANKFLG means that MAKEINIT won't write on this page, so fake it - to prevent storage overflow when running on Maxc and init'ing GC table) (for I from 0 to (SUB1 N) do (\NEWPAGE (\ADDBASE VA (UNFOLD I WORDSPERPAGE)) NIL LOCKFLG BLANKFLG)) VA]) (\NEW4PAGE [LAMBDA (PTR) (* lmm "11-FEB-83 07:47") (\NEWPAGE (\ADDBASE (\NEWPAGE (\ADDBASE (\NEWPAGE (\ADDBASE (\NEWPAGE PTR) WORDSPERPAGE)) WORDSPERPAGE)) WORDSPERPAGE]) ) (DECLARE: DONTCOPY (* FOLLOWING DEFINITIONS EXPORTED) [DECLARE: EVAL@COMPILE (ACCESSFNS POINTER [(PAGE# (IPLUS (LLSH (\HILOC DATUM) 8) (LRSH (\LOLOC DATUM) 8))) (WORDINPAGE (LOGAND (\LOLOC DATUM) 255)) (CELLINPAGE (LRSH (fetch WORDINPAGE of DATUM) 1)) (BYTEINPAGE (LLSH (fetch WORDINPAGE of DATUM) 1)) (SEGMENT# (\HILOC DATUM)) (WORDINSEGMENT (\LOLOC DATUM)) (CELLINSEGMENT (LRSH (fetch WORDINSEGMENT of DATUM) 1)) (WORD# (fetch WORDINPAGE of DATUM)) (DBLWORD# (fetch CELLINPAGE of DATUM)) (PAGEBASE (\VAG2 (\HILOC DATUM) (LOGAND (\LOLOC DATUM) 65280] (CREATE (\VAG2 (LRSH PAGE# 8) (LLSH (LOGAND PAGE# 255) 8)))) (ACCESSFNS WORD ((HIBYTE (LRSH DATUM 8)) (LOBYTE (LOGAND DATUM 255))) (CREATE (IPLUS (LLSH HIBYTE 8) LOBYTE))) ] (DECLARE: EVAL@COMPILE (PUTPROPS PTRGTP MACRO [OPENLAMBDA (X Y) (OR (IGREATERP (\HILOC X) (\HILOC Y)) (AND (EQ (\HILOC X) (\HILOC Y)) (IGREATERP (\LOLOC X) (\LOLOC Y]) (PUTPROPS .COERCE.TO.SMALLPOSP. DMACRO [OPENLAMBDA (X) (COND ((SMALLPOSP X) X) (T (\ILLEGAL.ARG X]) (PUTPROPS .COERCE.TO.BYTE. DMACRO [OPENLAMBDA (X) (COND ([AND (SMALLPOSP X) (ILESSP X (CONSTANT (LLSH 1 BITSPERBYTE] X) (T (\ILLEGAL.ARG X]) ) (* END EXPORTED DEFINITIONS) (ADDTOVAR INEWCOMS (FNS \GETBASEBYTE \PUTBASEBYTE CREATEPAGES \NEW4PAGE)) (ADDTOVAR RDCOMS (FNS \CAR.UFN \CDR.UFN) (FNS \COPY \UNCOPY) (FNS \GETBASEBYTE \PUTBASEBYTE)) (ADDTOVAR INITPTRS (\LISTPDTD)) (ADDTOVAR MKI.SUBFNS (\ADDBASE . I.ADDBASE) (\\ADDBASE . I.ADDBASE) (\GETBASE . I.GETBASE) (\PUTBASE . I.PUTBASE) (\GETBASEBYTE . I.GETBASEBYTE) (\PUTBASEBYTE . I.PUTBASEBYTE) (\GETBASEPTR . I.GETBASEPTR) (\PUTBASEPTR . I.PUTBASEPTR) (\HILOC . I.HILOC) (\LOLOC . I.LOLOC) (\VAG2 . I.VAG2) (.COERCE.TO.SMALLPOSP. . PROG1) (.COERCE.TO.BYTE. . PROG1) (LOCKEDPAGEP . MKI.LOCKEDPAGEP) (\RPLPTR . I.PUTBASEPTR) (CONS . I.\CONS.UFN)) (ADDTOVAR RD.SUBFNS (\ADDBASE . VADDBASE) (\\ADDBASE . VADDBASE) (\GETBASE . VGETBASE) (\PUTBASE . VPUTBASE) (\GETBASEPTR . VGETBASEPTR) (\PUTBASEPTR . VPUTBASEPTR) (\HILOC . VHILOC) (\LOLOC . VLOLOC) (\VAG2 . VVAG2) (.COERCE.TO.SMALLPOSP. . PROG1) (.COERCE.TO.BYTE. . PROG1) (CONS . VCONS) (CREATECELL . VCREATECELL) (COPYSTRING . VCOPYSTRING) (PTRGTP . IGREATERP) (\RPLPTR . VPUTBASEPTR) (CAR . V\CAR.UFN) (CDR . V\CDR.UFN) (CAR/CDRERR . T)) EVAL@COMPILE (ADDTOVAR DONTCOMPILEFNS CREATEPAGES) ) (* cons cells) (DEFINEQ (CONS [LAMBDA (X Y) (* lmm "11-FEB-82 13:55") (* use microcode UFN to get to \CONS.UFN) ((OPCODES CONS) X Y]) (\CONS.UFN [LAMBDA (X Y) (* bvm: " 5-Feb-85 12:13") [COND ((ZEROP CDRCODING) (RAID) (PROG ((CELL (CREATECELL \LISTP))) (replace (LISTP CAR) of CELL with X) (replace (LISTP CDR) of CELL with Y) (RETURN CELL] (UNINTERRUPTABLY (\ADDREF X) (\ADDREF Y) (\StatsAdd1 (fetch DTDCNTLOC of \LISTPDTD)) (.INCREMENT.ALLOCATION.COUNT. 1) (PROG (CNS.PAGE) [SETQ CNS.PAGE (COND [(AND (EQ (NTYPX Y) \LISTP) (IGREATERP (fetch (CONSPAGE CNT) of (SETQ CNS.PAGE (fetch (POINTER PAGEBASE) of Y))) 0)) (* Test for any cells left on page - NTYPX rather than LISTP test for benefit of MAKEINIT) (.MAKECONSCELL. CNS.PAGE X (IPLUS \CDR.ONPAGE (fetch (POINTER DBLWORD#) of Y] (T (.MAKECONSCELL. (SETQ CNS.PAGE (\NEXTCONSPAGE)) X (COND ((NULL Y) \CDR.NIL) (T (IPLUS \CDR.INDIRECT (fetch (POINTER DBLWORD#) of (.MAKECONSCELL. CNS.PAGE Y 0] (\DELREF CNS.PAGE) (RETURN CNS.PAGE)))]) (CAR [LAMBDA (X) (* lmm "11-FEB-82 13:56") ((OPCODES CAR) X]) (\CAR.UFN [LAMBDA (X) (* lmm "18-Jul-84 00:07") (* most cases handled in microcode - this code also used by MAKEINIT/READSYS) (\CALLME (QUOTE CAR)) (COND [(LISTP X) (COND ((ZEROP CDRCODING) (fetch (LISTP CAR) of X)) (T (COND ((EQ (fetch CDRCODE of X) \CDR.INDIRECT) (fetch CARFIELD of (fetch CARFIELD of X))) (T (fetch CARFIELD of X] ((NULL X) NIL) (T (SELECTQ CAR/CDRERR (T (LISPERROR "ARG NOT LIST" X)) [(NIL CDR) (COND ((EQ X T) T) ((LITATOM X) NIL) (T (QUOTE "{car of non-list}"] (COND ((EQ X T) T) ((STRINGP X) (LISPERROR "ARG NOT LIST" X)) (T (QUOTE "{car of non-list}"]) (CDR [LAMBDA (X) (* lmm "11-FEB-82 13:56") ((OPCODES CDR) X]) (\CDR.UFN [LAMBDA (X) (* lmm "17-Jul-84 22:26") (* most cases handled in microcode - this code also used by MAKEINIT/READSYS) (\CALLME (QUOTE CDR)) (COND [(LISTP X) (COND ((ZEROP CDRCODING) (fetch (LISTP CDR) of X)) (T (PROG ((Q (fetch CDRCODE of X))) (RETURN (COND ((EQ Q \CDR.NIL) NIL) ((IGREATERP Q \CDR.ONPAGE) (\ADDBASE (fetch (POINTER PAGEBASE) of X) (LLSH (IDIFFERENCE Q \CDR.ONPAGE) 1))) ((EQ Q \CDR.INDIRECT) (\CDR.UFN (fetch CARFIELD of X))) (T (fetch CARFIELD of (\ADDBASE (fetch PAGEBASE of X) (LLSH Q 1] ((NULL X) NIL) (T (SELECTQ CAR/CDRERR ((T CDR) (LISPERROR "ARG NOT LIST" X)) (NIL (COND ((LITATOM X) (GETPROPLIST X)) (T "{cdr of non-list}"))) (COND ((STRINGP X) (LISPERROR "ARG NOT LIST" X)) (T "{cdr of non-list}"]) (RPLACA [LAMBDA (X Y) (* lmm "11-FEB-82 13:55") (* invoke \RPLACA.UFN) ((OPCODES RPLACA) X Y]) (\RPLACA.UFN [LAMBDA (X Y) (* lmm " 1-DEC-81 21:17") (COND [(NLISTP X) (COND [(NULL X) (* if X is NIL and Y is NIL ok) (COND (Y (LISPERROR "ATTEMPT TO RPLAC NIL" Y] (T (LISPERROR "ARG NOT LIST" X] (T (COND ((ZEROP CDRCODING) (replace (LISTP CAR) of X with Y) X) (T (UNINTERRUPTABLY (\DELREF (CAR X)) (\ADDREF Y) (replace CARFIELD of (COND ((EQ (fetch CDRCODE of X) \CDR.INDIRECT) (fetch CARFIELD of X)) (T X)) with Y) X)]) (RPLACD [LAMBDA (X Y) (* lmm "11-FEB-82 13:55") ((OPCODES RPLACD) X Y]) (\RPLACD.UFN [LAMBDA (X Y) (* lmm "11-JAN-82 10:15") (COND [(NLISTP X) (COND [(NULL X) (* if X is NIL and Y is NIL ok) (COND (Y (LISPERROR "ATTEMPT TO RPLAC NIL" Y] (T (LISPERROR "ARG NOT LIST" X] ((ZEROP CDRCODING) (replace (LISTP CDR) of X with Y) X) (T (UNINTERRUPTABLY (\DELREF (CDR X)) (\ADDREF Y) (PROG (RP.PAGE (RP.Q (fetch CDRCODE of X))) (COND ((EQ RP.Q \CDR.INDIRECT) (SETQ RP.PAGE (fetch CARFIELD of X)) (CHECK (ILEQ (fetch CDRCODE of RP.PAGE) \CDR.MAXINDIRECT) (NEQ (fetch CDRCODE of RP.PAGE) \CDR.INDIRECT)) (SETQ RP.PAGE (\ADDBASE (fetch PAGEBASE of RP.PAGE) (LLSH (IDIFFERENCE (fetch CDRCODE of RP.PAGE) \CDR.INDIRECT) 1))) (CHECK (LISTP RP.PAGE) (EQ 0 (fetch CDRCODE of RP.PAGE))) (replace FULLCARFIELD of RP.PAGE with Y)) ((ILEQ RP.Q \CDR.MAXINDIRECT) (SETQ RP.PAGE (\ADDBASE (fetch PAGEBASE of X) (LLSH (IDIFFERENCE RP.Q \CDR.INDIRECT) 1))) (CHECK (LISTP RP.PAGE) (EQ 0 (fetch CDRCODE of RP.PAGE))) (replace FULLCARFIELD of RP.PAGE with Y)) ((NULL Y) (replace CDRCODE of X with \CDR.NIL)) [(EQ (SETQ RP.PAGE (fetch PAGEBASE of X)) (fetch PAGEBASE of Y)) (* New CDR on same page) (replace CDRCODE of X with (IPLUS \CDR.ONPAGE (fetch (POINTER DBLWORD#) of Y] [(IGREATERP (fetch (CONSPAGE CNT) of RP.PAGE) 0) (* Room on page for cdr cell) (replace CDRCODE of X with (IPLUS \CDR.INDIRECT (fetch (POINTER DBLWORD#) of (.MAKECONSCELL. RP.PAGE Y 0] (T [replace FULLCARFIELD of X with (.MAKECONSCELL. (SETQ RP.PAGE (\NEXTCONSPAGE)) (fetch CARFIELD of X) (IPLUS \CDR.INDIRECT (fetch (POINTER DBLWORD#) of (.MAKECONSCELL. RP.PAGE Y 0] (replace CDRCODE of X with \CDR.INDIRECT))) (RETURN X)))]) (DOCOLLECT [LAMBDA (ITEM LST) (* lmm: "30-SEP-76 13:03:33") (COND ((NLISTP LST) (FRPLACD (SETQ LST (LIST ITEM)) LST)) (T (CDR (FRPLACD LST (CONS ITEM (CDR LST]) (\RPLCONS [LAMBDA (LST ITEM) (* bvm: " 5-Feb-85 22:49") (* (CDR (RPLACD LST (CONS ITEM NIL)))) (COND [(AND (NEQ CDRCODING 0) (LISTP LST) (UNINTERRUPTABLY (* Have to go uninterruptable here so that someone doesn't change the CNT field to zero out from under us) [PROG ((CPAGE (fetch (POINTER PAGEBASE) of LST)) CELL) (RETURN (COND ((AND (NEQ (fetch (CONSPAGE CNT) of CPAGE) 0) (IGREATERP (fetch CDRCODE of LST) \CDR.MAXINDIRECT)) (\ADDREF ITEM) (\DELREF (CDR LST)) (SETQ CELL (.MAKECONSCELL. CPAGE ITEM \CDR.NIL)) (\StatsAdd1 (fetch DTDCNTLOC of \LISTPDTD)) (.INCREMENT.ALLOCATION.COUNT. 1) (replace CDRCODE of LST with (IPLUS \CDR.ONPAGE (fetch (POINTER DBLWORD#) of CELL))) CELL])] (T (SETQ ITEM (CONS ITEM NIL)) (* Have to be careful how this part is written, or compiler will turn it into RPLCONS !) (RPLACD LST ITEM) ITEM]) (ENDCOLLECT [LAMBDA (X Y) (* lmm "21-MAR-81 13:37") (COND ((NULL X) Y) (T (PROG1 (CDR X) (RPLACD X Y]) (\INITCONSPAGE [LAMBDA (BASE LINK) (* lmm "20-DEC-81 23:11") (COND ((ZEROP CDRCODING) (RAID)) (T (PROG ((J (replace NEXTCELL of BASE with 254)) CELL) LP (COND ((NEQ J 0) (SETQ CELL (\ADDBASE BASE J)) (replace FULLCARFIELD of CELL with NIL) (replace CDRCODE of CELL with (SETQ J (IDIFFERENCE J 2))) (GO LP))) (replace (CONSPAGE CNT) of BASE with 127) (* if LINK=NIL, stores a 0.0 This assumes that the pagebase of NIL is NIL) (replace NEXTPAGE of BASE with (fetch (POINTER PAGE#) of LINK)) (RETURN BASE]) (\NEXTCONSPAGE [LAMBDA NIL (* bvm: " 4-Feb-85 12:34") (CHECK (NULL \INTERRUPTABLE)) (PROG ((N (fetch DTDNEXTPAGE of \LISTPDTD)) PG) LP [COND ((EQ N 0) (SETQ PG (\ALLOCMDSPAGE \LISTP)) (\INITCONSPAGE PG (\INITCONSPAGE (\ADDBASE PG WORDSPERPAGE) NIL)) (replace DTDNEXTPAGE of \LISTPDTD with (PAGELOC PG))) (T (SETQ PG (create POINTER PAGE# ← N] (COND ((IGREATERP (fetch (CONSPAGE CNT) of PG) 1) (RETURN PG))) (replace DTDNEXTPAGE of \LISTPDTD with (SETQ N (fetch (CONSPAGE NEXTPAGE) of PG))) (replace (CONSPAGE NEXTPAGE) of PG with \CONSPAGE.LAST) (* Take off free list) (GO LP]) ) (RPAQ? CAR/CDRERR (QUOTE CDR)) (DECLARE: DONTCOPY (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS CAR/CDRERR) ) (* FOLLOWING DEFINITIONS EXPORTED) [DECLARE: EVAL@COMPILE (BLOCKRECORD LISTP ((CAR POINTER) (CDR POINTER)) (CREATE (CREATECELL \LISTP)) (* FOLLOWING ARE CDR-CODE FIELDS) (BLOCKRECORD LISTP ((CDRCODE BYTE) (CARFIELD XPOINTER))) [ACCESSFNS LISTP ((FULLCARFIELD NIL (\PUTBASEPTR DATUM 0 NEWVALUE] (* because replace of XPOINTER is slow, the CAR field is stored with PUTBASEPTR, even though that smashes the hi byte) ) (BLOCKRECORD CONSPAGE ((CNT BYTE) (NEXTCELL BYTE) (NEXTPAGE WORD))) ] (RPAQQ CONSCONSTANTS (\CDR.ONPAGE \CDR.NIL \CDR.INDIRECT \CDR.MAXINDIRECT \CONSPAGE.LAST)) (DECLARE: EVAL@COMPILE (RPAQQ \CDR.ONPAGE 128) (RPAQQ \CDR.NIL 128) (RPAQQ \CDR.INDIRECT 0) (RPAQQ \CDR.MAXINDIRECT 127) (RPAQQ \CONSPAGE.LAST 65535) (CONSTANTS \CDR.ONPAGE \CDR.NIL \CDR.INDIRECT \CDR.MAXINDIRECT \CONSPAGE.LAST) ) (* END EXPORTED DEFINITIONS) (DECLARE: EVAL@COMPILE (PUTPROPS .MAKECONSCELL. MACRO (OPENLAMBDA (PAGE A D) (PROG [(.MK.NEWCELL (\ADDBASE PAGE (fetch (CONSPAGE NEXTCELL) of PAGE] (CHECK (NEQ (fetch (CONSPAGE CNT) of PAGE) 0) (EVENP (fetch (CONSPAGE NEXTCELL) of PAGE))) (replace (CONSPAGE NEXTCELL) of PAGE with (fetch (LISTP CDRCODE) of .MK.NEWCELL)) (CHECK (EVENP (fetch (CONSPAGE NEXTCELL) of PAGE))) (add (fetch (CONSPAGE CNT) of PAGE) -1) (replace (LISTP FULLCARFIELD) of .MK.NEWCELL with A) (replace (LISTP CDRCODE) of .MK.NEWCELL with D) (RETURN .MK.NEWCELL)))) ) (ADDTOVAR INEWCOMS (FNS \CONS.UFN \INITCONSPAGE \NEXTCONSPAGE)) (ADDTOVAR EXPANDMACROFNS .MAKECONSCELL.) ) (* testing out CONSes) (DEFINEQ (CHECKCONSPAGES [LAMBDA NIL (* bvm: "29-Jan-85 22:51") (COND ((ZEROP CDRCODING) NIL) (T [for (CPAGE ←(create POINTER PAGE# ←(fetch DTDNEXTPAGE of \LISTPDTD))) do (COND ((NULL CPAGE) (* End of free list) (RETURN)) ((NEQ (NTYPX CPAGE) \LISTP) (* Free list not pointing at a cons page. Test is not for LISTP because LISTP is formally defined to be false for list page bases) (HELP CPAGE)) (T (SETQ CPAGE (create POINTER PAGE# ←(fetch (CONSPAGE NEXTPAGE) of CPAGE] (\MAPMDS (QUOTE LISTP) (FUNCTION \CHECKCONSPAGE]) (\CHECKCONSPAGE [LAMBDA (PN) (* bvm: "27-Jan-85 14:52") (* check if page PN is ok) (PROG ((PTR (create POINTER PAGE# ← PN)) NXT CNT) (SETQ CNT (fetch (CONSPAGE CNT) of PTR)) (!CHECK (EVENP (SETQ NXT (fetch (CONSPAGE NEXTCELL) of PTR)) WORDSPERCELL)) LP (COND ((IGREATERP CNT 0) (!CHECK (AND (NEQ NXT 0) (EVENP (SETQ NXT (fetch (LISTP CDRCODE) of (\ADDBASE PTR NXT))) WORDSPERCELL))) (add CNT -1) (GO LP))) (!CHECK (EQ NXT 0]) ) (DECLARE: DONTCOPY (DECLARE: EVAL@COMPILE (PUTPROPS !CHECK MACRO [(X) (OR X (RAID (QUOTE X]) ) ) (* other random stuff for makeinit) (DEFINEQ (MAKEINITFIRST [LAMBDA NIL (* bvm: "29-MAR-83 16:35") (CREATEMDSTYPETABLE) (INITDATATYPES) (PREINITARRAYS) (INITATOMS) (INITDATATYPENAMES) (INITUFNTABLE) (INITGC) (\NEWPAGE \InterfacePage NIL T]) (MAKEINITLAST [LAMBDA (VERSIONS) (* bvm: "14-Jan-85 14:15") (SETUPSTACK T) (MAKEINITBFS) (PROGN (* fold in property list and values gathered from boot files) [SELECTQ (SYSTEMTYPE) [(D ALTO) [LOCAL (MAPHASH MKI.PLHA (FUNCTION (LAMBDA (P A) (SETPROPLIST A (COPY P] (LOCAL (MAPHASH MKI.TVHA (FUNCTION (LAMBDA (V A) (SETTOPVAL A (COPY (LOCAL (CDR V] (PROG (AL GAG) (* the reason this is set up this way is because there is a bug in Interlisp-10 suchthat if a garbage collection happens in the middle of a MAPHASH, some of the values in the hash array may be missed because the garbage collector has moved stuff around and rehashed the data in the array. Thus we are careful to set things up so that no garbage collection happens) [ALLOCAL (PROGN [MINFS (IMAX (MINFS) (ITIMES 2 (ARRAYSIZE (CAR MKI.PLHA))) (ARRAYSIZE (CAR MKI.TVHA] (RECLAIM) (SETQ GAG (GCGAG "[***** GARBAGE COLLECTION - ERROR ******]")) [MAPHASH MKI.PLHA (FUNCTION (LAMBDA (P A) (push AL (CONS A P] (SETQ GAG (GCGAG GAG] [LOCAL (MAPC AL (FUNCTION (LAMBDA (X) (SETPROPLIST (CAR X) (COPY (CDR X] (ALLOCAL (PROGN (SETQ AL) (RECLAIM) (SETQ GAG (GCGAG GAG)) [MAPHASH MKI.TVHA (FUNCTION (LAMBDA (V A) (push AL (RPLACA V A] (GCGAG GAG))) (LOCAL (MAPC AL (FUNCTION (LAMBDA (X) (SETTOPVAL (CAR X) (COPY (CDR X] (* set most initial variables) ) (PROG ((AFL (FILEARRAYBASE))) (* put output on a double page boundary - output at least one page) [LOCAL (BOUTZEROS (IDIFFERENCE (TIMES 2 BYTESPERPAGE) (UNFOLD (IMOD (\LOLOC AFL) (TIMES 2 WORDSPERPAGE)) BYTESPERWORD] (SETQ MKI.CODELASTPAGE (PAGELOC (FILEARRAYBASE))) (* now we can update the string/array space freelist to point beyond the code area - We call POSTINITARRAYS with (a) pointer to word after end of compiled code, (b) page number of beginning of compiled code, and (c) page number after compiled code) (POSTINITARRAYS AFL (IPLUS \FirstArrayPage MKI.CODESTARTOFFSET) MKI.CODELASTPAGE)) [MAPC (ALLOCAL (APPEND INITVALUES INITPTRS)) (FUNCTION (LAMBDA (X) (* make sure atoms exist for initial atoms) (\ATOMVALINDEX (LOCAL (CAR X] [for X in INITVALUES as A in MKI.VALUES do (SETQ A (LOCAL (EVALV A))) (SETTOPVAL (LOCAL (CAR X)) (COND ([ALLOCAL (OR (EQ A T) (EQ A NIL) (AND (FIXP A) (IGEQ A -200000Q) (ILEQ A 177777Q] (COPY A)) (T (SHOULDNT] [for X in INITPTRS as A in MKI.PTRS do (SETTOPVAL (LOCAL (CAR X)) (LOCAL (EVALV A] (for X in LOCKEDVARS do (OR (GETHASH X MKI.ATOMARRAY) (printout T "***Note: Locked var " X " does not exist" T)) (\LOCKVAR X)) (SETUPPAGEMAP) (DUMPINITPAGES (IPLUS \FirstArrayPage MKI.CODESTARTOFFSET) MKI.CODELASTPAGE VERSIONS]) (\COPY [LAMBDA (X) (* lmm " 2-NOV-81 18:22") (* Prints X into the MAKEINIT / READSYS system) (SELECTQ (LOCAL (TYPENAME X)) (LITATOM (UNLESSRDSYS (MKI.ATOM X) (VATOMNUMBER X T))) (LISTP (PROG [(R (LOCAL (REVERSE X))) (V (\COPY (LOCAL (CDR (LOCAL (LAST X] LP (COND ((LOCAL (LISTP R)) (SETQ V (CONS (\COPY (LOCAL (CAR R))) V)) (SETQ R (LOCAL (CDR R))) (GO LP))) (RETURN V))) ((FIXP SMALLP) (PROG (V) [COND [(LOCAL (IGREATERP 0 X)) (* negative) (COND ((LOCAL (IGREATERP X -65537)) (* small neg) (RETURN (\ADDBASE \SMALLNEGSPACE (LOCAL (LOGAND X 65535] ((LOCAL (ILESSP X 65536)) (* small pos) (RETURN (\ADDBASE \SMALLPOSPSPACE X] (* need to create a boxed integer) (SETQ V (CREATECELL \FIXP)) (\PUTBASE V 0 (LOGOR (COND ((IGREATERP 0 X) 32768) (T 0)) (LOGAND (LRSH X 16) 32767))) (\PUTBASE V 1 (LOGAND X 65535)) (RETURN V))) (STRINGP (COPYSTRING X)) (FLOATP (PROG ((VAL (CREATECELL \FLOATP))) (SELECTQ (SYSTEMTYPE) [(ALTO D) (\PUTBASE VAL 0 (LOCAL (\GETBASE X 0))) (\PUTBASE VAL 1 (LOCAL (\GETBASE X 1] (MKI.IEEE X VAL)) (RETURN VAL))) (ERROR X (QUOTE (can't be copied to remote file]) (\UNCOPY [LAMBDA (X) (* bvm: "15-Feb-85 18:02") (SELECTC (NTYPX X) [\SMALLP (COND ((EQ (\HILOC X) \SmallPosHi) (* This test used to be SMALLPOSP until its definition changed to test (IGREATERP X 0), which doesn't work renamed) (\LOLOC X)) (T (IPLUS (\LOLOC X) -65536] (\FIXP (* INTEGER) (IPLUS (LLSH (\GETBASE X 0) 16) (\GETBASE X 1))) (\LITATOM (VATOM (\LOLOC X))) (\STRINGP (PROG ((PTR (ffetch (STRINGP BASE) of X)) (OFFST (ffetch (STRINGP OFFST) of X)) (LENGTH (ffetch (STRINGP LENGTH) of X)) (I 1) STR) (* Use ffetch to avoid bogus DTEST's in the renamed version) (SETQ STR (ALLOCSTRING LENGTH)) (FRPTQ LENGTH [LOCAL (RPLSTRING STR I (LOCAL (FCHARACTER (\GETBASEBYTE PTR OFFST] (add I 1) (add OFFST 1)) (RETURN STR))) [\LISTP (COND [(LISTP X) (LOCAL (CONS (\UNCOPY (CAR X)) (\UNCOPY (CDR X] (T (* Redundant test in case is list page header) (LOCAL (VTYPEDPOINTER (QUOTE LISTP) X] (0 (LOCAL (VTYPEDPOINTER NIL X))) (LOCAL (VTYPEDPOINTER (TYPENAME X) X]) ) (DECLARE: DONTCOPY (* FOLLOWING DEFINITIONS EXPORTED) (DECLARE: EVAL@COMPILE (PUTPROPS LOCAL MACRO ((X) X)) (PUTPROPS ALLOCAL MACRO ((X) X)) ) (* END EXPORTED DEFINITIONS) (ADDTOVAR MKI.SUBFNS (CHECK . *) (RAID . HELP) (UNINTERRUPTABLY . PROGN) (\StatsAdd1 . *) (EVQ . I.\COPY) (COPY . I.\COPY)) (ADDTOVAR RD.SUBFNS (CHECK . *) (RAID . HELP) (UNINTERRUPTABLY . PROGN) (\StatsAdd1 . *) (EVQ . V\COPY) (COPY . V\COPY) (1ST . V\UNCOPY)) (ADDTOVAR INEWCOMS (FNS MAKEINITFIRST \COPY MAKEINITLAST)) EVAL@COMPILE (ADDTOVAR DONTCOMPILEFNS MAKEINITFIRST \COPY MAKEINITLAST \UNCOPY) ) (DECLARE: DOEVAL@COMPILE DONTCOPY (LOCALVARS) ) (PUTPROPS LLNEW COPYRIGHT ("Xerox Corporation" 1981 1982 1983 1984 1985)) (DECLARE: DONTCOPY (FILEMAP (NIL (3770 9702 (\ADDBASE 3780 . 4494) (\GETBASE 4496 . 4733) (\PUTBASE 4735 . 5000) ( \PUTBASE.UFN 5002 . 5271) (\PUTBASEPTR.UFN 5273 . 5584) (\PUTBITS.UFN 5586 . 6131) (\GETBASEBYTE 6133 . 6631) (\PUTBASEBYTE 6633 . 7276) (\GETBASEPTR 7278 . 7610) (\PUTBASEPTR 7612 . 7919) (\HILOC 7921 . 8089) (\LOLOC 8091 . 8259) (\VAG2 8261 . 8620) (EQ 8622 . 8784) (\RPLPTR 8786 . 9160) (\RPLPTR.UFN 9162 . 9700)) (9703 10292 (LOC 9713 . 9980) (VAG 9982 . 10290)) (10293 10994 (CREATEPAGES 10303 . 10755) (\NEW4PAGE 10757 . 10992)) (14052 24761 (CONS 14062 . 14304) (\CONS.UFN 14306 . 15595) (CAR 15597 . 15724) (\CAR.UFN 15726 . 16639) (CDR 16641 . 16768) (\CDR.UFN 16770 . 17905) (RPLACA 17907 . 18130) (\RPLACA.UFN 18132 . 18825) (RPLACD 18827 . 18962) (\RPLACD.UFN 18964 . 21423) (DOCOLLECT 21425 . 21641) (\RPLCONS 21643 . 22943) (ENDCOLLECT 22945 . 23103) (\INITCONSPAGE 23105 . 23813) ( \NEXTCONSPAGE 23815 . 24759)) (26987 28501 (CHECKCONSPAGES 26997 . 27773) (\CHECKCONSPAGE 27775 . 28499)) (28665 36011 (MAKEINITFIRST 28675 . 28959) (MAKEINITLAST 28961 . 32727) (\COPY 32729 . 34397) (\UNCOPY 34399 . 36009))))) STOP