;;; -*- Mode:LISP; Package:SI; Base:8; Readtable:ZL -*- ;;; Copyright LISP Machine, Inc. 1986 ;;; See filename "Copyright.Text" for ;;; licensing and release information. ;;; NOTE: THIS IS NO LONGER A PATCH FILE 28-Jan-86 19:51:51 -GJC. (DEFCONST LAM-REMOTE-DISK-WRITE-CHECK NIL "T => LAM remote disk handler does read after write") (DEFCONST LAM-DISK-USE-NUBUS-MEMORY-MODE T) (DEFUN MAKE-LAM-DISK-UNIT (UNIT USE &OPTIONAL LAM-DISK-INIT-P WRITE-P &AUX TEM) (DECLARE (SPECIAL REMOTE-DISK-CONN REMOTE-DISK-STREAM REMOTE-DISK-UNIT) (SPECIAL LAM-DISK-UNIT LAM-DISK-INIT-P LAMBDA:LAM-DISK-LOWCORE LAMBDA:LAM-DISK-TYPE)) (COND ((STRING-EQUAL UNIT "LAM") (SETQ TEM (STRING-SEARCH-CHAR #\SP UNIT)) (LET ((LAM-DISK-UNIT (IF (NULL TEM) 0 (READ-FROM-STRING UNIT NIL (1+ TEM))))) (declare (special lam-disk-init-p lam-disk-unit)) (COND ((NOT (ZEROP LAM-DISK-UNIT)) (FERROR NIL "LAM can only talk to unit zero"))) (COND ((NULL LAM-DISK-INIT-P) (LAMBDA:LAM-DISK-INIT) (COND (LAM-DISK-USE-NUBUS-MEMORY-MODE ;Block 2 is part of disk label! (LAMBDA:LAM-DISK-WRITE-VIA-NUBUS 1 LAMBDA:LAM-DISK-LOWCORE 1) ;below code no longer uses (1+ lam-disk-lowcore) ; (LAMBDA:LAM-DISK-WRITE-VIA-NUBUS 3 (1+ LAMBDA:LAM-DISK-LOWCORE) 1) ))) (T (SETQ lambda:LAM-DISK-TYPE T))) ;Dont try to read garbage label, etc. (CLOSURE '(LAM-DISK-UNIT LAM-DISK-INIT-P) 'LAM-DISK-HANDLER))) ((string-equal unit "EXP") (setq tem (string-search-char #\sp unit)) (let ((lam-disk-unit (if (null tem) 0 (read-from-string unit nil (1+ tem))))) (declare (special lam-disk-init-p lam-disk-unit)) (cond ((null lam-disk-init-p) (lam:exp-disk-init) ;this used to save 2 blocks --rg 11/18/85 (lam:exp-disk-write 1 lam:lam-disk-lowcore 1)) (t (setq lambda:lam-disk-type t))) (closure '(lam-disk-unit lam-disk-init-p) 'exp-disk-handler))) ('ELSE (FERROR NIL "LAM debug disk unit only for LAM or EXP")))) (DEFUN LAM-DISK-HANDLER (OP &REST ARGS) (DECLARE (SPECIAL LAM-DISK-UNIT LAM-DISK-INIT-P LAMBDA:LAM-DISK-TYPE)) (SELECTQ OP (:READ (LET* ((RQB (CAR ARGS)) (BLOCK (CADR ARGS)) (N-BLOCKS (ARRAY-LEADER RQB %DISK-RQ-LEADER-N-PAGES))) (DO ((BLOCK BLOCK (1+ BLOCK)) (N-BLOCKS N-BLOCKS (1- N-BLOCKS)) (BUF (RQB-BUFFER RQB)) (BUF-IDX -1)) ((ZEROP N-BLOCKS)) (LAMBDA:LAM-DISK-READ-VIA-NUBUS BLOCK LAMBDA:LAM-DISK-LOWCORE 1) (DO ((ADR (ASH LAMBDA:LAM-DISK-LOWCORE 8) (1+ ADR)) (WORD) (W 0 (1+ W))) (( W 400)) (SETQ WORD (LAMBDA:PHYS-MEM-READ ADR)) (AS-1 (LOGAND 177777 WORD) BUF (SETQ BUF-IDX (1+ BUF-IDX))) (AS-1 (LDB 2020 WORD) BUF (SETQ BUF-IDX (1+ BUF-IDX))))))) (:WRITE (LET* ((RQB (CAR ARGS)) (BLOCK (CADR ARGS)) (N-BLOCKS (ARRAY-LEADER RQB %DISK-RQ-LEADER-N-PAGES))) (DO ((BLOCK BLOCK (1+ BLOCK)) (N-BLOCKS N-BLOCKS (1- N-BLOCKS)) (BUF (RQB-BUFFER RQB)) (BUF-IDX -1)) ((ZEROP N-BLOCKS)) (IF (ZEROP BLOCK) (LAMBDA:READ-LABEL)) ;do it first. (DO ((ADR (ASH LAMBDA:LAM-DISK-LOWCORE 8) (1+ ADR)) (WORD) (W 0 (1+ W))) (( W 400)) (SETQ WORD (DPB (AR-1 BUF (SETQ BUF-IDX (+ 2 BUF-IDX))) 2020 (AR-1 BUF (1- BUF-IDX)))) (LAMBDA:PHYS-MEM-WRITE ADR WORD)) ;; If writing label, init some params such as LAMBDA:BLOCKS-PER-CYLINDER. RETRY (LAMBDA:LAM-DISK-WRITE-VIA-NUBUS BLOCK LAMBDA:LAM-DISK-LOWCORE 1) ;below code clobbers core block +1, and is pretty useless. ; (COND ((AND LAM-REMOTE-DISK-WRITE-CHECK ; (NULL (LAMBDA:LAM-DISK-READ-VIA-NUBUS BLOCK ; (1+ LAMBDA:LAM-DISK-LOWCORE) ; 1))) ; (GO RETRY))) ;read it back to let hardware check ECC, etc. ))) (:DISPOSE (COND ((NULL LAM-DISK-INIT-P) (IF LAM-DISK-USE-NUBUS-MEMORY-MODE (LAMBDA:LAM-DISK-READ-VIA-NUBUS 1 LAMBDA:LAM-DISK-LOWCORE 1)) ;Restore saved core ) (T (SETQ LAMBDA:LAM-DISK-TYPE NIL)))) ;Otherwise read label now that it ; maybe isnt garbage (:UNIT-NUMBER 0) (:MACHINE-NAME "via LAM") (:SAY (FORMAT T "LAM-SAY ~A~%" (CAR ARGS))) (:HANDLES-LABEL NIL)))