;;;
;;; ata-hd.lisp
;;;
;;; Quick hack ATA HD driver.
;;;

(in-package "SB!OS-KERNEL")

(locally
    (declare (optimize (speed 3) (safety 0)))

  (defun hd-wait-busy ()
    (loop while (logbitp 7 (port-byte #x1f7))))

  (defun hd-wait-ready ()
    (loop until (logbitp 3 (port-byte #x1f7))))

  (defun hd-set-sector (sector one)
    (declare (fixnum sector one))
    (setf (port-byte #x1f2) one)
    (setf (port-byte #x1f3) (ldb (byte 8 0) sector))
    (setf (port-byte #x1f4) (ldb (byte 8 8) sector))
    (setf (port-byte #x1f5) (ldb (byte 8 16) sector))
    (setf (port-byte #x1f6) (logior #xe0 (ldb (byte 5 24) sector))))

  (defun hd-read-sector (sector data)
    (hd-wait-busy)
    (hd-set-sector sector 1)
    (setf (port-byte #x1f7) #x20)
    (hd-wait-ready)
    (read-port-words #x1f0 (sb!sys:int-sap data) #x100))

  (defun hd-write-sector (sector data)
    (hd-wait-busy)
    (hd-set-sector sector 1)
    (setf (port-byte #x1f7) #x30)
    (hd-wait-ready)
    (write-port-words #x1f0 (sb!sys:int-sap data) #x100))

  #+(or)
  (defun test-hd-read ()
    (hd-read-sector 0 #x8000)
    (if (= (sap-ref-16 (sb!sys:int-sap #x8000) #x1fe) #xaa55)
	(display-char #\!)
	(display-char #\?))))

;;; EOF
