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
|
// license:BSD-3-Clause
// copyright-holders:Patrick Mackinlay
#ifndef MAME_MACHINE_I82357_H
#define MAME_MACHINE_I82357_H
#pragma once
#include "machine/pic8259.h"
#include "machine/pit8253.h"
#include "machine/am9517a.h"
class i82357_device : public device_t
{
public:
i82357_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);
auto out_rtc_cb() { return m_out_rtc.bind(); }
auto out_int_cb() { return subdevice<pic8259_device>("pic0")->out_int_callback(); }
auto out_nmi_cb() { return m_out_nmi.bind(); }
auto out_spkr_cb() { return m_out_spkr.bind(); }
u32 eisa_irq_ack() { return m_pic[0]->acknowledge(); }
DECLARE_WRITE_LINE_MEMBER(in_iochk);
DECLARE_WRITE_LINE_MEMBER(in_parity);
void map(address_map &map);
protected:
// standard device_t overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override;
virtual void device_reset() override;
void nmi_reg_w(u8 data);
void nmi_ext_w(u8 data);
u8 nmi_reg_r() { return m_nmi_reg; }
u8 nmi_ext_r() { return m_nmi_ext; }
TIMER_CALLBACK_MEMBER(nmi_check);
private:
required_device_array<pic8259_device, 2> m_pic;
required_device_array<pit8254_device, 2> m_pit;
required_device_array<eisa_dma_device, 2> m_dma;
devcb_write8 m_out_rtc;
devcb_write_line m_out_nmi;
devcb_write_line m_out_spkr;
enum nmi_reg_mask : u8
{
NMI_T1C2_GATE = 0x01,
NMI_SPEAKER_DATA = 0x02,
NMI_PARITY_DISABLE = 0x04,
NMI_IOCHK_DISABLE = 0x08,
NMI_REFRESH = 0x10,
NMI_T1C2_STATE = 0x20,
NMI_IOCHK = 0x40,
NMI_PARITY = 0x80,
NMI_WMASK = 0x0f,
NMI_NMI = 0xc0,
};
enum nmi_ext_mask : u8
{
NMI_EXT_BUS_RESET = 0x01, // bus reset (read/write)
NMI_EXT_EN_IOPORT = 0x02,
NMI_EXT_EN_FAILSAFE = 0x04,
NMI_EXT_EN_TIMEOUT = 0x08,
NMI_EXT_8US_TIMEOUT = 0x10, // 8us EISA bus master timeout occurred
NMI_EXT_IOPORT = 0x20, // NMI I/O port interrupt pending
NMI_EXT_TIMEOUT = 0x40, // EISA bus master timeout occurred, NMI requested
NMI_EXT_FAILSAFE = 0x80, // Fail-safe timer is active, NMI requested
NMI_EXT_WMASK = 0x0f,
NMI_EXT_NMI = 0xe0,
};
u8 m_elcr[2];
emu_timer *m_nmi_check;
bool m_out_nmi_asserted;
bool m_nmi_enabled;
u8 m_nmi_reg;
u8 m_nmi_ext;
};
DECLARE_DEVICE_TYPE(I82357, i82357_device)
#endif // MAME_MACHINE_I82357_H
|