#ifndef __HAL_SYSTEM_BUS_H__
#define __HAL_SYSTEM_BUS_H__
/*****************************************************************************
filename : hal_systembus.h
模擬ハードウェア(C-Machine)のシステムバス

 (C) Copyright 2002-2026 佐々木芳


Windowsのシミュレーション環境上で動作するアプリケーションプログラムのコンパイル時には以下のマクロ定義が必要
	_CMTOY

以下の順番にインクルードする。
#include "hal.h"
#include "hal_systembus.h"
*****************************************************************************/

#ifdef _CMTOY
/*Windowsシミュレーション環境*/

#ifdef _CM_EXPORT
/*cm.dll作成時に使用する定義*/
#define CM_EXTERN __declspec(dllexport)
#else
/*cm.dllを呼び出す側で使用する定義*/
#define CM_EXTERN __declspec( dllimport ) 
#endif/*_CM_EXPORT*/

#else
/*実機*/
#define EXTERN extern
#define CM_EXTERN extern

#endif/*_CMTOY*/


/////////////////////////////////////////////////////////////////////////////////
//CPUシステムバス
//メモリ構成
/////////////////////////////////////////////////////////////////////////////////
//エンディアン
typedef enum tagEndian{
	M_LITTLE_ENDIAN		= 0,
	M_BIG_ENDIAN		= 1,
}M_ENDIAN;


//メモリ機構
//アドレッシング（メモリセルのサイズ）
typedef enum tagTmemCell{
	M_UNKNOWN_CELL	= 0,
	M_CELL8		= 1,		//8ビット	バイトアドレッシング 8,16,32ビットデータバス
	M_CELL16	= 2,		//16ビット	ワードアドレッシング 16,32ビットデータバス
}M_CELL;

//データバスサイズ
typedef enum tagDataBusWidth{
	M_UNKNOWN_DBUS = 0,
	M_DBUS8		= 1,		//8,16命令のみ	バイトアドレッシングのみ
	M_DBUS16	= 2,		//8,16,32命令	バイトアドレッシング、ワードアドレッシング
	M_DBUS32	= 4,		//8,16,32命令	バイトアドレッシング、ワードアドレッシング
}M_DATA_BUS_WIDTH;


//メモリ、IO
typedef enum tagIoMemSignal{
	S_MEM		= 0,	
	S_IO		= 1,	//
}S_MEM_IO;//mem/io信号

//メモリリード/ライト
typedef enum tagReadWriteSignal{
	S_READ		= 0,	//
	S_WRITE		= 1,	//
}S_READ_WRITE;//read/write信号

//データバスのどの部分が有効データかを示す	D31-24, D23-16, D15-8,  D7-0	8bit　セル
//															D31-16, D15-0	16bit セル
typedef int	S_CELL_ENABLES;	//CE			bit3,	bit2,	bit1,	bit0


//バスオペレーション定義(bit2:M/IO, bit1:D/C, bit0:W/R)
typedef enum tagBusOp{
	S_Unknown_Busop	= -1,
	S_IntAck		= 0,		//Interrupt Acknoledge(LOCKED)
					//1 
	S_IoRead		= 2,		//Read I/O Port
	S_IoWrite		= 3,		//Write I/O Port
	S_Code			= 4,		//Code Access
	S_HS			= 5,		//HALT or Shutdown
	S_MemRead		= 6,		//Read Memory
	S_MemWrite		= 7,		//Write Memory
}S_BUSOP;

typedef DWORD	S_ADDR_BUS;
typedef union tagDataBus{
	BYTE		dbus8;
	WORD		dbus16;
	DWORD		dbus32;
	BYTE		cell8[4];
	WORD		cell16[2];
}S_DATA_BUS;//

typedef union tagCpuReg{
	BYTE		byte[4];
	WORD		word[2];
	DWORD		dword[1];
}CPU_REG;//

typedef enum tagCpuRegSize{
	RS_UNKNOWN_REG_SIZE	= 0,
	RS_BYTE		= 1,
	RS_WORD		= 2,
	RS_DWORD	= 4,
}CPU_REG_SIZE;

//ターゲットメモリ・スペック
typedef struct tagMemorySpec{
	M_CELL			MemCell;		//アドレッシング タイプ　　const
	M_ENDIAN		MemEndian;		//エンディアン const
	M_DATA_BUS_WIDTH	DataBusWidth;	//データバス幅　8/16/32ビット
}TARGET_MEMORY_SPEC;

typedef struct tagBusRequest{
	TARGET_MEMORY_SPEC	MemSpec;	//スペック
	S_BUSOP			BusOp;			//バスオペレーション
	S_MEM_IO		MemIo;
	S_READ_WRITE	ReadWrite;
	S_ADDR_BUS		addr_bus;		//メモリアドレス（データバスの境界）
	S_CELL_ENABLES	CE;				//セルイネーブル
	S_DATA_BUS		data_bus;		//データバス
	BOOL		bLOCK;			//CPUのバスロック（出力信号）
	BOOL		bINTR;			//入力信号
	BOOL		bHOLD;			//バス・ホールド・リクエスト（入力信号）
//	BOOL		bHLDA;			//バス・ホールド・アクノリッジ（出力信号）
}S_BUS_REQUEST;

#ifdef __cplusplus
extern "C" {
#endif
CM_EXTERN BOOL halInqTargetMemorySpec(TARGET_MEMORY_SPEC* pSpec);
#ifdef __cplusplus
}
#endif


#endif	//__HAL_SYSTEM_BUS_H__