;
;	clips26a.h
;
;	P/ECE Signetics 2650 Emulator
;
;	CLiP - Common Library for P/ECE
;	Copyright (C) 2001-2005 Naoyuki Sawa
;
;	* Mon Apr 25 20:42:00 JST 2005 Naoyuki Sawa
;	- 作成開始。
;

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

;****************************************************************************
;	S2650構造体
;****************************************************************************

				; typedef struct _S2650 {
#define PSL		 0	; 	unsigned char psl;		// + 0, 1: Program Status Lower
			  	; 					//           psl[1]=COM (logical/arith COMpare)
			  	; 					//           psl[3]=WC  (With/without Carry)
			  	; 					//           psl[4]=RS  (Register bank Select)
			  	; 					//           その他のビットは不定です。
#define PSU		 1	; 	unsigned char psu;		// + 1, 1: Program Status Upper
			  	; 					//           psu[5]=II (Interrupt Inhibit)
			  	; 					//           psu[6]=F  (Flag)
			  	; 					//           psu[7]=S  (Sense)
			  	; 					//           その他のビットは不定です。
#define _CC_		 2	; 	unsigned short cc;		// + 2, 2: Condition Code
			  	; 					//           cc=0x0000         ならば CC=0 を意味します。
			  	; 					//           cc=0x0001..0x007f ならば CC=1 を意味します。
			  	; 					//           cc=0x0080..0x00ff ならば CC=2 を意味します。
			  	; 					//           cc=0x0100..0xffff ならば CC=3 を意味します。
#define C		 4	; 	unsigned short c;		// + 4, 2: Carry
			  	; 					//           c[8]=0 ならば C=0 を意味します。
			  	; 					//           c[8]=1 ならば C=1 を意味します。
			  	; 					//           その他のビットは不定です。
#define OVF		 6	; 	unsigned char ovf;		// + 6, 1: OVerFlow
			  	; 					//           ovf[7]=0 ならば OVF=0 を意味します。
			  	; 					//           ovf[7]=1 ならば OVF=1 を意味します。
			  	; 					//           その他のビットは不定です。
#define IDC		 7	; 	unsigned char idc;		// + 7, 1: Inter Digit Carry
			  	; 					//           idc[4]=0 ならば IDC=0 を意味します。
			  	; 					//           idc[4]=1 ならば IDC=1 を意味します。
			  	; 					//           その他のビットは不定です。
#define REG		 8	;  	unsigned char reg[7];		// + 8, 7: REGister stack
#define SP		15	; 	unsigned char sp;		// +15, 1: Pointer for the return address Stack
			  	; 					//           sp=0..7
#define RAS		16	;  	unsigned short ras[8];		// +16,16: Return Address Stack
			  	;  					//           ras[*]=0x0000..0x7fff
#define _IAR_		32	; 	unsigned short iar;		// +32, 2: Instruction Address Register
			  	; 					//           iar=0x0000..0x7fff
				; 	//------------------------------//
#define FLAGS		34	; 	unsigned char flags;		// +34, 1: ------hi
			  	; 					//           flg[0]=IRQ (#INTREQ端子の状態に相当します)
			  	; 					//           flg[1]=HALT
#define VECTOR		35	; 	unsigned char vector;		// +35, 1: 割り込みベクタ
			  	; 					//           IRQ=1 の場合のみ有効です。
#define _CYCLE_		36	; 	int cycle;			// +36, 4: 残り実行サイクル
#define SIZEOF_S2650	40	; } S2650;				// =40

/* S2650.flags */
#define FLAGS_IRQ	0
#define FLAGS_HALT	1

/* S2650.psu */
#define PSU_SP0		0
#define PSU_SP1		1
#define PSU_SP2		2
// Unused		3
// Unused		4
#define PSU_II		5
#define PSU_F		6
#define PSU_S		7

/* S2650.psl */
#define PSL_C		0
#define PSL_COM		1
#define PSL_OVF		2
#define PSL_WC		3
#define PSL_RS		4
#define PSL_IDC		5
#define PSL_CC0		6
#define PSL_CC1		7

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

#define addr	r0	; 現在の命令のAddressModeを解決した、アドレスを保持します。
			; AddressMode()が設定し、Action()が参照します。
			; Operation()、その他のルーチンからは、原則として使用不可です。(例外あり)
			; AddressModeを伴わない命令においては、ワークレジスタとして使用可能です。
#define data	r1	; 基本的には、汎用のワークレジスタです。
			; コンテキスト外の関数を呼び出す場合に、保存する必要のある値を格納してください。
			; AddressMode()や一部の内部関数(*)への引数、戻り値を保持するためのレジスタとしても使用します。
			; ((*)2005/05/04現在、s2650_set_psu,s2650_set_pslへの引数、s2650_get_psu,s2650_get_pslからの戻り値)
			; 内部関数よって、"%data=fn(%addr,%data)"形式のものと、"%r10=fn(%r12,%r13)"形式のものが有るので、注意してください。
#define seq	r2	; 現在の命令に対応するs2650seqエントリ内の走査ポインタです。
			; s2650_run()が初期化し、s2650_run()とOperation()、AddressMode()が使用します。
#define reg	r3	; 現在の命令のRegisterを解決した、レジスタフィールドへのポインタを保持します。
			; Register()が初期化し、Operation()、AddressMode()が使用します。
#define CPU	r4	; S2650構造体の先頭アドレスを保持します。
#define CC	r5	; s2650.ccフィールドの値を保持します。($00/$01..$7F/$80..$FF/$100..$FFFF)
			; %CCレジスタが保持している値と、本当の2650のPSL(CC)の対応については、s2650.ccフィールドの説明を参照してください。
#define IAR	r6	; s2650.iarフィールドの値を保持します。($0000..$7FFF)
#define CYCLE	r7	; 残り実行サイクル数を保持します。

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