/*
	CPUボードとパソコンの通信プログラム: CPUボード用

	内容
	パソコンから数字2個 (2バイト) を受け取る
	簡単な計算をする
	計算結果2バイトをパソコンに送る
*/

#include <dos.h>
#include "usblib.h"
#include "iolib.h"

#define MEM_SEG 0x8080	/* Segment for Memory */
#define MEM_OFS 0x0000	/* Offset for Memory */
#define IOBASE 0x8200	/* I/O Base Address */

#define BUFSIZE 64
unsigned char in[BUFSIZE];
unsigned char out[BUFSIZE];

/***** パソコンからデータを受け取る ****/
void receive(unsigned char *buf, unsigned int size)
/*
	buf: 受け取ったデータを格納する配列
	size: 受け取るデータのバイト数
*/
{
  static struct USBUFCON ep_recv;

  ep_recv.buffer_pointer  = buf;
  ep_recv.buffer_counter  = size;
  ep_recv.xfr_done        = 0;
  ep_recv.req_task        = -1;
  systrap(RQ_SET_USBBUF | (EP_USR_BOUT << 8), (unsigned int)&ep_recv);
  systrap(RQ_OFF, -1);
}

/**** パソコンにデータを送る ****/
void send(unsigned char *buf, unsigned int size)
/*
	buf: 送るデータを格納する配列
	size: 送るデータのバイト数
*/
{
  struct USBUFCON ep_send;

  ep_send.buffer_pointer  = buf;
  ep_send.buffer_counter  = size;
  ep_send.xfr_done        = 0;
  ep_send.req_task        = -1;
  systrap(RQ_SET_USBBUF | (EP_USR_BIN << 8), (unsigned int)&ep_send);
  systrap(RQ_OFF, -1);
}

void user_task()
{
  int a, b, i;

  setup_ioreg();

  for (i = 0; i < 6; i++) {
    outport8(IOBASE + 0x08 + i, 0);
  }
  outport8(IOBASE + 0x01, ~0);

  while(1) {

    LED_on();

    /**** パソコンからデータを受け取る ****/
    receive(in, 2);  /* 配列inに2バイトのデータが入る */

    /**** 計算する ****/
    out[0] = in[0] + in[1];
    out[1] = in[0] * in[1];

    LED_off();

    /**** パソコンにデータを送る ****/
    send(out, 2);  /**** パソコンにデータを送る ****/
  }
}