Notes on the Lisp Machine

Notes on the Lisp Machine

Table of Contents

1 Lisp Machine Glossary

2 Random Compiler Notes

Overal working of QC:

3 Serial SPY protocol notes

Serial SPY protocol (values are octal, as usual):

<ADDRESS>/		Read from address ADDRESS, used by DBG-READ.
<ADDRESS>:<VALUE>:	Write value VALUE to address ADDRESS, used by DBG-WRITE.
R			Read status, returns a octal number.
<N>S			Manipulates some kind of high serial bit.
<N>A			Set the baud rate of the UART, where N is one of:

	0: 50. baud
	1: 75. baud
	2: 110. baud
	4: 150. baud
	5: 300. baud
	6: 600. baud
	7: 1200. baud
	10: 1800. baud
	11: 2000. baud
	12: 2400. baud
	13: 3600. baud
	14: 4800. baud
	15: 7200. baud
	16: 9600. baud
	17: 19200. baud

<LOW>L<MIDDLE>M<HIGH>H1I	CC-EXECUTE-R
<LOW>L<MIDDLE>M<HIGH>H7I	CC-EXECUTE-W
<LOW>L<MIDDLE>M<HIGH>H0I	CC-EXECUTE-LOAD-DEBUG-IR

Error code:

#o7	ERRONEOUS COMMAND RECEIVED BY DEBUGGER
#o10	DEBUGGER GOT PARITY ERROR, RESETTING DEBUGGER; when getting this we type out #o33
o15	Nothing.

4 Notes on debugging in usim

4.1 Macrocode debug tracing

When tracing, the macro disassembler prints out the PC, this can be used to figure out where in the LOD:

        00012140044 054010 BR-NOT-NIL 12140055
        00012140046 040206 CALL D-PDL FEF|134
        00012140050 076060 PUSH-NUMBER 48
        00012140052 042143 MOVE D-PDL FEF|99
        00012140054 055324 (MISC) LENGTH D-PDL

E.g, for a load band from System 99:

   $ ~/l/usim/lod -p 00012140052 LOD
   %SYS-COM-AREA-ORIGIN-PNTR: 00000000400 03200004000 (0x1a000800)
   %SYS-COM-BAND-FORMAT: 00000000410 01200000000 (0x0a000000)
   %SYS-COM-POINTER-WIDTH: 00000000432 01200000031 (0x0a000019)
   %SYS-COM-MAJOR-VERSION: 00000000427 00600000000 (0x06000000)
   %SYS-COM-DESIRED-MICROCODE-VERSION: 00000000430 00600000000 (0x06000000)

   fef @ 12140052:

   pc 12140052, addr 2430012
[...]
    30602143675 31001656007 (0xc8075c07) 'LISP-REINITIALIZE'
   00002427411 31200400001 (0xca020001)
   00002427412 31220000000 (0xca400000)
[...]
   00002427771 23401056520 (0x9c045d50)

   00002427772 042401 MOVE D-PDL '401
   00002427772 173010 POP FEF|8
   00002427773 042160 MOVE D-PDL FEF|112
   00002427773 072403 EQ '403
   00002427774 034004 BR-NIL 2430001
   00002427774 073157 SET-NIL FEF|111
   00002427775 073156 SET-NIL FEF|110
   00002427775 073155 SET-NIL FEF|109
   00002427776 014011 BR 2430010
   00002427776 042160 MOVE D-PDL FEF|112
   00002427777 072404 EQ '404
   00002427777 034006 BR-NIL 2430006
   00002430000 075113 (MISC) %lambda-tv-quad-slot D-PDL
   00002430000 173157 POP FEF|111
   00002430001 075112 (MISC) %lambda-rg-quad-slot D-PDL
   00002430001 173156 POP FEF|110
   00002430002 075116 (MISC) %lambda-sdu-quad-slot D-PDL
   00002430002 173155 POP FEF|109
   00002430003 073154 SET-NIL FEF|108
   00002430003 073153 SET-NIL FEF|107
   00002430004 073152 SET-NIL FEF|106
   00002430004 073151 SET-NIL FEF|105
   00002430005 073150 SET-NIL FEF|104
   00002430005 073147 SET-NIL FEF|103
   00002430006 073146 SET-NIL FEF|102
   00002430006 073145 SET-NIL FEF|101
   00002430007 042205 MOVE D-PDL FEF|133
   00002430007 015576 (MISC) BOUNDP D-IGNORE
   00002430010 034002 BR-NIL 2430013
   00002430010 002144 MOVE D-IGNORE FEF|100
   00002430011 054010 BR-NOT-NIL 2430022
   00002430011 040206 CALL D-PDL FEF|134
   00002430012 076060 PUSH-NUMBER 48
   00002430012 042143 MOVE D-PDL FEF|99
   00002430013 055324 (MISC) LENGTH D-PDL
   00002430013 031777 + PDL|511 (undefined)
   00002430014 042207 MOVE D-PDL FEF|135
   00002430014 142142 MOVE D-LAST FEF|98
   00002430015 173144 POP FEF|100
[...]

5 Notes on Clock Domains in the MIT CADR (FPGA)

Notes based on the Pipistrello implementation

6 Notes on the inner Lisp Machine System 78

These variables are defined in SYS: SYS; SYSDCL LISP.

File loaded into the cold load are defined by COLD-LOAD-FILE-LIST:

        SYS: FONTS; CPTFON QFASL
        SYS: SYS; QRAND QFASL
        SYS: IO; QIO QFASL
        SYS: IO; RDTBL QFASL	-- done specially
        SYS: IO; READ QFASL
        SYS: IO; PRINT QFASL
        SYS: WINDOW; COLD QFASL
        SYS: SYS; SGFCTN QFASL
        SYS: SYS; QEV QFASL
        SYS: SYS; LTOP QFASL
        SYS: SYS; QFASL QFASL
        SYS: IO; MINI QFASL
        SYS: SYS; QFCTNS QFASL
        SYS: SYS2; STRING QFASL

When booting (cold, or warm) we call LISP-TOP-LEVEL.

When doing QLD files listed in MINI-FILE-ALIST-LIST get loaded into the running system over MINI:

        LOAD-PACKAGES-FILE-ALIST-1
                SYS: SYS; PACK4 QFASL

        GLOBAL-PACKAGE-FILE-ALIST
                SYS: SYS2; GLOBAL LISP
                SYS: SYS2; SYSTEM LISP

        LOAD-PACKAGES-FILE-ALIST-2
                SYS: SYS; PKGDCL LISP

        INNER-SYSTEM-FILE-ALIST
                SYS: SYS; QMISC QFASL
                SYS: SYS; SORT QFASL		-- Needed by FLAVOR
                SYS: SYS2; DEFSEL QFASL		-- Needed by FQUERY
                SYS: IO; FORMAT QFASL		-- ditto
                SYS: IO1; FQUERY QFASL		-- Needed by everything in sight
                SYS: SYS2; FLAVOR QFASL		-- Needed by PROCES
                SYS: SYS2; PRODEF QFASL		-- Definitions for PROCES
                SYS: SYS2; PROCES QFASL
                SYS: WINDOW; EH QFASL
                SYS: WINDOW; EHR QFASL
                SYS: WINDOW; EHC QFASL
                SYS: SYS2; DISASS QFASL		-- EH calls subroutines in DISASS
                SYS: IO; DISK QFASL
                SYS: SYS2; LOGIN QFASL		-- ditto
                SYS: IO; RDDEFS QFASL		-- Load this before trying to read any #\'s
                SYS: SYS2; HOST QFASL
                SYS: SYS2; HASH QFASL		-- Needed by PATHNM
                SYS: IO; STREAM QFASL		-- Probably needed by any file system
                -- PATHNM must be the last file in this list.  It
                -- breaks things while cold loading that QLD knows how
                -- to fix after this alist is loaded.
                SYS: IO; PATHNM QFASL

        CHAOS-FILE-ALIST
                SYS: IO; CHSNCP QFASL
                SYS: IO; CHSAUX QFASL
                SYS: IO; QFILE QFASL

        SITE-FILE-ALIST
                SYS: SYS; SITE

        HOST-TABLE-FILE-ALIST
                SYS: IO; HSTTBL
                SYS: IO; LMLOCS

Then, SYSTEM-SYSTEM-FILE-ALIST is loaded:

        SYS: SYS2; MAKSYS QFASL
        SYS: SYS2; PATCH QFASL
        SYS: SYS; SYSDCL QFASL

At this point, QLD will do MAKE-SYSTEM on SYSTEM to load the rest of the Lisp Machine system. And we are done.

7 Notes on the inner Lisp Machine System 86

These variables are defined in SYS: SYS; SYSDCL LISP.

File loaded into the cold load are defined by COLD-LOAD-FILE-LIST:

        SYS: FONTS; CPTFON QFASL
        SYS: SYS; QRAND QFASL
        SYS: IO; QIO QFASL
        SYS: IO; RDTBL QFASL	-- done specially
                RTCs fine on System 78.
        SYS: IO; READ QFASL
                QCs fine on System 78.
        SYS: IO; PRINT QFASL
        SYS: WINDOW; COLD QFASL
        SYS: SYS; SGFCTN QFASL
        SYS: SYS; QEV QFASL
        SYS: SYS; LTOP QFASL
        SYS: SYS; QFASL QFASL
        SYS: IO; MINI QFASL
        SYS: SYS; QFCTNS QFASL
        SYS: SYS2; STRING QFASL

When booting (cold, or warm) we call LISP-TOP-LEVEL.

When doing QLD files listed in MINI-FILE-ALIST-LIST get loaded into the running system over MINI:

        LOAD-PACKAGES-FILE-ALIST-1
                SYS: SYS; PACK4 QFASL

        GLOBAL-PACKAGE-FILE-ALIST
                SYS: SYS2; GLOBAL LISP
                SYS: SYS2; SYSTEM LISP

        LOAD-PACKAGES-FILE-ALIST-2
                SYS: SYS; PKGDCL LISP

        INNER-SYSTEM-FILE-ALIST
                SYS: SYS2; DEFSEL QFASL		-- By (resource si:named-structure-invoke)
                SYS: SYS2; RESOUR QFASL		-- By FILLARRAY
                SYS: SYS; QMISC QFASL
                SYS: SYS; SORT QFASL		-- Needed by FLAVOR
                SYS: IO; FORMAT QFASL		-- ditto
                SYS: IO1; FQUERY QFASL		-- Needed by everything in sight
                SYS: SYS2; HASH QFASL		-- Needed by FLAVOR,PATHNM
                SYS: SYS2; FLAVOR QFASL		-- Needed by PROCES
                SYS: SYS2; PRODEF QFASL		-- Definitions for PROCES
                SYS: SYS2; PROCES QFASL
                SYS: SYS2; NUMER QFASL		-- SI:EXPT-HARD needed by PROCES
                SYS: WINDOW; EH QFASL
                SYS: WINDOW; EHR QFASL
                SYS: WINDOW; EHC QFASL
                SYS: SYS2; DISASS QFASL		-- EH calls subroutines in DISASS
                SYS: IO; DISK QFASL
                SYS: SYS2; LOGIN QFASL		-- ditto
                SYS: IO; RDDEFS QFASL		-- Load this before trying to read any #\'s
                SYS: SYS2; HOST QFASL
                SYS: IO; STREAM QFASL		-- Probably needed by any file system
                -- PATHNM must be the last file in this list.  It
                -- breaks things while cold loading that QLD knows how
                -- to fix after this alist is loaded.
                SYS: IO; PATHNM QFASL

        REST-OF-PATHNAMES-FILE-ALIST
                SYS: IO; PATHST QFASL
                SYS: IO; OPEN QFASL

        CHAOS-FILE-ALIST
                SYS: IO; CHSNCP QFASL
                SYS: IO; CHSAUX QFASL
                SYS: IO; QFILE QFASL

        SITE-FILE-ALIST
                SYS: SITE; SITE QFASL

        HOST-TABLE-FILE-ALIST
                SYS: SITE; HSTTBL QFASL
                SYS: SITE; LMLOCS QFASL

Then, SYSTEM-SYSTEM-FILE-ALIST is loaded:

        SYS: SYS2; MAKSYS QFASL
        SYS: SYS2; PATCH QFASL
        SYS: SYS; SYSDCL QFASL

At this point, QLD will do MAKE-SYSTEM on SYSTEM to load the rest of the Lisp Machine system. And we are done.

7.1 New MISC instructions (compared against System 78)

        (DEFMIC %PERMIT-TAIL-RECURSION 306 () NIL T)
        (DEFMIC %GET-SELF-MAPPING-TABLE 506 (METHOD-FLAVOR-NAME) T)
        (DEFMIC %SET-SELF-MAPPING-TABLE 336 (MAPPING-TABLE) T)

7.2 Changes in the Read Table

The read-table only has one additional XR:

        (#/ . XR-/#/-MACRO)

From SYS: IO; READ LISP (QCs fine on System 78):

        (DEFUN XR-/#/-MACRO (LIST-SO-FAR STREAM)
          LIST-SO-FAR
          (LET* ((FLAVOR-NAME
                  (LET ((PACKAGE PKG-USER-PACKAGE)) (READ STREAM)))
                 (INSTANCE
                   (LET ((HANDLER (OR (GET FLAVOR-NAME 'READ-INSTANCE)
                                      (GET-FLAVOR-HANDLER-FOR FLAVOR-NAME ':READ-INSTANCE)))
                         (SELF NIL))
                     (FUNCALL HANDLER ':READ-INSTANCE FLAVOR-NAME STREAM)))
                 (CHAR (TYI STREAM)))
            ;; Make sure that the read-instance function read as much as it was supposed to.
            (IF (EQ CHAR #/)
                INSTANCE
              (FUNCALL STREAM ':UNTYI CHAR)
              (FERROR NIL "Malformatted #~S... encountered during READ" FLAVOR-NAME))))

8 Notes on the inner Lisp Machine System 98

These variables are defined in SYS: SYS; SYSDCL LISP.

File loaded into the cold load are defined by COLD-LOAD-FILE-LIST:

        SYS: FONTS; CPTFON QFASL
        SYS: SYS; QRAND QFASL
        SYS: IO; QIO QFASL
        SYS: IO; RDTBL QFASL	-- done specially
        SYS: IO; READ QFASL
        SYS: IO; PRINT QFASL
        SYS: WINDOW; COLD QFASL
        SYS: SYS; SGFCTN QFASL
        SYS: SYS; EVAL QFASL
        SYS: SYS; TYPES QFASL
        SYS: SYS; LTOP QFASL
        SYS: SYS; QFASL QFASL
        SYS: IO; MINI QFASL
        SYS: SYS; QFCTNS QFASL
        SYS: SYS2; STRING QFASL
        SYS: SYS; CLPACK QFASL
        SYS: SYS2; GLOBAL QFASL
        SYS: SYS2; SYSTEM QFASL

When booting (cold, or warm) we call LISP-TOP-LEVEL.

When doing QLD files listed in MINI-FILE-ALIST-LIST get loaded into the running system over MINI:

        INNER-SYSTEM-FILE-ALIST
                SYS: SYS2; DEFSEL QFASL		-- By (resource si:named-structure-invoke)
                SYS: SYS2; RESOUR QFASL		-- By FILLARRAY
                SYS: SYS; QMISC QFASL
                SYS: SYS; SORT QFASL		-- Needed by FLAVOR
                SYS: IO; FORMAT QFASL		-- ditto
                SYS: IO1; FQUERY QFASL		-- Needed by everything in sight
                SYS: SYS2; HASH QFASL		-- Needed by FLAVOR,PATHNM
                SYS: SYS2; FLAVOR QFASL		-- Needed by PROCES
                SYS: SYS2; HASHFL QFASL		-- Make flavors really work.
                SYS: SYS2; PRODEF QFASL		-- Definitions for PROCES
                SYS: SYS2; PROCES QFASL
                SYS: SYS2; NUMER QFASL		-- SI:EXPT-HARD needed by PROCES
                SYS: WINDOW; EH QFASL
                SYS: WINDOW; EHF QFASL
                SYS: WINDOW; EHC QFASL
                SYS: SYS2; DISASS QFASL		-- EH calls subroutines in DISASS
                SYS: IO; DISK QFASL
                SYS: SYS2; LOGIN QFASL		-- ditto
                SYS: IO; RDDEFS QFASL		-- Load this before trying to read any #\'s
                SYS: SYS2; HOST QFASL
                SYS: IO; STREAM QFASL		-- Probably needed by any file system
                -- PATHNM must be the last file in this list.  It
                -- breaks things while cold loading that QLD knows how
                -- to fix after this alist is loaded.
                SYS: IO; PATHNM QFASL

        REST-OF-PATHNAMES-FILE-ALIST
                SYS: IO; PATHST QFASL
                SYS: FILE2; PATHNM QFASL
                SYS: FILE; LMPARS QFASL
                SYS: IO; OPEN QFASL

        CHAOS-FILE-ALIST
                SYS: IO; CHSNCP QFASL
                SYS: IO; CHSAUX QFASL
                SYS: IO; QFILE QFASL

        SITE-FILE-ALIST
                SYS: SITE; SITE QFASL

        HOST-TABLE-FILE-ALIST
                SYS: SITE; HSTTBL QFASL
                SYS: SITE; LMLOCS QFASL

Then, SYSTEM-SYSTEM-FILE-ALIST is loaded:

                SYS: SYS2; MAKSYS QFASL
                SYS: SYS2; PATCH QFASL
                SYS: SYS; SYSDCL QFASL

At this point, QLD will do MAKE-SYSTEM on SYSTEM to load the rest of the Lisp Machine system. And we are done.

9 Notes on the inner Lisp Machine System 99 (on MIT CADR)

These variables are defined in SYS: SYS; SYSDCL LISP.

File loaded into the cold load are defined by COLD-LOAD-FILE-LIST:

        SYS: FONTS; CPTFON QFASL
        SYS: SYS; QRAND QFASL
        SYS: SYS; FSPEC QFASL
        SYS: IO; QIO QFASL
        SYS: IO; RDTBL QFASL	-- done specially
        SYS: IO; CRDTBL QFASL	-- done specially
        SYS: IO; READ QFASL
        SYS: IO; PRINT QFASL
        SYS: WINDOW; COLD QFASL
        SYS: SYS; SGFCTN QFASL
        SYS: SYS; EVAL QFASL
        SYS: SYS; TYPES QFASL
        SYS: SYS; LTOP QFASL
        SYS: SYS; QFASL QFASL
        SYS: IO; MINI QFASL
        SYS: SYS; QFCTNS QFASL
        SYS: SYS2; STRING QFASL
        SYS: SYS2; CHARACTER QFASL
        SYS: SYS; CLPACK QFASL
        SYS: COLD; GLOBAL QFASL
        SYS: COLD; SYSTEM QFASL
        SYS: COLD; LISP QFASL

When booting (cold, or warm) we call LISP-TOP-LEVEL.

When doing QLD files listed in MINI-FILE-ALIST-LIST get loaded into the running system over MINI:

        INNER-SYSTEM-FILE-ALIST
                SYS: SYS2; DEFSEL QFASL		-- By (resource named-structure-invoke)
                SYS: SYS2; RESOUR QFASL		-- By FILLARRAY
                SYS: SYS; QMISC QFASL
                SYS: SYS; SORT QFASL		-- Needed by FLAVOR
                SYS: IO; FORMAT QFASL		-- ditto
                SYS: IO1; FQUERY QFASL		-- Needed by everything in sight
                SYS: SYS2; HASH QFASL		-- Needed by FLAVOR,PATHNM
                SYS: SYS2; FLAVOR QFASL		-- Needed by PROCES
                SYS: SYS2; HASHFL QFASL		-- Make flavors really work.
                SYS: SYS2; PRODEF QFASL		-- Definitions for PROCES
                SYS: SYS2; PROCES QFASL
                SYS: SYS2; NUMER QFASL		-- SI:EXPT-HARD needed by PROCES
                SYS: EH; EH QFASL
                SYS: EH; EHF QFASL
                SYS: EH; EHC QFASL
                SYS: EH; EHBPT QFASL
                SYS: SYS2; DISASS QFASL		-- EH calls subroutines in DISASS
                SYS: SYS2; DESCRIBE QFASL	-- For hack value
                SYS: IO; DISK QFASL
                SYS: SYS2; LOGIN QFASL		-- ditto
                SYS: IO; RDDEFS QFASL		-- Load this before trying to read any #\'s
                SYS: NETWORK; HOST QFASL
                SYS: NETWORK; PACKAGE QFASL
                SYS: IO; FILE; ACCESS QFASL
                SYS: IO; STREAM QFASL		-- Probably needed by any file system
                -- PATHNM must be the last file in this list.  It
                -- breaks things while cold loading that QLD knows how
                -- to fix after this alist is loaded.
                SYS: IO; FILE; PATHNM QFASL

        REST-OF-PATHNAMES-FILE-ALIST
                SYS: IO; FILE; PATHST QFASL
                SYS: IO; FILE; LOGICAL QFASL
                SYS: FILE2; PATHNM QFASL
                SYS: FILE; LMPARS QFASL
                SYS: IO; FILE; OPEN QFASL
                SYS: NETWORK; CHAOS; CHSNCP QFASL
                SYS: NETWORK; CHAOS; CHUSE QFASL
                SYS: NETWORK; CHAOS; QFILE QFASL

        ETHERNET-FILE-ALIST
                SYS: IO; SIMPLE-ETHER QFASL
                SYS: IO; ADDR-RES QFASL

        SITE-FILE-ALIST
                SYS: SITE; SITE QFASL

        HOST-TABLE-FILE-ALIST
                SYS: SITE; HSTTBL QFASL
                SYS: SITE; LMLOCS QFASL

Then, SYSTEM-SYSTEM-FILE-ALIST is loaded:

        SYS: SYS2; MAKSYS QFASL
        SYS: SYS2; PATCH QFASL
        SYS: SYS; SYSDCL QFASL

At this point, QLD will do MAKE-SYSTEM on SYSTEM to load the rest of the Lisp Machine system. And we are done.

10 Notes on confusion or discrepancies in MIT AI Memo 528

This was written by Brad Parker, around 10/17/04.

While writing a CADR emulator I ran into some issues and/or discrepancies in the available documentation. I’ve tried to list them here.

[These are my conclusions; If you read them and disagree, please send me email and set me straight. I do not have a functional hardware description (i.e. verilog) yet, so some things are assuptions based on quick scans of the schematics]

First, let me quote from "lmdocs: popj.2", a document which I found illuminating.

POPJ-AFTER-NEXT in combination with JUMP and DISPATCH			[CONTRL]

Dispatch	R	P	N	PC	SPC	NOP
                0	0	0	jump	pop	no
                0	0	1	jump	pop	yes
                0	1	0	jump	push	no
                0	1	1	jump	push	yes
                1	0	0	popj	pop	no
                1	0	1	popj	pop	yes
                1	1	0	popj	pop	no
                1	1	1	popj	pop	yes

Jump		R	P	N	PC	SPC	NOP
(cond		0	0	0	jump	pop	no
 satisfied)	0	0	1	jump	pop	yes
                0	1	0	jump	push	no
                0	1	1	jump	push	yes
                1	0	0	popj	pop	no
                1	0	1	popj	pop	yes
                1	1	0	iwrite
                1	1	1	iwrite

Jump with condition not satisfied is similar to ALU and BYTE instructions.

Possible mods to increase usefulness:

A dispatch-call or jump-call in combination with popj-after-next should neither popj nor pushj but just jump. If it’s xct-next the right thing happens. If the next instruction is inhibited, well that’s OK. However, if the next instruction is not inhibited, and it’s a CALL, normally (without the previous call) would be like tail recursive, but here will end up with two return addresses on pdl, however, the top one is the address of the place called in the first instruction and the one under that is the original return so that’s right too.

Dispatch example - POPJ+DISPATCH, enumerating cases

001 LABEL	(CHECK-PAGE-READ)
002	(POPJ-AFTER-NEXT DISPATCH TRANSPORT READ-MEMORY-DATA) ;FOLLOW ALL INVZ
003       ((M-T) Q-TYPED-POINTER READ-MEMORY-DATA)	;RETURN C(E) IN M-T
004
005
dispatch yields N=0,P=0,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   new pc<- dispatch address
   (disable popj)
- exec alu                              fetch new pc (dispatch address)

dispatch yields N=0,P=0,R=1

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   new pc <- spc[spc-ptr--]
   (disable popj)
- exec alu                              fetch new pc (from stack)

dispatch yields N=0,P=1,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   spc[++spc-ptr] <- 004
   new pc <- dispatch address
   (disable popj)
- exec alu                              fetch new pc (dispatch address)

dispatch yields N=0,P=1,R=1

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   ignore dispatch, do popj
   new pc <- spc[spc-ptr--]
   if pc14, advance-lc
- exec alu                              fetch new pc

dispatch yields N=1,P=0,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   new pc<- dispatch address
   (disable popj)
- (nop - pipe flush)                    fetch new pc

dispatch yields N=1,P=0,R=1

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   new pc <- spc[spc-ptr--]
   if pc14, advance-lc
   (disable popj)
- (nop - pipe flush)                    fetch new pc

dispatch yields N=1,P=1,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/alu
   spc[++spc-ptr] <- 005
   new pc <- dispatch address
   (disable popj)
- exec alu                              fetch new pc

Another Dispatch example - POPJ+DISPATCH with CALL, enumerating cases

001 LABEL	(CHECK-PAGE-READ)
002	(POPJ-AFTER-NEXT DISPATCH TRANSPORT READ-MEMORY-DATA) ;FOLLOW ALL INVZ
003     (CALL-XCT-NEXT FUNC)
004
005
dispatch yields N=0,P=0,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   new pc<- dispatch address
   (disable popj)
- exec call                             fetch new pc (dispatch address)
   spc[++spc-ptr] <- new pc+1
   new pc<- call address
- exec 1st inst @ dispatch address	fetch call address
- exec 1st inst @ call address

[help! I'm confused here. I don't think the action above is correct.
When the call returns it will return to new pc + 1...]

dispatch yields N=0,P=0,R=1

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   new pc <- spc[spc-ptr--]
   (disable popj)
- exec call                             fetch new pc (from stack)
   spc[++spc-ptr] <- new pc+1
   new pc<- call address
- exec 1st inst @ new pc		fetch call address
- exec 1st inst @ call address

[again; I don't think the action above is correct.  When the call
returns it will return to new pc + 1...]

dispatch yields N=0,P=1,R=0a

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   spc[++spc-ptr] <- 004
   new pc <- dispatch address
   (disable popj)
- exec call                             fetch new pc (dispatch address)
   spc[++spc-ptr] <- new pc+1
   new pc<- call address
- exec 1st inst @ dispatch address	fetch call address
- exec 1st inst @ call address

dispatch yields N=0,P=1,R=1

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   ignore dispatch, do popj
   new pc <- spc[spc-ptr--]
   if pc14, advance-lc
- exec call                             fetch new pc (from stack)
   spc[++spc-ptr] <- new pc+1
   new pc<- call address
- exec 1st inst @ new pc		fetch call address
- exec 1st inst @ call address

dispatch yields N=1,P=0,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   new pc<- dispatch address
   (disable popj)
- (nop - pipe flush)                    fetch new pc (dispatch address)
- exec 1st inst @ new pc		fetch new pc+1

dispatch yields N=1,P=0,R=1

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   new pc <- spc[spc-ptr--]
   if pc14, advance-lc
   (disable popj)
- (nop - pipe flush)                    fetch new pc (from stack)
- exec 1st inst @ new pc		fetch new pc+1

dispatch yields N=1,P=1,R=0

- exec check-page-read jump		fetch 002/popj
- exec popj + dispatch			fetch 003/call
   spc[++spc-ptr] <- 005
   new pc <- dispatch address
   (disable popj)
- exec call                             fetch new pc (dispatch address)
   spc[++spc-ptr] <- dispatch address+1
   new pc<- call address
- exec 1st inst @ new pc		fetch call address
- exec 1st inst @ call address

Another Dispatch example - with CALL, enumerating cases

001	(NOP)
002	(DISPATCH TRANSPORT READ-MEMORY-DATA) ;FOLLOW ALL INVZ
003     (CALL FUNC)
004
005
dispatch yields N=0,P=0,R=0

- exec check-page-read jump		fetch 002/dispatch
- exec dispatch				fetch 003/call
   new pc <- dispatch address
- exec call w/n-bit			fetch new pc (dispatch address)
   spc[++spc-ptr] <- new pc+1
   new pc<- call address
- (nop - pipe flush)			fetch call address
- exec 1nd inst @ call address

The call pushes the dispatch address + 1 and the pipe stalls because the call has the N bit set, followed by the 1st instruction at the call address.

11 TAGS database

For creating a TAGS database that also contains DEFMETHOD mixins for :BEFORE or :AFTER, one can pass the following to etags:

    -r "/(defmethod ([A-Z-_ \t(]+\(:BEFORE\|:AFTER\)?[ \t]+:\([A-Z-]+\)/\2/i"

12 CADR HDL Internals

*** TO BE WRITTEN ***

13 Internal Implementation Stuff (Lisp Machine chapter)

The following chapters are intended to be merged into the Lisp Machine Manual when they have been written.

13.1 Bootstrap loading

*** TO BE WRITTEN ***

13.2 Lisp Machine Storage

This section describes the format in which objects are stored in the Lisp Machine.

*** TO BE WRITTEN ***
	----------------------------------------------------------------
	| 2 |1|    5    |                    24                        |
	----------------------------------------------------------------
          |  |       |                          |
CDR CODE--|  |       |                          |
USER CONTROL-|       |                          |
                     |                          |
DATA TYPE------------|                          |
POINTER-----------------------------------------|

13.2.1 DTP-TRAP

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.2 DTP-NULL

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.3 DTP-FREE

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.4 DTP-SYMBOL

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.5 DTP-SYMBOL-HEADER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.6 DTP-FIX

	----------------------------------------------------------------
	|                              24                              |
	----------------------------------------------------------------
                                        |
                                        |
                                        |
                                        |
                                        |
VALUE OF FIXNUM-------------------------|

13.2.7 DTP-EXTENDED-NUMBER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.8 DTP-HEADER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.9 DTP-GC-FORWARD

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.10 DTP-EXTERNAL-VALUE-CELL-POINTER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.11 DTP-ONE-Q-FORWARD

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.12 DTP-HEADER-FORWARD

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.13 DTP-BODY-FORWARD

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.14 DTP-LOCATIVE

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.15 DTP-LIST

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.16 DTP-U-ENTRY

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.17 DTP-FEF-POINTER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.18 DTP-ARRAY-POINTER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.19 DTP-ARRAY-HEADER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.20 DTP-STACK-GROUP

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.21 DTP-CLOSURE

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.22 DTP-SMALL-FLONUM

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.23 DTP-SELECT-METHOD

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.24 DTP-INSTANCE

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.25 DTP-INSTANCE-HEADER

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.26 DTP-ENTITY

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.2.27 DTP-STACK-CLOSURE

	----------------------------------------------------------------
	|                                                              |
	----------------------------------------------------------------

13.3 Areas and Regions

13.4 The Lisp Machine Macro-instruction Set

This section describes the Lisp Machine’s interpreted order code, referred to below as "macrocode." The macrocode is designed to be highly bit-efficient, and well-suited to Lisp. The compilation of Lisp into macrocode is very straightforward, as will be shown in examples below.

*** TO BE WRITTEN ***

13.5 QFASL format

*** TO BE WRITTEN ***
[When written, move this under “Analyzing QFASL Files”]

13.6 Paging internals

*** TO BE WRITTEN ***
[When written, move this under “The Paging System”]

14 Right way to create a clean load band

29-Oct-83 11:21:24-CDT,1900;000000000000
Return-Path: <@MIT-MC:rsl@SPA-NIMBUS>
Received: from MIT-MC by UTEXAS-20.ARPA with TCP; Tue 25 Oct 83 15:19:04-CDT
Received: from SPA-RUSSIAN by SPA-Nimbus with CHAOS; Tue 25-Oct-83 13:24:02-PST
Date: Tuesday, 25 October 1983, 13:23-PST
From: Richard Lamson <rsl at SPA-NIMBUS>
Subject: pathname defaulting
To: Jonathan Slocum <LRC.Slocum at UTEXAS-20 at mc>,
    cmp.cohen at UTEXAS-20 at mc, HOSS at SCRC-TENEX
Cc: slug at UTEXAS-20 at mc
In-reply-to: The message of 25 Oct 83 07:42-PST from Jonathan Slocum <LRC.Slocum at UTEXAS-20>

    Date: Tue 25 Oct 83 10:42:44-CDT
    From: Jonathan Slocum <LRC.Slocum@UTEXAS-20.ARPA>
 ....
    What do you think -- is this a bug, or a feature?  The way things are arranged
    now, it is not safe to reconfigure a configured band that one has used the
    editor in [for example], since all sorts of old pathnames start getting saved
    away for future use.  Beware...

As documented in the Lisp Machine manual on page 424, the "right" way to
create a world is to do as little as possible in it before saving it.
That is, you should not use the editor, the File System Editor, Peek,
etc.  Please read the last paragraph on that page for (slightly)
incorrect information but sound advice.

You should do something which looks like this:

   <cold boot>
   (login "whoever" T)	; don't load an init file -- makes your world dirtier
   (make-system ...)	; load whatever things you want in your world
or (load ...)		; repeat for each file you want loaded
   (si:update-site-configuration-info)
                        ; only if the site information has changed
   (si:full-gc)		; optional -- makes the world somewhat smaller.
   (disk-save ...)	; save it away

Although it says to use the function PRINT-DISK-LABEL, I try to do that
before cold booting, so even the little garbage that function generates
is not present in the saved world.