;
;	clipdmca.h
;
;	P/ECE DMG-CPU (Sharp LR35902) Emulator (高速版)
;	
;	CLiP - Common Library for P/ECE
;	Copyright (C) 2001-2005 Naoyuki Sawa
;	
;	* Sun Feb 13 03:10:00 JST 2005 Naoyuki Sawa
;	- 作成開始。
;

; clipdmca.s、framdmca.sにインクルードして使います。

; - トレースデバッグを行う場合は、DMGCPU_RUN_TRACEシンボルを定義してください。
;   DMGCPU_RUN_TRACEシンボルを定義すると、動作速度がとても遅くなるので、
;   通常はコメントアウトしておいてください。
; - DMGCPU_RUN_TRACEシンボルを参照してトレースログを出力しているのは、
;   dmgcpu_runとdmgcpu_EIです。(2005/03/05現在)
;   dmgcpu_runとdmgcpu_EIの実装を参照してください。
;;#define DMGCPU_RUN_TRACE

;****************************************************************************
;	DMGCPU構造体
;****************************************************************************

					; typedef struct _DMGCPU {
#define CZ		 0		; 	unsigned short cz;		/* + 0,2: -------C zzzzzzzz (C=F(C),z=!F(Z)) */
#define NH		 2		; 	unsigned char  nh;		/* + 2,1:          --NH---- (N=F(N),H= F(H)) */
#define _A_		 3		; 	unsigned char   a;		/* + 3,1: A  */
#define BC		 4		; 	unsigned short bc;		/* + 4,2: BC */
#define DE		 6		; 	unsigned short de;		/* + 6,2: DE */
#define HL		 8		; 	unsigned short hl;		/* + 8,2: HL */
#define SP		10		; 	unsigned short sp;		/* +10,2: SP */
#define _PC_		12		; 	unsigned short pc;		/* +12,2: PC */
#define FLAGS		14		; 	unsigned char flags;		/* +14,1: -----SHI (S=STOP,H=HALT,I=IME) */
					; 	//				/* +15,1: (パディング) */
#define _CYCLE_		16		; 	int cycle;			/* +16,4: 残り実行サイクル数 */
#define _READ_		20		; 	void* read;			/* +20,4: メモリ読み出しルーチン */
#define _WRITE_		24		; 	void* write;			/* +24,4: メモリ書き込みルーチン */
#define SIZEOF_DMGCPU	28		; } DMGCPU;				/* =28 */

#define C		 4
#define B		 5
#define E		 6
#define D		 7
#define L		 8
#define H		 9

;****************************************************************************
;	フラグビット定義
;****************************************************************************

; * フラグフィールドのマスク定義、および、注意事項を記します。
;
; - 一時的にレジスタに保持しているNHフィールドに対して、Nフラグをセットするには、
;
;	xoor	%t0, %t0, 0x20		; D5だけセット (2命令に展開される)
;
;   よりも、
;
;	xoor	%t0, %t0, ~0x1f		; D31:5を全てセット (1命令で済む)
;
;   の方が有利です。同様に、Nフラグをクリアするには、
;
;	xand	%t0, %t0, ~0x20		; D5だけクリア (2命令に展開される)
;
;   よりも、
;
;	xand	%t0, %t0, 0x1f		; D31:5を全てクリア (1命令で済む)
;
;   の方が有利です。以上を踏まえて、フラグビットのマスク定義を行いました。
;
;	xoor	%t0, %t0, NF		; Nフラグをセット (1命令)
;	xand	%t0, %t0, ~NF		; Nフラグをクリア (1命令)
;
;   なお、NHフィールドは、F(N,H)より1ビット右にずれていることに注意してください。
;   1ビット右にずれていることの主な理由は、Hフラグの計算を容易にするためですが、
;   同時にNフラグも右にずれたために、都合良く、1命令でNフラグのセット、クリアが
;   できるようになりました。
;
; - H、Cフラグに関しては、1ビットだけをセット、クリアしてもコストは同じですが、
;   Nフラグに揃えて、連続ビットをセット、クリアすることにしました。
;
;	xoor	%t0, %t0, HF		; Hフラグをセット (1命令)
;	xand	%t0, %t0, ~HF		; Hフラグをクリア (1命令)
;
;	xoor	%t0, %t0, CF		; Cフラグをセット (2命令)
;	xand	%t0, %t0, ~CF		; Cフラグをクリア (2命令)
;
; - CZフィールド上のZフラグは、F(Z)の逆論理であることに注意してください。
;   CZフィールド上のZフラグがすべて0ならば、F(Z)=1を意味します。
;   CZフィールド上のZフラグのうち1ビットでも1ならば、F(Z)=0を意味します。
;   Zフラグをクリアする場合は、定義上、全ビットをクリアする必要があります。
;
;	xand	%t0, %t0, ~ZF		; Zフラグをクリア (2命令)
;
;   Zフラグをセットする場合は、定義上、どれか1ビットだけのセットで充分です。
;
;	xoor	%t0, %t0, ZF		; Zフラグをセット (2命令)
;	;↓上の方法でも構いませんが、次の方法がより低コストです。
;	xoor	%t0, %t0, 1		; Zフラグをセット (1命令)
;
; - メモリ上のフラグフィールドに対して、N、H、Cのセット、クリアを行う場合は、
;   通常どおりxbset、xbclrを使って、1ビットだけをセット、クリアしてください。
;   (Cフラグのクリアに関しては、全ビットをクリアする方が、より低コストです。)
;
;	xbset	[%CPU+NH], NF_BIT	; Nフラグをセット
;	xbclr	[%CPU+NH], NF_BIT	; Nフラグをクリア
;
;	xbset	[%CPU+NH], HF_BIT	; Hフラグをセット
;	xbclr	[%CPU+NH], HF_BIT	; Hフラグをクリア
;
;	xbset	[%CPU+CZ+1], 0		; Cフラグをセット
;	xbclr	[%CPU+CZ+1], 0		; Cフラグをクリア
;	;↓上の方法でも構いませんが、次の方法がより低コストです。
;	xld.b	[%CPU+CZ+1], %r8	; Cフラグをクリア
;
;   Zフラグをクリアする場合は、定義上、全ビットをクリアする必要があります。
;
;	xld.b	[%CPU+CZ+0], %r8	; Zフラグをクリア
;
;   Zフラグをセットする場合は、定義上、どれか1ビットだけのセットで充分です。
;
;	xbset	[%CPU+CZ+0], 0		; Zフラグをセット
;
; - 以上をまとめると、各フラグをセット、クリアする最善の方法は、次のとおりです。
;
;	一時的にレジスタに保持しているフラグフィールドに対して...
;
;	xoor	%t0, %t0, NF		; Nフラグをセット (1命令)
;	xand	%t0, %t0, ~NF		; Nフラグをクリア (1命令)
;
;	xoor	%t0, %t0, HF		; Hフラグをセット (1命令)
;	xand	%t0, %t0, ~HF		; Hフラグをクリア (1命令)
;
;	xoor	%t0, %t0, CF		; Cフラグをセット (2命令)
;	xand	%t0, %t0, ~CF		; Cフラグをクリア (2命令)
;
;	xoor	%t0, %t0, 1		; Zフラグをセット (1命令)
;	xand	%t0, %t0, ~ZF		; Zフラグをクリア (2命令)
;
;	メモリ上のフラグフィールドに対して...
;
;	xbset	[%CPU+NH], NF_BIT	; Nフラグをセット
;	xbclr	[%CPU+NH], NF_BIT	; Nフラグをクリア
;
;	xbset	[%CPU+NH], HF_BIT	; Hフラグをセット
;	xbclr	[%CPU+NH], HF_BIT	; Hフラグをクリア
;
;	xbset	[%CPU+CZ+1], 0		; Cフラグをセット
;	xld.b	[%CPU+CZ+1], %r8	; Cフラグをクリア
;
;	xbset	[%CPU+CZ+0], 0		; Zフラグをセット
;	xld.b	[%CPU+CZ+0], %r8	; Zフラグをクリア

;/* DMGCPU.cz */
#define ZF		0xff
#define CF		(~0xff)
;#define ZF_BIT		0..7
;#define CF_BIT		8

;/* DMGCPU.nh */
#define HF		0x1f
#define NF		(~0x1f)
#define HF_BIT		4
#define NF_BIT		5

;/* DMGCPU.flags */
;#define IME		(1<<0)
;#define HALT		(1<<1)
;#define STOP		(1<<2)
#define IME_BIT		0
#define HALT_BIT	1
#define STOP_BIT	2

;****************************************************************************
;	レジスタ割り当て
;****************************************************************************

#define addr		r0		; READ、WRITEルーチンへのアドレス引数です。
					; 命令ルーチンが初期化し、READ、WRITEルーチンが参照します。
					; 命令ルーチン以外が、このレジスタを変更してはいけません。
#define data		r1		; READルーチンの戻り値、WRITEルーチンへのデータ引数です。
					; READルーチンが初期化し、命令ルーチンが参照します。
					; または、命令ルーチンが初期化し、WRITEルーチンが参照します。
					; WRITEルーチンは、このレジスタを変更してはいけません。
#define s0		r2		; READ、WRITEルーチン呼び出し時に、一時的な値を保存するためのレジスタです。
					; 命令ルーチンが、任意に使用可能です。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
#define s1		r3		; (同上)
#define CPU		r4		; dmgcpuのアドレスを保持します。
					; dmgcpu_enter〜dmgcpu_leaveの間、不変です。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
#define A		r5		; Aレジスタの値を保持します。
					; D31:8は常に0とします。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
#define PC		r6		; PCレジスタの値を保持します。
					; D31:16は常に0とします。
					; dmgcpu_run、命令ルーチン、および補助ルーチンが、適切に設定、参照します。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
#define CYCLE		r7		; 残り実行サイクル数を保持します。
					; 命令ルーチン、および補助ルーチンが、適切に設定、参照します。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
;	 		r8
;	 		r9
#define READ		r10		; READルーチンのアドレスを保持します。
					; dmgcpu_enter〜dmgcpu_leaveの間、不変です。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
#define WRITE		r11		; WRITEルーチンのアドレスを保持します。
					; dmgcpu_enter〜dmgcpu_leaveの間、不変です。
					; READ、WRITEルーチンは、このレジスタを変更してはいけません。
#define t0		r12		; 汎用ワークレジスタです。
					; 全てのルーチンが、任意に使用可能です。
#define t1		r13		; (同上)
#define t2		r14		; (同上)
#define t3		r15		; (同上)

;****************************************************************************
;	8-Bit Loads
;****************************************************************************

#define CYCLE_LD_A_n		8
#define CYCLE_LD_A_A		4
#define CYCLE_LD_A_B		4
#define CYCLE_LD_A_C		4
#define CYCLE_LD_A_D		4
#define CYCLE_LD_A_E		4
#define CYCLE_LD_A_H		4
#define CYCLE_LD_A_L		4
#define CYCLE_LD_A_IHLI		8

#define CYCLE_LD_B_n		8
#define CYCLE_LD_B_A		4
#define CYCLE_LD_B_B		4
#define CYCLE_LD_B_C		4
#define CYCLE_LD_B_D		4
#define CYCLE_LD_B_E		4
#define CYCLE_LD_B_H		4
#define CYCLE_LD_B_L		4
#define CYCLE_LD_B_IHLI		8

#define CYCLE_LD_C_n		8
#define CYCLE_LD_C_A		4
#define CYCLE_LD_C_B		4
#define CYCLE_LD_C_C		4
#define CYCLE_LD_C_D		4
#define CYCLE_LD_C_E		4
#define CYCLE_LD_C_H		4
#define CYCLE_LD_C_L		4
#define CYCLE_LD_C_IHLI		8

#define CYCLE_LD_D_n		8
#define CYCLE_LD_D_A		4
#define CYCLE_LD_D_B		4
#define CYCLE_LD_D_C		4
#define CYCLE_LD_D_D		4
#define CYCLE_LD_D_E		4
#define CYCLE_LD_D_H		4
#define CYCLE_LD_D_L		4
#define CYCLE_LD_D_IHLI		8

#define CYCLE_LD_E_n		8
#define CYCLE_LD_E_A		4
#define CYCLE_LD_E_B		4
#define CYCLE_LD_E_C		4
#define CYCLE_LD_E_D		4
#define CYCLE_LD_E_E		4
#define CYCLE_LD_E_H		4
#define CYCLE_LD_E_L		4
#define CYCLE_LD_E_IHLI		8

#define CYCLE_LD_H_n		8
#define CYCLE_LD_H_A		4
#define CYCLE_LD_H_B		4
#define CYCLE_LD_H_C		4
#define CYCLE_LD_H_D		4
#define CYCLE_LD_H_E		4
#define CYCLE_LD_H_H		4
#define CYCLE_LD_H_L		4
#define CYCLE_LD_H_IHLI		8

#define CYCLE_LD_L_n		8
#define CYCLE_LD_L_A		4
#define CYCLE_LD_L_B		4
#define CYCLE_LD_L_C		4
#define CYCLE_LD_L_D		4
#define CYCLE_LD_L_E		4
#define CYCLE_LD_L_H		4
#define CYCLE_LD_L_L		4
#define CYCLE_LD_L_IHLI		8

#define CYCLE_LD_IHLI_n		12
#define CYCLE_LD_IHLI_A		8
#define CYCLE_LD_IHLI_B		8
#define CYCLE_LD_IHLI_C		8
#define CYCLE_LD_IHLI_D		8
#define CYCLE_LD_IHLI_E		8
#define CYCLE_LD_IHLI_H		8
#define CYCLE_LD_IHLI_L		8

#define CYCLE_LD_A_InnI		16
#define CYCLE_LD_InnI_A		16
#define CYCLE_LD_A_IBCI		8
#define CYCLE_LD_IBCI_A		8
#define CYCLE_LD_A_IDEI		8
#define CYCLE_LD_IDEI_A		8

#define CYCLE_LD_A_ICI		8
#define CYCLE_LD_ICI_A		8
#define CYCLE_LDH_A_InI		12
#define CYCLE_LDH_InI_A		12

#define CYCLE_LDI_A_IHLI	8
#define CYCLE_LDI_IHLI_A	8
#define CYCLE_LDD_A_IHLI	8
#define CYCLE_LDD_IHLI_A	8

;****************************************************************************
;	16-Bit Loads
;****************************************************************************

#define CYCLE_LD_BC_nn		12
#define CYCLE_LD_DE_nn		12
#define CYCLE_LD_HL_nn		12
#define CYCLE_LD_SP_nn		12

#define CYCLE_LD_SP_HL		8
#define CYCLE_LDHL_SP_e		12
#define CYCLE_LD_InnI_SP	20

#define CYCLE_PUSH_AF		16
#define CYCLE_PUSH_BC		16
#define CYCLE_PUSH_DE		16
#define CYCLE_PUSH_HL		16

#define CYCLE_POP_AF		12
#define CYCLE_POP_BC		12
#define CYCLE_POP_DE		12
#define CYCLE_POP_HL		12

;****************************************************************************
;	8-Bit ALU
;****************************************************************************

#define CYCLE_ADD_A_n		8
#define CYCLE_ADD_A_A		4
#define CYCLE_ADD_A_B		4
#define CYCLE_ADD_A_C		4
#define CYCLE_ADD_A_D		4
#define CYCLE_ADD_A_E		4
#define CYCLE_ADD_A_H		4
#define CYCLE_ADD_A_L		4
#define CYCLE_ADD_A_IHLI	8

#define CYCLE_ADC_A_n		8
#define CYCLE_ADC_A_A		4
#define CYCLE_ADC_A_B		4
#define CYCLE_ADC_A_C		4
#define CYCLE_ADC_A_D		4
#define CYCLE_ADC_A_E		4
#define CYCLE_ADC_A_H		4
#define CYCLE_ADC_A_L		4
#define CYCLE_ADC_A_IHLI	8

#define CYCLE_SUB_n		8
#define CYCLE_SUB_A		4
#define CYCLE_SUB_B		4
#define CYCLE_SUB_C		4
#define CYCLE_SUB_D		4
#define CYCLE_SUB_E		4
#define CYCLE_SUB_H		4
#define CYCLE_SUB_L		4
#define CYCLE_SUB_IHLI		8

#define CYCLE_SBC_A_n		8
#define CYCLE_SBC_A_A		4
#define CYCLE_SBC_A_B		4
#define CYCLE_SBC_A_C		4
#define CYCLE_SBC_A_D		4
#define CYCLE_SBC_A_E		4
#define CYCLE_SBC_A_H		4
#define CYCLE_SBC_A_L		4
#define CYCLE_SBC_A_IHLI	8

#define CYCLE_CP_n		8
#define CYCLE_CP_A		4
#define CYCLE_CP_B		4
#define CYCLE_CP_C		4
#define CYCLE_CP_D		4
#define CYCLE_CP_E		4
#define CYCLE_CP_H		4
#define CYCLE_CP_L		4
#define CYCLE_CP_IHLI		8

#define CYCLE_AND_n		8
#define CYCLE_AND_A		4
#define CYCLE_AND_B		4
#define CYCLE_AND_C		4
#define CYCLE_AND_D		4
#define CYCLE_AND_E		4
#define CYCLE_AND_H		4
#define CYCLE_AND_L		4
#define CYCLE_AND_IHLI		8

#define CYCLE_OR_n		8
#define CYCLE_OR_A		4
#define CYCLE_OR_B		4
#define CYCLE_OR_C		4
#define CYCLE_OR_D		4
#define CYCLE_OR_E		4
#define CYCLE_OR_H		4
#define CYCLE_OR_L		4
#define CYCLE_OR_IHLI		8

#define CYCLE_XOR_n		8
#define CYCLE_XOR_A		4
#define CYCLE_XOR_B		4
#define CYCLE_XOR_C		4
#define CYCLE_XOR_D		4
#define CYCLE_XOR_E		4
#define CYCLE_XOR_H		4
#define CYCLE_XOR_L		4
#define CYCLE_XOR_IHLI		8

#define CYCLE_INC_A		4
#define CYCLE_INC_B		4
#define CYCLE_INC_C		4
#define CYCLE_INC_D		4
#define CYCLE_INC_E		4
#define CYCLE_INC_H		4
#define CYCLE_INC_L		4
#define CYCLE_INC_IHLI		12

#define CYCLE_DEC_A		4
#define CYCLE_DEC_B		4
#define CYCLE_DEC_C		4
#define CYCLE_DEC_D		4
#define CYCLE_DEC_E		4
#define CYCLE_DEC_H		4
#define CYCLE_DEC_L		4
#define CYCLE_DEC_IHLI		12

;****************************************************************************
;	16-Bit Arithmetic
;****************************************************************************

#define CYCLE_ADD_HL_BC		8
#define CYCLE_ADD_HL_DE		8
#define CYCLE_ADD_HL_HL		8
#define CYCLE_ADD_HL_SP		8
#define CYCLE_ADD_SP_e		16

#define CYCLE_INC_BC		8
#define CYCLE_INC_DE		8
#define CYCLE_INC_HL		8
#define CYCLE_INC_SP		8

#define CYCLE_DEC_BC		8
#define CYCLE_DEC_DE		8
#define CYCLE_DEC_HL		8
#define CYCLE_DEC_SP		8

;****************************************************************************
;	Miscellaneous
;****************************************************************************

#define CYCLE_SWAP_A		8
#define CYCLE_SWAP_B		8
#define CYCLE_SWAP_C		8
#define CYCLE_SWAP_D		8
#define CYCLE_SWAP_E		8
#define CYCLE_SWAP_H		8
#define CYCLE_SWAP_L		8
#define CYCLE_SWAP_IHLI		16

#define CYCLE_DAA		4
#define CYCLE_CPL		4
#define CYCLE_SCF		4
#define CYCLE_CCF		4

#define CYCLE_NOP		4
#define CYCLE_HALT		4
#define CYCLE_STOP		4
#define CYCLE_DI		4
#define CYCLE_EI		4

;****************************************************************************
;	Rotates & Shifts
;****************************************************************************

#define CYCLE_RLA		4
#define CYCLE_RLCA		4
#define CYCLE_RRA		4
#define CYCLE_RRCA		4

#define CYCLE_RL_A		8
#define CYCLE_RL_B		8
#define CYCLE_RL_C		8
#define CYCLE_RL_D		8
#define CYCLE_RL_E		8
#define CYCLE_RL_H		8
#define CYCLE_RL_L		8
#define CYCLE_RL_IHLI		16

#define CYCLE_RLC_A		8
#define CYCLE_RLC_B		8
#define CYCLE_RLC_C		8
#define CYCLE_RLC_D		8
#define CYCLE_RLC_E		8
#define CYCLE_RLC_H		8
#define CYCLE_RLC_L		8
#define CYCLE_RLC_IHLI		16

#define CYCLE_RR_A		8
#define CYCLE_RR_B		8
#define CYCLE_RR_C		8
#define CYCLE_RR_D		8
#define CYCLE_RR_E		8
#define CYCLE_RR_H		8
#define CYCLE_RR_L		8
#define CYCLE_RR_IHLI		16

#define CYCLE_RRC_A		8
#define CYCLE_RRC_B		8
#define CYCLE_RRC_C		8
#define CYCLE_RRC_D		8
#define CYCLE_RRC_E		8
#define CYCLE_RRC_H		8
#define CYCLE_RRC_L		8
#define CYCLE_RRC_IHLI		16

#define CYCLE_SLA_A		8
#define CYCLE_SLA_B		8
#define CYCLE_SLA_C		8
#define CYCLE_SLA_D		8
#define CYCLE_SLA_E		8
#define CYCLE_SLA_H		8
#define CYCLE_SLA_L		8
#define CYCLE_SLA_IHLI		16

#define CYCLE_SRA_A		8
#define CYCLE_SRA_B		8
#define CYCLE_SRA_C		8
#define CYCLE_SRA_D		8
#define CYCLE_SRA_E		8
#define CYCLE_SRA_H		8
#define CYCLE_SRA_L		8
#define CYCLE_SRA_IHLI		16

#define CYCLE_SRL_A		8
#define CYCLE_SRL_B		8
#define CYCLE_SRL_C		8
#define CYCLE_SRL_D		8
#define CYCLE_SRL_E		8
#define CYCLE_SRL_H		8
#define CYCLE_SRL_L		8
#define CYCLE_SRL_IHLI		16

;****************************************************************************
;	Bit Opcodes
;****************************************************************************

#define CYCLE_BIT_0_A		8
#define CYCLE_BIT_0_B		8
#define CYCLE_BIT_0_C		8
#define CYCLE_BIT_0_D		8
#define CYCLE_BIT_0_E		8
#define CYCLE_BIT_0_H		8
#define CYCLE_BIT_0_L		8
#define CYCLE_BIT_0_IHLI	12

#define CYCLE_BIT_1_A		8
#define CYCLE_BIT_1_B		8
#define CYCLE_BIT_1_C		8
#define CYCLE_BIT_1_D		8
#define CYCLE_BIT_1_E		8
#define CYCLE_BIT_1_H		8
#define CYCLE_BIT_1_L		8
#define CYCLE_BIT_1_IHLI	12

#define CYCLE_BIT_2_A		8
#define CYCLE_BIT_2_B		8
#define CYCLE_BIT_2_C		8
#define CYCLE_BIT_2_D		8
#define CYCLE_BIT_2_E		8
#define CYCLE_BIT_2_H		8
#define CYCLE_BIT_2_L		8
#define CYCLE_BIT_2_IHLI	12

#define CYCLE_BIT_3_A		8
#define CYCLE_BIT_3_B		8
#define CYCLE_BIT_3_C		8
#define CYCLE_BIT_3_D		8
#define CYCLE_BIT_3_E		8
#define CYCLE_BIT_3_H		8
#define CYCLE_BIT_3_L		8
#define CYCLE_BIT_3_IHLI	12

#define CYCLE_BIT_4_A		8
#define CYCLE_BIT_4_B		8
#define CYCLE_BIT_4_C		8
#define CYCLE_BIT_4_D		8
#define CYCLE_BIT_4_E		8
#define CYCLE_BIT_4_H		8
#define CYCLE_BIT_4_L		8
#define CYCLE_BIT_4_IHLI	12

#define CYCLE_BIT_5_A		8
#define CYCLE_BIT_5_B		8
#define CYCLE_BIT_5_C		8
#define CYCLE_BIT_5_D		8
#define CYCLE_BIT_5_E		8
#define CYCLE_BIT_5_H		8
#define CYCLE_BIT_5_L		8
#define CYCLE_BIT_5_IHLI	12

#define CYCLE_BIT_6_A		8
#define CYCLE_BIT_6_B		8
#define CYCLE_BIT_6_C		8
#define CYCLE_BIT_6_D		8
#define CYCLE_BIT_6_E		8
#define CYCLE_BIT_6_H		8
#define CYCLE_BIT_6_L		8
#define CYCLE_BIT_6_IHLI	12

#define CYCLE_BIT_7_A		8
#define CYCLE_BIT_7_B		8
#define CYCLE_BIT_7_C		8
#define CYCLE_BIT_7_D		8
#define CYCLE_BIT_7_E		8
#define CYCLE_BIT_7_H		8
#define CYCLE_BIT_7_L		8
#define CYCLE_BIT_7_IHLI	12

#define CYCLE_SET_0_A		8
#define CYCLE_SET_0_B		8
#define CYCLE_SET_0_C		8
#define CYCLE_SET_0_D		8
#define CYCLE_SET_0_E		8
#define CYCLE_SET_0_H		8
#define CYCLE_SET_0_L		8
#define CYCLE_SET_0_IHLI	16

#define CYCLE_SET_1_A		8
#define CYCLE_SET_1_B		8
#define CYCLE_SET_1_C		8
#define CYCLE_SET_1_D		8
#define CYCLE_SET_1_E		8
#define CYCLE_SET_1_H		8
#define CYCLE_SET_1_L		8
#define CYCLE_SET_1_IHLI	16

#define CYCLE_SET_2_A		8
#define CYCLE_SET_2_B		8
#define CYCLE_SET_2_C		8
#define CYCLE_SET_2_D		8
#define CYCLE_SET_2_E		8
#define CYCLE_SET_2_H		8
#define CYCLE_SET_2_L		8
#define CYCLE_SET_2_IHLI	16

#define CYCLE_SET_3_A		8
#define CYCLE_SET_3_B		8
#define CYCLE_SET_3_C		8
#define CYCLE_SET_3_D		8
#define CYCLE_SET_3_E		8
#define CYCLE_SET_3_H		8
#define CYCLE_SET_3_L		8
#define CYCLE_SET_3_IHLI	16

#define CYCLE_SET_4_A		8
#define CYCLE_SET_4_B		8
#define CYCLE_SET_4_C		8
#define CYCLE_SET_4_D		8
#define CYCLE_SET_4_E		8
#define CYCLE_SET_4_H		8
#define CYCLE_SET_4_L		8
#define CYCLE_SET_4_IHLI	16

#define CYCLE_SET_5_A		8
#define CYCLE_SET_5_B		8
#define CYCLE_SET_5_C		8
#define CYCLE_SET_5_D		8
#define CYCLE_SET_5_E		8
#define CYCLE_SET_5_H		8
#define CYCLE_SET_5_L		8
#define CYCLE_SET_5_IHLI	16

#define CYCLE_SET_6_A		8
#define CYCLE_SET_6_B		8
#define CYCLE_SET_6_C		8
#define CYCLE_SET_6_D		8
#define CYCLE_SET_6_E		8
#define CYCLE_SET_6_H		8
#define CYCLE_SET_6_L		8
#define CYCLE_SET_6_IHLI	16

#define CYCLE_SET_7_A		8
#define CYCLE_SET_7_B		8
#define CYCLE_SET_7_C		8
#define CYCLE_SET_7_D		8
#define CYCLE_SET_7_E		8
#define CYCLE_SET_7_H		8
#define CYCLE_SET_7_L		8
#define CYCLE_SET_7_IHLI	16

#define CYCLE_RES_0_A		8
#define CYCLE_RES_0_B		8
#define CYCLE_RES_0_C		8
#define CYCLE_RES_0_D		8
#define CYCLE_RES_0_E		8
#define CYCLE_RES_0_H		8
#define CYCLE_RES_0_L		8
#define CYCLE_RES_0_IHLI	16

#define CYCLE_RES_1_A		8
#define CYCLE_RES_1_B		8
#define CYCLE_RES_1_C		8
#define CYCLE_RES_1_D		8
#define CYCLE_RES_1_E		8
#define CYCLE_RES_1_H		8
#define CYCLE_RES_1_L		8
#define CYCLE_RES_1_IHLI	16

#define CYCLE_RES_2_A		8
#define CYCLE_RES_2_B		8
#define CYCLE_RES_2_C		8
#define CYCLE_RES_2_D		8
#define CYCLE_RES_2_E		8
#define CYCLE_RES_2_H		8
#define CYCLE_RES_2_L		8
#define CYCLE_RES_2_IHLI	16

#define CYCLE_RES_3_A		8
#define CYCLE_RES_3_B		8
#define CYCLE_RES_3_C		8
#define CYCLE_RES_3_D		8
#define CYCLE_RES_3_E		8
#define CYCLE_RES_3_H		8
#define CYCLE_RES_3_L		8
#define CYCLE_RES_3_IHLI	16

#define CYCLE_RES_4_A		8
#define CYCLE_RES_4_B		8
#define CYCLE_RES_4_C		8
#define CYCLE_RES_4_D		8
#define CYCLE_RES_4_E		8
#define CYCLE_RES_4_H		8
#define CYCLE_RES_4_L		8
#define CYCLE_RES_4_IHLI	16

#define CYCLE_RES_5_A		8
#define CYCLE_RES_5_B		8
#define CYCLE_RES_5_C		8
#define CYCLE_RES_5_D		8
#define CYCLE_RES_5_E		8
#define CYCLE_RES_5_H		8
#define CYCLE_RES_5_L		8
#define CYCLE_RES_5_IHLI	16

#define CYCLE_RES_6_A		8
#define CYCLE_RES_6_B		8
#define CYCLE_RES_6_C		8
#define CYCLE_RES_6_D		8
#define CYCLE_RES_6_E		8
#define CYCLE_RES_6_H		8
#define CYCLE_RES_6_L		8
#define CYCLE_RES_6_IHLI	16

#define CYCLE_RES_7_A		8
#define CYCLE_RES_7_B		8
#define CYCLE_RES_7_C		8
#define CYCLE_RES_7_D		8
#define CYCLE_RES_7_E		8
#define CYCLE_RES_7_H		8
#define CYCLE_RES_7_L		8
#define CYCLE_RES_7_IHLI	16

;****************************************************************************
;	Jumps
;****************************************************************************

#define CYCLE_JP_nn		12
#define CYCLE_JP_Z_nn		12	/* 16 */
#define CYCLE_JP_NZ_nn		12	/* 16 */
#define CYCLE_JP_C_nn		12	/* 16 */
#define CYCLE_JP_NC_nn		12	/* 16 */
#define CYCLE_JP_IHLI		4

#define CYCLE_JR_e		8
#define CYCLE_JR_Z_e		8	/* 12 */
#define CYCLE_JR_NZ_e		8	/* 12 */
#define CYCLE_JR_C_e		8	/* 12 */
#define CYCLE_JR_NC_e		8	/* 12 */

;****************************************************************************
;	Calls
;****************************************************************************

#define CYCLE_CALL_nn		12
#define CYCLE_CALL_Z_nn		12	/* 24 */
#define CYCLE_CALL_NZ_nn	12	/* 24 */
#define CYCLE_CALL_C_nn		12	/* 24 */
#define CYCLE_CALL_NC_nn	12	/* 24 */

;****************************************************************************
;	Restarts
;****************************************************************************

#define CYCLE_RST_00H		16
#define CYCLE_RST_08H		16
#define CYCLE_RST_10H		16
#define CYCLE_RST_18H		16
#define CYCLE_RST_20H		16
#define CYCLE_RST_28H		16
#define CYCLE_RST_30H		16
#define CYCLE_RST_38H		16

;****************************************************************************
;	Returns
;****************************************************************************

#define CYCLE_RET		8
#define CYCLE_RET_Z		8	/* 20 */
#define CYCLE_RET_NZ		8	/* 20 */
#define CYCLE_RET_C		8	/* 20 */
#define CYCLE_RET_NC		8	/* 20 */
#define CYCLE_RETI		8

;****************************************************************************
;	
;****************************************************************************

