
enum {
	GDCOPE_REPLACE		= 0,
	GDCOPE_COMPLEMENT	= 1,
	GDCOPE_CLEAR		= 2,
	GDCOPE_SET			= 3
};

typedef struct {
	UINT8	ope;
	UINT8	DC[2];
	UINT8	D[2];
	UINT8	D2[2];
	UINT8	D1[2];
	UINT8	DM[2];
} GDCVECT;

extern const UINT32 gdcplaneseg[4];

typedef void (*GDCSUBFN)(UINT32 csrw, const GDCVECT *vect,
														REG16 pat, REG8 ope);


#ifdef __cplusplus
extern "C" {
#endif

#if !defined(MEMOPTIMIZE) || (MEMOPTIMIZE < 2)
extern const UINT8 gdcbitreverse[0x100];
#define	GDCPATREVERSE(d)		gdcbitreverse[(d) & 0xff]
#else
REG8 gdcbitreverse(REG8 data);
#define	GDCPATREVERSE(d)		gdcbitreverse((REG8)(d))
#endif

void gdcslavewait(NEVENTITEM item);

void gdcsub_initialize(void);
void gdcsub_setslavewait(UINT32 clock);
void gdcsub_setvectl(GDCVECT *vect, int x1, int y1, int x2, int y2);

void gdcsub_vect0(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope);
void gdcsub_vectp(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope);
void gdcsub_vectl(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope);
void gdcsub_vectt(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope);
void gdcsub_vectc(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope);
void gdcsub_vectr(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope);

void gdcsub_text(UINT32 csrw, const GDCVECT *vect, const UINT8 *pat, REG8 ope);
void gdcsub_write(void);

#ifdef __cplusplus
}
#endif

