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
|
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
VideoBrain UV201/UV202 video chip emulation
**********************************************************************
_____ _____
GND 1 |* \_/ | 40 DMAREQ
G 2 | | 39 /CE
I 3 | | 38 RESET
B 4 | | 37 BISTROBE
R 5 | | 36 UMIREQ0
BA0 6 | | 35 BRCLK
BA1 7 | | 34 HBLANK
BA2 8 | | 33 VBLANK
BA3 9 | | 32 R/W
BA4 10 | UV201 | 31 keypad column 8
BA5 11 | | 30 EXT INT
BA6 12 | | 29 FIELD
BA7 13 | | 28 BD7
BA8 14 | | 27 BD6
BA9 15 | | 26 BD5
BA10 16 | | 25 BD4
BA11 17 | | 24 BD3
BA12 18 | | 23 BD2
+5V 19 | | 22 BD1
+12V 20 |_____________| 21 BD0
_____ _____
UMIREQ1 1 |* \_/ | 40 BISTROBE
UMIREQ0 2 | | 39 CPUREQ1
CPUREQ0 3 | | 38 GND
XIN 4 | | 37 /800-BFF
XOUT 5 | | 36 RST
DMAREQ0 6 | | 35 DMAREQ1
CPU CLK 7 | | 34 COLCLK
WACK 8 | | 33 BRCLK
D0 9 | | 32 D7
BD0 10 | UV202 | 31 BD7
D1 11 | | 30 D6
BD1 12 | | 29 BD6
D2 13 | | 28 D5
BD2 14 | | 27 BD5
D3 15 | | 26 D4
BD3 16 | | 25 BD4
HBLANK 17 | | 24 FIELD
VBLANK 18 | | 23 SCANLINE
BURST 19 | | 22 +12V
CSYNCH 20 |_____________| 21 +5V
**********************************************************************/
#pragma once
#ifndef __UV201__
#define __UV201__
#include "emu.h"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_UV201_ADD(_tag, _screen_tag, _clock, _config) \
MCFG_SCREEN_ADD(_screen_tag, RASTER) \
MCFG_SCREEN_UPDATE_DEVICE(_tag, uv201_device, screen_update) \
MCFG_SCREEN_RAW_PARAMS(_clock, 232, 18, 232, 262, 21, 262) \
MCFG_DEVICE_ADD(_tag, UV201, _clock) \
MCFG_VIDEO_SET_SCREEN(_screen_tag)
#define MCFG_UV201_EXT_INT_CALLBACK(_write) \
devcb = &uv201_device::set_ext_int_wr_callback(*device, DEVCB_##_write);
#define MCFG_UV201_HBLANK_CALLBACK(_write) \
devcb = &uv201_device::set_hblank_wr_callback(*device, DEVCB_##_write);
#define MCFG_UV201_DB_CALLBACK(_read) \
devcb = &uv201_device::set_db_rd_callback(*device, DEVCB_##_read);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> uv201_device
class uv201_device : public device_t,
public device_video_interface
{
public:
// construction/destruction
uv201_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb_base &set_ext_int_wr_callback(device_t &device, _Object object) { return downcast<uv201_device &>(device).m_write_ext_int.set_callback(object); }
template<class _Object> static devcb_base &set_hblank_wr_callback(device_t &device, _Object object) { return downcast<uv201_device &>(device).m_write_hblank.set_callback(object); }
template<class _Object> static devcb_base &set_db_rd_callback(device_t &device, _Object object) { return downcast<uv201_device &>(device).m_read_db.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( ext_int_w );
DECLARE_READ_LINE_MEMBER( kbd_r );
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
enum
{
TIMER_Y_ODD,
TIMER_Y_EVEN,
TIMER_HBLANK_ON,
TIMER_HBLANK_OFF
};
void initialize_palette();
int get_field_vpos();
int get_field();
void set_y_interrupt();
void do_partial_update();
devcb_write_line m_write_ext_int;
devcb_write_line m_write_hblank;
devcb_read8 m_read_db;
rgb_t m_palette_val[32];
UINT8 m_ram[0x90];
UINT8 m_y_int;
UINT8 m_fmod;
UINT8 m_bg;
UINT8 m_cmd;
UINT8 m_freeze_x;
UINT16 m_freeze_y;
int m_field;
// timers
emu_timer *m_timer_y_odd;
emu_timer *m_timer_y_even;
emu_timer *m_timer_hblank_on;
emu_timer *m_timer_hblank_off;
};
// device type definition
extern const device_type UV201;
#endif
|