#pragma once
#include "udpl_dll_imp.h"

//
// YM2203
//
class UdplChipYM2203 : public UdplChipImp
{
public:
	UdplChipYM2203(UdplSocketIf *pif, UDPL_CHIP_INFO *pinfo) : UdplChipImp(pif, pinfo)
	{
		// extinfo から設定読み込み
		pre13_clock = getPre13Clock();
		
		// ウェイト設定
		setWaits(pchipInfo->clock);
		// レジスタの初期化をする
		initRegs();
	};

	virtual ~UdplChipYM2203() {
	};

	bool __stdcall setRegister(uint32_t addr, uint32_t data);
	bool __stdcall writeBus(uint8_t abit, uint8_t data);
	uint32_t __stdcall getRegister(uint32_t addr);
	bool __stdcall setPcmData(void *pdat);
	
	virtual bool __stdcall setClock(uint32_t clock, bool ignore_lock = false);

private:
	virtual void setWaits(uint32_t clk) override;
	virtual void initRegs(void) override;				// レジスタの初期化

	uint32_t getPre13Clock(void);
	void setPre13(void);

	uint8_t wait0;
	uint8_t wait17;
	uint8_t wait47;
	uint8_t wait83;
	uint32_t pre13_clock;
	uint8_t wr_wait;
};
