Skip to content

Commit 2959c82

Browse files
committed
video/pc_vga_cirrus: add start address bit 19 for GD5430+
1 parent 40bf644 commit 2959c82

File tree

3 files changed

+84
-16
lines changed

3 files changed

+84
-16
lines changed

src/devices/bus/pci/clgd5446.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Assume Rev. B
2323
#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__)
2424
#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__)
2525

26-
DEFINE_DEVICE_TYPE(GD5446_PCI, cirrus_gd5446_pci_device, "clgd5446", "Cirrus Logic GD-5446 card")
26+
DEFINE_DEVICE_TYPE(GD5446_PCI, cirrus_gd5446_pci_device, "clgd5446_pci", "Cirrus Logic GD-5446 card")
2727

2828
cirrus_gd5446_pci_device::cirrus_gd5446_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
2929
: pci_card_device(mconfig, GD5446_PCI, tag, owner, clock)

src/devices/video/pc_vga_cirrus.cpp

+68-14
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,20 @@ cirrus_gd5428_vga_device::cirrus_gd5428_vga_device(const machine_config &mconfig
4848
}
4949

5050
cirrus_gd5430_vga_device::cirrus_gd5430_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
51-
: cirrus_gd5428_vga_device(mconfig, CIRRUS_GD5430_VGA, tag, owner, clock)
51+
: cirrus_gd5430_vga_device(mconfig, CIRRUS_GD5430_VGA, tag, owner, clock)
5252
{
5353
m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_vga_device::crtc_map), this));
5454
m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_vga_device::gc_map), this));
5555
m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5430_vga_device::sequencer_map), this));
5656
}
5757

58+
cirrus_gd5430_vga_device::cirrus_gd5430_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
59+
: cirrus_gd5428_vga_device(mconfig, type, tag, owner, clock)
60+
{
61+
}
62+
5863
cirrus_gd5446_vga_device::cirrus_gd5446_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
59-
: cirrus_gd5428_vga_device(mconfig, CIRRUS_GD5446_VGA, tag, owner, clock)
64+
: cirrus_gd5430_vga_device(mconfig, CIRRUS_GD5446_VGA, tag, owner, clock)
6065
{
6166
m_crtc_space_config = address_space_config("crtc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_vga_device::crtc_map), this));
6267
m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(cirrus_gd5446_vga_device::gc_map), this));
@@ -215,8 +220,6 @@ void cirrus_gd5428_vga_device::crtc_map(address_map &map)
215220
cirrus_define_video_mode();
216221
})
217222
);
218-
// TODO: CR1D for GD543x
219-
//vga.crtc.start_addr_latch = (vga.crtc.start_addr_latch & 0xf7ffff) | ((data & 0x01) << 16);
220223
map(0x27, 0x27).lr8(
221224
NAME([this] (offs_t offset) {
222225
LOGMASKED(LOG_REG, "CR27: Read ID\n");
@@ -1134,19 +1137,25 @@ uint8_t cirrus_gd5428_vga_device::vga_latch_write(int offs, uint8_t data)
11341137
return res;
11351138
}
11361139

1140+
// 0xa0000-0xa7fff offset 0
1141+
// 0xa8000-0xaffff offset 1 (if enabled with GRB bit 0)
1142+
// notice that "offset" in this context doesn't mean pitch like everything else in the
1143+
// (S)VGA realm but it's really intended as a window bank base here.
1144+
uint8_t cirrus_gd5428_vga_device::offset_select(offs_t offset)
1145+
{
1146+
const uint8_t sa15 = BIT(offset, 15);
1147+
return gc_bank[sa15 & BIT(gc_mode_ext, 0)];
1148+
}
1149+
11371150
uint8_t cirrus_gd5428_vga_device::mem_r(offs_t offset)
11381151
{
11391152
uint32_t addr;
1140-
uint8_t bank;
11411153
uint8_t cur_mode = pc_vga_choosevideomode();
11421154

11431155
if(gc_locked || offset >= 0x10000 || cur_mode == TEXT_MODE || cur_mode == SCREEN_OFF)
11441156
return vga_device::mem_r(offset);
11451157

1146-
if(offset >= 0x8000 && offset < 0x10000 && (gc_mode_ext & 0x01)) // if accessing bank 1 (if enabled)
1147-
bank = gc_bank[1];
1148-
else
1149-
bank = gc_bank[0];
1158+
const uint8_t bank = offset_select(offset);
11501159

11511160
if(gc_mode_ext & 0x20) // 16kB bank granularity
11521161
addr = bank * 0x4000;
@@ -1270,7 +1279,6 @@ uint8_t cirrus_gd5428_vga_device::mem_r(offs_t offset)
12701279
void cirrus_gd5428_vga_device::mem_w(offs_t offset, uint8_t data)
12711280
{
12721281
uint32_t addr;
1273-
uint8_t bank;
12741282
uint8_t cur_mode = pc_vga_choosevideomode();
12751283

12761284
if(m_blt_system_transfer)
@@ -1302,10 +1310,7 @@ void cirrus_gd5428_vga_device::mem_w(offs_t offset, uint8_t data)
13021310
return;
13031311
}
13041312

1305-
if(offset >= 0x8000 && offset < 0x10000 && (gc_mode_ext & 0x01)) // if accessing bank 1 (if enabled)
1306-
bank = gc_bank[1];
1307-
else
1308-
bank = gc_bank[0];
1313+
const uint8_t bank = offset_select(offset);
13091314

13101315
if(gc_mode_ext & 0x20) // 16kB bank granularity
13111316
addr = bank * 0x4000;
@@ -1451,3 +1456,52 @@ void cirrus_gd5428_vga_device::mem_w(offs_t offset, uint8_t data)
14511456
}
14521457
}
14531458
}
1459+
1460+
/*
1461+
* CL-GD5430 overrides
1462+
*/
1463+
1464+
void cirrus_gd5430_vga_device::crtc_map(address_map &map)
1465+
{
1466+
cirrus_gd5428_vga_device::crtc_map(map);
1467+
map(0x1d, 0x1d).lrw8(
1468+
NAME([this] (offs_t offset) {
1469+
return m_cr1d;
1470+
}),
1471+
NAME([this] (offs_t offset, u8 data) {
1472+
LOGMASKED(LOG_REG, "CR1D: Overlay Extended Control %02x\n", data);
1473+
m_cr1d = data;
1474+
// TODO: '34/'36 onward
1475+
vga.crtc.start_addr_latch = (vga.crtc.start_addr_latch & 0xf7ffff) | (BIT(data, 7) << 19);
1476+
})
1477+
);
1478+
}
1479+
1480+
void cirrus_gd5430_vga_device::gc_map(address_map &map)
1481+
{
1482+
cirrus_gd5428_vga_device::gc_map(map);
1483+
}
1484+
1485+
void cirrus_gd5430_vga_device::sequencer_map(address_map &map)
1486+
{
1487+
cirrus_gd5428_vga_device::sequencer_map(map);
1488+
}
1489+
1490+
/*
1491+
* CL-GD5446 overrides
1492+
*/
1493+
1494+
void cirrus_gd5446_vga_device::crtc_map(address_map &map)
1495+
{
1496+
cirrus_gd5430_vga_device::crtc_map(map);
1497+
}
1498+
1499+
void cirrus_gd5446_vga_device::gc_map(address_map &map)
1500+
{
1501+
cirrus_gd5430_vga_device::gc_map(map);
1502+
}
1503+
1504+
void cirrus_gd5446_vga_device::sequencer_map(address_map &map)
1505+
{
1506+
cirrus_gd5430_vga_device::sequencer_map(map);
1507+
}

src/devices/video/pc_vga_cirrus.h

+15-1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ class cirrus_gd5428_vga_device : public svga_device
9595

9696
virtual bool get_interlace_mode() override { return BIT(m_cr1a, 0); }
9797

98+
uint8_t offset_select(offs_t offset);
99+
98100
private:
99101
void cirrus_define_video_mode();
100102

@@ -112,16 +114,28 @@ class cirrus_gd5430_vga_device : public cirrus_gd5428_vga_device
112114
cirrus_gd5430_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
113115

114116
protected:
117+
cirrus_gd5430_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
118+
115119
virtual void device_start() override;
120+
121+
virtual void crtc_map(address_map &map) override;
122+
virtual void gc_map(address_map &map) override;
123+
virtual void sequencer_map(address_map &map) override;
124+
private:
125+
uint8_t m_cr1d = 0;
116126
};
117127

118-
class cirrus_gd5446_vga_device : public cirrus_gd5428_vga_device
128+
class cirrus_gd5446_vga_device : public cirrus_gd5430_vga_device
119129
{
120130
public:
121131
cirrus_gd5446_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
122132

123133
protected:
124134
virtual void device_start() override;
135+
136+
virtual void crtc_map(address_map &map) override;
137+
virtual void gc_map(address_map &map) override;
138+
virtual void sequencer_map(address_map &map) override;
125139
};
126140

127141

0 commit comments

Comments
 (0)