#include "commlib-child.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 */


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

  /* begin send */
  SEND(ADDR_C_COUT,COMM_C_REQ_BLOCK);
  WAIT(ADDR_C_CIN,COMM_P_ACK_REQUEST);

  *ADDR_C_DDR = DATA_INPUT_MASK;
  SEND(ADDR_C_COUT,COMM_C_NULL); /* tell parent ready to receive */

  WAIT_NOT(ADDR_C_CIN,COMM_P_ACK_REQUEST); /* wait for start or end */

  while(*ADDR_C_CIN != COMM_P_DONE_TRANSFER) {
    assert(*ADDR_C_CIN == COMM_P_BYTE_THERE);

    RECV(ADDR_C_DATA,dest);
    SEND(ADDR_C_COUT,COMM_C_BYTE_THERE);

    WAIT(ADDR_C_CIN,COMM_P_NULL);
    SEND(ADDR_C_COUT,COMM_C_NULL);

    ++bytes_received;
    ++dest;

    WAIT_NOT(ADDR_C_CIN,COMM_P_NULL);
  }
  *ADDR_C_DDR = DATA_RELEASE;

  SEND(ADDR_C_COUT,COMM_C_DONE_TRANSFER);
  WAIT(ADDR_C_CIN,COMM_P_NULL);
  SEND(ADDR_C_COUT,COMM_C_NULL);

  return bytes_received;
} /* child_req_block_from_parent */


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

  /* begin send */
  SEND(ADDR_C_COUT,COMM_C_DONE_BLOCK);
  *ADDR_C_DDR = DATA_OUTPUT_MASK; /* do this while waiting for parent */
  WAIT(ADDR_C_CIN,COMM_P_START_TRANSFER);

  for(i=0; i<n; ++i) {
    SEND(ADDR_C_DATA,data[i]);
    SEND(ADDR_C_COUT,COMM_C_BYTE_THERE);
    WAIT(ADDR_C_CIN,COMM_P_BYTE_THERE);

    SEND(ADDR_C_COUT,COMM_C_NULL);
    WAIT(ADDR_C_CIN,COMM_P_NULL);
  }
  SEND(ADDR_C_COUT,COMM_C_DONE_TRANSFER);
  *ADDR_C_DDR = DATA_RELEASE; /* do this while waiting for parent */
  WAIT(ADDR_C_CIN,COMM_P_DONE_TRANSFER);

  SEND(ADDR_C_COUT,COMM_C_NULL);
  WAIT(ADDR_C_CIN,COMM_P_NULL);

} /* child_write_block_to_parent */

