summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/spectrum/exp.h
blob: 366e27c9e5e1d904f8bb5aaf1b4dc70cf517868c (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************

        ZX Spectrum Expansion Port emulation

**********************************************************************

    Pinout:

             48K                          128K/+2                          +2A/+2B/+3/3B     

         A         B                    A         B                         A         B
        A15   1   A14                  A15   1   A14                       A15   1   A14
        A13   2   A12                  A13   2   A12                       A13   2   A12
         D7   3   +5V                   D7   3   +5v                        D7   3   +5v
         NC   4   +9V                   NC   4   +9V                  /OE ROM1   4   NC
       SLOT   5   SLOT                SLOT   5   SLOT                     SLOT   5   SLOT
         D0   6   GND                   D0   6   GND                        D0   6   GND
         D1   7   GND                   D1   7   GND                        D1   7   GND
         D2   8   CLK                   D2   8   CLK                        D2   8   CKEXT
         D6   9   A0                    D6   9   A0                         D6   9   A0
         D5  10   A1                    D5  10   A1                         D5  10   A1
         D3  11   A2                    D3  11   A2                         D3  11   A2
         D4  12   A3                    D4  12   A3                         D4  12   A3
       /INT  13   /IORQGE             /INT  13   /IORQGE (+2 only)        /INT  13   NC
       /NMI  14   GND                 /NMI  14   GND                      /NMI  14   GND
      /HALT  15   VIDEO              /HALT  15   NC                      /HALT  15   /OE ROM2
      /MREQ  16   /Y                 /MREQ  16   NC                      /MREQ  16   /DRD
      /IORQ  17   V                  /IORQ  17   NC                      /IORQ  17   /DWR
        /RD  18   U                    /RD  18   NC                        /RD  18   /MTR
        /WR  19   /BUSRQ               /WR  19   /BUSRQ                    /WR  19   /BUSRQ
        -5V  20   /RESET               -5V  20   /RESET                     NC  20   /RESET
      /WAIT  21   A7                 /WAIT  21   A7                      /WAIT  21   A7
       +12V  22   A6                  +12V  22   A6                       +12V  22   A6
      12VAC  23   A5                 12VAC  23   A5                       -12V  23   A5
        /M1  24   A4                   /M1  24   A4                        /M1  24   A4
      /RFSH  25   /ROMCS             /RFSH  25   /ROMCS                  /RFSH  25   NC
         A8  26   /BUSACK               A8  26   /BUSACK                    A8  26   /BUSACK
        A10  27   A9                   A10  27   A9                        A10  27   A9
         NC  28   A11                   NC  28   A11                     RESET  28   A11


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

#ifndef MAME_BUS_SPECTRUM_EXP_H
#define MAME_BUS_SPECTRUM_EXP_H

#pragma once


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

// ======================> spectrum_expansion_slot_device

class device_spectrum_expansion_interface;

class spectrum_expansion_slot_device : public device_t, public device_single_card_slot_interface<device_spectrum_expansion_interface>
{
public:
	// construction/destruction
	template <typename T>
	spectrum_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
		: spectrum_expansion_slot_device(mconfig, tag, owner)
	{
		option_reset();
		slot_options(*this);
		set_default_option(default_option);
		set_fixed(false);
	}

	spectrum_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);

	// callbacks
	auto irq_handler() { return m_irq_handler.bind(); }
	auto nmi_handler() { return m_nmi_handler.bind(); }

	void pre_opcode_fetch(offs_t offset);
	void post_opcode_fetch(offs_t offset);
	void pre_data_fetch(offs_t offset);
	void post_data_fetch(offs_t offset);

	uint8_t mreq_r(offs_t offset);
	void mreq_w(offs_t offset, uint8_t data);
	uint8_t iorq_r(offs_t offset);
	void iorq_w(offs_t offset, uint8_t data);
	DECLARE_READ_LINE_MEMBER( romcs );

	DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
	DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }

protected:
	// device-level overrides
	virtual void device_start() override;

	device_spectrum_expansion_interface *m_card;

private:
	devcb_write_line m_irq_handler;
	devcb_write_line m_nmi_handler;
};


// ======================> device_spectrum_expansion_interface

class device_spectrum_expansion_interface : public device_interface
{
public:
	// reading and writing
	virtual void pre_opcode_fetch(offs_t offset) { };
	virtual void post_opcode_fetch(offs_t offset) { };
	virtual void pre_data_fetch(offs_t offset) { };
	virtual void post_data_fetch(offs_t offset) { };
	virtual uint8_t mreq_r(offs_t offset) { return 0xff; }
	virtual void mreq_w(offs_t offset, uint8_t data) { }
	virtual uint8_t iorq_r(offs_t offset) { return 0xff; }
	virtual void iorq_w(offs_t offset, uint8_t data) { }
	virtual DECLARE_READ_LINE_MEMBER(romcs) { return 0; }

protected:
	// construction/destruction
	device_spectrum_expansion_interface(const machine_config &mconfig, device_t &device);

	spectrum_expansion_slot_device *m_slot;
};


// device type definition
DECLARE_DEVICE_TYPE(SPECTRUM_EXPANSION_SLOT, spectrum_expansion_slot_device)

void spectrum_expansion_devices(device_slot_interface &device);
void spec128_expansion_devices(device_slot_interface &device);
void specpls3_expansion_devices(device_slot_interface &device);


#endif // MAME_BUS_SPECTRUM_EXP_H