|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 8117 (0x1fb5)
Types: TextFile
Names: »intrpt.scm.63«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/scm/intrpt.scm.63«
;;; -*-Scheme-*-
;;;
;;; Copyright (c) 1984 Massachusetts Institute of Technology
;;;
;;; This material was developed by the Scheme project at the
;;; Massachusetts Institute of Technology, Department of
;;; Electrical Engineering and Computer Science. Permission to
;;; copy this software, to redistribute it, and to use it for any
;;; purpose is granted, subject to the following restrictions and
;;; understandings.
;;;
;;; 1. Any copy made of this software must include this copyright
;;; notice in full.
;;;
;;; 2. Users of this software agree to make their best efforts (a)
;;; to return to the MIT Scheme project any improvements or
;;; extensions that they make, so that these may be included in
;;; future releases; and (b) to inform MIT of noteworthy uses of
;;; this software.
;;;
;;; 3. All materials developed as a consequence of the use of
;;; this software shall duly acknowledge such use, in accordance
;;; with the usual standards of acknowledging credit in academic
;;; research.
;;;
;;; 4. MIT has made no warrantee or representation that the
;;; operation of this software will be error-free, and MIT is
;;; under no obligation to provide any services, by way of
;;; maintenance, update, or otherwise.
;;;
;;; 5. In conjunction with products arising from the use of this
;;; material, there shall be no use of the name of the
;;; Massachusetts Institute of Technology nor of any adaptation
;;; thereof in any advertising, promotional, or sales literature
;;; without prior written consent from MIT in each case.
;;;
;;;; Interrupt System
(declare (usual-integrations)
(compilable-primitive-functions set-fixed-objects-vector!))
(define with-external-interrupts-handler)
(define timer-interrupt
(let ((setup-timer-interrupt
(make-primitive-procedure 'setup-timer-interrupt #!TRUE)))
(named-lambda (timer-interrupt)
(setup-timer-interrupt '() '())
(error "Unhandled Timer interrupt received"))))
(define interrupt-system
(make-package interrupt-system
((get-next-interrupt-character
(make-primitive-procedure 'GET-NEXT-INTERRUPT-CHARACTER))
(check-and-clean-up-input-channel
(make-primitive-procedure 'CHECK-AND-CLEAN-UP-INPUT-CHANNEL))
(system-interrupts-vector
(fixed-objects-vector-slot 'SYSTEM-INTERRUPT-VECTOR))
(^Q-Hook '()))
\f
;;;; Soft interrupts
;;; Timer interrupts
(define (timer-interrupt-handler interrupt-code interrupt-enables)
(timer-interrupt))
;;; Keyboard Interrupts
(define (external-interrupt-handler interrupt-code interrupt-enables)
(let ((interrupt-character (get-next-interrupt-character)))
((vector-ref keyboard-interrupts interrupt-character) interrupt-character
interrupt-enables)))
(define (losing-keyboard-interrupt interrupt-character interrupt-enables)
(error "Bad interrupt character" interrupt-character))
(define keyboard-interrupts
(vector-cons 256 losing-keyboard-interrupt))
(define (install-keyboard-interrupt! interrupt-character handler)
(vector-set! keyboard-interrupts interrupt-character handler))
(define (remove-keyboard-interrupt! interrupt-character)
(vector-set! keyboard-interrupts interrupt-character
losing-keyboard-interrupt))
(define until-most-recent-interrupt-character 0) ;for Pascal, ugh!
(define multiple-copies-only 1)
(define ((flush-typeahead kernel) interrupt-character interrupt-enables)
(if (check-and-clean-up-input-channel until-most-recent-interrupt-character
interrupt-character)
(kernel interrupt-character interrupt-enables)))
(define ((keep-typeahead kernel) interrupt-character interrupt-enables)
(if (check-and-clean-up-input-channel multiple-copies-only
interrupt-character)
(kernel interrupt-character interrupt-enables)))
\f
(define ^B-interrupt-handler
(keep-typeahead
(lambda (interrupt-character interrupt-enables)
(with-standard-proceed-point
(lambda ()
(breakpoint "^B interrupt" (rep-environment)))))))
;(define ^S-interrupt-handler
; (keep-typeahead
; (lambda (interrupt-character interrupt-enables)
; (if (null? ^Q-Hook)
; (sequence (set-interrupt-enables! interrupt-enables)
; (tyo 7)
; (catch
; (lambda (stop-^S-wait)
; (fluid-let ((^Q-Hook Stop-^S-Wait))
; (let busy-wait () (busy-wait))))))))))
;
;(define ^Q-interrupt-handler
; (keep-typeahead
; (lambda (interrupt-character interrupt-enables)
; (if (not (null? ^Q-Hook))
; (sequence (set-interrupt-enables! interrupt-enables)
; (^Q-Hook 'GO-ON))))))
;
;(define ^P-interrupt-handler
; (flush-typeahead
; (lambda (interrupt-character interrupt-enables)
; (set-interrupt-enables! interrupt-enables)
; (proceed))))
;
;(define ^Z-interrupt-handler
; (flush-typeahead
; (lambda (interrupt-character interrupt-enables)
; (set-interrupt-enables! interrupt-enables)
; (edit))))
(define ^G-interrupt-handler
(flush-typeahead
(lambda (interrupt-character interrupt-enables)
(abort-to-top-level-driver "Quit!"))))
(define ^U-interrupt-handler
(flush-typeahead
(lambda (interrupt-character interrupt-enables)
(abort-to-previous-driver "Up!"))))
(define ^X-interrupt-handler
(flush-typeahead
(lambda (interrupt-character interrupt-enables)
(abort-to-nearest-driver "Abort!"))))
;(define ^Z-lower-interrupt-handler
; (flush-typeahead
; (lambda (interrupt-character interrupt-enables)
; (abort->top-level edit))))
\f
(install-keyboard-interrupt! #/G ^G-interrupt-handler)
(install-keyboard-interrupt! #/B ^B-interrupt-handler)
;(install-keyboard-interrupt! #/P ^P-interrupt-handler)
(install-keyboard-interrupt! #/U ^U-interrupt-handler)
(install-keyboard-interrupt! #/X ^X-interrupt-handler)
;(install-keyboard-interrupt! #/Z ^Z-interrupt-handler)
;(install-keyboard-interrupt! #/z ^Z-lower-interrupt-handler)
;(install-keyboard-interrupt! #/S ^S-interrupt-handler)
;(install-keyboard-interrupt! #/Q ^Q-interrupt-handler)
(define STACK-OVERFLOW-SLOT 0)
(define GC-SLOT 2)
(define CHARACTER-SLOT 4)
(define TIMER-SLOT 6)
(define (install)
(with-interrupt-mask INTERRUPT-MASK-GC-OK
(lambda (old-mask)
(let ((old-system-interrupt-vector
(vector-ref (get-fixed-objects-vector)
system-interrupts-vector)))
(let ((previous-gc-interrupt
(vector-ref old-system-interrupt-vector GC-SLOT))
(previous-stack-interrupt
(vector-ref old-system-interrupt-vector STACK-OVERFLOW-SLOT))
(system-interrupt-vector
(vector-cons (vector-size old-system-interrupt-vector)
default-interrupt-handler)))
(vector-set! system-interrupt-vector GC-SLOT previous-gc-interrupt)
(vector-set! system-interrupt-vector STACK-OVERFLOW-SLOT
previous-stack-interrupt)
(vector-set! system-interrupt-vector CHARACTER-SLOT
external-interrupt-handler)
(vector-set! system-interrupt-vector TIMER-SLOT
timer-interrupt-handler)
;; install the new vector atomically
(vector-set! (get-fixed-objects-vector)
(fixed-objects-vector-slot 'SYSTEM-INTERRUPT-VECTOR)
system-interrupt-vector)
(set-fixed-objects-vector! (get-fixed-objects-vector)))))))
(define (default-interrupt-handler interrupt-code interrupt-enables)
(princ "Anomalous Interrupt: ")
(prin1 interrupt-code)
(princ " Mask: ")
(prin1 interrupt-enables))
\f
(set! with-external-interrupts-handler
(named-lambda (with-external-interrupts-handler handler code)
(define (interrupt-routine interrupt-code interrupt-enables)
(let ((character (get-next-interrupt-character)))
(check-and-clean-up-input-channel
until-most-recent-interrupt-character
character)
(handler character interrupt-enables)))
(define old-handler interrupt-routine)
(define interrupt-vector
(vector-ref (get-fixed-objects-vector)
system-interrupts-vector))
(dynamic-wind
(lambda ()
(set! old-handler
(vector-set! interrupt-vector CHARACTER-SLOT
old-handler)))
code
(lambda ()
(vector-set! interrupt-vector CHARACTER-SLOT
(set! old-handler (vector-ref interrupt-vector
CHARACTER-SLOT)))))))
;;; end INTERRUPT-SYSTEM package.
))