home *** CD-ROM | disk | FTP | other *** search
- ;;; (C) Copyright 1984 by Gold Hill Computers
-
- ;;; This file contains a bootstap loader for the fasload function which
- ;;; is compiled code in fasload format. It implements enough of the
- ;;; fasloader to load the compiled version.
-
- (DEFCONSTANT FOP-DISPATCH-TABLE ()) ; the operations
-
- (DEFCONSTANT FOP-STRING (MAKE-ARRAY 50 :FILL-POINTER 0
- :ELEMENT-TYPE 'STRING-CHAR))
-
- ; for reading a 4 byte sequence and returning a number. NOTE: the 2 most
- ; significant bytes are currently ignored.
- (DEFMACRO GET-4-BYTE X
- '(PROG1 (+& (FUNCALL *STANDARD-INPUT* :READ-CHAR)
- (LSH (FUNCALL *STANDARD-INPUT* :READ-CHAR) 8))
- (FUNCALL *STANDARD-INPUT* :READ-CHAR) ; dump 2 high bytes for now
- (FUNCALL *STANDARD-INPUT* :READ-CHAR)))
-
- ; for reading a 2 byte sequence and returning a number.
- (DEFMACRO GET-2-BYTE X
- '(+& (FUNCALL *STANDARD-INPUT* :READ-CHAR)
- (LSH (FUNCALL *STANDARD-INPUT* :READ-CHAR) 8)))
-
- ; for reading 1 byte and returning its value.
- (DEFMACRO GET-1-BYTE X
- '(FUNCALL *STANDARD-INPUT* :READ-CHAR))
-
- ; For defining the operations
- (DEFMACRO DEF-FOP X
- (LET ((OP (CAR X))
- (BODY (CDR X)))
- `(PUSH '(,OP . (LAMBDA () ,@BODY)) FOP-DISPATCH-TABLE)))
-
- ;;; The various FOP instructions
-
- ; FOP-EMPTY-LIST
- (DEF-FOP 4
- (PUSH NIL FOP-STACK))
-
- ; FOP-SMALL-SYMBOL-SAVE
- (DEF-FOP 7
- (LET ((SIZE (GET-1-BYTE)))
- (SETF (FILL-POINTER FOP-STRING) SIZE)
- (SEND *STANDARD-INPUT* :FILL-ARRAY FOP-STRING)
- (PUSH (INTERN FOP-STRING) FOP-STACK)))
-
- ; FOP-SMALL-SYMBOL-IN-BYTE-PACKAGE-SAVE
- (DEF-FOP 11
- (LET ((I (GET-1-BYTE))
- (SIZE (GET-1-BYTE)))
- (SETF (FILL-POINTER FOP-STRING) SIZE)
- (SEND *STANDARD-INPUT* :FILL-ARRAY FOP-STRING)
- (PUSH (INTERN FOP-STRING (AREF FOP-TABLE I)) FOP-STACK)))
-
- ; FOP-DEFAULT-PACKAGE
- (DEF-FOP 13
- (LET ((P (AREF FOP-TABLE (GET-4-BYTE))))
- (UNLESS (TYPEP P 'PACKAGE)
- (ERROR "FOP 13: ~S is not a package" P))
- (SETQ *PACKAGE* P)))
-
- ; FOP-PACKAGE
- (DEF-FOP 14
- (LET* ((S (POP FOP-STACK))
- (P (FIND-PACKAGE S)))
- (UNLESS (TYPEP P 'PACKAGE)
- (ERROR "~S is not the name of an existing package"))
- (VECTOR-PUSH P FOP-TABLE)))
-
- ; FOP-SMALL-STRING
- (DEF-FOP 38
- (LET ((SIZE (GET-1-BYTE))
- (STR))
- (SETQ STR (MAKE-ARRAY SIZE :ELEMENT-TYPE 'STRING-CHAR))
- (SEND *STANDARD-INPUT* :FILL-ARRAY STR)
- (PUSH STR FOP-STACK)))
-
- ; FOP-FIXUP
- (DEF-FOP 51
- (LET ((FEFOFF (GET-2-BYTE))
- (CNT (GET-2-BYTE))
- (FEF (CAR FOP-STACK))
- SEG OFF X VAL)
- (SETF (VALUES OFF SEG)(%POINTER FEF))
- (SETQ FEFOFF (-& OFF FEFOFF))
- (DOTIMES (I CNT)
- (SETF (VALUES NIL VAL) (%CONTENTS SEG (+& OFF (SETQ X (GET-2-BYTE)))))
- (%CONTENTS-STORE SEG (+& OFF X) (+& VAL FEFOFF) T))
- ))
-
- ; FOP-ALTER, highly special cased.
- (DEF-FOP 52
- (LET ((NV (POP FOP-STACK))
- (OBJ (POP FOP-STACK))
- (IDX (GET-1-BYTE)))
- (FSET OBJ NV)))
-
- ; FOP-CODE-FORMAT
- (DEF-FOP 57
- (GET-1-BYTE))
-
- ; FOP-SMALL-CODE
- (DEF-FOP 59
- (LET ((ITEMS (GET-1-BYTE))
- (SIZE (GET-2-BYTE))
- FEF SEG OFF C-OFF SEG1 OFF1)
- (SETQ FEF (MAKE-ARRAY (-& SIZE 11)
- :ELEMENT-TYPE '(UNSIGNED-BYTE 8)))
- (MULTIPLE-VALUE-SETQ (OFF SEG) (%POINTER FEF))
- (%CONTENTS-STORE SEG (+& OFF 4) 0 NIL) ; set constants 0
- (%CONTENTS-STORE SEG OFF 20. NIL) ; make it a FEF
- (SEND *STANDARD-INPUT* :FILL-ARRAY FEF) ; fill the FEF
- (SETQ C-OFF (+& OFF 11)) ; where constants go
- ; We hang onto stack so constants don't get gc'ed too soon.
- (LET ((STACK FOP-STACK))
- (DOTIMES (I ITEMS) ; store constants
- (MULTIPLE-VALUE-SETQ (OFF1 SEG1) (%POINTER (POP FOP-STACK)))
- (%CONTENTS-STORE SEG (+& C-OFF (* I 4)) OFF1 SEG1))
- (%CONTENTS-STORE SEG (+& OFF 4) ITEMS NIL))
- ; fix up entry point
- (%CONTENTS-STORE SEG (+& OFF 5) (+& OFF (+& 11 (* ITEMS 4))) T) ; offset
- (%CONTENTS-STORE SEG (+& OFF 7) SEG T) ; segment
- (PUSH FEF FOP-STACK)))
-
- ; FOP-END-GROUP
- (DEF-FOP 64
- (THROW 'FASLGROUP 'OK))
-
- ;; The TOPLEVEL function
- (DEFUN FASLOAD1 (FILE &AUX BYTE)
- (LET ((*STANDARD-INPUT* (OPEN (SETQ FILE (MERGE-PATHNAMES FILE ".FAS"))
- :ELEMENT-TYPE 'UNSIGNED-BYTE))
- (*PACKAGE* *PACKAGE*)
- (FOP-STACK NIL)
- (FOP-TABLE (MAKE-ARRAY 50 :FILL-POINTER 0))
- BYTE FUNC)
- (UNWIND-PROTECT
- (PROGN
- (DO () ((= #X0FF (FUNCALL *STANDARD-INPUT* :READ-CHAR))))
- (CATCH 'FASLGROUP
- (DO () (())
- (UNLESS (SETQ BYTE (FUNCALL *STANDARD-INPUT* :READ-CHAR))
- (ERROR "Unexpected EOF while loading FASL file."))
- (COND ((SETQ FUNC (CDR (ASSOC BYTE FOP-DISPATCH-TABLE)))
- (FUNCALL FUNC))
- (T (ERROR "Unimplemented FOP instruction: ~S" BYTE)))))
- FILE)
- (CLOSE *STANDARD-INPUT*))))
-
- (WITH-DISKETTE *LISP-LIBRARY-DISKETTE*
- #'FASLOAD1
- (MERGE-PATHNAMES "FLD.FAS"
- *LISP-LIBRARY-PATHNAME*))
-
- (MAPC 'FMAKUNBOUND '(GET-4-BYTE GET-2-BYTE GET-1-BYTE DEF-FOP FASLOAD1))
- (MAPC 'MAKUNBOUND '(FOP-DISPATCH-TABLE))