-- Rapunzel.mesa
-- Willie-Sue	10-Oct-86 13:55:48 PDT

DIRECTORY System;

Rapunzel: DEFINITIONS
 = {

  BindHandle: TYPE = LONG POINTER TO READONLY BindObject;
  BindObject: TYPE;

  Short: TYPE = CARDINAL;

  Long: TYPE = LONG CARDINAL;

  SeqShort: TYPE = LONG DESCRIPTOR FOR ARRAY SeqShortIndex OF Short;
  SeqShortIndex: TYPE = CARDINAL;

  Address: TYPE = LONG CARDINAL;

  PeekShortCmd: TYPE = RECORD [address: Address];

  PokeShortCmd: TYPE = RECORD [address: Address, value: Short];

  OpCode: TYPE = MACHINE DEPENDENT {peekShort(0), pokeShort(1), (CARDINAL.LAST - 1)};

  Cmd: TYPE = RECORD[ 
    SELECT tag: OpCode FROM
      peekShort => [peekShort: PeekShortCmd], 
      pokeShort => [pokeShort: PokeShortCmd],
      ENDCASE];

  SeqCmd: TYPE = LONG DESCRIPTOR FOR ARRAY SeqCmdIndex OF Cmd;
  SeqCmdIndex: TYPE = CARDINAL;

  PeekShortResult: TYPE = RECORD [value: Short];

  PokeShortResult: TYPE = RECORD [];

  Result: TYPE = RECORD[ 
    SELECT tag: OpCode FROM
      peekShort => [peekShort: PeekShortResult], 
      pokeShort => [pokeShort: PokeShortResult],
      ENDCASE];

  SeqResult: TYPE = LONG DESCRIPTOR FOR ARRAY SeqResultIndex OF Result;
  SeqResultIndex: TYPE = CARDINAL;

  Fault: ERROR [
    bH: BindHandle, code: FaultCode, address: Address];

  FaultCode: TYPE = MACHINE DEPENDENT {nonexistent(1), protection(2), alignmentShort(3), alignmentLong(4), (CARDINAL.LAST - 1)};

  DoCmds: PROCEDURE [
    bH: BindHandle, cmdSeq: LONG POINTER TO SeqCmd]
    RETURNS [resultSeq: LONG POINTER TO SeqResult];

  FreeDoCmdsResults: PROCEDURE[bH: BindHandle, resultSeq: LONG POINTER TO SeqResult];

  PeekShort: PROCEDURE [
    bH: BindHandle, address: Address]
    RETURNS [result: Short];

  PokeShort: PROCEDURE [
    bH: BindHandle, address: Address, value: Short];

  PeekSeqShort: PROCEDURE [
    bH: BindHandle, address: Address, count: CARDINAL]
    RETURNS [resultSeq: LONG POINTER TO SeqShort];

  FreePeekSeqShortResults: PROCEDURE[bH: BindHandle, resultSeq: LONG POINTER TO SeqShort];

  PokeSeqShort: PROCEDURE [
    bH: BindHandle, address: Address, valueSeq: LONG POINTER TO SeqShort];

  PeekLong: PROCEDURE [
    bH: BindHandle, address: Address]
    RETURNS [result: Long];

  PokeLong: PROCEDURE [
    bH: BindHandle, address: Address, value: Long];

  RemoteBind: PROCEDURE [
    host: System.NetworkAddress, zone: UNCOUNTED ZONE ← NIL]
    RETURNS[bH: BindHandle];

  RemoteUnbind: PROCEDURE[bH: BindHandle] RETURNS [nil: BindHandle];



  }.