?? NEWTITLE := '~~~~~   common deck DSI$TRANSMIT_DATA_VIA_SSR', EJECT ??
{*********************************************************}
{}
{ SSR helper routines for resource requests, deck DSI$TRANSMIT_DATA_VIA_SSR}
{}
{*********************************************************}

  TYPE
    transfer_entry = record
      offset: 0 .. 0ffffffff(16),
      length: 0 .. 0ffffffff(16),
    recend;

  VAR
    dsv$send_buffer: integer := 0,
    dsv$receive_buffer: integer := 0;

?? SKIP := 3 ??

  PROCEDURE [XDCL] dsp$receive_data_via_ssr ALIAS 'dsp$rec' (VAR buffer: ^SEQ (
    * ));

    VAR
      left: integer,
      right: integer,
      entry: transfer_entry,
      cm_copy_info: memory_copy_header;

    IF dsv$receive_buffer = 0 THEN
      find_ssr_entry (dsc$ssr_c180_transfer_buffer, dsv$receive_buffer);
      get_ssr_directory_entry (dsv$receive_buffer, left, right);
      dsv$receive_buffer := right * 8;
    IFEND;

{ read buffer descriptor rma from nve
    get_ssr_data (dsv$receive_buffer, ^entry, 2);
    IF exitcd = 0 THEN
      error_processor (nosve_down, fatal_error);
    IFEND;

    buffer := NIL;

    IF entry.offset > 0 THEN
{ read data into stack
      cm_copy_info.byte_rma := entry.offset;
      cm_copy_info.length := (entry.length + 14) DIV 15 * 2;
      cm_copy_info.copy_method := ve64_to_nos60;
      cm_copy_info.pva_type := start_of_mf_wired;

      ALLOCATE buffer: [[REP cm_copy_info.length OF integer]];
      RESET buffer;
      copy_memory (cm_copy_info, buffer);

{ clear descriptor rma
      entry.offset := 0;
      entry.length := 0;
      store_ssr_data (dsv$receive_buffer, ^entry, 2);
    IFEND;
  PROCEND dsp$receive_data_via_ssr;
?? SKIP := 3 ??

  PROCEDURE [XDCL] dsp$send_data_via_ssr ALIAS 'dsp$sen' (data: ^cell,
        data_length: integer);

    VAR
      cm_copy_info: memory_copy_header,
      entry: transfer_entry,
      left: integer,
      right: integer;

    IF dsv$send_buffer = 0 THEN
      find_ssr_entry (dsc$ssr_c170_transfer_buffer, dsv$send_buffer);
      get_ssr_directory_entry (dsv$send_buffer, left, right);
      dsv$send_buffer := right * 8;
    IFEND;

    get_ssr_data (dsv$send_buffer, ^entry, 2);
    WHILE entry.length > 0 DO
      wakeup;
      get_ssr_data (dsv$send_buffer, ^entry, 2);
      IF exitcd = 0 THEN
        error_processor (nosve_down, fatal_error);
      IFEND;
    WHILEND;

{ Set transmit buffer size in c170_send_buffer.

    entry.length := (data_length + 1) DIV 2 * 15;
    store_ssr_data (dsv$send_buffer, ^entry, 2);

{ Await receive buffer offset preset in c70_send_buffer from 180 side.

    REPEAT
      wakeup;
      get_ssr_data (dsv$send_buffer, ^entry, 2);
      IF exitcd = 0 THEN
        error_processor (nosve_down, fatal_error);
      IFEND;
    UNTIL entry.offset > 0;

{ send information to NOS/ve
    cm_copy_info.byte_rma := entry.offset;
    cm_copy_info.length := (data_length + 1) DIV 2 * 2;
    cm_copy_info.copy_method := nos60_to_ve64;
    cm_copy_info.pva_type := start_of_mf_wired;

    copy_memory (cm_copy_info, data);

    entry.offset := 0;
    store_ssr_data (dsv$send_buffer, ^entry.offset, 1);
  PROCEND dsp$send_data_via_ssr;

?? OLDTITLE ??
