-- DoradoInputOutput.mesa
-- Last Edited by: Taft, April 16, 1983 12:56 pm

DIRECTORY
  DisplayFace USING [Cursor],
  Mopcodes USING [zOR, zLINI, zMISC];

DoradoInputOutput: DEFINITIONS =
  BEGIN

  IOAddress: TYPE = [0..377B];

  -- Read one word from specified slow I/O address
  Input: PROCEDURE [IOAddress] RETURNS [UNSPECIFIED] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 5; END;

  -- Input with parity checking disabled.
  InputNoPE: PROCEDURE [IOAddress] RETURNS [UNSPECIFIED] = MACHINE CODE
    BEGIN Mopcodes.zLINI; Mopcodes.zOR; Mopcodes.zMISC, 5; END;
  
  -- Write one word to specified slow I/O address
  Output: PROCEDURE [datum: UNSPECIFIED, register: IOAddress] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 6; END;

  -- Read one word from External IO port (event counter A must be disabled)
  ExternalInput: PROCEDURE RETURNS [UNSPECIFIED] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 12B; END;
 
  -- Write one word to External IO port (event counter B must be disabled)
  ExternalOutput: PROCEDURE [datum: UNSPECIFIED] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 13B; END;

  -- Operate the event counters
  StartEventCounters: PROCEDURE [EventCounterControl] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 240B; END;

  EventCounterControl: TYPE = MACHINE DEPENDENT RECORD [
    loadInsSet (0: 0..0): BOOLEAN ← FALSE,
    unused1 (0: 1..3): [0..7] ← 0,
    enableA (0: 4..4): BOOLEAN, -- enable event counter A
    enableB (0: 5..5): BOOLEAN, -- enable event counter A
    unused2 (0: 6..7): [0..3] ← 0,
    eventTypeA (0: 8..10): {
      true(0), hold(1), procRef(2), ifuJump(3), miss(4),
      backPanelA(5), backPanelC(6), backPanelE(7)} ← true,
    unused3 (0: 11..11): [0..1] ← 0,
    eventTypeB (0: 12..14): {
      true(0), hold(1), ifuRef(2), ifuNotReady(3), miss(4),
      backPanelB(5), backPanelC(6), backPanelD(7)} ← true,
    tasks (0: 15..15): {emuAndFaultOnly(0), all(1)}];

  ReadEventCounters: PROCEDURE [LONG POINTER TO EventCounterTable] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 241B; END;

  EventCounterTable: TYPE = MACHINE DEPENDENT RECORD [
    eventALo, eventAMid, eventAHi: CARDINAL,
    eventBLo, eventBMid, eventBHi: CARDINAL];

  StopEventCounters: PROCEDURE = MACHINE CODE
    BEGIN Mopcodes.zMISC, 242B; END;

  -- Operate the micro-PC sampling machinery
  SetPCHistogram: PROCEDURE [LONG POINTER TO PCHistogram --NIL to disable--] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 243B; END;

  PCHistogram: TYPE = ARRAY [0..4095] OF LONG CARDINAL;

  -- Operate the Dorado muffler/manifold system.
  RWMufMan: PROCEDURE [MufManArg] RETURNS [MufManResult] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 246B; END;

  MufManArg: TYPE = MACHINE DEPENDENT RECORD [
    useDMD (0: 0..0): BOOLEAN,
    unused (0: 1..3): [0..7] ← NULL,
    dMuxAddr (0: 4..15): DMuxAddr];

  DMuxAddr: TYPE = [0..7777B];

  MufManResult: TYPE = MACHINE DEPENDENT RECORD [
    dMuxData (0: 0..0): [0..1],
    unused (0: 1..15): [0..77777B]];

  -- Reset Ethernet hardware and tasks
  ResetEther: PROCEDURE = MACHINE CODE
    BEGIN Mopcodes.zMISC, 247B; END;  

  -- Get memory configuration
  GetMemConfig: PROC RETURNS [realPages, virtualBanks: CARDINAL] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 251B; END;
  pagesPerBank: CARDINAL = 256;  -- wordsPerBank/wordsPerPage

  -- Halt the Dorado, leaving a specified value on the BMux for the BaseBoard to read
  Halt: PROC [data: UNSPECIFIED] = MACHINE CODE { Mopcodes.zMISC, 252B };

  -- Change the refresh rate on the display
  SetDisplayFieldRate: PROCEDURE [sync, topBorder, visible: CARDINAL] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 253B; END;

  -- Reset disk hardware and task
  -- mode=disable causes disk task to go catatonic.
  ResetDisk: PROCEDURE [mode: MACHINE DEPENDENT {normal(0), disable(1)}] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 254B; END;  

  -- Set interval timer wakeup time
  SetIntervalTimer: PROCEDURE [time: CARDINAL] = MACHINE CODE
    BEGIN Mopcodes.zMISC, 255B; END;  

  -- Exported from ProcessorHeadDorado to UserTerminalHeadDorado for saving cursor
  -- across world-swaps.
  savedCursor: DisplayFace.Cursor;
  
  END.