summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/pce_ctrl/multitap.h
blob: 214053fff3c156148adc5082e93596887d901884 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// license:BSD-3-Clause
// copyright-holders:cam900
/**********************************************************************

    NEC PC Engine/TurboGrafx-16 Multi Tap emulation

**********************************************************************/

#ifndef MAME_BUS_PCE_CTRL_MULTITAP_H
#define MAME_BUS_PCE_CTRL_MULTITAP_H

#pragma once


#include "pcectrl.h"



//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> pce_multitap_device

class pce_multitap_device : public device_t,
							public device_pce_control_port_interface
{
public:
	// construction/destruction
	pce_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

protected:
	// device-level overrides
	virtual void device_add_mconfig(machine_config &config) override;
	virtual void device_start() override;
	virtual void device_reset() override;

	// device_pce_control_port_interface overrides
	virtual u8 peripheral_r() override;
	virtual void sel_w(int state) override;
	virtual void clr_w(int state) override;

private:
	// controller ports
	required_device_array<pce_control_port_device, 5> m_subctrl_port;

	// internal states
	u8 m_port_sel; // select port to read
	bool m_prev_sel; // previous SEL pin state
};


// device type definition
DECLARE_DEVICE_TYPE(PCE_MULTITAP, pce_multitap_device)


#endif // MAME_BUS_PCE_CTRL_MULTITAP_H
ass="p">() { return m_in_sp_func.bind(); } // Slave program select (VCC = master; GND = slave; pin becomes EN output in buffered mode) auto read_slave_ack_callback() { return m_read_slave_ack_func.bind(); } // Cascaded interrupt acknowledge request for slave 8259 to place vector on data bus uint8_t read(offs_t offset); void write(offs_t offset, uint8_t data); uint8_t acknowledge(); DECLARE_WRITE_LINE_MEMBER( ir0_w ) { set_irq_line(0, state); } DECLARE_WRITE_LINE_MEMBER( ir1_w ) { set_irq_line(1, state); } DECLARE_WRITE_LINE_MEMBER( ir2_w ) { set_irq_line(2, state); } DECLARE_WRITE_LINE_MEMBER( ir3_w ) { set_irq_line(3, state); } DECLARE_WRITE_LINE_MEMBER( ir4_w ) { set_irq_line(4, state); } DECLARE_WRITE_LINE_MEMBER( ir5_w ) { set_irq_line(5, state); } DECLARE_WRITE_LINE_MEMBER( ir6_w ) { set_irq_line(6, state); } DECLARE_WRITE_LINE_MEMBER( ir7_w ) { set_irq_line(7, state); } IRQ_CALLBACK_MEMBER(inta_cb); protected: pic8259_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const XTAL &clock); // device-level overrides virtual void device_resolve_objects() override; virtual void device_start() override; virtual void device_reset() override; virtual bool is_x86() const { return m_is_x86; } TIMER_CALLBACK_MEMBER(irq_timer_tick); private: void set_irq_line(int irq, int state); enum class state_t : u8 { ICW1, ICW2, ICW3, ICW4, READY }; devcb_write_line m_out_int_func; devcb_read_line m_in_sp_func; devcb_read8 m_read_slave_ack_func; emu_timer *m_irq_timer; state_t m_state; uint8_t m_isr; uint8_t m_irr; uint8_t m_prio; uint8_t m_imr; uint8_t m_irq_lines; uint8_t m_input; uint8_t m_ocw3; uint8_t m_master; /* ICW1 state */ uint8_t m_level_trig_mode; uint8_t m_vector_size; uint8_t m_cascade; uint8_t m_icw4_needed; uint32_t m_vector_addr_low; /* ICW2 state */ uint8_t m_base; uint8_t m_vector_addr_high; /* ICW3 state */ uint8_t m_slave; /* ICW4 state */ uint8_t m_nested; uint8_t m_mode; uint8_t m_auto_eoi; uint8_t m_is_x86; int8_t m_current_level; uint8_t m_inta_sequence; }; class v5x_icu_device : public pic8259_device { public: v5x_icu_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock = XTAL()); protected: virtual bool is_x86() const override { return true; } }; class mk98pic_device : public pic8259_device { public: mk98pic_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock = XTAL()); protected: virtual bool is_x86() const override { return true; } }; DECLARE_DEVICE_TYPE(PIC8259, pic8259_device) DECLARE_DEVICE_TYPE(V5X_ICU, v5x_icu_device) DECLARE_DEVICE_TYPE(MK98PIC, mk98pic_device) #endif // MAME_MACHINE_PIC8259_H