Lisp1.5 en PDP1

By | June 10, 2008

Introducción

 

En una de las asignaturas que tuve en la facultad se impartía Lisp. Este lenguaje siempre me pareció muy interesante, por su elegancia y simplicidad. En estos últimos meses, cada vez leo mas de Lisp por dos motivos principales, es uno de los lenguajes que se estan montando encima de la máquina virtual Parrot, y el otro motivo, es que algunos colegas me estan liando con Emacs, y el lenguaje de extensión de emacs es una variante de Lisp. Bueno, tambien hay otro motivo fundamental, y es que en todas las maquinas (OSes) que me parecen interesantes hay versiones de lisp, ejemplos: Multics(maclisp), ITS(maclisp), TOPS-10, TOPS-20(interlisp, maclisp), VAX(franz lisp), Apollo(T), etc..

.. Y una de las mejores formas de ver Lisp, es quizas probándolo en arquitecturas antiguas, así que aquí lo vamos a probar en un PDP1.  Esta versión de Lisp es del 23 de febrero de 1964, fué escrita por L. Peter Deutsch y es una de las primeras de uso generico y la primera de uso interactivo. Cabe destacar que esta totalmente escrita en ensamblador, y quitando los comentarios y las líneas de separación ocupa unas mil quinientas líneas de código.

 

Instalación de SIMH

 

Como es habitual, vamos a usar SIMH para emular el PDP1. Dudo mucho que alguien tenga un PDP1 real, que se sepa, sólo quedan tres sistemas funcionales,  y están en el CHM.

Instalar SIMH no tiene ningún problema, salvo que se necesita un directorio BIN y que se necesita enlazar con la libreria “librt”, que por defecto no viene con SIMH.

Es por ello que en vez de un paquete, bajaremos la última versión de SIMH, la compilaremos e instalarlemos en algún lugar que esté en nuestro PATH (por ejemplo /usr/local/bin,  cambiar a gusto del consumidor).

 

Nota: No sólo instalamos el emulador del PDP1, sino la totalidad de emuladores, ya que podríamos hacer uso de ellos más adelante.

 

mkdir -p ~/emuladores/simh
cd ~/emuladores/simh
wget http://simh.trailing-edge.com/sources/simhv37-3.zip
unzip simhv37-3.zip
mkdir BIN
mv makefile makefile.orig
cat makefile.orig | sed s/c99/"c99 -lrt"/ > makefile
make
sudo cp BIN/* /usr/local/bin

Estos comandos bajaran la última version de SIMH, compilan los fuentes e  instalan los binarios resultantes en /usr/local/bin .

NOTA: Bob Supknik, el autor de SIMH ha anunciado recientemente que va a sacar una nueva versión de SIMH, posiblemente en una semana (hoy es 9 de junio de 2008). La nueva version ya vendrá parcheada…

 
Con esto ya tendremos el emulador de la máquina PDP1 listo.

Descarga de los fuentes de Lisp1.5

 

Esta versión de Lisp está disponible como un paquete de software listo para funcionar en el emulador SIMH, así que lo único que tendremos que hacer es descargarlo en nuestro directorio de trabajo y descomprimirlo:

mkdir -p ~/emuladores/pdp1-lisp
cd ~/emuladores/pdp1-lisp
wget http://simh.trailing-edge.com/kits/lispswre.zip
unzip lispswre.zip 

 

En el paquete viene el código fuente del Lisp, el fichero .mac, así como una imagen lista para cargar en el emulador. Me parece más interesante ensamblar el código y crear esa imagen nosotros mismos, ya que viene un ensablador cruzado en el paquete. Tan sólo tenemos que compilar previamente el ensamblador:

 

rm lisp.rim
cc macro1.c -o macro1
./macro1 lisp.mac

 

Ejecución de Lisp en la máquina PDP1

 

Antes de poder usar el emulador con la imagen de Lisp, hay que seguir unos pasos previos, lanzamos el emulador…

 

pdp1

PDP-1 simulator V3.7-2
sim> 

 

Y tecleamos las secuencias… (tecleamos lo que está en negrita):

 

set cpu mdv
load lisp.rim
deposit extm_init 1
run

       HALT INSTRUCTION, PC: 002353 (CLA LAT CLI)

deposit tw 7777
cont

       HALT INSTRUCTION, PC: 002357 (CLA LAT)

deposit tw 400
cont

        HALT INSTRUCTION, PC: 000005 (STF5)

deposit ss 2
save lisp.sav
cont

 

En el momento que tecleemos el ultimo cont, ya estamos el el bucle read-eval, con lo cual ya le podemos pasar expresiones ..

 

(car (quote (a b c d))) --- detras del ultimo parentesis pulsar espacio
a 

(cdr (quote (a b c d))) 
(b c d) 

oblist 
(d c b a atom car cdr cond cons eq gensym greaterp list minus n
umberp stop prin1 quotient rplaca rplacd terpri prog return go s
etq sassoc plus times logand logor xeq loc null quote lambda apv
al subr expr fsubr fexpr t oblist read eval print nil) 

(rplaca (quote (nil x y))
(quote (a b)))
 ((a b) x y) 

 

Para salir del emulador solo hay que pulsar ^e y luego teclear exit:

 

oblist
 
(atom car cdr cond cons eq gensym greaterp list minus numberp s
top prin1 quotient rplaca rplacd terpri prog return go setq sass
oc plus times logand logor xeq loc null quote lambda apval subr 
expr fsubr fexpr t oblist read eval print nil) ^e
Simulation stopped, PC: 001133 (SZS5)
sim> exit
Goodbye
paco@linux:~/emuladores/pdp1-lisp$

 

Para que la próxima vez que queramos jugar con Lisp no haya que teclear la parte de la configuración, podemos aprovechar que hicimos una imagen en lisp.sav, así que únicamente tendremos que restaurarla. Además, se puede automatizar la carga de los parámetros, usando el fichero pdp1.ini:

 

cat > pdp1.ini
restore lisp.sav
cont -- tecleamos ^Z
paco@linux:~/emuladores/pdp1-lisp$ pdp1

PDP-1 simulator V3.7-2
oblist 
(atom car cdr cond cons eq gensym greaterp list minus numberp s
top prin1 quotient rplaca rplacd terpri prog return go setq sass
oc plus times logand logor xeq loc null quote lambda apval subr 
expr fsubr fexpr t oblist read eval print nil) 

 

Funciones del PDP1 Lisp

 

  • atom
  • car
  • cdr
  • cond x y
  • CONS x y
  • eq x y
  • eval x
  • gensym
  • greaterp x y
  • go
  • list
  • loc x
  • logand x y
  • logor x y
  • minus x
  • null x
  • numberp x
  • plus x y
  • prin1 x
  • print
  • prog
  • quote
  • quotient x y
  • read
  • return
  • rplaca
  • rplacd
  • sassoc
  • setq
  • stop x
  • terpri
  • times x y
  • xeq c a i

 

Objetos

    

  • oblist
  • nil
  • t
  • expr
  • subr
  • fexpr
  • fsubr
  • apval

 

Enlaces de interés

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *