/*
 * $Id: m_debug.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 *
 * */

#ifndef INCLUDE_M_DEBUG_H
#define INCLUDE_M_DEBUG_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include <ultratypes.h>		/* u8 */
    
/************************************************************************
 *
 *	デバッグモードクラス
 *
 ************************************************************************/

#define	DEBUG_KEYWAIT	16
#define	DEBUG_KEYWAIT_T	1

enum debug_type_e {
#define decl(a, reg, k1, k2) DEBUG_TYPE_##reg,
#include "m_debug.decl"
    DEBUG_TYPE_MAX
#undef decl
};

//#define	DEBUG_TYPE_MAX	(38)

#define	DEBUG_REG_MAX	16
#define	DEBUG_REG_GRP	6

typedef struct {
#if 0
    int		mode;
    int		type;
    int		input_r;
    int		old_key;
    int		key_wait;
    short	r[DEBUG_REG_MAX * (DEBUG_REG_GRP * DEBUG_TYPE_MAX)];
#endif
    /* private */
    u8		mode;		/* 0-6 */
    u8		type;		/* 0-DEBUG_TYPE_MAX(29) */
    s8		input_r;	/* 0-DEBUG_REG_MAX(16) */
    s8		key_wait;	/* -1 - DEBUG_KEYWAIT(16) */
    int		old_key;
    int		__pad1;
    int		__pad2;
    int		__pad3;
    /* public */
    short	r[DEBUG_REG_MAX * (DEBUG_REG_GRP * DEBUG_TYPE_MAX)];
} Debug_mode;

extern Debug_mode	*debug_mode;	/* デバッグモードクラスポインター */

#define	GETSETREG(g, n)	(debug_mode->r[(n)+(DEBUG_REG_MAX*DEBUG_REG_GRP*DEBUG_TYPE_##g)])
   
#define VOID_GETREG(g, n)	((void)(n), (short)0)
#define VOID_SETREG(g, n, v)	(void)((void)(n), (v))

#ifndef VOID_REG
#define GETREG(g, n)		(short)GETSETREG(g, n)
#define SETREG(g, n, v)		(GETSETREG(g, n) = (v))
#define CALC_REG(g, n, c, v)	(GETSETREG(g, n) c##= (v))
#else
#define GETREG(g, n)		VOID_GETREG(g, n)
#define SETREG(g, n, v)		VOID_SETREG(g, n, v)
#define CALC_REG(g, n, c, v)	(VOID_SETREG(g, n, v), (void)#c)
#endif

#if 1
#define GETSET_OR_GETREG(g, n) GETSETREG(g, n)
#else
#define GETSET_OR_GETREG(g, n) GETREG(g, n)
#endif
    
#define	GET_REG(n)	GETREG(REG, n)
#define	GETSREG(n)	GETREG(SREG, n)
#define	GETOREG(n)	GETREG(OREG, n)
#define	GETPREG(n)	GETREG(PREG, n)
#define	GETQREG(n)	GETREG(QREG, n)
#define	GETMREG(n)	GETREG(MREG, n)
#define	GETSBREG(n)	GETREG(SBREG, n)
#define	GETDREG(n)	GETREG(DREG, n)
#define	GETUREG(n)	GETREG(UREG, n)
#define	GETIREG(n)	GETREG(IREG, n)
#define	GETZREG(n)	GETREG(ZREG, n)
#define	GETCRV(n)	GETREG(CRV, n)
#define	GETNS1(n)	GETREG(NS1, n)
#if DEBUG
#define	GETSND(n)	GETREG(SND, n)
#endif
#define	GETXREG(n)	GETREG(XREG, n)
#define	GETCRV2(n)	GETREG(CRV2, n)
#if DEBUG
#define	GETDEMOREG(n)	GETREG(DEMOREG, n)
#endif
#define	GETTREG(n)	GETREG(TREG, n)
#define	GETWREG(n)	GETREG(WREG, n)
#define	GETAREG(n)	GETREG(AREG, n)
#define	GETVREG(n)	GETREG(VREG, n)
#define	GETHREG(n)	GETREG(HREG, n)
#define	GETGREG(n)	GETREG(GREG, n)
#define	GETmREG(n)	GETREG(mREG, n)
#define	GETnREG(n)	GETREG(nREG, n)
#define	GETBREG(n)	GETREG(BREG, n)
#define	GETDORO(n)	GETREG(DORO, n)
#if DEBUG
#define	GETkREG(n)	GETREG(kREG, n)
#endif
#define	GETBAK(n)	GETREG(BAK, n)
#define	GETPLAYERREG(n)	GETREG(PLAYERREG, n)
#if DEBUG
#define	GETOTUREG(n)	GETREG(OTUREG, n)
#define	GETNIIREG(n)	GETREG(NIIREG, n)
#define	GETGENREG(n)	GETREG(GENREG, n)
#define	GETMYKREG(n)	GETREG(MYKREG, n)
#define	GETCAMREG(n)	GETREG(CAMREG, n)
#define	GETSAKREG(n)	GETREG(SAKREG, n)
#define	GETTAKREG(n)	GETREG(TAKREG, n)
#endif
#define	GETPL2REG(n)	GETREG(PL2REG7, n)

#define	SET_REG(n, v)	SETREG(REG, n, v)
#define	SETSREG(n, v)	SETREG(SREG, n, v)
#define	SETOREG(n, v)	SETREG(OREG, n, v)
#define	SETPREG(n, v)	SETREG(PREG, n, v)
#define	SETQREG(n, v)	SETREG(QREG, n, v)
#define	SETMREG(n, v)	SETREG(MREG, n, v)
#define	SETSBREG(n, v)	SETREG(SBREG, n, v)
#define	SETDREG(n, v)	SETREG(DREG, n, v)
#define	SETUREG(n, v)	SETREG(UREG, n, v)
#define	SETIREG(n, v)	SETREG(IREG, n, v)
#define	SETZREG(n, v)	SETREG(ZREG, n, v)
#define	SETCRV(n, v)	SETREG(CRV, n, v)
#define	SETNS1(n, v)	SETREG(NS1, n, v)
#if DEBUG
#define	SETSND(n, v)	SETREG(SND, n, v)
#endif
#define	SETXREG(n, v)	SETREG(XREG, n, v)
#define	SETCRV2(n, v)	SETREG(CRV2, n, v)
#if DEBUG
#define	SETDEMOREG(n, v)	SETREG(DEMOREG, n, v)
#endif
#define	SETTREG(n, v)	SETREG(TREG, n, v)
#define	SETWREG(n, v)	SETREG(WREG, n, v)
#define	SETAREG(n, v)	SETREG(AREG, n, v)
#define	SETVREG(n, v)	SETREG(VREG, n, v)
#define	SETHREG(n, v)	SETREG(HREG, n, v)
#define	SETGREG(n, v)	SETREG(GREG, n, v)
#define	SETmREG(n, v)	SETREG(mREG, n, v)
#define	SETnREG(n, v)	SETREG(nREG, n, v)
#define	SETBREG(n, v)	SETREG(BREG, n, v)
#define	SETDORO(n, v)	SETREG(DORO, n, v)
#if DEBUG
#define	SETkREG(n, v)	SETREG(kREG, n, v)
#endif
#define	SETBAK(n, v)	SETREG(BAK, n, v)
#define	SETPLAYERREG(n, v)	SETREG(PLAYERREG, n, v)
#if DEBUG
#define	SETOTUREG(n, v)	SETREG(OTUREG, n, v)
#define	SETNIIREG(n, v)	SETREG(NIIREG, n, v)
#define	SETGENREG(n, v)	SETREG(GENREG, n, v)
#define	SETMYKREG(n, v)	SETREG(MYKREG, n, v)
#define	SETCAMREG(n, v)	SETREG(CAMREG, n, v)
#define	SETSAKREG(n, v)	SETREG(SAKREG, n, v)
#define	SETTAKREG(n, v)	SETREG(TAKREG, n, v)
#endif
#define	SETPL2REG(n, v)	SETREG(PL2REG, n, v)

#if 01
				/* ワーニング出さない */
#define	REG(n)		GETSET_OR_GETREG(REG, n)
#define	SREG(n)		GETSET_OR_GETREG(SREG, n)
#define	OREG(n)		GETSET_OR_GETREG(OREG, n)
#define	PREG(n)		GETSET_OR_GETREG(PREG, n)
#define	QREG(n)		GETSET_OR_GETREG(QREG, n)
#define	MREG(n)		GETSET_OR_GETREG(MREG, n)
#define	SBREG(n)	GETSET_OR_GETREG(SBREG, n)
#define	DREG(n)		GETSET_OR_GETREG(DREG, n)
#define	UREG(n)		GETSET_OR_GETREG(UREG, n)
#define	IREG(n)		GETSET_OR_GETREG(IREG, n)
#define	ZREG(n)		GETSET_OR_GETREG(ZREG, n)
#define	CRV(n)		GETSET_OR_GETREG(CRV, n)
#define	NS1(n)		GETSET_OR_GETREG(NS1, n)

#if DEBUG
#define	SND(n)		GETSET_OR_GETREG(SND, n)
#else
#define	SND(n)		(0)
#endif
//#define	SEX(n)		(debug_mode->r[(n)+(DEBUG_REG_MAX*DEBUG_REG_GRP*16)])
#define	BREG(n)		GETSET_OR_GETREG(BREG, n)
#define	GREG(n)		GETSET_OR_GETREG(GREG, n)
#endif

#define	XREG(n)		GETSET_OR_GETREG(XREG, n)
#define	CRV2(n)		GETSET_OR_GETREG(CRV2, n)
#if DEBUG
#define	DEMOREG(n)	GETSET_OR_GETREG(DEMOREG, n)
#else
#define	DEMOREG(n)	(0)
#endif
#define	TREG(n)		GETSET_OR_GETREG(TREG, n)
#define	WREG(n)		GETSET_OR_GETREG(WREG, n)
#define	AREG(n)		GETSET_OR_GETREG(AREG, n)
#define	VREG(n)		GETSET_OR_GETREG(VREG, n)
#define	HREG(n)		GETSET_OR_GETREG(HREG, n)
#define	mREG(n)		GETSET_OR_GETREG(mREG, n)
#define	nREG(n)		GETSET_OR_GETREG(nREG, n)
#define	DORO(n)		GETSET_OR_GETREG(DORO, n)
#if DEBUG
#define	kREG(n)		GETSET_OR_GETREG(kREG, n)
#else
#define	kREG(n)		(0)
#endif
#define	BAK(n)		GETSET_OR_GETREG(BAK, n)
#define	PLAYERREG(n)	GETSET_OR_GETREG(PLAYERREG, n)
#if DEBUG
#define	OTUREG(n)	GETSET_OR_GETREG(OTUREG, n)
#define	NIIREG(n)	GETSET_OR_GETREG(NIIREG, n)
#endif
#define	GENREG(n)	GETSET_OR_GETREG(GENREG, n)
#define	GET_GENREG(n)	GETREG(GENREG,n)
#define	SET_GENREG(n,v)	SETREG(GENREG,n,v)
#define	GET_MYKREG(n)	GETREG(MYKREG,n)
#define	SET_MYKREG(n,v)	SETREG(MYKREG,n,v)

#if DEBUG
#define	CAMREG(n)	GETSET_OR_GETREG(CAMREG, n)
#define	SAKREG(n)	GETSET_OR_GETREG(SAKREG, n)
#define	TAKREG(n)	GETSET_OR_GETREG(TAKREG, n)
#else
#define	CAMREG(n)	(0)
#define	SAKREG(n)	(0)
#define	TAKREG(n)	(0)
#endif
#define	PL2REG(n)	GETSET_OR_GETREG(PL2REG, n)

/* 早川 */
#include "m_debug_hayakawa.h"
    
/* 樽角 */
#undef  GETNS1
#undef  SETNS1
#undef  NS1

#include "m_debug_mode.h"

#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif /* INCLUDE_M_DEBUG_H */
