summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/cpu/nec/v25.h
blob: f170ad03b8f944dfb10311e6d6ccc58278ef1752 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
                       
                                                   









                                          












                                                                               







                                                                          
 












                                                                           



                                           
                                                                                                                                                                                                                                                                   


                                                                                                                                                                                
 







                                                                                                                                                                                   




                                                  


                                                                            

                                             







                                                                                                        

                                            
                                                                                                                                                                                                                           

                                           
                                                                                                           

                                                                            

                                            


                                                                                                                                    


















































                                                                                                        









                              

































































































































































































































































































































                                                                                 
                                                                                                  





                                           
                                                                                                  







                             
// license:BSD-3-Clause
// copyright-holders:Bryan McPhail, Alex W. Jackson
/* ASG 971222 -- rewrote this interface */
#ifndef __NEC_V25_H_
#define __NEC_V25_H_


#define NEC_INPUT_LINE_INTP0 10
#define NEC_INPUT_LINE_INTP1 11
#define NEC_INPUT_LINE_INTP2 12
#define NEC_INPUT_LINE_POLL 20

enum
{
	V25_PC=0,
	V25_IP, V25_AW, V25_CW, V25_DW, V25_BW, V25_SP, V25_BP, V25_IX, V25_IY,
	V25_FLAGS, V25_ES, V25_CS, V25_SS, V25_DS,
	V25_PENDING
};


#define MCFG_V25_CONFIG(_table) \
	v25_common_device::set_decryption_table(*device, _table);


#define MCFG_V25_PORT_PT_READ_CB(_devcb) \
	devcb = &v25_common_device::set_pt_in_cb(*device, DEVCB_##_devcb);

#define MCFG_V25_PORT_P0_READ_CB(_devcb) \
	devcb = &v25_common_device::set_p0_in_cb(*device, DEVCB_##_devcb);

#define MCFG_V25_PORT_P1_READ_CB(_devcb) \
	devcb = &v25_common_device::set_p1_in_cb(*device, DEVCB_##_devcb);

#define MCFG_V25_PORT_P2_READ_CB(_devcb) \
	devcb = &v25_common_device::set_p2_in_cb(*device, DEVCB_##_devcb);


#define MCFG_V25_PORT_P0_WRITE_CB(_devcb) \
	devcb = &v25_common_device::set_p0_out_cb(*device, DEVCB_##_devcb);

#define MCFG_V25_PORT_P1_WRITE_CB(_devcb) \
	devcb = &v25_common_device::set_p1_out_cb(*device, DEVCB_##_devcb);

#define MCFG_V25_PORT_P2_WRITE_CB(_devcb) \
	devcb = &v25_common_device::set_p2_out_cb(*device, DEVCB_##_devcb);

class v25_common_device : public cpu_device
{
public:
	// construction/destruction
	v25_common_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, bool is_16bit, offs_t fetch_xor, UINT8 prefetch_size, UINT8 prefetch_cycles, UINT32 chip_type);

	// static configuration helpers
	static void set_decryption_table(device_t &device, const UINT8 *decryption_table) { downcast<v25_common_device &>(device).m_v25v35_decryptiontable = decryption_table; }

	template<class _Object> static devcb_base & set_pt_in_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_pt_in.set_callback(object); }
	template<class _Object> static devcb_base & set_p0_in_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_p0_in.set_callback(object); }
	template<class _Object> static devcb_base & set_p1_in_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_p1_in.set_callback(object); }
	template<class _Object> static devcb_base & set_p2_in_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_p2_in.set_callback(object); }

	template<class _Object> static devcb_base & set_p0_out_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_p0_out.set_callback(object); }
	template<class _Object> static devcb_base & set_p1_out_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_p1_out.set_callback(object); }
	template<class _Object> static devcb_base & set_p2_out_cb(device_t &device, _Object object) { return downcast<v25_common_device &>(device).m_p2_out.set_callback(object); }

	TIMER_CALLBACK_MEMBER(v25_timer_callback);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_post_load() override { notify_clock_changed(); }

	// device_execute_interface overrides
	virtual UINT64 execute_clocks_to_cycles(UINT64 clocks) const override { return clocks / m_PCK; }
	virtual UINT64 execute_cycles_to_clocks(UINT64 cycles) const override { return cycles * m_PCK; }
	virtual UINT32 execute_min_cycles() const override { return 1; }
	virtual UINT32 execute_max_cycles() const override { return 80; }
	virtual UINT32 execute_input_lines() const override { return 1; }
	virtual UINT32 execute_default_irq_vector() const override { return 0xff; }
	virtual void execute_run() override;
	virtual void execute_set_input(int inputnum, int state) override;

	// device_memory_interface overrides
	virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr); }

	// device_state_interface overrides
	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
	virtual void state_import(const device_state_entry &entry) override;
	virtual void state_export(const device_state_entry &entry) override;

	// device_disasm_interface overrides
	virtual UINT32 disasm_min_opcode_bytes() const override { return 1; }
	virtual UINT32 disasm_max_opcode_bytes() const override { return 8; }
	virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;

private:
	address_space_config m_program_config;
	address_space_config m_io_config;

/* internal RAM and register banks */
union internalram
{
	UINT16 w[128];
	UINT8  b[256];
};

	internalram m_ram;
	offs_t  m_fetch_xor;

	UINT16  m_ip;

	/* PSW flags */
	INT32   m_SignVal;
	UINT32  m_AuxVal, m_OverVal, m_ZeroVal, m_CarryVal, m_ParityVal;  /* 0 or non-0 valued flags */
	UINT8   m_IBRK, m_F0, m_F1, m_TF, m_IF, m_DF, m_MF;   /* 0 or 1 valued flags */
	UINT8   m_RBW, m_RBB;   /* current register bank base, preshifted for word and byte registers */

	/* interrupt related */
	UINT32  m_pending_irq;
	UINT32  m_unmasked_irq;
	UINT32  m_bankswitch_irq;
	UINT8   m_priority_inttu, m_priority_intd, m_priority_intp, m_priority_ints0, m_priority_ints1;
	UINT8   m_IRQS, m_ISPR;
	UINT32  m_nmi_state;
	UINT32  m_irq_state;
	UINT32  m_poll_state;
	UINT32  m_mode_state;
	UINT32  m_intp_state[3];
	UINT8   m_no_interrupt;
	UINT8   m_halted;

	/* timer related */
	UINT16  m_TM0, m_MD0, m_TM1, m_MD1;
	UINT8   m_TMC0, m_TMC1;
	emu_timer *m_timers[4];

	/* system control */
	UINT8   m_RAMEN, m_TB, m_PCK; /* PRC register */
	UINT32  m_IDB;

	address_space *m_program;
	direct_read_data *m_direct;
	address_space *m_io;
	int     m_icount;

	/* callbacks */
	devcb_read8 m_pt_in;
	devcb_read8 m_p0_in;
	devcb_read8 m_p1_in;
	devcb_read8 m_p2_in;

	devcb_write8 m_p0_out;
	devcb_write8 m_p1_out;
	devcb_write8 m_p2_out;

	UINT8   m_prefetch_size;
	UINT8   m_prefetch_cycles;
	INT8    m_prefetch_count;
	UINT8   m_prefetch_reset;
	UINT32  m_chip_type;

	UINT32  m_prefix_base;    /* base address of the latest prefix segment */
	UINT8   m_seg_prefix;     /* prefix segment indicator */

	UINT32 m_EA;
	UINT16 m_EO;
	UINT16 m_E16;

	UINT32 m_debugger_temp;

	const UINT8 *m_v25v35_decryptiontable;  // internal decryption table

	typedef void (v25_common_device::*nec_ophandler)();
	typedef UINT32 (v25_common_device::*nec_eahandler)();
	static const nec_ophandler s_nec_instruction[256];
	static const nec_eahandler s_GetEA[192];

	inline void prefetch();
	void do_prefetch(int previous_ICount);
	inline UINT8 fetch();
	inline UINT16 fetchword();
	inline UINT8 fetchop();
	void nec_interrupt(unsigned int_num, int /*INTSOURCES*/ source);
	void nec_bankswitch(unsigned bank_num);
	void nec_trap();
	void external_int();
	UINT8 read_irqcontrol(int /*INTSOURCES*/ source, UINT8 priority);
	UINT8 read_sfr(unsigned o);
	UINT16 read_sfr_word(unsigned o);
	void write_irqcontrol(int /*INTSOURCES*/ source, UINT8 d);
	void write_sfr(unsigned o, UINT8 d);
	void write_sfr_word(unsigned o, UINT16 d);
	UINT8 v25_read_byte(unsigned a);
	UINT16 v25_read_word(unsigned a);
	void v25_write_byte(unsigned a, UINT8 d);
	void v25_write_word(unsigned a, UINT16 d);

	void i_add_br8();
	void i_add_wr16();
	void i_add_r8b();
	void i_add_r16w();
	void i_add_ald8();
	void i_add_axd16();
	void i_push_es();
	void i_pop_es();
	void i_or_br8();
	void i_or_r8b();
	void i_or_wr16();
	void i_or_r16w();
	void i_or_ald8();
	void i_or_axd16();
	void i_push_cs();
	void i_pre_nec();
	void i_pre_v25();
	void i_adc_br8();
	void i_adc_wr16();
	void i_adc_r8b();
	void i_adc_r16w();
	void i_adc_ald8();
	void i_adc_axd16();
	void i_push_ss();
	void i_pop_ss();
	void i_sbb_br8();
	void i_sbb_wr16();
	void i_sbb_r8b();
	void i_sbb_r16w();
	void i_sbb_ald8();
	void i_sbb_axd16();
	void i_push_ds();
	void i_pop_ds();
	void i_and_br8();
	void i_and_r8b();
	void i_and_wr16();
	void i_and_r16w();
	void i_and_ald8();
	void i_and_axd16();
	void i_es();
	void i_daa();
	void i_sub_br8();
	void i_sub_wr16();
	void i_sub_r8b();
	void i_sub_r16w();
	void i_sub_ald8();
	void i_sub_axd16();
	void i_cs();
	void i_das();
	void i_xor_br8();
	void i_xor_r8b();
	void i_xor_wr16();
	void i_xor_r16w();
	void i_xor_ald8();
	void i_xor_axd16();
	void i_ss();
	void i_aaa();
	void i_cmp_br8();
	void i_cmp_wr16();
	void i_cmp_r8b();
	void i_cmp_r16w();
	void i_cmp_ald8();
	void i_cmp_axd16();
	void i_ds();
	void i_aas();
	void i_inc_ax();
	void i_inc_cx();
	void i_inc_dx();
	void i_inc_bx();
	void i_inc_sp();
	void i_inc_bp();
	void i_inc_si();
	void i_inc_di();
	void i_dec_ax();
	void i_dec_cx();
	void i_dec_dx();
	void i_dec_bx();
	void i_dec_sp();
	void i_dec_bp();
	void i_dec_si();
	void i_dec_di();
	void i_push_ax();
	void i_push_cx();
	void i_push_dx();
	void i_push_bx();
	void i_push_sp();
	void i_push_bp();
	void i_push_si();
	void i_push_di();
	void i_pop_ax();
	void i_pop_cx();
	void i_pop_dx();
	void i_pop_bx();
	void i_pop_sp();
	void i_pop_bp();
	void i_pop_si();
	void i_pop_di();
	void i_pusha();
	void i_popa();
	void i_chkind();
	void i_repnc();
	void i_repc();
	void i_push_d16();
	void i_imul_d16();
	void i_push_d8();
	void i_imul_d8();
	void i_insb();
	void i_insw();
	void i_outsb();
	void i_outsw();
	void i_jo();
	void i_jno();
	void i_jc();
	void i_jnc();
	void i_jz();
	void i_jnz();
	void i_jce();
	void i_jnce();
	void i_js();
	void i_jns();
	void i_jp();
	void i_jnp();
	void i_jl();
	void i_jnl();
	void i_jle();
	void i_jnle();
	void i_80pre();
	void i_82pre();
	void i_81pre();
	void i_83pre();
	void i_test_br8();
	void i_test_wr16();
	void i_xchg_br8();
	void i_xchg_wr16();
	void i_mov_br8();
	void i_mov_r8b();
	void i_mov_wr16();
	void i_mov_r16w();
	void i_mov_wsreg();
	void i_lea();
	void i_mov_sregw();
	void i_invalid();
	void i_popw();
	void i_nop();
	void i_xchg_axcx();
	void i_xchg_axdx();
	void i_xchg_axbx();
	void i_xchg_axsp();
	void i_xchg_axbp();
	void i_xchg_axsi();
	void i_xchg_axdi();
	void i_cbw();
	void i_cwd();
	void i_call_far();
	void i_pushf();
	void i_popf();
	void i_sahf();
	void i_lahf();
	void i_mov_aldisp();
	void i_mov_axdisp();
	void i_mov_dispal();
	void i_mov_dispax();
	void i_movsb();
	void i_movsw();
	void i_cmpsb();
	void i_cmpsw();
	void i_test_ald8();
	void i_test_axd16();
	void i_stosb();
	void i_stosw();
	void i_lodsb();
	void i_lodsw();
	void i_scasb();
	void i_scasw();
	void i_mov_ald8();
	void i_mov_cld8();
	void i_mov_dld8();
	void i_mov_bld8();
	void i_mov_ahd8();
	void i_mov_chd8();
	void i_mov_dhd8();
	void i_mov_bhd8();
	void i_mov_axd16();
	void i_mov_cxd16();
	void i_mov_dxd16();
	void i_mov_bxd16();
	void i_mov_spd16();
	void i_mov_bpd16();
	void i_mov_sid16();
	void i_mov_did16();
	void i_rotshft_bd8();
	void i_rotshft_wd8();
	void i_ret_d16();
	void i_ret();
	void i_les_dw();
	void i_lds_dw();
	void i_mov_bd8();
	void i_mov_wd16();
	void i_enter();
	void i_leave();
	void i_retf_d16();
	void i_retf();
	void i_int3();
	void i_int();
	void i_into();
	void i_iret();
	void i_rotshft_b();
	void i_rotshft_w();
	void i_rotshft_bcl();
	void i_rotshft_wcl();
	void i_aam();
	void i_aad();
	void i_setalc();
	void i_trans();
	void i_fpo();
	void i_loopne();
	void i_loope();
	void i_loop();
	void i_jcxz();
	void i_inal();
	void i_inax();
	void i_outal();
	void i_outax();
	void i_call_d16();
	void i_jmp_d16();
	void i_jmp_far();
	void i_jmp_d8();
	void i_inaldx();
	void i_inaxdx();
	void i_outdxal();
	void i_outdxax();
	void i_lock();
	void i_repne();
	void i_repe();
	void i_hlt();
	void i_cmc();
	void i_f6pre();
	void i_f7pre();
	void i_clc();
	void i_stc();
	void i_di();
	void i_ei();
	void i_cld();
	void i_std();
	void i_fepre();
	void i_ffpre();
	void i_wait();
	void i_brkn();
	void i_brks();

	UINT32 EA_000();
	UINT32 EA_001();
	UINT32 EA_002();
	UINT32 EA_003();
	UINT32 EA_004();
	UINT32 EA_005();
	UINT32 EA_006();
	UINT32 EA_007();
	UINT32 EA_100();
	UINT32 EA_101();
	UINT32 EA_102();
	UINT32 EA_103();
	UINT32 EA_104();
	UINT32 EA_105();
	UINT32 EA_106();
	UINT32 EA_107();
	UINT32 EA_200();
	UINT32 EA_201();
	UINT32 EA_202();
	UINT32 EA_203();
	UINT32 EA_204();
	UINT32 EA_205();
	UINT32 EA_206();
	UINT32 EA_207();
};


class v25_device : public v25_common_device
{
public:
	v25_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};


class v35_device : public v25_common_device
{
public:
	v35_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};


extern const device_type V25;
extern const device_type V35;


#endif