video/pc_vga: retire vblank_timer_cb override, add a latch_start_addr fn in place

This commit is contained in:
angelosa 2024-03-10 04:28:06 +01:00
parent 3eea92649c
commit c2ebab9d9f
12 changed files with 47 additions and 34 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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();
};

View File

@ -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;

View File

@ -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;

View File

@ -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()

View File

@ -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;

View File

@ -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()

View File

@ -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;

View File

@ -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));
}

View File

@ -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();