#define PLATFORM_HC11
#define PLATFORM_SLG


#include <stddef.h>

/* require exactly one of PLATFORM_UNIX or PLATFORM_HC11 */
#ifdef PLATFORM_HC11
#ifdef PLATFORM_UNIX
#ifdef VERIFY
#error "Specify only one of PLATFORM_UNIX or PLATFORM_HC11"
#endif
#else /* ifdef PLATFORM_UNIX */
/* ok -- PLATFORM_HC11 */
#endif /* ifdef PLATFORM_UNIX */
#else /* ifdef PLATFORM_HC11 */
#ifdef PLATFORM_UNIX
/* ok -- PLATFORM_UNIX */
#include "commlib-unix.h"
#else
#ifdef VERIFY
#error "Specify a platform: PLATFORM_UNIX or PLATFORM_HC11"
#endif
#endif /* ifdef PLATFORM_UNIX */
#endif /* ifdef PLATFORM_HC11 */


#ifndef _COMMLIB_COMMON_H_
#define _COMMLIB_COMMON_H_


#define PC_EVENT_UNKNOWN 0
#define PC_EVENT_ACK 1
#define PC_EVENT_NACK 2
#define PC_EVENT_OPEN_FILE 3
#define PC_EVENT_FILE_STATS_QUERY 4
#define PC_EVENT_PLAY_REQUEST 5
#define PC_EVENT_READ_MP3_BYTES 6
#define PC_EVENT_RECEIVE_DECODED_BYTES 7
#define PC_EVENT_DEBUG_MESSAGE 8
#define PC_EVENT_MP3_FILE_SEEK 9
#define PC_EVENT_OUT_FILE_SEEK 10
#define PC_EVENT_SHUTDOWN 11
#define PC_EVENT_RESEND 12

#ifdef PLATFORM_HC11
#define ADDR_C_DATA  ((char*) 0x0000) /* mem-mapped address of port A */
#define ADDR_C_CIN   ((char*) 0x000A) /* mem-mapped address of port E */
#define ADDR_C_COUT  ((char*) 0x007E) /* mem-mapped address of port G */
#define ADDR_C_DDR   ((char*) 0x0001) /* mem-mapped address of A direction */

#define ADDR_P_DATA  ((char*) 0x0000) /* mem-mapped address of port A */
#define ADDR_P_CIN   ((char*) 0x000A) /* mem-mapped address of port E */
#define ADDR_P_COUT  ((char*) 0x007E) /* mem-mapped address of port G */
#define ADDR_P_DDR   ((char*) 0x0001) /* mem-mapped address of A direction */

#elif PLATFORM_UNIX
unsigned char *ADDR_C_DATA;
unsigned char *ADDR_C_CIN;
unsigned char *ADDR_C_COUT;
unsigned char *ADDR_C_DDR;

unsigned char *ADDR_P_DATA;
unsigned char *ADDR_P_CIN;
unsigned char *ADDR_P_COUT;
unsigned char *ADDR_P_DDR;
#endif

#define DATA_OUTPUT_MASK (0x0F)
#define DATA_INPUT_MASK  (0x00)
#define DATA_RELEASE (0x00)

/* communication protocol defines: comm to parent */
#define COMM_C_REQ_BLOCK          0x1
#define COMM_C_DONE_TRANSFER      0x9
#define COMM_C_BYTE_THERE         0x4
#define COMM_C_DONE_BLOCK         0xa
#define COMM_C_NULL               0xf

/* communication protocol defines: comm to child */
#define COMM_P_ACK_REQUEST        0x2
#define COMM_P_START_TRANSFER     0x8
#define COMM_P_NULL               0xf
#define COMM_P_BYTE_THERE         0x4
#define COMM_P_DONE_BLOCK         0xa
#define COMM_P_DONE_TRANSFER      0x9


typedef struct {
  unsigned char EventID;
  unsigned char DataLength;
  unsigned char Data[257]; /* this may not be entirely filled */
  /* checksum contained in last part of Data */
} pcdata;

#ifndef PLATFORM_SLG
#define SEND(port,message) { *port = message; }
#define WAIT(port,message) { while(*port != message) /* nop */; }
#define WAIT_NOT(port,message) { while(*port == message) /* nop */; }
#define RECV(port,message) { *message = *port; }
#endif /* ifndef PLATFORM_SLG */

void commlib_init();
/* commlib_init: call this before even thinking about using any of the
 * commlib functions */

#endif /* ifdef  _COMMLIB_COMMON_H_ */



