

  CONST
    rmb_utility_name = 'REAL_MEMORY_BUILDER            ',
    rmb_prompt_string = 'RMB',
    occ$max_retries = 100;


  TYPE
    oct$build_options = record
      page_size: ost$page_size,
      page_table_address: ost$real_memory_address,
      page_table_length: 4096 .. 1048576,
      load_address: ost$real_memory_address,
      load_offset: ost$real_memory_address,
      memory_map: clt$file,
      c170_memory_size: integer,
      ssr_size: integer,
      job_exchange_address: oct$exchange_name,
      monitor_exchange_address: oct$exchange_name,
      pp_address_array_address: oct$exchange_name,
      pages_loaded_address: oct$exchange_name,
      page_size_address: oct$exchange_name,
      define_commands: oct$define_command_list,
      load_files: oct$load_file_list,
      monitor_symbol_tables: oct$symbol_table_list,
      job_symbol_tables: oct$symbol_table_list,
      segment_commands: oct$segment_command_list,
      memory_commands: oct$memory_command_list,
      bytes_loaded_address: oct$exchange_name,
      building_ei: boolean,
    recend;


  TYPE
    oct$exchange_address = record
      address_space: oct$address_space_id,
      segment: ost$segment,
      segment_offset: ost$segment_offset,
    recend,


    oct$exchange_name = record
      address_space: oct$address_space_id,
      name: pmt$program_name,
    recend;


  TYPE
    oct$address_space_id = (occ$null, occ$mtr, occ$job, occ$both);


  TYPE
    oct$parameter = (occ$attributes, occ$ring_brackets, occ$asid, occ$gl_key),

    oct$parameters = set of oct$parameter,

    oct$display_memory_options = (occ$all, occ$page_table, occ$memory_map,
      occ$mps, occ$jps),

    oct$segment_command_kind = (occ$change, occ$share, occ$extend),

    oct$memory_command_kind = (occ$display_memory, occ$display_memory_address),

    oct$define_command_list = record
      parameters: oct$parameters,
      address_space: oct$address_space_id,
      segment_id: pmt$program_name,
      segment_number: ost$segment,
      address: ost$real_memory_address,
      length: ost$segment_length,
      contiguous_space: boolean,
      hardware_attributes: ost$segment_access_control,
      software_attributes: mmt$software_attribute_set,
      r1: ost$valid_ring,
      r2: ost$valid_ring,
      active_segment_id: ost$asid,
      key_lock: ost$key_lock,
      link: ^oct$define_command_list,
    recend,

    oct$segment_command_list = record
      address_space: oct$address_space_id,
      segment_number: ost$segment,
      link: ^oct$segment_command_list,

      case kind: oct$segment_command_kind of
      = occ$change =
        parameters: oct$parameters,
        address: ost$real_memory_address,
        length: ost$segment_length,
        hardware_attributes: ost$segment_access_control,
        software_attributes: mmt$software_attribute_set,
        r1: ost$valid_ring,
        r2: ost$valid_ring,
        active_segment_id: ost$asid,
        key_lock: ost$key_lock,

      = occ$share =
        new_address_space: oct$address_space_id,
        new_segment_number: ost$segment,

      = occ$extend =
        extend_length: ost$segment_length,
      casend,
    recend,

    oct$memory_command_list = record
      file_name_specified: boolean,
      link: ^oct$memory_command_list,
      output: clt$file,

      case kind: oct$memory_command_kind of
      = occ$display_memory =
        memory: oct$display_memory_options,

      = occ$display_memory_address =
        display_address: ost$real_memory_address,
        length: ost$real_memory_address,
      casend,
    recend;


  TYPE
    oct$load_file_list = record
      name: amt$local_file_name,
      address_space: oct$address_space_id,
      link: ^oct$load_file_list,
    recend;


  TYPE
    oct$file_descriptor = record
      name: amt$local_file_name,
      id: amt$file_identifier,
      segment: amt$segment_pointer,
    recend;


  TYPE
    oct$symbol_table_list = record
      name: amt$local_file_name,
      link: ^oct$symbol_table_list,
    recend;


  TYPE
    oct$page_table = array [ * ] of ost$page_table_entry,

    oct$real_memory_descriptor = record
      id: amt$file_identifier,
      segment: amt$segment_pointer,
      length: 0 .. 100000000(16),
      page_table: ^oct$page_table,
      page: ^array [0 .. * ] of record
        reserved: boolean,
        continue_bits: 0 .. 0ffffffff(16),
      recend,
      reserved_asids: oct$reserved_asids,
      next_free_page: ost$real_memory_address,
      pt_continue_bits: integer,
    recend;


  TYPE
    oct$segment_descriptor = record
      segment_id: pmt$program_name,
      ste: ost$segment_descriptor,
      software_attributes: mmt$software_attribute_set,
      pages: ^oct$page_descriptor,
      asid: ^oct$asid,
      segment_number: ost$segment,
      segment_length: ^ost$segment_length,
      link: ^oct$segment_descriptor,
    recend,


    oct$asid = record
      assigned: boolean,
      predefined: boolean,
      active_segment_id: ost$asid,
    recend;


  TYPE
    oct$segment_descriptors = array [1 .. * ] of oct$segment_descriptor;


  TYPE
    oct$page_descriptor = record
      offset: ost$real_memory_address,
      link: ^oct$page_descriptor,
    recend,

    oct$page_descriptors = array [0 .. * ] of oct$page_descriptor;


  TYPE
    oct$exchange_package_info = record
      p_address: ost$pva,
      binding_address: ost$pva,
      address_space: oct$address_space_id,
      exchange_address: oct$exchange_address,
      rma: ost$real_memory_address,
      segment_descriptor_list: oct$segment_descriptor,
      symbol_table: ^oct$symbol_table,
    recend;


  TYPE
    oct$symbol_table = array [1 .. * ] of oct$symbol_table_entry,

    oct$symbol_table_entry = record
      name: pmt$program_name,
      pva: ost$pva,
    recend;


  TYPE
    oct$reserved_asids = record
      asid: ost$asid,
      link: ^oct$reserved_asids,
    recend;


  TYPE
    oct$half_word = record
      case 0 .. 1 of
      = 0 =
        rma: ost$halfword,
      = 1 =
        address_1: 0 .. 0ffff(16),
        address_2: 0 .. 0ffff(16),
      casend,
    recend;


  TYPE
    oct$display_word = record
      upper_half: ost$halfword,
      lower_half: ost$halfword,
    recend;


  TYPE
    oct$pva = record
      case 0 .. 1 of
      = 0 =
        pva: ost$pva,
      = 1 =
        reg: ^cell,
      casend,
    recend;


?? EJECT ??



?? EJECT ??

*copyc OST$SEGMENT_ACCESS_CONTROL
*copyc OST$VIRTUAL_MACHINE_IDENTIFIER
*copyc OSD$VIRTUAL_ADDRESS
*copyc OST$SEGMENT_DESCRIPTOR
*copyc PMT$PROGRAM_DESCRIPTION
*copyc OST$STRING
*copyc MMT$ATTRIBUTE_KEYWORD
*copyc AMT$FILE_IDENTIFIER
*copyc AMT$SEGMENT_POINTER
