1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-07 03:35:53 +00:00
Files
PDP-10.its/src/libdoc/lispt.patch
2018-03-22 10:38:13 -07:00

222 lines
6.5 KiB
Diff
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;-*-LISP-*-
;; KLUDGEY PATCH FOR LISP TO GET AROUND I.T.S. LOSSAGE
;; ON INPUT, CHECKS FOR USR DEVICE, DOES WORD/BLOCK AT A TIME, BLOCK IOT'S
;; THIS CODE MUST BE CHECKED EVERY TIME A NEW LISP COMES OUT
;; THE INPUT SIDE SIMPLY HACKS $DEV5K WHICH IS THE LISP ROUTINE FOR FILLING THE
;; INPUT BUFFER FOR ASCII MODE CHANNELS ON NON-TTY DEVICES (SEE L;READER >)
;; On output, a similar trap is put in IFORCE. Unlike the input patch,
;; the output patch is a very special kludge which works by letting
;; the inferior TECO read the characters from LISP's buffer.
;; Some assumptions on which this kludge is based:
;; Assume USR-OPEN-FIX was called after calling OPEN. This
;; reopens the USR channel in block mode (but doesn't tell LISP!)
;; and sets the "file length" to whatever is specified as an arg.
;; This is usually ZV. This way, the normal LISP EOF handling
;; mechanisms can work.
;; On output, it is assumed that a variable CURRENT-TECO-BUFFER-BLOCK
;; has been set with a pointer to the buffer block of the target
;; buffer.
(eval-when (eval compile)
(SETQ OIBASE IBASE IBASE 8) ; SO WE CAN READ INTO MACSYMA AND CGOL
)
(SETQ LISPT-PATCH 0) ; HOLDS NUMBER OF "EXTRA CHARACTERS", FOR BELOW
(OR (GETDDTSYM '$DEV5K) ; BE SURE THAT SYMBOL TABLE IS LOADED
((LAMBDA (TTY-RETURN) (VALRET '|/î:SL /î:EXISTS /îºVP |)) NIL))
(LAP-A-LIST '(
(LAP LISPT-PATCH SUBR) ; ROUTINE TO ACCOMPLISH THE PATCHING
(MOVEI T ($DEV5K 0)) ; INPUT PATCH
(MOVEI TT LTINP)
(PUSHJ P PURPAT) ; GO PUT A PURE PATCH
(MOVEI T (IFORCE 4)) ; output patch
(MOVEI TT LTOUTP) ; FALL THRU
PURPAT (PUSH FXP (% PUSHJ P 0))
(PUSH FXP T) ; ALLOCATE A PDL SLOT FOR PATCH ADDRESS
(HRRM TT -1 FXP) ; ADDRESS TO COME TO, IN RH
(PUSHJ P DPUR) ; DEPURIFIES PAGE WHOSE ADDRESS IS IN 0(FXP)
(MOVE TT -1 FXP) ; GET PATCH-IN INSTRUCTION
(EXCH TT @ 0 FXP) ; SWAP THE OLD WITH THE NEW
(CAME TT @ 0 FXP) ; If same, we've already patched
(MOVEM TT @ -1 FXP) ; Otherwise save the old instruction
(PUSHJ P RPUR) ; JUST FOR WRITE PROTECTION
(SUB FXP (% 0 0 2 2)) ; POP THE FXP SLOTS
(POPJ P)
DPUR (TDZA C C)
RPUR (MOVE C 'T)
(MOVEI A 0 FXP)
(MOVEI B 0 FXP)
(JCALL 3 (FUNCTION PURIFY))
; ASCII mode input on the USR device patch:
LTINP (PUSH FXP D) ; COPIED FROM $DEV5K?
(PUSHJ P USRCHK) ; IS IT ASCII MODE ON THE USR DEVICE?
; IF NOT, RETURNS
(PUSHJ P USRPOS) ; reposition the channel
(MOVEI D 0)
(MOVE TT F/.FLEN T) ; get pseudo file length in D
(CAMG TT F/.FPOS T) ; if over EOF,
(JRST 0 USRFIX) ; skip doing input, and return 0
(PUSHJ P USRIO) ; INPUT FB.BFL CHARACTERS + (D)
(HLRES 0 D) ; UNFOLD COUNT LEFT FOR FB.CNT
(MOVNS 0 D)
(IMULI D 5)
(SUB D FB/.BFL T)
(SKIPE 0 D)
(SUB D @ (SPECIAL LISPT-PATCH)) ; add in correction for word rounding
(SUB TT F/.FPOS T)
(ADD TT D) ; adding D is subtracting the count of chars read
(SKIPG 0 TT) ; skip if not at EOF
(SUB D TT) ; subtract the difference
USRFIX (MOVNM D FB/.CNT T)
(MOVNM D FB/.BVC T)
(JUMPE D POPXDJ) ; EOF in this case
(MOVE TT FB/.IBP T) ; RESTORE THE BYTE POINTER
(SKIPE D @ (SPECIAL LISPT-PATCH)); AND WORD BOUNDARY CORRECTIONS TO DO?
IBPLP (IBP 0 TT)
(AOJL D IBPLP)
(MOVEM TT FB/.BP T)
(POP FXP D)
(JRST 0 POPJ1)
; USR device output patch.
LTOUTP (MOVE F FB/.BFL TT) ; COPIED FROM IFORCE+4?
(MOVE T TT)
(PUSHJ P USRCHK) ; IF NOT USER DEVICE, RETURNS DIRECTLY
(SUB F FB/.CNT T) ; update the filepos
(ADDM F F/.FPOS T)
(JUMPE F LTEXIT)
(HRRZ TT @ (SPECIAL CURRENT-TECO-BUFFER-BLOCK)) ;
(JUMPE TT LTEXIT) ; SKIP ON NIL (WHAT ABOUT UNBOUND?)
(ADDI TT 8) ; ADDRESS WHERE THE ARG GOES
(*CALL 0 USRACC)
(JFCL)
(HRLS 0 F)
(HRRI F FB/.BUF T) ; ADDRESS IN THE RIGHT HALF
(HRROI D F) ; -1,,F
(*CALL 0 USRIOT)
(*LOSE 1000)
(SOJ TT) ; BACK TO BUFFER BLOCK + 7
(MOVEI F 0) ; .RUPC INTO F
(PUSH FXP (% 0))
(MOVE D (% MOVEM 0 0 FXP))
(*CALL 0 USRVAR) ; SAVE THE CURRENT PC
(*LOSE 1000)
(HLL TT 0 FXP)
(MOVE D (% MOVE 0 TT)) ; SET USER PC TO SPECIFIED LOCATION
(*CALL 0 USRVAR)
(*LOSE 1000)
(MOVEI F 7) ; .RUSTP
(MOVE D (% MOVEI 0 0)) ; CLEAR USTP, ALLOWING THE INFERIOR TO RUN
(*CALL 0 USRVAR)
(*LOSE 1000)
(MOVE D (% MOVEM 0 TT)) ; WAIT UNTIL USTP IS NON-ZERO
LOOP (*CALL 0 USRVAR)
(*LOSE 1000)
(JUMPE TT LOOP)
(MOVEI F 0) ; RESTORE THE PC
(MOVE D (% MOVE 0 0 FXP))
(*CALL 0 USRVAR)
(*LOSE 1000)
(SUB FXP (% 0 0 1 1))
LTEXIT (MOVE TT T)
(JSP D FORCE6) ; RESET VARIOUS BUFFER POINTERS
(POPJ P)
USRVAR (SETZ)
(SIXBIT USRVAR)
(0 0 F/.CHAN T)
(0 0 F) ; VARIABLE SPECIFIER IN F
(0) ; IGNORED
(SETZ 0 D) ; INSTRUCTION IN D
; UTILITY ROUTINES
USRCHK (PUSH FXP F)
(PUSH FXP TT)
(MOVE D F/.DEV T) ; GET DEVICE FROM TTSAR
(MOVE F F/.MODE T) ; and check for ascii mode
(POP P TT) ; pop the stack and save in TT
(CAMN D (% (SIXBIT |USR |))) ; SIOT ON USR CHANNEL?
(TRNE F 4) ; 1.3=0 implies ascii mode
(SKIPA)
(MOVEM TT 0 p) ; clobber the return for the patch
(POP FXP TT)
(POP FXP F)
(POPJ P)
USRPOS (MOVE TT F/.FPOS T) ; FIRST, STANDARD UPDATE OF FILEPOS
(ADD TT FB/.BVC T)
(MOVEM TT F/.FPOS T)
(SETZM 0 FB/.BVC T)
(IDIVI TT 5) ; ROUND TO WORDS (CLOBBERS R - OK?)
(*CALL 0 USRACC) ; AND ACTUALLY REPOSITION
(JFCL) ; CAN'T FAIL...
(IMULI TT 5) ; BACK TO CHARS
(SUB TT F/.FPOS T) ; NUMBER OF CHARS TO SKIP (Negative)
(ADD TT CIN0) ; IN EFFECT, "FXCONS"
(MOVEM TT (SPECIAL LISPT-PATCH)) ; DUE TO FILEPOS NOT ON WORD BOUNDARY
(SUB TT CIN0)
(POPJ P)
USRIO (ADD D FB/.BFL T) ; Do input or output of (D) chars
(IDIVI D 5) ; CONVERT TO WORDS (CLOBBERS R)
(HRLOI D -1 D) ; MAKE AN AOBJN POINTER (from HAKMEM!!)
(EQVI D FB/.BUF T) ; can you figure that one out!
(*CALL 0 USRIOT) ; BLOCK IOT
(*LOSE 0 1000)
(POPJ P)
; various call blocks
USRACC (SETZ)
(SIXBIT ACCESS)
(0 0 F/.CHAN T)
(SETZ 0 TT)
USRIOT (SETZ)
(SIXBIT IOT)
(0 0 F/.CHAN T)
(SETZ 0 D) ; AOBJN POINTER IS IN D
; (USR-OPEN-FIX <file> <fillen>)
(ENTRY USR-OPEN-FIX SUBR)
(HRRZ T 1 A) ; F.FLEN TO BE (B)
(MOVEI A NIL)
(MOVE TT 0 B)
(MOVEM TT F/.FLEN T)
(MOVE TT F/.MODE T) ; REOPEN IN BLOCK MODE (BUT DON'T TELL LISP!)
(ANDI TT 1)
(IORI TT 2)
(*CALL 0 OPUSRI) ; RE-OPEN USER INPUT (SPECS FROM FILE-ARRAY)
(*LOSE 0 1000) ; WHAT IF IT FAILS?
(MOVEI A 'TRUTH)
(POPJ P)
OPUSRI (SETZ)
(SIXBIT OPEN)
(0 0 F/.CHAN T)
(5_33 0 0 TT) ; open mode (immediate cntrl arg (TT))
(0 0 F/.DEV T)
(0 0 F/.FN1 T)
(SETZ 0 F/.FN2 T)
() ; (USE WITH CAUTION - CAN CASE LOSSAGE
; IF PAGES IN INFERIOR DON'T EXIST!)
))
(AND (NOT (STATUS FEATURE LISPT)) ;PATCH TO ENABLE INTERRUPT HANDLING
(LISPT-PATCH))
(eval-when (eval compile)
(SETQ IBASE OIBASE)
)