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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
|
// license:BSD-3-Clause
// copyright-holders:Roberto Lavarone
/*****************************************************************************
*
* includes/z80ne.h
*
* Nuova Elettronica Z80NE
*
* http://www.z80ne.com/
*
****************************************************************************/
#ifndef MAME_INCLUDES_Z80NE_H
#define MAME_INCLUDES_Z80NE_H
#pragma once
#include "imagedev/cassette.h"
#include "imagedev/floppy.h"
#include "machine/ay31015.h"
#include "machine/clock.h"
#include "machine/kr2376.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
#include "video/mc6847.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
#define Z80NE_CPU_SPEED_HZ 1920000 /* 1.92 MHz */
#define LX383_KEYS 16
#define LX383_DOWNSAMPLING 16
#define LX385_TAPE_SAMPLE_FREQ 38400
/* wave duration threshold */
enum z80netape_speed
{
TAPE_300BPS = 300, /* 300 bps */
TAPE_600BPS = 600, /* 600 bps */
TAPE_1200BPS = 1200 /* 1200 bps */
};
struct z80ne_cass_data_t {
struct {
int length = 0; /* time cassette level is at input.level */
int level = 0; /* cassette level */
int bit = 0; /* bit being read */
} input;
struct {
int length = 0; /* time cassette level is at output.level */
int level = 0; /* cassette level */
int bit = 0; /* bit to output */
} output;
z80netape_speed speed; /* 300 - 600 - 1200 */
int wave_filter = 0;
int wave_length = 0;
int wave_short = 0;
int wave_long = 0;
};
class z80ne_state : public driver_device
{
public:
z80ne_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_uart(*this, "uart"),
m_uart_clock(*this, "uart_clock"),
m_maincpu(*this, "maincpu"),
m_cassette1(*this, "cassette"),
m_cassette2(*this, "cassette2"),
m_ram(*this, RAM_TAG),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_bank4(*this, "bank4"),
m_io_row0(*this, "ROW0"),
m_io_row1(*this, "ROW1"),
m_io_ctrl(*this, "CTRL"),
m_io_rst(*this, "RST"),
m_io_lx_385(*this, "LX.385"),
m_lx383_digits(*this, "digit%u", 0U)
, m_rom(*this, "maincpu")
, m_mram(*this, "mainram")
{ }
void z80ne(machine_config &config);
void init_z80ne();
DECLARE_INPUT_CHANGED_MEMBER(z80ne_reset);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
void base_reset();
void save_state_vars();
static void floppy_formats(format_registration &fr);
uint8_t m_lx383_scan_counter = 0;
uint8_t m_lx383_key[LX383_KEYS]{};
int m_lx383_downsampler = 0;
uint8_t m_lx385_ctrl = 0;
emu_timer *m_cassette_timer = nullptr;
emu_timer *m_kbd_timer = nullptr;
z80ne_cass_data_t m_cass_data;
uint8_t lx383_r();
void lx383_w(offs_t offset, uint8_t data);
uint8_t lx385_ctrl_r();
void lx385_ctrl_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(lx385_uart_tx_clock_w);
TIMER_CALLBACK_MEMBER(cassette_tc);
TIMER_CALLBACK_MEMBER(kbd_scan);
TIMER_CALLBACK_MEMBER(pulse_nmi);
memory_passthrough_handler m_rom_shadow_tap;
required_device<ay31015_device> m_uart;
required_device<clock_device> m_uart_clock;
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cassette1;
required_device<cassette_image_device> m_cassette2;
optional_device<ram_device> m_ram;
optional_memory_bank m_bank1;
optional_memory_bank m_bank2;
optional_memory_bank m_bank3;
optional_memory_bank m_bank4;
required_ioport m_io_row0;
required_ioport m_io_row1;
required_ioport m_io_ctrl;
required_ioport m_io_rst;
required_ioport m_io_lx_385;
output_finder<8> m_lx383_digits;
required_region_ptr<u8> m_rom;
optional_shared_ptr<u8> m_mram;
emu_timer *m_timer_nmi = nullptr;
cassette_image_device *cassette_device_image();
private:
void mem_map(address_map &map);
void io_map(address_map &map);
};
class z80net_state : public z80ne_state
{
public:
z80net_state(const machine_config &mconfig, device_type type, const char *tag)
: z80ne_state(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_vdg(*this, "mc6847"),
m_lx387_kr2376(*this, "lx387_kr2376"),
m_io_lx387_brk(*this, "LX387_BRK"),
m_io_modifiers(*this, "MODIFIERS")
{
}
void lx387(machine_config &config);
void z80net(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(z80net_nmi);
protected:
virtual void machine_reset() override;
DECLARE_READ_LINE_MEMBER(lx387_shift_r);
DECLARE_READ_LINE_MEMBER(lx387_control_r);
uint8_t lx387_data_r();
uint8_t lx388_mc6847_videoram_r(offs_t offset);
uint8_t lx388_read_field_sync();
required_shared_ptr<uint8_t> m_videoram;
required_device<mc6847_base_device> m_vdg;
required_device<kr2376_device> m_lx387_kr2376;
required_ioport m_io_lx387_brk;
required_ioport m_io_modifiers;
void reset_lx387();
void io_map(address_map &map);
private:
void mem_map(address_map &map);
};
class z80netb_state : public z80net_state
{
public:
z80netb_state(const machine_config &mconfig, device_type type, const char *tag)
: z80net_state(mconfig, type, tag)
{
}
void z80netb(machine_config &config);
protected:
virtual void machine_reset() override;
private:
void mem_map(address_map &map);
};
class z80netf_state : public z80netb_state
{
public:
z80netf_state(const machine_config &mconfig, device_type type, const char *tag)
: z80netb_state(mconfig, type, tag),
m_io_config(*this, "CONFIG"),
m_floppy(*this, "wd1771:%u", 0U),
m_wd1771(*this, "wd1771"),
m_drv_led(*this, "drv%u", 0U)
{
}
void z80netf(machine_config &config);
private:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void driver_init() override;
struct wd17xx_state_t
{
int drq = 0;
int intrq = 0;
uint8_t drive = 0; /* current drive */
uint8_t head = 0; /* current head */
};
void mem_map(address_map &map);
void io_map(address_map &map);
void lx390_motor_w(uint8_t data);
uint8_t lx390_fdc_r(offs_t offset);
void lx390_fdc_w(offs_t offset, uint8_t data);
void reset_lx390_banking();
required_ioport m_io_config;
required_device_array<floppy_connector, 4> m_floppy;
required_device<fd1771_device> m_wd1771;
wd17xx_state_t m_wd17xx_state;
output_finder<2> m_drv_led;
};
#endif // MAME_INCLUDES_Z80NE_H
|