(FILECREATED " 8-Nov-85 14:07:01" {ERIS}<LISPCORE>LIBRARY>CENTRONICS.;4 5930   

      changes to:  (FNS \DANDETIGERP \CENTRONICS-NO-PORT-ERROR CENTRONICS.RESET \CENTRONICS.OPENFILE 
			\CENTRONICS-CHECK-FOR-PORT)
		   (VARS CENTRONICSCOMS)

      previous date: "11-Oct-85 17:58:36" {ERIS}<LISPCORE>LIBRARY>CENTRONICS.;3)


(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT CENTRONICSCOMS)

(RPAQQ CENTRONICSCOMS [(FNS CENTRONICS.RESET CENTRONICS.BUSYWAIT)
			 (FNS \CreateCentronicsDevice \CENTRONICS.OPENFILE \CENTRONICS.CLOSEFILE 
			      \CENTRONICS.BOUT \CENTRONICS.BUSYWAIT \CENTRONICS.EVENTFN)
			 (FNS \DANDETIGERP \CENTRONICS-CHECK-FOR-PORT)
			 (DECLARE: DONTEVAL@LOAD DOCOPY (P (\CreateCentronicsDevice])
(DEFINEQ

(CENTRONICS.RESET
  [LAMBDA (C150STREAM)                                       (* hdj " 8-Nov-85 14:06")

          (* * only do it if we're talking about the real centronics device, and not a disk file or something)


    (\CENTRONICS-CHECK-FOR-PORT)
    (if (OR (NULL C150STREAM)
		(EQ (fetch (FDEV DEVICENAME) of (fetch (STREAM DEVICE) of C150STREAM))
		      (QUOTE CENTRONICS)))
	then (WRITEPRINTERPORT 40960)
	       (WRITEPRINTERPORT 32768)
	       (DISMISS 1)                                 (* 32768 means init printer)
	       (WRITEPRINTERPORT 40960)                    (* turn off initialization and control lines)
	       NIL])

(CENTRONICS.BUSYWAIT
  [LAMBDA NIL                                                (* hdj "11-Oct-85 17:58")
    (PROG (C150STATUSLINE)
	RETRY
	    (SETQ C150STATUSLINE (LOGAND (READPRINTERPORT)
					     31744))         (* If printer is busy, return T)
                                                             (* If other than busy, then there is an error)
	    (RETURN (if (EQ C150STATUSLINE 8192)
			  then T
			else (if (NEQ (LOGAND (READPRINTERPORT)
						      31744)
					    24576)
				   then (PRINTOUT PROMPTWINDOW "Printer error" T)
					  (HELP "Printer error - RETURN to continue")
					  (GO RETRY])
)
(DEFINEQ

(\CreateCentronicsDevice
  [LAMBDA NIL                                                (* hdj " 9-Sep-85 22:27")
    (LET [(DEVICE (create FDEV
			  DEVICENAME ←(QUOTE CENTRONICS)
			  EVENTFN ←(FUNCTION \CENTRONICS.EVENTFN)
			  BOUT ←(FUNCTION \CENTRONICS.BOUT)
			  OPENFILE ←(FUNCTION \CENTRONICS.OPENFILE)
			  CLOSEFILE ←(FUNCTION \CENTRONICS.CLOSEFILE)
			  GETFILENAME ←(FUNCTION [LAMBDA (NAME RECOG DEVICE)
			      NAME])
			  DELETEFILE ←(FUNCTION NILL)
			  GETFILEINFO ←(FUNCTION NILL)
			  SETFILEINFO ←(FUNCTION NILL]
         (\DEFINEDEVICE (QUOTE CENTRONICS)
			DEVICE)
     DEVICE])

(\CENTRONICS.OPENFILE
  [LAMBDA (NAME ACCESS RECOG PARAMETERS DEVICE)              (* hdj " 8-Nov-85 14:06")
    (if (OR (EQ ACCESS (QUOTE OUTPUT))
		(EQ ACCESS (QUOTE APPEND)))
	then [LET ((OLDSTREAM (fetch (FDEV DEVICEINFO) of DEVICE)))
		    (\CENTRONICS-CHECK-FOR-PORT)
		    (if OLDSTREAM
			then (ERROR "Only one open stream allowed on this device" NAME)
		      else (replace (FDEV DEVICEINFO) of DEVICE
				with (create STREAM
						 DEVICE ← DEVICE
						 FULLFILENAME ←(QUOTE {CENTRONICS}]
      else (ERROR "Centronics can only be used for output" NAME])

(\CENTRONICS.CLOSEFILE
  [LAMBDA (STREAM)                                           (* hdj " 4-Sep-85 17:30")
    (replace (FDEV DEVICEINFO) of (fetch (STREAM DEVICE) of STREAM) with NIL])

(\CENTRONICS.BOUT
  [LAMBDA (STREAM BYTE)                                      (* hdj " 4-Sep-85 16:31")
    (if (NEQ (LOGAND (READPRINTERPORT)
		     31744)
	     24576)
	then (while (\CENTRONICS.BUSYWAIT)))                 (* Check if printer is busy)
    (LET ((C150DATANOSTB (LOGOR BYTE 40960)))                (* Send data, turn off strobe signal)
         (WRITEPRINTERPORT C150DATANOSTB)
         (WRITEPRINTERPORT (LOGAND 32767 C150DATANOSTB))     (* Send data, turn on strobe signal)
         (WRITEPRINTERPORT C150DATANOSTB))                   (* Turn off strobe signal)
    NIL])

(\CENTRONICS.BUSYWAIT
  [LAMBDA NIL                                                (* edited: "16-Jul-85 14:54")
    (PROG (C150STATUSLINE)
      RETRY
          (SETQ C150STATUSLINE (LOGAND (READPRINTERPORT)
				       31744))               (* If printer is busy, return T)
                                                             (* If other than busy, then there is an error)
          (RETURN (if (EQ C150STATUSLINE 8192)
		      then T
		    else (if (NEQ (LOGAND (READPRINTERPORT)
					  31744)
				  24576)
			     then (PRINTOUT PROMPTWINDOW "Printer error" T)
				  (HELP "Printer error - type (RETURN) to continue")
				  (GO RETRY])

(\CENTRONICS.EVENTFN
  [LAMBDA (DEVICE EVENT)                                     (* hdj " 4-Sep-85 16:34")
    (SELECTQ EVENT
	     ((AFTERLOGOUT AFTERSYSOUT AFTERMAKESYS)
	       (CENTRONICS.RESET))
	     NIL])
)
(DEFINEQ

(\DANDETIGERP
  [LAMBDA NIL                                                (* hdj " 8-Nov-85 14:00")
    (AND (EQ \MACHINETYPE \DANDELION)
	   (ODDP (\DEVICE.INPUT 8])

(\CENTRONICS-CHECK-FOR-PORT
  [LAMBDA NIL                                                (* hdj " 8-Nov-85 14:05")
    (if (NOT (\DANDETIGERP))
	then (ERROR "This machine has no Centronics port"])
)
(DECLARE: DONTEVAL@LOAD DOCOPY 
(\CreateCentronicsDevice)
)
(PUTPROPS CENTRONICS COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (761 2191 (CENTRONICS.RESET 771 . 1491) (CENTRONICS.BUSYWAIT 1493 . 2189)) (2192 5359 (
\CreateCentronicsDevice 2202 . 2857) (\CENTRONICS.OPENFILE 2859 . 3516) (\CENTRONICS.CLOSEFILE 3518 . 
3734) (\CENTRONICS.BOUT 3736 . 4398) (\CENTRONICS.BUSYWAIT 4400 . 5127) (\CENTRONICS.EVENTFN 5129 . 
5357)) (5360 5789 (\DANDETIGERP 5370 . 5561) (\CENTRONICS-CHECK-FOR-PORT 5563 . 5787)))))
STOP