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
139
140
141
142
143
144
145
146
147
148
|
// license:BSD-3-Clause
// copyright-holders: Angelo Salese
#ifndef MAME_MACHINE_W83977TF_H
#define MAME_MACHINE_W83977TF_H
#pragma once
#include "bus/isa/isa.h"
#include "imagedev/floppy.h"
#include "machine/8042kbdc.h"
#include "machine/ds128x.h"
#include "machine/pc_lpt.h"
#include "machine/upd765.h"
class w83977tf_device : public device_t,
public device_isa16_card_interface,
public device_memory_interface
{
public:
w83977tf_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~w83977tf_device();
void remap(int space_id, offs_t start, offs_t end) override;
auto gp20_reset() { return m_gp20_reset_callback.bind(); }
auto gp25_gatea20() { return m_gp25_gatea20_callback.bind(); }
auto irq1() { return m_irq1_callback.bind(); }
auto irq8() { return m_irq8_callback.bind(); }
auto irq9() { return m_irq9_callback.bind(); }
// auto txd1() { return m_txd1_callback.bind(); }
// auto ndtr1() { return m_ndtr1_callback.bind(); }
// auto nrts1() { return m_nrts1_callback.bind(); }
// auto txd2() { return m_txd2_callback.bind(); }
// auto ndtr2() { return m_ndtr2_callback.bind(); }
// auto nrts2() { return m_nrts2_callback.bind(); }
auto gpio1_read() { return m_gpio1_read_cb.bind(); }
auto gpio1_write() { return m_gpio1_write_cb.bind(); }
static void floppy_formats(format_registration &fr);
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual space_config_vector memory_space_config() const override;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual uint8_t dack_r(int line) override;
virtual void dack_w(int line, uint8_t data) override;
virtual void eop_w(int state) override;
void update_dreq_mapping(int dreq, int logical);
private:
const address_space_config m_space_config;
required_device<n82077aa_device> m_fdc;
required_device<kbdc8042_device> m_kbdc;
required_device<ds12885_device> m_rtc;
required_device<pc_lpt_device> m_lpt;
memory_view m_logical_view;
devcb_write_line m_gp20_reset_callback;
devcb_write_line m_gp25_gatea20_callback;
devcb_write_line m_irq1_callback;
devcb_write_line m_irq8_callback;
devcb_write_line m_irq9_callback;
// devcb_write_line m_txd1_callback;
// devcb_write_line m_ndtr1_callback;
// devcb_write_line m_nrts1_callback;
// devcb_write_line m_txd2_callback;
// devcb_write_line m_ndtr2_callback;
// devcb_write_line m_nrts2_callback;
devcb_read8 m_gpio1_read_cb;
devcb_write8 m_gpio1_write_cb;
u8 m_index;
u8 m_logical_index;
bool m_activate[0xb];
int m_dreq_mapping[4];
int m_last_dma_line;
u8 m_hefras;
u8 m_lockreg;
u8 m_lock_sequence;
u8 m_fdc_irq_line;
u8 m_fdc_drq_line;
u8 m_fdd_mode, m_fdd_crf1, m_fdd_crf2, m_fdd_crf4;
u8 m_keyb_irq_line;
u8 m_mouse_irq_line;
u8 m_rtc_irq_line;
u8 m_lpt_irq_line;
u8 m_lpt_drq_line;
u8 m_lpt_mode;
u16 m_fdc_address;
u16 m_keyb_address[2];
u16 m_lpt_address;
u16 m_gpio1_address;
uint8_t read(offs_t offset);
void write(offs_t offset, u8 data);
u8 cr26_r();
void cr26_w(offs_t offset, u8 data);
void config_map(address_map &map) ATTR_COLD;
void logical_device_select_w(offs_t offset, u8 data);
template <unsigned N> u8 activate_r(offs_t offset);
template <unsigned N> void activate_w(offs_t offset, u8 data);
void irq_floppy_w(int state);
void drq_floppy_w(int state);
u8 keyb_irq_r(offs_t offset);
void keyb_irq_w(offs_t offset, u8 data);
u8 mouse_irq_r(offs_t offset);
void mouse_irq_w(offs_t offset, u8 data);
u8 keybc_status_r(offs_t offset);
void keybc_command_w(offs_t offset, u8 data);
u8 keyb_io_address_r(offs_t offset);
void keyb_io_address_w(offs_t offset, u8 data);
void kbdp21_gp25_gatea20_w(int state);
void kbdp20_gp20_reset_w(int state);
u8 rtc_r(offs_t offset);
void rtc_w(offs_t offset, u8 data);
u8 rtc_irq_r(offs_t offset);
void rtc_irq_w(offs_t offset, u8 data);
void irq_keyboard_w(int state);
void irq_mouse_w(int state);
void irq_rtc_w(int state);
void irq_parallel_w(int state);
void request_irq(int irq, int state);
void request_dma(int dreq, int state);
};
DECLARE_DEVICE_TYPE(W83977TF, w83977tf_device);
#endif // MAME_MACHINE_W83977TF_H
|