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
|
// license:BSD-3-Clause
// copyright-holders:
#include "emu.h"
#include "pc_vga_alliance.h"
#include "screen.h"
#define VERBOSE (LOG_GENERAL)
//#define LOG_OUTPUT_FUNC osd_printf_info
#include "logmacro.h"
DEFINE_DEVICE_TYPE(PROMOTION_VGA, promotion_vga_device, "promotion_vga", "Alliance ProMotion VGA i/f")
promotion_vga_device::promotion_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: svga_device(mconfig, PROMOTION_VGA, tag, owner, clock)
{
m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(promotion_vga_device::crtc_map), this));
m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(promotion_vga_device::sequencer_map), this));
// TODO: ATT20C408-13 RAMDAC (with bit 9 of address space), BIOS does extensive signature checks at POST
}
static INPUT_PORTS_START(promotion_vga_sense)
PORT_START("VGA_SENSE")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // read at POST
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
ioport_constructor promotion_vga_device::device_input_ports() const
{
return INPUT_PORTS_NAME(promotion_vga_sense);
}
void promotion_vga_device::device_start()
{
svga_device::device_start();
}
void promotion_vga_device::device_reset()
{
svga_device::device_reset();
m_remap_blt = 0;
m_remap_mem = 0;
}
// TODO: lock mechanism
void promotion_vga_device::crtc_map(address_map &map)
{
svga_device::crtc_map(map);
// TODO: $19-$1e for extended regs
}
// TODO: lock mechanism
void promotion_vga_device::sequencer_map(address_map &map)
{
svga_device::sequencer_map(map);
map(0x10, 0xff).unmaprw();
map(0x1b, 0x1b).lrw8(
NAME([this]() { return (m_remap_blt & 0x7) << 3 | (m_remap_mem & 0x7); }),
NAME([this] (offs_t offset, u8 data) {
m_remap_blt = (data >> 3) & 0x7;
m_remap_mem = (data >> 0) & 0x7;
LOG("aT1B: Remap control %02x (host blt %01x promotion %01x)\n", data, m_remap_blt, m_remap_mem);
})
);
}
uint8_t promotion_vga_device::mem_r(offs_t offset)
{
if (m_remap_mem == 1 && (offset & 0x1f800) == 0x00000)
{
LOG("aT Ext Reg: [%03x] R\n", offset );
return 0xff;
}
return svga_device::mem_r(offset);
}
void promotion_vga_device::mem_w(offs_t offset, uint8_t data)
{
if (m_remap_mem == 1 && (offset & 0x1f800) == 0x00000)
{
LOG("aT Ext Reg: [%03x] W %02x\n", offset, data );
return;
}
svga_device::mem_w(offset, data);
}
|