Skip to content

Commit ca593d3

Browse files
authored
dvk_kcgd: use new 1801vp033 device (#14278)
1 parent 2c7e661 commit ca593d3

File tree

3 files changed

+523
-118
lines changed

3 files changed

+523
-118
lines changed

src/mame/ussr/1801vp033.cpp

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Sergey Svishchev
3+
/**********************************************************************
4+
5+
1801VP1-033 Gate Array emulation
6+
7+
https://github.com/1801BM1/k1801/blob/master/033/doc/bpic.md
8+
9+
Multifunction device; function is chosen at power-up time:
10+
11+
BPIC - bidirectional 8-bit parallel port with interrupt support
12+
(for printers, paper tape readers and terminals)
13+
PIC - bidirectional 16-bit parallel port with interrupt support
14+
FDIC - bidirectional parallel-to-serial interface
15+
(for external floppy drive, clone of RX01 or RX02)
16+
17+
Unimplemented: FDIC function and bidirectional mode of BPIC function
18+
19+
**********************************************************************/
20+
21+
#include "emu.h"
22+
#include "1801vp033.h"
23+
24+
//#define VERBOSE (LOG_GENERAL)
25+
#include "logmacro.h"
26+
27+
28+
//**************************************************************************
29+
// MACROS / CONSTANTS
30+
//**************************************************************************
31+
32+
33+
34+
//**************************************************************************
35+
// DEVICE DEFINITIONS
36+
//**************************************************************************
37+
38+
DEFINE_DEVICE_TYPE(K1801VP033, k1801vp033_device, "1801vp1_033", "1801VP1-033")
39+
40+
41+
42+
//**************************************************************************
43+
// LIVE DEVICE
44+
//**************************************************************************
45+
46+
//-------------------------------------------------
47+
// k1801vp033_device - constructor
48+
//-------------------------------------------------
49+
50+
k1801vp033_device::k1801vp033_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
51+
: device_t(mconfig, K1801VP033, tag, owner, clock)
52+
, device_z80daisy_interface(mconfig, *this)
53+
, m_bpic_write_rxrdy(*this)
54+
, m_bpic_write_txrdy(*this)
55+
, m_bpic_write_reset(*this)
56+
, m_bpic_write_strobe(*this)
57+
, m_bpic_write_pd(*this)
58+
, m_pic_write_reqa(*this)
59+
, m_pic_write_reqb(*this)
60+
, m_pic_write_csr0(*this)
61+
, m_pic_write_csr1(*this)
62+
, m_pic_write_out(*this)
63+
, m_rxvec(0)
64+
, m_txvec(0)
65+
{
66+
}
67+
68+
69+
//-------------------------------------------------
70+
// device_start - device-specific startup
71+
//-------------------------------------------------
72+
73+
void k1801vp033_device::device_start()
74+
{
75+
m_rcsr = m_tcsr = m_rbuf = m_tbuf = 0;
76+
m_rxrdy = m_txrdy = CLEAR_LINE;
77+
78+
m_bpic_write_strobe(1);
79+
80+
// register for state saving
81+
save_item(NAME(m_rcsr));
82+
save_item(NAME(m_rbuf));
83+
save_item(NAME(m_tcsr));
84+
save_item(NAME(m_tbuf));
85+
}
86+
87+
88+
//-------------------------------------------------
89+
// device_reset - device-specific reset
90+
//-------------------------------------------------
91+
92+
void k1801vp033_device::device_reset()
93+
{
94+
m_tbuf = 0;
95+
m_txrdy = CLEAR_LINE;
96+
m_tcsr &= ~(CSR_IE | PICCSR_IEA | PICCSR_IEB);
97+
m_tcsr |= BPICCSR_DRQ;
98+
}
99+
100+
//-------------------------------------------------
101+
// daisy chained interrupts
102+
//-------------------------------------------------
103+
104+
int k1801vp033_device::z80daisy_irq_state()
105+
{
106+
if (m_rxrdy == ASSERT_LINE || m_txrdy == ASSERT_LINE)
107+
return Z80_DAISY_INT;
108+
else
109+
return 0;
110+
}
111+
112+
int k1801vp033_device::z80daisy_irq_ack()
113+
{
114+
int vec = -1;
115+
116+
if (m_rxrdy == ASSERT_LINE)
117+
{
118+
m_rxrdy = CLEAR_LINE;
119+
vec = m_rxvec;
120+
}
121+
else if (m_txrdy == ASSERT_LINE)
122+
{
123+
m_txrdy = CLEAR_LINE;
124+
vec = m_txvec;
125+
}
126+
127+
return vec;
128+
}
129+
130+
131+
//-------------------------------------------------
132+
// read - register read
133+
//-------------------------------------------------
134+
135+
uint16_t k1801vp033_device::bpic_read(offs_t offset)
136+
{
137+
uint16_t data = 0;
138+
139+
switch (offset & 3)
140+
{
141+
case 0:
142+
data = m_tcsr & BPICCSR_RD;
143+
break;
144+
145+
case 2:
146+
data = m_tbuf;
147+
break;
148+
}
149+
150+
return data;
151+
}
152+
153+
154+
uint16_t k1801vp033_device::pic_read(offs_t offset)
155+
{
156+
uint16_t data = 0;
157+
158+
switch (offset & 3)
159+
{
160+
case 0:
161+
data = m_tcsr & PICCSR_RD;
162+
break;
163+
164+
case 1:
165+
data = m_tbuf;
166+
break;
167+
168+
case 2:
169+
data = m_rbuf;
170+
break;
171+
}
172+
173+
return data;
174+
}
175+
176+
//-------------------------------------------------
177+
// write - register write
178+
//-------------------------------------------------
179+
180+
void k1801vp033_device::bpic_write(offs_t offset, uint16_t data, uint16_t mem_mask)
181+
{
182+
LOG("%s W %06o <- %06o & %06o\n", machine().describe_context(), 0177510 + (offset << 1), data, mem_mask);
183+
184+
switch (offset & 3)
185+
{
186+
case 0:
187+
if ((data & CSR_IE) == 0)
188+
{
189+
clear_virq(m_bpic_write_txrdy, 1, 1, m_txrdy);
190+
}
191+
else if ((m_tcsr & (BPICCSR_DRQ + CSR_IE)) == BPICCSR_DRQ)
192+
{
193+
raise_virq(m_bpic_write_txrdy, 1, 1, m_txrdy);
194+
}
195+
m_tcsr = ((m_tcsr & ~BPICCSR_WR) | (data & BPICCSR_WR));
196+
m_bpic_write_reset(!BIT(m_tcsr, 14));
197+
break;
198+
199+
case 2:
200+
m_tbuf = data & 0377;
201+
m_tcsr &= ~BPICCSR_DRQ;
202+
clear_virq(m_bpic_write_txrdy, m_tcsr, CSR_IE, m_txrdy);
203+
m_bpic_write_pd(m_tbuf);
204+
m_bpic_write_strobe(0);
205+
m_bpic_write_strobe(1);
206+
break;
207+
}
208+
}
209+
210+
void k1801vp033_device::pic_write(offs_t offset, uint16_t data, uint16_t mem_mask)
211+
{
212+
LOG("%s W %06o <- %06o & %06o\n", machine().describe_context(), 0177510 + (offset << 1), data, mem_mask);
213+
214+
switch (offset & 3)
215+
{
216+
case 0:
217+
m_tcsr = ((m_tcsr & ~PICCSR_WR) | (data & PICCSR_WR));
218+
m_pic_write_csr0(BIT(m_tcsr, 0));
219+
m_pic_write_csr1(BIT(m_tcsr, 1));
220+
break;
221+
222+
case 1:
223+
COMBINE_DATA(&m_tbuf);
224+
m_pic_write_out(0, m_tbuf, mem_mask);
225+
break;
226+
}
227+
}

src/mame/ussr/1801vp033.h

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Sergey Svishchev
3+
/**********************************************************************
4+
5+
1801VP1-033 Gate Array emulation
6+
7+
**********************************************************************/
8+
9+
#ifndef MAME_USSR_1801VP033_H
10+
#define MAME_USSR_1801VP033_H
11+
12+
#pragma once
13+
14+
#include "machine/pdp11.h"
15+
#include "machine/z80daisy.h"
16+
17+
18+
//**************************************************************************
19+
// TYPE DEFINITIONS
20+
//**************************************************************************
21+
22+
// ======================> k1801vp033_device
23+
24+
class k1801vp033_device : public device_t,
25+
public device_z80daisy_interface
26+
{
27+
public:
28+
// construction/destruction
29+
k1801vp033_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
30+
31+
// BPIC mode
32+
33+
void set_txvec(int vec) { m_txvec = vec; }
34+
void set_rxvec(int vec) { m_rxvec = vec; }
35+
36+
auto bpic_txrdy_wr_callback() { return m_bpic_write_txrdy.bind(); }
37+
auto bpic_reset_wr_callback() { return m_bpic_write_reset.bind(); }
38+
auto bpic_strobe_wr_callback() { return m_bpic_write_strobe.bind(); }
39+
auto bpic_pd_wr_callback() { return m_bpic_write_pd.bind(); }
40+
41+
uint16_t bpic_read(offs_t offset);
42+
void bpic_write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
43+
44+
void bpic_write_drq(int state) { if (state) { m_tcsr |= BPICCSR_DRQ; raise_virq(m_bpic_write_txrdy, m_tcsr, CSR_IE, m_txrdy); } }
45+
void bpic_write_err(int state) { if (state) m_tcsr |= CSR_ERR; else m_tcsr &= ~CSR_ERR; }
46+
47+
// PIC mode
48+
49+
void set_vec_a(int vec) { m_txvec = vec; }
50+
void set_vec_b(int vec) { m_rxvec = vec; }
51+
52+
auto pic_out_wr_callback() { return m_pic_write_out.bind(); }
53+
auto pic_csr0_wr_callback() { return m_pic_write_csr0.bind(); }
54+
auto pic_csr1_wr_callback() { return m_pic_write_csr1.bind(); }
55+
56+
uint16_t pic_read(offs_t offset);
57+
void pic_write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
58+
59+
void pic_write_reqa(int state) { if (state) { m_tcsr |= PICCSR_REQA; raise_virq(m_pic_write_reqa, m_tcsr, PICCSR_IEA, m_txrdy); } }
60+
void pic_write_reqb(int state) { if (state) { m_tcsr |= PICCSR_REQB; raise_virq(m_pic_write_reqb, m_tcsr, PICCSR_IEB, m_rxrdy); } }
61+
void pic_write_rbuf(uint16_t data) { m_rbuf = data; }
62+
63+
protected:
64+
// device-level overrides
65+
virtual void device_start() override;
66+
virtual void device_reset() override;
67+
68+
// device_z80daisy_interface overrides
69+
virtual int z80daisy_irq_state() override;
70+
virtual int z80daisy_irq_ack() override;
71+
virtual void z80daisy_irq_reti() override {};
72+
73+
private:
74+
static constexpr uint16_t BPICCSR_RDY = 0000040;
75+
static constexpr uint16_t BPICCSR_DRQ = 0000200;
76+
static constexpr uint16_t BPICCSR_RESET = 0040000;
77+
static constexpr uint16_t BPICCSR_RD = (CSR_DONE | CSR_IE | CSR_ERR | BPICCSR_RDY | BPICCSR_DRQ);
78+
static constexpr uint16_t BPICCSR_WR = (CSR_IE | BPICCSR_RESET);
79+
80+
static constexpr uint16_t PICCSR_CSR0 = 0000001;
81+
static constexpr uint16_t PICCSR_CSR1 = 0000002;
82+
static constexpr uint16_t PICCSR_IEB = 0000040;
83+
static constexpr uint16_t PICCSR_IEA = 0000100;
84+
static constexpr uint16_t PICCSR_REQA = 0000200;
85+
static constexpr uint16_t PICCSR_REQB = 0100000;
86+
static constexpr uint16_t PICCSR_RD = (PICCSR_REQB | PICCSR_REQA | PICCSR_IEA | PICCSR_IEB | PICCSR_CSR1 | PICCSR_CSR0);
87+
static constexpr uint16_t PICCSR_WR = (PICCSR_IEA | PICCSR_IEB | PICCSR_CSR1 | PICCSR_CSR0);
88+
89+
devcb_write_line m_bpic_write_rxrdy;
90+
devcb_write_line m_bpic_write_txrdy;
91+
devcb_write_line m_bpic_write_reset;
92+
devcb_write_line m_bpic_write_strobe;
93+
devcb_write8 m_bpic_write_pd;
94+
95+
devcb_write_line m_pic_write_reqa;
96+
devcb_write_line m_pic_write_reqb;
97+
devcb_write_line m_pic_write_csr0;
98+
devcb_write_line m_pic_write_csr1;
99+
devcb_write16 m_pic_write_out;
100+
101+
line_state m_rxrdy;
102+
line_state m_txrdy;
103+
104+
int m_rxvec;
105+
int m_txvec;
106+
107+
uint16_t m_rcsr;
108+
uint16_t m_rbuf;
109+
uint16_t m_tcsr;
110+
uint16_t m_tbuf;
111+
};
112+
113+
114+
// device type definition
115+
DECLARE_DEVICE_TYPE(K1801VP033, k1801vp033_device)
116+
117+
#endif // MAME_USSR_1801VP033_H

0 commit comments

Comments
 (0)