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


(defvar *my-area*
	(make-area :name '*my-area* :gc :fixed))

(defun init-my-area ()
  (when (minusp (%area-region-list *my-area*))
    (%make-region *my-area* (area-region-bits *my-area*) #o40000))
  (%use-up-region (area-region-list *my-area*))
  (%wire-area *my-area* t))

(defun area-bounds (area)
  (let ((region (%area-region-list area)))
    (or (minusp (%region-list-thread region)) ;last region in area
	(ferror "area ~a has more than one region" (area-name area)))
    (let ((start (%region-origin region)))
      (values start (+ start (%region-length region))))))

(defvar *my-area-start* (area-bounds *my-area*))

(defun store-nubus-address (pointer vadr)
  (let* ((padr (%physical-address vadr))
	 (nubus (%nubus-physical-address (ldb (byte 22. 8) padr)))
	 (tag (ldb (byte 7 15) nubus))
	 (bottom1 (ldb (byte 15 0) nubus))
	 (bottom2 (ldb (byte 8 0) padr))
	 (bottom (%logdpb bottom1 (byte 15 10)
			  (%logdpb bottom2 (byte 8 2) 0))))
    (%p-store-tag-and-pointer pointer tag bottom)))

(defsetf virtual-address store-nubus-address)


(defvar *screen-pointer* (...))

(defmacro master-table-screen (pointer)
  (virtual-address (%pointer-plus pointer 4)))

(setf (master-table-screen *master-table-pointer*) *screen-pointer*)