diff options
-rw-r--r-- | src/devices/bus/pci/clgd546x_laguna.cpp | 4 | ||||
-rw-r--r-- | src/devices/bus/pci/clgd546x_laguna.h | 4 | ||||
-rw-r--r-- | src/devices/video/pc_vga.cpp | 17 | ||||
-rw-r--r-- | src/devices/video/pc_vga.h | 7 | ||||
-rw-r--r-- | src/devices/video/pc_vga_cirrus.cpp | 16 | ||||
-rw-r--r-- | src/devices/video/pc_vga_cirrus.h | 1 | ||||
-rw-r--r-- | src/devices/video/pc_vga_matrox.cpp | 12 | ||||
-rw-r--r-- | src/devices/video/pc_vga_matrox.h | 2 | ||||
-rw-r--r-- | src/devices/video/pc_vga_s3.cpp | 9 | ||||
-rw-r--r-- | src/devices/video/pc_vga_s3.h | 3 | ||||
-rw-r--r-- | src/devices/video/pc_vga_trident.cpp | 2 | ||||
-rw-r--r-- | src/devices/video/s3virge.cpp | 4 |
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(); |