;;; -*- Mode:LISP; Package:SYSTEM-INTERNALS; Base:10; Readtable:ZL -*-

;;; Copyright LISP Machine, Inc. 1984, 1985, 1986
;;;   See filename "Copyright.Text" for
;;; licensing and release information.

;;; this abstracted (i.e. no debugging specify information contained) DEVICE-DRIVER
;;; for the BURR-BROWN parallel port is not yet used by LAMBDA-DIAG.

;;; Abstracting this is a good way to make it practical to give this
;;;  device driver this microcode support.

(DEFFLAVOR BURR-BROWN-DEBUG-MASTER
	 (MULTIBUS-ADDRESS SHARED-DEVICE (CABLE-LENGTH 0))
	 ()
  (:INITABLE-INSTANCE-VARIABLES MULTIBUS-ADDRESS SHARED-DEVICE)
  (:GETTABLE-INSTANCE-VARIABLES MULTIBUS-ADDRESS SHARED-DEVICE))

(DEFVAR *BURR-BROWN-DEVICE-NAME-AND-ADDRESS* NIL)

(defun add-burr-brown-device (name address config-slot)
  (delq (ass #'string-equal name *BURR-BROWN-DEVICE-NAME-AND-ADDRESS*)
	*BURR-BROWN-DEVICE-NAME-AND-ADDRESS*)
  (setq *BURR-BROWN-DEVICE-NAME-AND-ADDRESS*
	(append *BURR-BROWN-DEVICE-NAME-AND-ADDRESS* (list (list name address))))
  (add-shared-device :name name
		   :shared-device-flavor 'shared-device
		   :sys-conf-owner-index config-slot
		   :default-flavor-and-init-options '(burr-brown-debug-master))
  name)

(ADD-BURR-BROWN-DEVICE "BURR-BROWN-DEBUG-MASTER-1" #X2FF00 %SYSTEM-CONFIGURATION-BURR-BROWN-OWNER)

(ADD-BURR-BROWN-DEVICE "BURR-BROWN-DEBUG-MASTER-2" #X2FE00 %SYSTEM-CONFIGURATION-SECOND-BURR-BROWN-OWNER)

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :AFTER :INIT) (&REST IGNORED)
  (LET* ((NAME (SEND (SEND SHARED-DEVICE :HOST) :NAME))
	 (ADDR (CADR (ASS #'STRING-EQUAL NAME *BURR-BROWN-DEVICE-NAME-AND-ADDRESS*))))
    (WHEN (AND ADDR (NOT (VARIABLE-BOUNDP MULTIBUS-ADDRESS)))
      (SETQ MULTIBUS-ADDRESS ADDR))))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :CLOSE) (&OPTIONAL ABORT-P)
  (SEND SHARED-DEVICE :CLOSE ABORT-P))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :PRINT-SELF) (STREAM &REST IGNORED)
  (FORMAT STREAM "#<~A>" (SEND (SEND SHARED-DEVICE :HOST) :NAME)))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :DRIVE-DATA) ()
  (%NUBUS-WRITE-8 SDU-QUAD-SLOT (+ MULTIBUS-ADDRESS 2) 7))  

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :DONT-DRIVE-DATA) ()
  (%NUBUS-WRITE-8 SDU-QUAD-SLOT (+ MULTIBUS-ADDRESS 2) 4))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :READ-CSR) ()
  (%NUBUS-READ-8 SDU-QUAD-SLOT (+ MULTIBUS-ADDRESS 2)))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :DELAY) ()
  (DOTIMES (J CABLE-LENGTH)
    NIL))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :READ) (REG)
  (SEND SELF :DELAY)
  (SEND SELF :DONT-DRIVE-DATA)
  ;;send the address down
  (%NUBUS-WRITE-8 SDU-QUAD-SLOT
		  (+ MULTIBUS-ADDRESS 6)
		  (+ 0				;NOT REQ.L
		     4
		     (LOGXOR 3 REG)))
  (SEND SELF :DELAY)
  ;;strobe it
  (%NUBUS-WRITE-8 SDU-QUAD-SLOT
		  (+ MULTIBUS-ADDRESS 6)
		  (+ 8				;REQ.L
		     4
		     (LOGXOR 3 REG)))
  (SEND SELF :DELAY)
  (PROG1
    ;;GET DATA
    (LDB (BYTE 16 0) (%NUBUS-READ SDU-QUAD-SLOT (+ MULTIBUS-ADDRESS 4)))
    ;;turn off strobe
    (%NUBUS-WRITE-8 SDU-QUAD-SLOT
		    (+ MULTIBUS-ADDRESS 6)
		    (+ 0
		       4
		       (LOGXOR 3 REG)))))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :WRITE-STROBE) (REG)
  (LET ((INV-REG (LOGXOR 3 REG)))
    (%NUBUS-WRITE-8 #XFF (+ MULTIBUS-ADDRESS 6) (+ 8 INV-REG))	;REQ.L
    (%NUBUS-WRITE-8 #XFF (+ MULTIBUS-ADDRESS 6) INV-REG)))
	    
(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :WRITE-LO-DATA-WIRED) (DATA)
  (%NUBUS-WRITE-8 #XFF (+ MULTIBUS-ADDRESS 4) DATA))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :WRITE-HI-DATA-WIRES) (DATA)
  (%NUBUS-WRITE-8 #XFF (+ MULTIBUS-ADDRESS 5) data))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :WRITE) (REG DATA)
  (let ((ireg (logxor 3 reg)))
    ;;send address
    (%nubus-write-8 sdu-quad-slot
		    (+ MULTIBUS-ADDRESS 6)
		    (+ 0
		       ireg))
    (%nubus-write-8 sdu-quad-slot (+ MULTIBUS-ADDRESS 4) data)
    (%nubus-write-8 sdu-quad-slot (+ MULTIBUS-ADDRESS 5) (ldb (byte 8 8) data))
    ;;assert data
    (SEND SELF :DRIVE-DATA)
    (SEND SELF :DELAY)
    (SEND SELF :WRITE-STROBE REG)
;    ;do strobe
;    (%nubus-write-8 sdu-quad-slot
;		       (+ MULTIBUS-ADDRESS 6)
;		       (+ 8			;reg.l
;			  ireg))
;    (SEND SELF :DELAY)
;    (%nubus-write-8 sdu-quad-slot
;		       (+ MULTIBUS-ADDRESS 6)
;		       (+ 0
;			  ireg))
;    (SEND SELF :DELAY)
    ))


;mode reg bits
;
;  0 hi or lo mode
;  1 reset
;  2 byte

;;	mode		address		read		write
;;	0		0		mode reg	mode reg
;;	0		1		nc		low data
;;	0		2		nc		high data
;;	0		3		nc		nc

;;	1		0		mode reg	mode reg
;;	1		1		start read	start write
;;	1		2		low data	low address
;;	1		3		high data	high address


;;; SOME DIAGNOSTICS

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :INC-DIAG) ()
  (SEND SELF :WRITE 0 0)
  (DO-FOREVER
    (DOTIMES (I (EXPT 2 16))
      (SEND SELF :WRITE 1 I))))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :DIFF-DIAG) ()
  (SEND SELF :write 0 0)
  (do-forever
    (SEND SELF :write 1 #o4000)
    (SEND SELF :write 1 #o5000)
    (SEND SELF :write 1 #o1000)
    (SEND SELF :write 1 #o0000)))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :DIFF1-DIAG) ()
  (SEND SELF :write 0 0)
  (do-forever
    (SEND SELF :write 1 #o0400)
    (SEND SELF :write 1 #o2400)
    (SEND SELF :write 1 #o2000)
    (SEND SELF :write 1 #o0000)))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :WRITE-DATA) (DATA)
  (SEND SELF :write 0 0)
  (SEND SELF :write 1 (ldb (byte 16. 0) data))
  (SEND SELF :write 2 (ldb (byte 16. 16.) data)))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :READ-DATA) ()
  (SEND SELF :write 0 1)
  (dpb (SEND SELF :read 3) (byte 16. 16.) (SEND SELF :read 2)))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :WRITE-ADDR) (ADR)
  (SEND SELF :write 0 1)
  (SEND SELF :write 2 (ldb (byte 16. 0) adr))
  (SEND SELF :write 3 (ldb (byte 16. 16.) adr)))


(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :START-WRITE) ()
  (SEND SELF :write 0 5)
  (SEND SELF :write 1 0))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :START-WRITE-BYTE) ()
  (SEND SELF :write 0 1)
  (SEND SELF :write 1 0))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :START-READ) ()
  (SEND SELF :write 0 5)
  (SEND SELF :read 1))

(DEFMETHOD (BURR-BROWN-DEBUG-MASTER :START-READ-BYTE) ()
  (SEND SELF :write 0 1)
  (SEND SELF :read 1))

(COMPILE-FLAVOR-METHODS BURR-BROWN-DEBUG-MASTER)



