;;; ;;; 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