;;;-*- Mode:LISP; Package:SYSTEM-INTERNALS; Base:8.; Patch-File:T -*-

;;; This is a copy of the changes to serial-streams to support the
;;; :TYI-WITH-TIMEOUT operation.
;;; This must be loaded before using any phone software (until these changes
;;; are installed in the default system.

;;; Stream input protocol
(DEFMETHOD (SERIAL-STREAM-MIXIN :TYI) (&OPTIONAL IGNORE)
  (COND ((NULL SERIAL-UNRCHF)
	 (PROCESS-WAIT "Serial TYI" #'UNIBUS-CHANNEL-NOT-EMPTY INPUT-UNIBUS-CHANNEL)
	 (SERIAL-TYI-1))
	(T (PROG1 SERIAL-UNRCHF (SETQ SERIAL-UNRCHF NIL)))))

(DEFMETHOD (SERIAL-STREAM :TYI-WITH-TIMEOUT) (&OPTIONAL TIMEOUT)
  (COND ((NULL SERIAL-UNRCHF)
	 (COND ((PROCESS-WAIT-WITH-TIMEOUT "Serial TYI" TIMEOUT
					   #'UNIBUS-CHANNEL-NOT-EMPTY INPUT-UNIBUS-CHANNEL)
		(SERIAL-TYI-1))
	       (T NIL)))
	(T (PROG1 SERIAL-UNRCHF (SETQ SERIAL-UNRCHF NIL)))))

(DEFUN SERIAL-TYI-1 ()
  (DECLARE (:SELF-FLAVOR SERIAL-STREAM-MIXIN))
  (MULTIPLE-VALUE-BIND (CH STATUS) (READ-UNIBUS-CHANNEL INPUT-UNIBUS-CHANNEL)
    (SETQ CH (LOGAND 377 CH))
    (COND ((BIT-TEST SERIAL-ERROR-MASK STATUS)
	   ;; RESET THE STUPID ERROR FLAGS
	   (%UNIBUS-WRITE 764166 (LOGIOR 20 UART-COMMAND))
	   (%UNIBUS-WRITE 764166 UART-COMMAND)
	   (CERROR T NIL NIL
		   "SERIAL INPUT ~:[FRAMING ~]~:[OVER-RUN ~]~:[PARITY ~]ERROR: ~O"
		   (ZEROP (LOGAND 40 STATUS SERIAL-ERROR-MASK))
		   (ZEROP (LOGAND 20 STATUS SERIAL-ERROR-MASK))
		   (ZEROP (LOGAND 10 STATUS SERIAL-ERROR-MASK))
		   CH)))
    CH))

(DEFMETHOD (SERIAL-STREAM-MIXIN :ASCII-LINE-OUT) (STRING)
  (SEND SELF ':STRING-OUT STRING)
  (SEND SELF ':TYO #Return)
  (SEND SELF ':TYO #Linefeed))
