-- DLionInputOutput.mesa
-- Last edited by: Gobbel on: January 23, 1981  1:33 PM

DIRECTORY
  Environment USING [PageCount, PageNumber, wordsPerPage],
  Inline USING [],
  MiscAlpha USING [aINPUT, aOUTPUT],
  Mopcodes USING [zMISC],
  PageMap USING [GetF, RealPageNumber],
  Utilities USING [LongPointerFromPage, PageFromLongPointer];

DLionInputOutput: DEFINITIONS
  IMPORTS Inline, PageMap, Utilities SHARES PageMap =
BEGIN
-- Support for Dandelion heads (device face implementations)
-- I/O page.  The general layout (beginning of each of the csb's) should
-- also be defined here.

IOPage: READONLY LONG POINTER;

RegNum: TYPE = CARDINAL; -- used to index the I/O registers

-- Read one word from specified controller register.
Input: PROC [RegNum] RETURNS [UNSPECIFIED] = MACHINE CODE
  BEGIN Mopcodes.zMISC, MiscAlpha.aINPUT; END;

-- Write one word to specified controller register.
Output: PROC [datum: UNSPECIFIED, register: RegNum] = MACHINE CODE
  BEGIN Mopcodes.zMISC, MiscAlpha.aOUTPUT; END;

-- Return real page number currently mapped to given virtual page.  Undefined
-- if virtual page is not mapped.  The following code could (should) be
-- replaced by GetFlags when it is implemented.  It depends on the fact that
-- on Dandelion only the emulator updates map flags.
GetRealPage: PROC [page: Environment.PageNumber]
  RETURNS [PageMap.RealPageNumber] =
  INLINE {RETURN[PageMap.GetF[page].realPage]};

GetRealAddress: PROC [p: LONG POINTER] RETURNS [rp: LONG POINTER] = INLINE
  BEGIN OPEN Utilities;
  longPtr: TYPE = MACHINE DEPENDENT RECORD [lo, hi: CARDINAL];
  RETURN[
    LOOPHOLE[p, longPtr].lo MOD Environment.wordsPerPage +
      LongPointerFromPage[
	GetRealPage[PageFromLongPointer[p]]]];
  -- this could take advantage of the fact that the add never carries
  END;


-- Memory description and support:

firstReservedPage: PageMap.RealPageNumber = 0; -- special display/raven memory

reservedPageCount: Environment.PageCount = 256;
  -- = [0..377B) = [0..100x) = [0..256D)

firstMapPage: PageMap.RealPageNumber = 256; -- real memory reserved for map
mapPagesCount: Environment.PageCount = 64;
  -- = [0..500B) = [0..140x) = [0..320D)

ioPageNumber: PageMap.RealPageNumber = 320; -- = 140x = 500B
ioPageRealAddr: LONG POINTER = LOOPHOLE[240000B];
  -- = 240000B = 14000x = 81920D
ioPageRealAddrLow: WORD = 40000B; --  low half of ioPageRealAddr

numberVirtualPages: Environment.PageCount = 40000B; -- = 16384D = 4000x

-- used to resolve contention for special memory
ReservedMemoryUse: TYPE = {notBusy, Raven, Display};

SetReservedMemoryUse: PROC
  [use: ReservedMemoryUse, pagesNeeded: Environment.PageCount ← 0];

-- DonateReservedMemory is intended to be called from
-- appropriatly named modules, i.e. FreeAllReservedMemory,
-- FreeReservedMemoryFor8KRaven, FreeReservedMemoryFor12KRaven, etc.
DonateReservedMemory: PROCEDURE [pagesToKeep: Environment.PageCount];

END.

LOG

Time: June 10, 1980  1:51 PM	 	By: Davies
	Action: Create from D0InputOutput of May 15, 1980  10:54 AM.

Time: June 17, 1980  11:53 AM		By: McJones
	Action: Add GetRealPage

Time: June 19, 1980  1:22 PM		By: Forrest
	Action: reformat.

Time: June 23, 1980  12:09 PM		By: Forrest
	Action: Page<=>LongPointer, GetRealAddress.

Time: July 28, 1980  11:27 AM		By: Forrest
	Action: Upgrade to 5.0c build.

Time: July 31, 1980  11:16 PM		By: Forrest
	Action: Fix GetRealAddress.

Time: November 10, 1980  2:23 PM	By: Forrest
	Action: Add memory configuration code AND DonateReservedMemory.

Time: January 22, 1981  11:25 AM	By: Gobbel
	Action: Move DonateReservedMemory to RealMemoryImplDLion.