See the “Debugger Commands” in the manual for more details.
To enter debugger from an already running program hit M-BREAK
(BREAK is bound to PgDn by default in usim).
C-b (and the more verbose M-b) show the back trace.
C-n and C-p can be used to navigate the back trace.
M-l will dump the current function in disassembled form.w
C-c and M-c will try and continue from the current frame.
C-e will open the file the function is associated with.
C-r will return a value from the current frame.
M-C-r will re-run the current frame with the same arguments.
General information about using the debugger
You are in the debugger. If you don't want to debug this error, type <ABORT>.
Otherwise you can evaluate expressions in the context of the error, examine
the stack, and proceed//throw//return to recover.
If you type in a Lisp form, it will be evaluated, and the results printed,
using *READTABLE* and base *READ-BASE* in package *PACKAGE*. This
evaluation uses the variable environment of the stack frame you are examining.
Type <ABORT> or c-Z to get back to top level, or the previous debugger level.
While in the debugger, c-G quits back to the debugger top level.
If you think this error indicates a bug in the Lisp machine system, use the
Control-M command.
Various ways of obtaining information about the current stack frame
c-L or <CLEAR SCREEN> clears screen and retypes error message.
m-L clears screen and types args, locals and compiled code.
c-B gives a backtrace of function names.
c-m-B gives a backtrace of function names and argument names and values.
m-B is line c-B but shows EVALs, PROGs, CONDs, etc.
c-m-A prints an argument to the current function, and sets * to be that
argument to let you do more complicated things with it.
+ is set to a locative to that argument, should you want to modify it.
To specify which argument, type the argument number with Control
or Meta held down before the c-m-A.
c-m-L is like c-m-A but works on the function's locals rather than the args.
c-m-V is like c-m-A but works on the values this frame is returning.
(This is useful when you get a trap on exit from function).
c-m-F does likewise for the function itself.
c-A prints the arglist of the function in the current frame.
m-S prints the value in this frame of a special variable you specify.
c-m-S lists all special variable bindings in this frame.
Use the functions (EH-ARG n), (EH-LOC n), (EH-VAL n) and (EH-FUN) to get the
value of an arg, local, value or function-object respectively from an
expression being evaluated. For args and locals, n can be a name or a number.
EH-VAL allows numbers only. LOCF and SETF on those expressions are also allowed.
Selecting Stack Frames to examine
c-N or <LINE> goes down a frame, c-P or <RETURN> goes up.
m-N and m-P are similar but show args, locals and compiled code.
c-m-N and c-m-P are similar to c-N and c-P, but they show
all the internal EVALs, PROGs, CONDs, etc. of interpreted code,
and function calls whose args are still being computed.
m-< and m-> go to the top and bottom of the stack, respectively.
c-S reads a string and searches down the stack for a frame
calling a function whose name contains that substring.
Stepping though through the program
c-X toggles the trap-on-exit flag for the current frame.
m-X sets the trap-on-exit flag for the current frame and all outer frames.
c-m-X clears this flag for the current frame and all outer frames.
Trap on exit also occurs if the frame is thrown through.
c-D proceeds like <resume>, but first sets the trap-on-next-function-call flag.
m-D toggles the trap-on-next-function-call flag.
Functions which get a trap on entry are automatically flagged for
trap on exit as well. You can un-flag them with c-X.
Proceeding from this error and resuming execution
c-Z aborts to previous debugger or other command loop, or to top level.
c-R returns a value or values from the current frame.
c-m-R offers to reinvoke the current frame with the same arguments
originally supplied (as best as they can be determined).
m-R offers to reinvoke the current frame, letting you alter
some of the arguments, or use more or fewer arguments.
c-T throws to a specific tag.
Transferring to other systems: Edit, Bug report, Window-based Debugger
c-E calls the editor to edit the current function.
c-M enters the editor to send a bug message, and puts the error
message and a backtrace into the message automatically.
A numeric argument says how many stack frames to put in the backtrace.
c-m-W switches to the window-based debugger.
The 'Resume' (or 'Control-C') command is often synonymous with 'Super-A'. But 'Resume' only proceeds, never aborts. If there is no way to proceed, just ways to abort, then 'Resume' does not do anything. 'Meta-C' is similar to 'Control-C', but in the case of an unbound variable or undefined function, actually 'setq's the variable or defines the function, so that the error will not happen again. 'Control-C' (or 'Resume') provides a replacement value but does not actually change the variable. 'Meta-C' proceeds using the proceed type ':store-new-value', and is available only if that proceed type is provided.
The System 78.48 distribution band has the following site configuration:
;;; -*- Mode: LISP; Package: SI; Base: 8 -*-
(DEFCONST LISPM-SYS-PATHNAME-TRANSLATIONS
'(("CC" ">LMCONS>")
("CHAOS" ">CHAOS>")
("DEMO" ">LMDEMO>")
("DISTRIBUTION" ">DISTRIBUTION>")
("FONTS" ">LMFONTS>")
("IO" ">LMIO>")
("IO1" ">LMIO1>")
("LMFS" ">LMFS>")
("LMSYM" ">LMSYM>")
("LMTAPE" ">LMTAPE>")
("PATCH" ">LMPAT>")
("PRESS-FONTS" ">FONTS>")
("SITE" ">LMSITE>")
("SYS" ">LISPM>")
("SYS2" ">LISPM2>")
("UBIN" ">LISPM1>")
("UCADR" ">LCADR>")
("WINDOW" ">LMWIN>")
("ZMAIL" ">ZMAIL>")
("ZWEI" ">ZWEI>")))
(DEFSITE :DISTRIBUTION
(:SITE-PRETTY-NAME "Distribution")
(:SYS-HOST "DISTRIBUTION-LM1")
(:SYS-DIRECTORY-TRANSLATIONS LISPM-SYS-PATHNAME-TRANSLATIONS)
(:CHAOS T)
(:TIMEZONE 5)
(:ESC-F-ARG-ALIST '((NIL . :LOGIN)
(1 . :LISP-MACHINES)
(0 . :READ)))
)
There seems to be no host table configured
(SI:MACHINE-LOCATION-ALIST is NIL). When doing
SETUP-MY-ADDRESS, if we fail to get a host address from
GET-HOST-FROM-ADDRESS we will make a unnamed host and put it
into SI:HOST-ALIST. At that point, SI:HOST-ALIST will
contain:
(("UNKNOWN" #<LISPM-CHAOS-HOST UNKNOWN> NIL LISPM DISTRIBUTION CHAOS (401)))
The function PRESET-FOR-DISTRIBUTION (see DISTRIBUTION;
DIST LISP – Slimebolix) is used to setup a cold loaded system for
distribution. This NILs HOST-ALIST, initailizes
MACHINE-LOCATION-ALIST and cleans up some extra things. It
also creates a new HOSTS TEXT file that contains
DISTRIBUTION-LM1, copies
LOCAL:>DISTRIBUTION>DISTRIBUTION>SITE.LISP etc to SITE;
SITE LISP, etc. The function assumes that the following files
exists, it also overwrites whatever is in LOCAL:>LMSITE:
LOCAL:>DISTRIBUTION>DISTRIBUTION>SITE.LISP LOCAL:>DISTRIBUTION>DISTRIBUTION>HOSTS.TEXT ;This is created by the fucntion. LOCAL:>DISTRIBUTION>DISTRIBUTION>LMLOCS.LISP
CANON that is being refered in the Slimebolix DIST LISP is a
system for "Canon LBP software".
In System 222 the scheme is slightly different, and handled during
COLD initialization. The function
SI:SAVE-FOR-DISTRIBUTION is called which sets up so that the
band will clear any site specific information on COLD
initialization.
SI:SAVE-FOR-DISTRIBUTION
Saves the current environment as a distribution world load; this is
how distribution world loads are created. It prints the disk label,
prompts you for the name of partition, and does a DISK-SAVE into that
partition. As is usual with DISK-SAVE, when it is finished, the saved
environment is restored, and so when SI:SAVE-FOR-DISTRIBUTION is
finished, the machine is in a distribution world load environment.
Overal working of QC:
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>H0I CC-EXECUTE-LOAD-DEBUG-IR <LOW>L<MIDDLE>M<HIGH>H1I CC-EXECUTE-R <LOW>L<MIDDLE>M<HIGH>H7I CC-EXECUTE-W
Error code:
#o7 ERRONEOUS COMMAND RECEIVED BY DEBUGGER #o10 DEBUGGER GOT PARITY ERROR, RESETTING DEBUGGER; when getting this we type out #o33 #o15 Nothing.
;;; The following are the active locations: ;;; 766100 Reads or writes the debuggee-Unibus location addressed by the registers below. ;;; 766114 (Write only) Contains bits 1-16 of the debuggee-Unibus address ;;; to be accessed. Bit 0 of the address is always zero. ;;; 766110 (Write only) Contains additional modifier bits, as follows. ;;; These bits are reset to zero when the debuggee's Unibus is reset. ;;; 1 Bit 17 of the debuggee-Unibus address. ;;; 2 Resets the debuggee's Unibus and bus interface. Write a 1 here then write a 0. ;;; 4 Timeout inhibit. This turns off the NXM timeout for all Xbus and Unibus cycles ;;; done by the debuggee's bus interface (not just those by the debugger). ;;; 766104 (Read only) These contain the status for bus cycles executed on the debuggee's ;;; busses. These bits are cleared by writing into location 766044 (Error Status) ;;; on the debuggee's Unibus. They are not cleared by power up. ;;; 1 Xbus NXM Error. Set when an Xbus cycle times out for lack of response. ;;; 2 Xbus Parity Error. Set when an Xbus read receives a word with bad parity, ;;; and the Xbus ignore-parity line was not asserted. Parity Error is also set ;;; by Xbus NXM Error. ;;; 4 CADR Address Parity Error. Set when an address received from the processor ;;; has bad parity. ;;; 10 Unibus NXM Error. Set when a Unibus cycle times out for lack of response. ;;; 20 CADR Parity Error. Set when data received from the processor has bad parity. ;;; 40 Unibus Map Error. Set when an attempt to perform an Xbus cycle through the ;;; Unibus map is refused because the map specifies invalid or write-protected. ;;; The remaining bits are random (not necessarily zero).
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
[...]
Notes based on the Pipistrello implementation
This is also used by ram_controller_BOARD for driving the MIG.
Drives ram_controller_BOARD and support_BOARD modules.
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.
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]
Here’s an interesting quote:
;NOTE THAT THE LC HARDWARE IGNORES THE LOW BIT
;AND READS IT BACK AS ZERO IN HALFWORD MODE
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.
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"
The following chapters are intended to be merged into the Lisp Machine Manual when they have been written.
This section describes the format in which objects are stored in the Lisp Machine.
----------------------------------------------------------------
| 2 |1| 5 | 24 |
----------------------------------------------------------------
| | | |
CDR CODE--| | | |
USER CONTROL-| | |
| |
DATA TYPE------------| |
POINTER-----------------------------------------|
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
----------------------------------------------------------------
| 24 |
----------------------------------------------------------------
|
|
|
|
|
VALUE OF FIXNUM-------------------------|
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
---------------------------------------------------------------- | | ----------------------------------------------------------------
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.
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.
Load the local file system:
(MAKE-SYSTEM 'LOCAL-FILE)
If doing this is the first time (this only needs to be done once):
SI:EDIT-DISK-LABEL.
(FS:INITIALIZE-FILE-SYSTEM)
(FS:BOOT-FILE-SYSTEM), good to do; but shouldn’t be needed.
Good idea to do DISK-SAVE at this point.
To create a directory, e.g., your home directory:
(CREATE-DIRECTORY "LM:AMS;")
To edit your Lisp Machine login file:
(ed "LM:AMS;LISPM.INIT"
Start DIRED in the root directory:
(dired "LM:<>") ;
See the Lisp Machine Manual for more file system operations.
The file SYS:FILE;FSDOC TEXT documents some aspects of the local file system.
Lisp Machine file name syntax (from FSDOC.TEXT):
HOST: DEVICE: DIRECTORY; FILENAME.TYPE#VERSION
The DEVICE field has no meaning. The DIRECTORY field is actually
[DIRECTORY[.SUBDIRECTORY[.SUBDIRECTORY[...]]]]
The order of the fields is not important:
"LM: DLA; FOO.LISP" "LM: DLA; FOO#<" "DLA;.LISP" "#4" ".LISP FOO DLA;#4 LM:"
The host LM always refers to the Local Machine.
VERSION can be one of the following tokens:
> Newest. Same meaning as ITS.
< Oldest. Same meaning as ITS.
0 Newest. On output, this will not create a new file if one already
exists, rather, it will overwrite the existing newest version.
* Wild. Same meaning as ITS.
(absent) Unspecific. This is the same as > unless there are wildcard characters
elsewhere in the name and type. In that case, it is identical to *.
n or +n Refers to a specific version, as on ITS.
-n Refers to the version NEWEST minus n.
To copy files use the COPY-FILE function.
;; Copy lispm.init from host to LispM. (copy-file "oz://home//ams//lispm.init" "lm:ams;lispm.init") ;; Copies all files in LM:AMS; to OZ:/tmp. (copy-file "lm:ams;*.*#*" "oz://tmp")
If modifying the following (anything under DEFS in SYSTEM-INTERNALS):
Recompile everything. To incrementally test this do:
(RECOMPILE-COLD-LOAD-FILES)
Make a new COLD load band, and check that everything works.
(RECOMPILE-MINI-FILES)
See if the system loads.
(NEW-SYSTEM T)
And then MAKE-COLD, QLD, DISK-SAVE.
If just modifying some of the cold load files, or MINI file
(CHECK-COLD-LOAD-FILES)
or
(CHECK-MINI-FILES)
as suitable.
GAB
AKR Alex Krymm
ALR Andrew L. Ressler
DULCEY Mark J. Dulcey
ELISHA Elisha Sacks
FILECOMPUTER
HDT Howard D. Trachtman
JGB Jonathan G. Bliss
LISPM A Default User
LMFILE Use by @code{FILE-COMPUTER} as a default user.
MLY Richard Mlynarik
MUSE Tom Cloney
PGS Patrick G. Sobalvarro
RAMESH Ramesh S. Patil
RLK Robert L. Krawitz
RMS Richard M. Stallman
RPK Robert P. Krajewski
STRAZ Steve Strassmann
SUNDAR Sundar Narasimhan
TIM Tim McNerney
ADS Sathya D.Narayanan
KAB Kim A. Barrett
PHILIP Philippe Brou
RG Richard Greenblatt
SAZ David M. J. Saslav
HIC Howard I. Cannon
TAFT Jonathan D. Taft