From 3efeb980ac43372d31e43670a89f113d73fd0cad Mon Sep 17 00:00:00 2001 From: jbu Date: Sat, 1 Nov 2014 13:41:13 +0100 Subject: Add zero() to (s)vga_device: zeroes all private variables but vtbls. The vga.memory is resized to 0. --- src/emu/bus/isa/s3virge.c | 4 +--- src/emu/bus/isa/trident.c | 4 +--- src/emu/video/pc_vga.c | 24 ++++++++++++++++++++++-- src/emu/video/pc_vga.h | 3 ++- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/emu/bus/isa/s3virge.c b/src/emu/bus/isa/s3virge.c index e3162392831..fdd4c3b8ed7 100644 --- a/src/emu/bus/isa/s3virge.c +++ b/src/emu/bus/isa/s3virge.c @@ -45,9 +45,7 @@ s3virgedx_rev1_vga_device::s3virgedx_rev1_vga_device(const machine_config &mconf void s3virge_vga_device::device_start() { - // FIXME: this kills the vptr of vga.memory - memset(&vga, 0, sizeof(vga)); - memset(&svga, 0, sizeof(svga)); + zero(); int x; int i; diff --git a/src/emu/bus/isa/trident.c b/src/emu/bus/isa/trident.c index 2ac306a0d7d..0d8b2134808 100644 --- a/src/emu/bus/isa/trident.c +++ b/src/emu/bus/isa/trident.c @@ -155,9 +155,7 @@ void trident_vga_device::WRITEPIXEL(INT16 x,INT16 y, UINT32 data) void trident_vga_device::device_start() { - // FIXME: this kill the vga.memory vptr - memset(&vga, 0, sizeof(vga)); - memset(&svga, 0, sizeof(svga)); + zero(); int i; for (i = 0; i < 0x100; i++) diff --git a/src/emu/video/pc_vga.c b/src/emu/video/pc_vga.c index 54458c9338d..a7b6b935e62 100644 --- a/src/emu/video/pc_vga.c +++ b/src/emu/video/pc_vga.c @@ -198,6 +198,27 @@ mach8_device::mach8_device(const machine_config &mconfig, const char *tag, devic { } +// zero everything, keep vtbls +void vga_device::zero() +{ + memset(&vga.svga_intf, 0, sizeof(vga.svga_intf)); + vga.memory.resize(0); + memset(vga.pens, 0, sizeof(vga.pens)); + vga.miscellaneous_output = 0; + vga.feature_control = 0; + memset(&vga.sequencer, 0, sizeof(vga.sequencer)); + memset(&vga.crtc, 0, sizeof(vga.crtc)); + memset(&vga.gc, 0, sizeof(vga.gc)); + memset(&vga.attribute, 0, sizeof(vga.attribute)); + memset(&vga.dac, 0, sizeof(vga.dac)); + memset(&vga.oak, 0, sizeof(vga.oak)); +} + +void svga_device::zero() +{ + vga_device::zero(); + memset(&svga, 0, sizeof(svga)); +} /* VBLANK callback, start address definitely updates AT vblank, not before. */ TIMER_CALLBACK_MEMBER(vga_device::vblank_timer_cb) @@ -208,8 +229,7 @@ TIMER_CALLBACK_MEMBER(vga_device::vblank_timer_cb) void vga_device::device_start() { - // FIXME: this kills the vga.memory vptr - memset(&vga, 0, sizeof(vga)); + zero(); int i; for (i = 0; i < 0x100; i++) diff --git a/src/emu/video/pc_vga.h b/src/emu/video/pc_vga.h index 7869955ecde..be658c147d7 100644 --- a/src/emu/video/pc_vga.h +++ b/src/emu/video/pc_vga.h @@ -26,7 +26,7 @@ public: vga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); vga_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); - + virtual void zero(); virtual UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); virtual READ8_MEMBER(port_03b0_r); @@ -205,6 +205,7 @@ public: // construction/destruction svga_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + virtual void zero(); virtual UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); protected: void svga_vh_rgb8(bitmap_rgb32 &bitmap, const rectangle &cliprect); -- cgit v1.2.3