summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/bus/pci/clgd546x_laguna.cpp4
-rw-r--r--src/devices/bus/pci/clgd546x_laguna.h4
-rw-r--r--src/devices/video/pc_vga.cpp17
-rw-r--r--src/devices/video/pc_vga.h7
-rw-r--r--src/devices/video/pc_vga_cirrus.cpp16
-rw-r--r--src/devices/video/pc_vga_cirrus.h1
-rw-r--r--src/devices/video/pc_vga_matrox.cpp12
-rw-r--r--src/devices/video/pc_vga_matrox.h2
-rw-r--r--src/devices/video/pc_vga_s3.cpp9
-rw-r--r--src/devices/video/pc_vga_s3.h3
-rw-r--r--src/devices/video/pc_vga_trident.cpp2
-rw-r--r--src/devices/video/s3virge.cpp4
12 files changed, 47 insertions, 34 deletions
diff --git a/src/devices/bus/pci/clgd546x_laguna.cpp b/src/devices/bus/pci/clgd546x_laguna.cpp
index 90e50de61cc..fdc0ed199bc 100644
--- a/src/devices/bus/pci/clgd546x_laguna.cpp
+++ b/src/devices/bus/pci/clgd546x_laguna.cpp
@@ -19,8 +19,8 @@
DEFINE_DEVICE_TYPE(CIRRUS_GD5465_LAGUNA3D, cirrus_gd5465_laguna3d_device, "clgd5465_laguna", "Cirrus Logic GD-5465 \"Laguna 3D\"")
cirrus_gd5465_laguna3d_device::cirrus_gd5465_laguna3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : pci_device(mconfig, CIRRUS_GD5465_LAGUNA3D, tag, owner, clock)
- , m_vga(*this, "svga")
+ : pci_card_device(mconfig, CIRRUS_GD5465_LAGUNA3D, tag, owner, clock)
+ , m_vga(*this, "vga")
, m_vga_rom(*this, "vga_rom")
{
// device ID 0x1013 Cirrus Logic
diff --git a/src/devices/bus/pci/clgd546x_laguna.h b/src/devices/bus/pci/clgd546x_laguna.h
index 81d8479fa8d..668f724452b 100644
--- a/src/devices/bus/pci/clgd546x_laguna.h
+++ b/src/devices/bus/pci/clgd546x_laguna.h
@@ -5,10 +5,10 @@
#pragma once
-#include "machine/pci.h"
+#include "pci_slot.h"
#include "video/pc_vga_cirrus.h"
-class cirrus_gd5465_laguna3d_device : public pci_device
+class cirrus_gd5465_laguna3d_device : public pci_card_device
{
public:
cirrus_gd5465_laguna3d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
diff --git a/src/devices/video/pc_vga.cpp b/src/devices/video/pc_vga.cpp
index aebada89fa9..1780997b3ca 100644
--- a/src/devices/video/pc_vga.cpp
+++ b/src/devices/video/pc_vga.cpp
@@ -83,11 +83,9 @@
#define GRAPHIC_MODE (vga.gc.alpha_dis) /* else text mode */
#define EGA_COLUMNS (vga.crtc.horz_disp_end+1)
-#define EGA_START_ADDRESS (vga.crtc.start_addr)
#define EGA_LINE_LENGTH (vga.crtc.offset<<1)
#define VGA_COLUMNS (vga.crtc.horz_disp_end+1)
-#define VGA_START_ADDRESS (vga.crtc.start_addr)
#define VGA_LINE_LENGTH (vga.crtc.offset<<3)
#define VGA_CH_WIDTH ((vga.sequencer.data[1]&1)?8:9)
@@ -101,7 +99,6 @@
// Special values for SVGA Trident - Mode Vesa 110h
#define TLINES (LINES)
#define TGA_COLUMNS (EGA_COLUMNS)
-#define TGA_START_ADDRESS (vga.crtc.start_addr<<2)
#define TGA_LINE_LENGTH (vga.crtc.offset<<3)
@@ -1356,7 +1353,7 @@ void vga_device::vga_vh_ega(bitmap_rgb32 &bitmap, const rectangle &cliprect)
int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1);
int pel_shift = (vga.attribute.pel_shift & 7);
- for (int addr=EGA_START_ADDRESS, line=0; line<LINES; line += height, addr += offset())
+ for (int addr = vga.crtc.start_addr, line = 0; line < LINES; line += height, addr += offset())
{
for (int yi=0;yi<height;yi++)
{
@@ -1839,7 +1836,7 @@ void vga_device::mem_linear_w(offs_t offset, uint8_t data)
/* VBLANK callback, start address definitely updates AT vblank, not before. */
TIMER_CALLBACK_MEMBER(vga_device::vblank_timer_cb)
{
- vga.crtc.start_addr = vga.crtc.start_addr_latch;
+ vga.crtc.start_addr = latch_start_addr();
vga.attribute.pel_shift = vga.attribute.pel_shift_latch;
m_vblank_timer->adjust( screen().time_until_pos(vga.crtc.vert_blank_start + vga.crtc.vert_blank_end) );
}
@@ -1896,7 +1893,7 @@ void svga_device::svga_vh_rgb8(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// }
uint8_t start_shift = (!(vga.sequencer.data[4] & 0x08) || svga.ignore_chain4) ? 2 : 0;
- for (int addr = VGA_START_ADDRESS << start_shift, line=0; line<LINES; line+=height, addr+=offset(), curr_addr+=offset())
+ for (int addr = vga.crtc.start_addr << start_shift, line=0; line<LINES; line+=height, addr += offset(), curr_addr+=offset())
{
for (int yi = 0;yi < height; yi++)
{
@@ -1932,7 +1929,7 @@ void svga_device::svga_vh_rgb15(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// uint16_t mask_comp = 0xff | (TLINES & 0x300);
int curr_addr = 0;
int yi=0;
- for (int addr = TGA_START_ADDRESS, line=0; line<TLINES; line+=height, addr+=offset(), curr_addr+=offset())
+ for (int addr = vga.crtc.start_addr << 2, line=0; line<TLINES; line+=height, addr+=offset(), curr_addr+=offset())
{
uint32_t *const bitmapline = &bitmap.pix(line);
addr %= vga.svga_intf.vram_size;
@@ -1967,7 +1964,7 @@ void svga_device::svga_vh_rgb16(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// uint16_t mask_comp = 0xff | (TLINES & 0x300);
int curr_addr = 0;
int yi=0;
- for (int addr = TGA_START_ADDRESS, line=0; line<TLINES; line+=height, addr+=offset(), curr_addr+=offset())
+ for (int addr = vga.crtc.start_addr << 2, line=0; line<TLINES; line+=height, addr+=offset(), curr_addr+=offset())
{
uint32_t *const bitmapline = &bitmap.pix(line);
addr %= vga.svga_intf.vram_size;
@@ -2002,7 +1999,7 @@ void svga_device::svga_vh_rgb24(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// uint16_t mask_comp = 0xff | (TLINES & 0x300);
int curr_addr = 0;
int yi=0;
- for (int addr = TGA_START_ADDRESS<<1, line=0; line<TLINES; line+=height, addr+=offset(), curr_addr+=offset())
+ for (int addr = vga.crtc.start_addr << 3, line=0; line<TLINES; line+=height, addr+=offset(), curr_addr+=offset())
{
uint32_t *const bitmapline = &bitmap.pix(line);
addr %= vga.svga_intf.vram_size;
@@ -2036,7 +2033,7 @@ void svga_device::svga_vh_rgb32(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// mask_comp = 0xff | (TLINES & 0x300);
int curr_addr = 0;
int yi=0;
- for (int addr = TGA_START_ADDRESS, line=0; line<TLINES; line+=height, addr+=(offset()), curr_addr+=(offset()))
+ for (int addr = vga.crtc.start_addr << 2, line=0; line<TLINES; line+=height, addr+=(offset()), curr_addr+=(offset()))
{
uint32_t *const bitmapline = &bitmap.pix(line);
addr %= vga.svga_intf.vram_size;
diff --git a/src/devices/video/pc_vga.h b/src/devices/video/pc_vga.h
index 158f282678d..679f7e2c22e 100644
--- a/src/devices/video/pc_vga.h
+++ b/src/devices/video/pc_vga.h
@@ -40,7 +40,6 @@ public:
virtual void mem_w(offs_t offset, uint8_t data);
virtual uint8_t mem_linear_r(offs_t offset);
virtual void mem_linear_w(offs_t offset,uint8_t data);
- virtual TIMER_CALLBACK_MEMBER(vblank_timer_cb);
void set_offset(uint16_t val) { vga.crtc.offset = val; }
void set_vram_size(size_t vram_size) { vga.svga_intf.vram_size = vram_size; }
@@ -65,6 +64,8 @@ protected:
vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ TIMER_CALLBACK_MEMBER(vblank_timer_cb);
+
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
@@ -128,7 +129,7 @@ protected:
// NOTE: do not use the subclassed result when determining pitch in SVGA modes.
// dw & word mode should apply to normal VGA modes only.
virtual uint16_t offset();
- virtual uint32_t start_addr();
+ virtual uint32_t latch_start_addr() { return vga.crtc.start_addr_latch; }
virtual uint8_t vga_latch_write(int offs, uint8_t data);
inline uint8_t rotate_right(uint8_t val) { return (val >> vga.gc.rotate_count) | (val << (8 - vga.gc.rotate_count)); }
inline uint8_t vga_logical_op(uint8_t data, uint8_t plane, uint8_t mask)
@@ -298,6 +299,8 @@ protected:
address_space_config m_atc_space_config;
bool m_ioas = false;
+private:
+ uint32_t start_addr();
};
diff --git a/src/devices/video/pc_vga_cirrus.cpp b/src/devices/video/pc_vga_cirrus.cpp
index ac8673450d7..345403f0b22 100644
--- a/src/devices/video/pc_vga_cirrus.cpp
+++ b/src/devices/video/pc_vga_cirrus.cpp
@@ -643,7 +643,7 @@ void cirrus_gd5428_vga_device::device_start()
save_item(NAME(m_hidden_dac_mode));
save_pointer(NAME(gc_bank), 2);
- m_vblank_timer = timer_alloc(FUNC(vga_device::vblank_timer_cb), this);
+ m_vblank_timer = timer_alloc(FUNC(cirrus_gd5428_vga_device::vblank_timer_cb), this);
m_chip_id = 0x98; // GD5428 - Rev 0
}
@@ -848,6 +848,20 @@ uint16_t cirrus_gd5428_vga_device::offset()
return svga_device::offset();
}
+uint32_t cirrus_gd5428_vga_device::latch_start_addr()
+{
+ if (svga.rgb24_en || svga.rgb32_en)
+ return vga.crtc.start_addr_latch >> 1;
+
+ // FIXME: need to explicitly return earlier because rgb8_en is '1' in tandem with these
+ if (svga.rgb15_en || svga.rgb16_en)
+ return vga.crtc.start_addr_latch;
+
+ if (svga.rgb8_en)
+ return vga.crtc.start_addr_latch << 2;
+ return vga.crtc.start_addr_latch;
+}
+
void cirrus_gd5428_vga_device::start_bitblt()
{
uint32_t x,y;
diff --git a/src/devices/video/pc_vga_cirrus.h b/src/devices/video/pc_vga_cirrus.h
index 15d7781ba1c..af7e2a9d490 100644
--- a/src/devices/video/pc_vga_cirrus.h
+++ b/src/devices/video/pc_vga_cirrus.h
@@ -30,6 +30,7 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
virtual uint16_t offset() override;
+ virtual uint32_t latch_start_addr() override;
virtual void io_3cx_map(address_map &map) override;
diff --git a/src/devices/video/pc_vga_matrox.cpp b/src/devices/video/pc_vga_matrox.cpp
index 181c2581a2c..21340f76ec2 100644
--- a/src/devices/video/pc_vga_matrox.cpp
+++ b/src/devices/video/pc_vga_matrox.cpp
@@ -673,13 +673,15 @@ uint16_t matrox_vga_device::offset()
return svga_device::offset();
}
-uint32_t matrox_vga_device::start_addr()
+uint32_t matrox_vga_device::latch_start_addr()
{
- // TODO: fails VBEtest scrolling tests
-// if (m_mgamode)
-// return (vga.crtc.start_addr << 4);
+ // TODO: fails SDD scrolling tests
+ // Looks like it can latch per byte in SVGA modes, which contradicts what's in pc_vga
+ // drawing functions.
+ //if (m_mgamode)
+ // return (vga.crtc.start_addr << 4);
- return svga_device::start_addr();
+ return vga.crtc.start_addr_latch;
}
u16 matrox_vga_device::line_compare_mask()
diff --git a/src/devices/video/pc_vga_matrox.h b/src/devices/video/pc_vga_matrox.h
index 40f230427fa..f57b5c5db14 100644
--- a/src/devices/video/pc_vga_matrox.h
+++ b/src/devices/video/pc_vga_matrox.h
@@ -43,7 +43,7 @@ protected:
virtual void device_reset() override;
virtual uint16_t offset() override;
- virtual uint32_t start_addr() override;
+ virtual uint32_t latch_start_addr() override;
virtual void recompute_params() override;
virtual void palette_update() override;
diff --git a/src/devices/video/pc_vga_s3.cpp b/src/devices/video/pc_vga_s3.cpp
index c087515e5c0..390686ce8ba 100644
--- a/src/devices/video/pc_vga_s3.cpp
+++ b/src/devices/video/pc_vga_s3.cpp
@@ -43,19 +43,16 @@ void s3vision864_vga_device::device_add_mconfig(machine_config &config)
IBM8514A(config, "8514a", 0).set_vga_owner();
}
-TIMER_CALLBACK_MEMBER(s3vision864_vga_device::vblank_timer_cb)
+uint32_t s3vision864_vga_device::latch_start_addr()
{
if(s3.memory_config & 0x08)
{
// - SDD scrolling test expects a << 2 for 8bpp and no shift for anything else
// - Slackware 3.x XF86_S3 expect a << 2 shift (to be confirmed)
// - przonegd expect no shift (RGB16)
- vga.crtc.start_addr = vga.crtc.start_addr_latch << (svga.rgb8_en ? 2 : 0);
+ return vga.crtc.start_addr_latch << (svga.rgb8_en ? 2 : 0);
}
- else
- vga.crtc.start_addr = vga.crtc.start_addr_latch;
- vga.attribute.pel_shift = vga.attribute.pel_shift_latch;
- m_vblank_timer->adjust( screen().time_until_pos(vga.crtc.vert_blank_start + vga.crtc.vert_blank_end) );
+ return vga.crtc.start_addr_latch;
}
void s3vision864_vga_device::device_start()
diff --git a/src/devices/video/pc_vga_s3.h b/src/devices/video/pc_vga_s3.h
index 90d54dbad85..f913c9175f3 100644
--- a/src/devices/video/pc_vga_s3.h
+++ b/src/devices/video/pc_vga_s3.h
@@ -21,8 +21,6 @@ public:
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
- virtual TIMER_CALLBACK_MEMBER(vblank_timer_cb) override;
-
ibm8514a_device* get_8514() { return m_8514; }
protected:
@@ -35,6 +33,7 @@ protected:
virtual void crtc_map(address_map &map) override;
virtual void sequencer_map(address_map &map) override;
+ virtual uint32_t latch_start_addr() override;
virtual u16 line_compare_mask() override;
diff --git a/src/devices/video/pc_vga_trident.cpp b/src/devices/video/pc_vga_trident.cpp
index 4f3b70ba3db..36e990360b7 100644
--- a/src/devices/video/pc_vga_trident.cpp
+++ b/src/devices/video/pc_vga_trident.cpp
@@ -574,7 +574,7 @@ void trident_vga_device::device_start()
save_pointer(tri.accel_pattern,"Pattern Data", 0x80);
save_pointer(tri.lutdac_reg,"LUTDAC registers", 0x100);
- m_vblank_timer = timer_alloc(FUNC(vga_device::vblank_timer_cb), this);
+ m_vblank_timer = timer_alloc(FUNC(trident_vga_device::vblank_timer_cb), this);
svga.ignore_chain4 = true;
memset(&tri, 0, sizeof(tri));
}
diff --git a/src/devices/video/s3virge.cpp b/src/devices/video/s3virge.cpp
index bcca234ab90..63492746a5f 100644
--- a/src/devices/video/s3virge.cpp
+++ b/src/devices/video/s3virge.cpp
@@ -102,7 +102,7 @@ void s3virge_vga_device::device_start()
save_item(vga.sequencer.data,"Sequencer Registers");
save_item(vga.attribute.data,"Attribute Registers");
- m_vblank_timer = timer_alloc(FUNC(vga_device::vblank_timer_cb), this);
+ m_vblank_timer = timer_alloc(FUNC(s3virge_vga_device::vblank_timer_cb), this);
m_draw_timer = timer_alloc(FUNC(s3virge_vga_device::draw_step_tick), this);
memset(&s3, 0, sizeof(s3));
@@ -188,7 +188,7 @@ void s3virgedx_rev1_vga_device::device_reset()
uint16_t s3virge_vga_device::offset()
{
// win98se expects 24bpp packed mode with x6 boundaries
- // this breaks VBETest, which detects these VESA modes as 32bpp.
+ // this breaks SDD, which detects these VESA modes as 32bpp.
if(svga.rgb24_en)
return vga.crtc.offset * 6;
return s3trio64_vga_device::offset();