;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for Kermit version 36.2
;;; Reason:
;;;  Don't scroll up the H19 status line.
;;; Written 19-Jul-88 12:59:29 by pld (Peter L. DeWolf) at site Gigamos Cambridge
;;; while running on Cthulhu from band 3
;;; with System 125.6, ZWEI 125.2, ZMail 73.0, Local-File 75.0, File-Server 24.0, Unix-Interface 13.0, Tape 24.0, Lambda-Diag 17.0, Experimental Kermit 36.0, microcode 1761, SDU Boot Tape 3.14, SDU ROM 8.



; From modified file DJ: L.NETWORK.KERMIT; TERM.LISP#69 at 19-Jul-88 12:59:38
#10R KERMIT#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "KERMIT")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERMIT; TERM  "


(DEFSUBST TERMINAL-END-OF-PAGE-EXCEPTION ()
  (SEND *TERMINAL* :HOME-CURSOR)
  (cond (*wrap-around-instead-of-scrolling-flag*
	 (send *terminal* :clear-eol))
	(t
	 (SEND *TERMINAL* :DELETE-LINE)
	 (TERMINAL-SET-CURSORPOS 0 (- (TERMINAL-CHARACTER-HEIGHT) 2))
	 (send *terminal* :insert-line))))


))

; From modified file DJ: L.NETWORK.KERMIT; TERM.LISP#69 at 19-Jul-88 12:59:42
#10R KERMIT#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "KERMIT")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERMIT; TERM  "

(DEFSUBST TERMINAL-CR ()
  (MULTIPLE-VALUE-BIND (IGNORE Y)
      (TERMINAL-READ-CURSORPOS)
    (TERMINAL-SET-CURSORPOS 0 Y)
    (AND *AUTO-LF-ON-CR-FLAG*
	 (COND ((EQ Y (- (TERMINAL-CHARACTER-HEIGHT) 2))
		(TERMINAL-END-OF-PAGE-EXCEPTION))
	       (T (TERMINAL-SET-CURSORPOS 0 (1+ Y)))))
    (if (and *wrap-around-instead-of-scrolling-flag*
	     *auto-cr-on-lf-flag*)
	(send *terminal* ':clear-eol))
    NIL))

))

; From modified file DJ: L.NETWORK.KERMIT; TERM.LISP#69 at 19-Jul-88 12:59:46
#10R KERMIT#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "KERMIT")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERMIT; TERM  "

(DEFSUBST TERMINAL-LINEFEED ()
  (MULTIPLE-VALUE-BIND (X Y)
      (TERMINAL-READ-CURSORPOS)
    (COND ((and (fixp y) (>= Y (- (TERMINAL-CHARACTER-HEIGHT) 2)))
	   (TERMINAL-END-OF-PAGE-EXCEPTION))
	  (T (TERMINAL-SET-CURSORPOS
	       (IF *AUTO-CR-ON-LF-FLAG* 0 X)
	       (1+ Y))))
    (if (and *wrap-around-instead-of-scrolling-flag*
	     (not *auto-cr-on-lf-flag*))
	(send *terminal* ':clear-eol))
    NIL))

))

; From modified file DJ: L.NETWORK.KERMIT; TERM.LISP#69 at 19-Jul-88 12:59:54
#10R KERMIT#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "KERMIT")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; KERMIT; TERM  "

(DEFUN READ-CHAR-FROM-SERIAL-STREAM-TO-TERMINAL ()
  (LET ((KEYSTROKE (SERIAL-TYI)))
    (when (not keystroke)
      (return-from READ-CHAR-FROM-SERIAL-STREAM-TO-TERMINAL :eof))
    (when (eq keystroke #o377)
      ;; telnet IAC which can only be seen if *serial-stream-mask* is set to #o377
      (return-from READ-CHAR-FROM-SERIAL-STREAM-TO-TERMINAL (handle-telnet-iac)))
    (COND (*INPUT-FLOW-CONTROL*
	   ;; of course, instead of doing this we might just as well work a bit
	   ;; on speeding up the terminal emulation itself so that we wouldnt fall
	   ;; behind at 9600 baud. but we make it fine at 1200 baud already, the
	   ;; most usual operating speed over dial up lines. It is losers in the field
	   ;; who want to flow-control. On the other hand would also be nice to have
	   ;; a termcap entry for this "terminal" that had sufficient padding.
	   ;; the worlds slowest and most expensive H19.
	   ;; With a unibus channel of 5k characters we never fall behind, which is
	   ;; the solution I prefer. On the other hand it should be the microcode
	   ;; that implements hardware and software flow control on input.
	   ;; But even that may lose depending on the uart's silo characterists.
	   (MULTIPLE-VALUE-BIND (AMOUNT MAX)
	       ;; a reasonable optimization regardless of flow control nonsense
	       ;; is to look ahead and process all easy characters if available,
	       ;; collect them into a string and do a string out.
	       (SEND *SERIAL-STREAM* :INPUT-CHARACTERS-AVAILABLE)
	     (COND ((EQ *INPUT-FLOW-CONTROL* :CATCHING-UP)
		    (COND ((< (* 3 AMOUNT) (* 1 MAX))
			   ;; less than 1/3 full, must be catching up now, so let 'em rip.
			   (SEND *SERIAL-STREAM* :TYO #o21)
			   (SETQ *INPUT-FLOW-CONTROL* :READY))))
		   ((> (* 3 AMOUNT) (* 2 MAX))
		    ;; if more than 2/3 full we must be falling behind, so make 'em stop.
		    (SETQ *INPUT-FLOW-CONTROL* :CATCHING-UP)
		    (SEND *SERIAL-STREAM* :TYO #o23))))))

    (COND (*tek-in-graphics-mode*
	   (COND ((eq keystroke *tek-pad*))
		 ((EQ KEYSTROKE *TEK-PRINTMODE*)
		  (SETQ *TEK-IN-GRAPHICS-MODE* NIL))
		 ((EQ KEYSTROKE *CR*)
		  (SETQ *TEK-IN-GRAPHICS-MODE* NIL)
		  (SEND *SERIAL-STREAM* :UNTYI KEYSTROKE))
		 ((EQ KEYSTROKE *TEK-GRAPHMODE*)
		  (setq *tek-firstp* t))
		 ((EQ KEYSTROKE #\ALT)
		  (escape-dispatch))
		 ((EQ KEYSTROKE #O12)
		  (TERMINAL-LINEFEED))
		 ((>= KEYSTROKE #O40)
		  (SEND *SERIAL-STREAM* :UNTYI KEYSTROKE)
		  (MULTIPLE-VALUE-BIND (X Y)
		      (get-tek-vector)
		    (COND (*tek-firstp*
			   (SETQ *tek-firstp* NIL)
			   (TEK-MOVE X Y))
			  ('ELSE
			   (TEK-DRAW X Y)))))))
	  ((AND *TEK-EMULATIONP* (EQ KEYSTROKE *TEK-GRAPHMODE*))
	   (setq *tek-in-graphics-mode* t)
	   (setq *tek-firstp* t))

	  ((EQ KEYSTROKE #O33)			;ASCII <ALTMODE> [ESCAPE]
	   (ESCAPE-DISPATCH))

	  ((< #O31 KEYSTROKE #O200)
	   (AND *LOGFILE* TURN-ON-LOGGING? (SEND *LOGFILE* ':TYO KEYSTROKE))	;LOGFILE KLUDGE
	   (COND (*INSERT-FLAG* (TERMINAL-INSERT-CHAR)))
	   (LET ((STORE (TERMINAL-ERASE-ALUF)))
	     (TERMINAL-SET-ERASE-ALUF (IF *REVERSE-VIDEO-FLAG* TV:ALU-IOR TV:ALU-ANDCA))
	     (TERMINAL-CLEAR-CHAR)
	     (TERMINAL-SET-ERASE-ALUF STORE))
	   (TERMINAL-TYO KEYSTROKE)
	   (when (>= (TERMINAL-READ-CURSORPOS) (TERMINAL-CHARACTER-WIDTH))
	     (TERMINAL-CR)
	     (terminal-linefeed)))

	  (T (SELECTQ KEYSTROKE
	       (0)
	       (#O7 (TERMINAL-BEEP))
	       (#O10 (TERMINAL-BACKSPACE))
	       (#O11 (TERMINAL-TAB)
		     (AND *LOGFILE* TURN-ON-LOGGING? (SEND *LOGFILE* ':TYO #O211)))
	       (#O12 (TERMINAL-LINEFEED)
		     (if *auto-clear-eol-on-linefeed-flag* (terminal-clear-eol)))
	       (#O15 (TERMINAL-CR)
		     (AND *TEK-EMULATIONP* (TEK-RESET-MEMORY))
		     (AND *LOGFILE* TURN-ON-LOGGING? (SEND *LOGFILE* ':TYO #O215)))
	       (T (terminal-tyo keystroke)
		  (COND (*TERMINAL-DEBUG-MODE*
			 (FORMAT INTERACTION-PANE
				 "~%Unrecognized /"control character/": ~O [~:@C]"
				 KEYSTROKE KEYSTROKE)))) 
	       )))))

))
