mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
video/pc_vga: retire vblank_timer_cb override, add a latch_start_addr fn in place
This commit is contained in:
parent
3eea92649c
commit
c2ebab9d9f
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user