pcs/newpcs/pstl.s

172 lines
5.8 KiB
ArmAsm
Raw Normal View History

2023-05-20 05:57:05 -04:00
; -*- Mode: Lisp -*- Filename: pstl.s
;--------------------------------------------------------------------------;
; ;
; TI SCHEME -- PCS Compiler ;
; Copyright 1985 (c) Texas Instruments ;
; ;
; David Bartley ;
; ;
; Standard SCHEME-Top-Level Routines ;
; ;
;--------------------------------------------------------------------------;
; Revision history:
; 6/01/87 tc - Modified original PSTL.S so that only top level functions
; are now in this file.
; 6/01/87 rb - modified runtime-system toplevel handling so it works
; identically to the compiler version; this gets rid of
; APPLICATION-TOP-LEVEL, and PATCH.PCS and .INI handling
; will get executed in the runtime system
;define standard toplevel loop and support functions
(begin
(define reset-scheme-top-level ; SCHEME-TOP-LEVEL
(let ((saved-genv user-initial-environment))
(lambda ()
(letrec
((==reset== '())
(==scheme-reset== ; here for SCHEME-RESET
(lambda ()
(%set-global-environment saved-genv)
(set! (fluid input-port) standard-input)
(set! (fluid output-port) standard-output)
(putprop '%PCS-STL-HISTORY (list '()) %pcs-stl-history)
(newline)
(display "[PCS-DEBUG-MODE is ")
(display (if pcs-debug-mode "ON]" "OFF]"))
(newline)
(call/cc (lambda (k)
(set! ==reset== (lambda ()(k '())))
(set! (fluid scheme-top-level)
==reset==)))
; here for RESET (if fluid
; SCHEME-TOP-LEVEL hasn't been redefined;
; if it has, restart that function)
(pcs-kill-engine)
(gc) ; restore WHO line (temporary)
(more)))
(more
(lambda ()
(pcs-clear-registers)
(fresh-line)
(display "[")
(display (length (getprop '%PCS-STL-HISTORY %pcs-stl-history)))
(display "] ")
(let ((problem (read)))
(flush-input)
(if (eof-object? problem)
(display "[End of file read by SCHEME-TOP-LEVEL]")
(begin
(putprop '%PCS-STL-HISTORY
(cons (list problem)
(getprop '%PCS-STL-HISTORY
%pcs-stl-history))
%pcs-stl-history)
(let* ((answer (eval (if %pcs-stl-debug-flag
(compile (list 'BEGIN
'(%BEGIN-DEBUG)
problem))
problem)))
(next (fluid scheme-top-level)))
(when (not (eq? answer *the-non-printing-object*))
(write answer))
(putprop '%PCS-STL-HISTORY
(cons (cons problem answer)
(cdr (getprop '%PCS-STL-HISTORY
%pcs-stl-history)))
%pcs-stl-history)
(if (eq? next ==reset==)
(more)
(next)))))))))
(set! (fluid scheme-top-level) ==scheme-reset==)
*the-non-printing-object*))))
;;; %C accesses the nth user command
;;; %D accesses the result of the nth user command
(define %c ; %C
(lambda (n)
(let ((history (getprop '%PCS-STL-HISTORY %pcs-stl-history)))
(and (positive? n)
(< n (length history))
(car (list-ref (reverse history) n))))))
(define %d ; %D
(lambda (n)
(let ((history (getprop '%PCS-STL-HISTORY %pcs-stl-history)))
(and (positive? n)
(< n (length history))
(cdr (list-ref (reverse history) n))))))
) ;begin
(reset-scheme-top-level)
(let ((file (%system-file-name "PATCH.PCS")))
(when (file-exists? file) ; system patches
(load file)))
;; Pathnames read as text from a file will have single backslashes.
;; This doubles them so a read-from-string type operation will work on them.
;; It's used for the .INI processing following.
(define (double-slashify string)
(let loop ((m 0)
(n 0)
(new (make-string (string-length string) nil)))
(if (= m (string-length string))
new
(begin
(string-set! new n (string-ref string m))
(if (char=? (string-ref string m) #\\)
(let ((newer (make-string (add1 (string-length new)) nil)))
(substring-move-left! new 0 (+ n 1) newer 0)
(string-set! newer (+ n 1) #\\)
(loop (+ m 1) (+ n 2) newer))
(loop (+ m 1) (+ n 1) new))))))
(%set-global-environment user-initial-environment)
;; Note: You can make your own toplevel function the system's toplevel by
;; assigning it to the fluid variable SCHEME-TOP-LEVEL from the .INI file.
;; Don't invoke it yourself. After loading the .INI file, this file's
;; final SCHEME-RESET initializes the VM for toplevel recovery
;; (in case of errors) and invokes the toplevel function automatically.
(cond ((null? pcs-initial-arguments) ;no args at all, use scheme.ini
(when (file-exists? "scheme.ini")
(load "scheme.ini")))
(else
(let ((pia-files
(map symbol->string
(let ((x (read (open-input-string
(double-slashify (car pcs-initial-arguments))))))
(if (pair? x) x (list x)))))) ;handle nonlist file
(let loop ((rest pia-files) (ini-files '())) ;handle list files
(let ((f (car rest)))
(cond ((null? rest)
(when (null? ini-files) ;no ini's given, use scheme.ini
(set! ini-files '("scheme.ini")))
(for-each ;load several ini's
(lambda (f)
(when (file-exists? f) (load f)))
ini-files))
((< (string-length f) 4) ;file sans extension--assumed ini
(loop (cdr rest) (cons f ini-files)))
((substring-ci=? f (- (string-length f) 4) (string-length f)
".app" 0 4)
(loop (cdr rest) ini-files)) ;don't reload compiler
((substring-ci=? f (- (string-length f) 4) (string-length f)
".xli" 0 4)
(loop (cdr rest) ini-files)) ;ignore XLI files
(else
(loop (cdr rest) (cons f ini-files))) ;assume fasl file
))))))
(scheme-reset) ; must be last operation!