#include "commlib-parent.h"

#ifdef PLATFORM_HC11
#ifndef PLATFORM_SLG
#include <hidef.h>
#include <stddef.h>
#include <stdtypes.h>
#include <Terminal.h>
#include <startup.h>
#endif /* ifdef PLATFORM_SLG */
#include <assert.h>

#endif /* ifdef PLATFORM_HC11 */


void parent_write_block_to_child(char *data, int n) {
  int i;

  WAIT(ADDR_P_CIN,COMM_C_REQ_BLOCK); /* this should be unnecessary */
  SEND(ADDR_P_COUT,COMM_P_ACK_REQUEST);
  *ADDR_P_DDR = DATA_OUTPUT_MASK;
  WAIT(ADDR_P_CIN,COMM_C_NULL);

  for(i=0; i<n; ++i) {
    SEND(ADDR_P_DATA,data[i]);
    SEND(ADDR_P_COUT,COMM_P_BYTE_THERE);
    WAIT(ADDR_P_CIN,COMM_C_BYTE_THERE);

    SEND(ADDR_P_COUT,COMM_P_NULL);
    WAIT(ADDR_P_CIN,COMM_C_NULL);
  }

  SEND(ADDR_P_COUT,COMM_P_DONE_TRANSFER);
  *ADDR_P_DDR = DATA_RELEASE;
  WAIT(ADDR_P_CIN,COMM_C_DONE_TRANSFER);
  SEND(ADDR_P_COUT,COMM_P_NULL);
#if 0
  WAIT(ADDR_P_CIN,COMM_C_NULL);
#endif
  
} /* parent_write_block_to_child */

int parent_read_block_from_child(char *dest) {
  int bytes_received = 0;

  *ADDR_P_DDR = DATA_INPUT_MASK;
  WAIT(ADDR_P_CIN,COMM_C_DONE_BLOCK); /* this should be unnecessary */
  SEND(ADDR_P_COUT,COMM_P_START_TRANSFER);

  WAIT_NOT(ADDR_P_CIN,COMM_C_DONE_BLOCK);
  while(*ADDR_P_CIN != COMM_C_DONE_TRANSFER) {
    if(*ADDR_P_CIN != COMM_C_BYTE_THERE)
    assert(*ADDR_P_CIN == COMM_C_BYTE_THERE);

    RECV(ADDR_P_DATA,dest);
    SEND(ADDR_P_COUT,COMM_P_BYTE_THERE);

    WAIT(ADDR_P_CIN,COMM_C_NULL);
    SEND(ADDR_P_COUT,COMM_P_NULL);

    ++bytes_received;
    ++dest;

    WAIT_NOT(ADDR_P_CIN,COMM_C_NULL);
  }
  *ADDR_P_DDR = DATA_RELEASE;

  SEND(ADDR_P_COUT,COMM_P_DONE_TRANSFER);
  WAIT(ADDR_P_CIN,COMM_C_NULL);
  SEND(ADDR_P_COUT,COMM_P_NULL);

  return bytes_received;
} /* parent_read_block_from_child */
