;;; -*- Mode:LISP; Package:LISP-INTERNALS; Base:10; Readtable:CL -*-

;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Generic paging devices
;;;;;;;;;;;;;;;;;;;;;;;;;;;

(li:defstruct (paging-device :named (:conc-name "PAGING-DEVICE-"))
  status-generator

  opener
  closer

  quantum-allocator
  quantum-deallocator
  
  reader-initializer
  next-cluster-reader
  reader-activate

  writer-initializer
  next-cluster-writer
  writer-activate

  operation-completer)

(defmacro define-generic-paging-device-operation (name args accessor)
  `(PROGN (DEFUN ,name ,args (FUNCALL (,accessor ,(car args)) ,@args))
	  (EXPORT '(,name))))
	  
(define-generic-paging-device-operation paging-device-status (device) paging-device-status-generator)

(define-generic-paging-device-operation open-paging-device   (device) paging-device-opener)
(define-generic-paging-device-operation close-paging-device  (device) paging-device-closer)

(define-generic-paging-device-operation allocate-quantum     (device) paging-device-quantum-allocator)
(define-generic-paging-device-operation deallocate-quantum   (device dqin) paging-device-quantum-deallocator)

(define-generic-paging-device-operation begin-read
					(device dqin relative-cluster-in-quantum)
  paging-device-reader-initializer)

(define-generic-paging-device-operation next-read-cluster
					(device physical-cluster-number)
  paging-device-next-cluster-reader)

(define-generic-paging-device-operation do-the-read (device)
  paging-device-reader-activate)


(define-generic-paging-device-operation begin-write
					(device dqin relative-cluster-in-quantum)
  paging-device-writer-initializer)

(define-generic-paging-device-operation next-write-cluster
					(device physical-cluster-number)
  paging-device-next-cluster-writer)

(define-generic-paging-device-operation do-the-write (device)
  paging-device-writer-activate)


(define-generic-paging-device-operation operation-complete (device)
  paging-device-operation-completer)

;;; Paging devices 12/10/87

(defvar *paging-devices* nil)

(defun make-paging-devices (&optional (number-of-devices 16.))
  (setq *paging-devices* (array:make-1d-array number-of-devices))
  )

(defvar *null-paging-device*         0)
(defvar *boot-band-paging-device-id* 1)
(defvar *page-band-paging-device-id* 2)


