-
Notifications
You must be signed in to change notification settings - Fork 4
Clone of https://gitorious.org/lisp-1-5/lisp-1-5 Informatimago's Machine Readable Transcription of the LISP 1.5 (1962) Sources
informatimago/lisp-1-5
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Content-Type: text/plain; charset=iso-8859-1
LISP1.5 -- Millésime 1961
Here is a reproduction of the LISP1.5 card deck obtained from the
Listing 'LISP1.5-Bonnie-sBirthdayAssembly.pdf' [1].
This card deck can be assembled with asm7090-2.1.4 [2] applying the
small patch 'asm7090.patch' to get a listing as identical as possible.
asm7090 prints '0' in the generated words for symbols under different
headers, so we cannot make a complete word-for-word comparison of the
generated code from the listing, until we modify asm7090 in this
respect.
The objective is to recover a perforation for performation image of
the Source. The same columns, the same typoes should be reproduced.
Please send in patches to reduce any difference that remains to:
<pjb@informatimago.com>.
However, the following differences have been introduced to be able to
assemble the deck with asm7090, or by expendiency:
* The ID columns have not been reproduced, but please, add them and
send back a patch: they would have a historical interest as they'd
allow to track the origins and edits of the cards.
* Some tables have not been typed in, but generated automatically. See
'lisp15.lisp'. It's surprizing that they did not use this technique
at the time, but seem to have generated by hand everything... These
generated cards get an ID beginning with GENER, GPLI, and GPLA,
followed by a sequence number.
If you like, please feel free to edit these cards to match the
Listing. Note that property lists (GPLI cards) don't even ensure
the same bit pattern be generated, only the same lisp list (EQUAL).
However the number of cards, the size of the generated data and the
placement of each property list should be preserved.
* There are five cards that are not visible on the Listing. Happily,
they belong to a table and their contents can be infered. I've
added the comment '** ASSUMING THIS IS THIS' to these cards.
* asm7090-2.1.4 doesn't ignore blank cards (it takes them as PZE
cards), and doesn't consider "errors" after column 11 to be
comments, so bank cards and cards containing these comments (lisp
pseudo code) that don't start with a '*' have been prefixed with
'**'.
* asm7090-2.1.4 outputs to the listing duplicated cards (by the DUP
directive). So I added a TITLE and a DETAIL card to get the same
behavior as the original assembler:
TITLE ** TO AVOID DUP EXPANSION BY ASM7090...
DUP 1,125 MAKE BUCKETS
,,-*+1
DETAIL ** TO AVOID DUP EXPANSION BY ASM7090...
Happily there's an EJECT following closely so this doesn't shift
pages.
* asm7090-2.1.4 seem to have difficulties to parse -)ALST,,-*-1, so
we intruduced three synonims to be used in the object list table:
**
** OUR ASSEMBLER CAN'T HANDLE -)SYM EXPRESSIONS
**
ZZALST SYN )ALST
ZZ069B SYN )069B
ZZ069A SYN )069A
* Four emacs comment cards have been added before the END card.
(Note: it seems asm7090 has some difficulties to process a deck with
cards beyond the END card).
A few remarks
-------------
No assembler macros used in 7090 LISP1.5 sources!
Apparently, no meta programming applied. Eg. all tables seems to have
been entirely hand generated!
Not even symbols are much used instead of literal, eg
SIR 20 SET DOT INDICATOR
instead of:
IDOT EQL 20
SIR IDOT SET DOT INDICATOR
We can see the cost of punching cards: typoes in comments aren't
corrected :-)
SYMBOL, $SYMBOL, N$SYMBOL: The assembler provides several name spaces.
The program enters an name space with the HED or HEAD directive.
Labels are referenced across name spaces with the space$label
notation. There's a default space with no name where labels can be
"exported" (defined SYN to labels inside another name space); labels
in this default name space can be refered with the $label notation.
The 7090: An early Lisp Machine?
--------------------------------
Of course, we all know how CAR/CDR came from the address and decrement
part of 704/7090 instructions. But tag bits where also present. The
36-bit words could be considered as:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|opcod| decrement ( 15-bit) | tags| address ( 15-bit) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|s 1 2|3 4 5 6 7 8 9 0 1 2 3 4 5 6 7|8 9 0|1 2 3 4 5 6 7 8 9 0 1 2 3 4 5|
|0 0 0|0 0 0 0 0 0 0 1 1 1 1 1 1 1 1|1 1 2|2 2 2 2 2 2 2 2 2 3 3 3 3 3 3|
| | | | |
There are instructions to get or set each of the fields: the operation
code, the decrement, the tags and the address.
STO CLA store and load a full word (CONS) in the 36-bit accumulator AC.
STP store the prefix (ie. operation code, ie. "tags for CDR").
STD store the decrement.
STT store the tags ("tags for the CAR").
STA store the address.
SXD LXD store and load the decrement (CDR) in a 15-bit index register.
SXA LXA store and load the address (CAR) in a 15-bit index register.
PXA PDA move decrement or address between AC (CONS)
PXD PDX and an index register.
In addition, there is a processor-level "EVAL": the XEC instruction
that fetches and executes a processor instruction at the specified
address. So the technique, often used in Lisp, which consists in
passing a first class function to a higher order function can be
applied directly to the processor instruction level.
For more details, see [3].
------------------------------------------------------------------------
[1] http://community.computerhistory.org/scc/projects/LISP/LISP1.5-Bonnie-sBirthdayAssembly.pdf
[2] http://www.cozx.com/~dpitts/ibm7090.html
[3] http://www.bitsavers.org/pdf/ibm/7090/
[4] http://www.bitsavers.org/bits/IBM/www.cozx.com/709x/
[5] http://www.mcjones.org/dustydecks/
[6] http://www.frobenius.com/
------------------------------------------------------------------------
From: Sherman -- Programming the 7090:
INFORMATION ON TAPE
Magnetic tapes for the 7090 computer are ½" in width
and are normally 2400' long. Information is stored in
seven channels, in the manner described in the book.
Data are recorded on tape in one of two modes; the
difference is usually of little concern to the programmer.
In the binary mode, information appears as described in
the book. In the BCD mode, some bit configurations are
changed and the check bit is such that there are an even
number of 1's across the tape width.
Record gaps are ¾" long. The ends of files are
indicated by special marks and/or end-of-file gaps; the
latter are 3¾" long.
Assuming records of 80 characters, and a density of 1600 b/i,
one record would be 80/1600 = 0.05 inch,
one record + one gap would be 0.05 + 0.75 = 0.80 inch,
the total number of records of one tape would be: 2400*12/0.80 = 36,000 rec.,
and the total capacity of one tape would be: 2,880,000 characters.
Assuming records of 1024 words of 36-bits, ie. 6144 "bytes", at the
same density of 1600 b/i, one record would be 6144/1600 = 3.84 inch,
one record + one gap would be 3.84 + 0.75 = 4.59 inch,
the total number of records of one tape would be: 2400*12/4.59 = 6274 records,
and the total capacity of one tape would be: 6274*1024 = 6,424,576 words,
or 28,910,592 octets.
-----------------------------------------
-------------
-
.
About
Clone of https://gitorious.org/lisp-1-5/lisp-1-5 Informatimago's Machine Readable Transcription of the LISP 1.5 (1962) Sources
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published