From 196f444b95c6f0adce989e7aa753728881bb3295 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 23 Feb 2024 02:25:53 +0600 Subject: [PATCH] Implement screen blank-on-reset behaviour for rest of the cards --- src/video/vid_ati18800.c | 23 ++++++++++++++++--- src/video/vid_ati28800.c | 29 ++++++++++++++++++----- src/video/vid_et3000.c | 22 +++++++++++++++++- src/video/vid_et4000.c | 35 +++++++++++++++++++++++----- src/video/vid_et4000w32.c | 48 +++++++++++++++++++++++++++------------ src/video/vid_ht216.c | 32 ++++++++++++++++++++------ src/video/vid_oak_oti.c | 29 +++++++++++++++++++---- src/video/vid_paradise.c | 25 ++++++++++++++++---- src/video/vid_rtg310x.c | 22 ++++++++++++++++-- src/video/vid_vga.c | 1 + 10 files changed, 216 insertions(+), 50 deletions(-) diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index b54f6b89ee..5b8e32d93b 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -245,6 +245,23 @@ ati18800_recalctimings(svga_t *svga) } } +static void +ati18800_reset(void *priv) +{ + ati18800_t *ati18800 = (ati18800_t *) priv; + svga_t *svga = (svga_t*) &ati18800->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + static void * ati18800_init(const device_t *info) { @@ -345,7 +362,7 @@ const device_t ati18800_wonder_device = { .local = ATI18800_WONDER, .init = ati18800_init, .close = ati18800_close, - .reset = NULL, + .reset = ati18800_reset, { .available = ati18800_wonder_available }, .speed_changed = ati18800_speed_changed, .force_redraw = ati18800_force_redraw, @@ -360,7 +377,7 @@ const device_t ati18800_vga88_device = { .local = ATI18800_VGA88, .init = ati18800_init, .close = ati18800_close, - .reset = NULL, + .reset = ati18800_reset, { .available = ati18800_vga88_available }, .speed_changed = ati18800_speed_changed, .force_redraw = ati18800_force_redraw, @@ -374,7 +391,7 @@ const device_t ati18800_device = { .local = ATI18800_EDGE16, .init = ati18800_init, .close = ati18800_close, - .reset = NULL, + .reset = ati18800_reset, { .available = ati18800_available }, .speed_changed = ati18800_speed_changed, .force_redraw = ati18800_force_redraw, diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 368312fcbc..b87063ff0f 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -509,6 +509,23 @@ ati28800_recalctimings(svga_t *svga) } } +static void +ati28800_reset(void *priv) +{ + ati28800_t *ati28800 = (ati28800_t *) priv; + svga_t *svga = (svga_t*) &ati28800->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + static void ati28800k_recalctimings(svga_t *svga) { @@ -788,7 +805,7 @@ const device_t ati28800_device = { .local = 0, .init = ati28800_init, .close = ati28800_close, - .reset = NULL, + .reset = ati28800_reset, { .available = ati28800_available }, .speed_changed = ati28800_speed_changed, .force_redraw = ati28800_force_redraw, @@ -802,7 +819,7 @@ const device_t ati28800k_device = { .local = 0, .init = ati28800k_init, .close = ati28800_close, - .reset = NULL, + .reset = ati28800_reset, { .available = ati28800k_available }, .speed_changed = ati28800_speed_changed, .force_redraw = ati28800_force_redraw, @@ -816,7 +833,7 @@ const device_t ati28800k_spc4620p_device = { .local = 1, .init = ati28800k_init, .close = ati28800_close, - .reset = NULL, + .reset = ati28800_reset, { .available = NULL }, .speed_changed = ati28800_speed_changed, .force_redraw = ati28800_force_redraw, @@ -830,7 +847,7 @@ const device_t ati28800k_spc6033p_device = { .local = 2, .init = ati28800k_init, .close = ati28800_close, - .reset = NULL, + .reset = ati28800_reset, { .available = NULL }, .speed_changed = ati28800_speed_changed, .force_redraw = ati28800_force_redraw, @@ -844,7 +861,7 @@ const device_t compaq_ati28800_device = { .local = VGAWONDERXL, .init = ati28800_init, .close = ati28800_close, - .reset = NULL, + .reset = ati28800_reset, { .available = compaq_ati28800_available }, .speed_changed = ati28800_speed_changed, .force_redraw = ati28800_force_redraw, @@ -859,7 +876,7 @@ const device_t ati28800_wonderxl24_device = { .local = VGAWONDERXL24, .init = ati28800_init, .close = ati28800_close, - .reset = NULL, + .reset = ati28800_reset, { .available = ati28800_wonderxl24_available }, .speed_changed = ati28800_speed_changed, .force_redraw = ati28800_force_redraw, diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c index 97da08822c..615437df5e 100644 --- a/src/video/vid_et3000.c +++ b/src/video/vid_et3000.c @@ -457,6 +457,8 @@ et3000_recalctimings(svga_t *svga) default: break; } + + svga->dpms = !(svga->crtc[0x17] & 0x80); } et3000_log("HDISP = %i, HTOTAL = %i, ROWOFFSET = %i, INTERLACE = %i\n", @@ -478,6 +480,24 @@ et3000_recalctimings(svga_t *svga) } } +static void +et3000_reset(void *priv) +{ + et3000_t *dev = (et3000_t *) priv; + svga_t *svga = (svga_t*) &dev->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0x17] = 0x0; + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + static void * et3000_init(const device_t *info) { @@ -570,7 +590,7 @@ const device_t et3000_isa_device = { .local = 0, .init = et3000_init, .close = et3000_close, - .reset = NULL, + .reset = et3000_reset, { .available = et3000_available }, .speed_changed = et3000_speed_changed, .force_redraw = et3000_force_redraw, diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index fa671e2f6d..7ef9b03415 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -734,6 +734,11 @@ et4000_recalctimings(svga_t *svga) else if (svga->render == svga_render_8bpp_highres) svga->render = svga_render_8bpp_tseng_highres; } + + /* From ET4000 docs: + Bit 7 of the CRTC Mode register is set to 0 to place all horizontal and vertical timing control circuitry into a hold state. + */ + svga->dpms = !(svga->crtc[0x17] & 0x80); } static void @@ -780,6 +785,24 @@ et4000_mca_feedb(UNUSED(void *priv)) return 1; } +static void +et4000_reset(void *priv) +{ + et4000_t *dev = (et4000_t *) priv; + svga_t *svga = (svga_t*) &dev->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0x17] = 0x0; + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + static void * et4000_init(const device_t *info) { @@ -1014,7 +1037,7 @@ const device_t et4000_tc6058af_isa_device = { .local = 0, .init = et4000_init, .close = et4000_close, - .reset = NULL, + .reset = et4000_reset, { .available = et4000_tc6058af_available }, .speed_changed = et4000_speed_changed, .force_redraw = et4000_force_redraw, @@ -1028,7 +1051,7 @@ const device_t et4000_isa_device = { .local = ET4000_TYPE_ISA, .init = et4000_init, .close = et4000_close, - .reset = NULL, + .reset = et4000_reset, { .available = et4000_available }, .speed_changed = et4000_speed_changed, .force_redraw = et4000_force_redraw, @@ -1042,7 +1065,7 @@ const device_t et4000_mca_device = { .local = ET4000_TYPE_MCA, .init = et4000_init, .close = et4000_close, - .reset = NULL, + .reset = et4000_reset, { .available = et4000_available }, .speed_changed = et4000_speed_changed, .force_redraw = et4000_force_redraw, @@ -1056,7 +1079,7 @@ const device_t et4000k_isa_device = { .local = ET4000_TYPE_KOREAN, .init = et4000_init, .close = et4000_close, - .reset = NULL, + .reset = et4000_reset, { .available = et4000k_available }, .speed_changed = et4000_speed_changed, .force_redraw = et4000_force_redraw, @@ -1070,7 +1093,7 @@ const device_t et4000k_tg286_isa_device = { .local = ET4000_TYPE_TRIGEM, .init = et4000_init, .close = et4000_close, - .reset = NULL, + .reset = et4000_reset, { .available = et4000k_available }, .speed_changed = et4000_speed_changed, .force_redraw = et4000_force_redraw, @@ -1084,7 +1107,7 @@ const device_t et4000_kasan_isa_device = { .local = ET4000_TYPE_KASAN, .init = et4000_init, .close = et4000_close, - .reset = NULL, + .reset = et4000_reset, { .available = et4000_kasan_available }, .speed_changed = et4000_speed_changed, .force_redraw = et4000_force_redraw, diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 7adb6bc89e..9541765fc7 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -526,7 +526,7 @@ et4000w32p_recalctimings(svga_t *svga) } svga->render = svga_render_blank; - if (!svga->scrblank && svga->attr_palette_enable) { + if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /* Text mode */ if (svga->seqregs[1] & 8) /* 40 column */ svga->render = svga_render_text_40; @@ -2708,6 +2708,24 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) } } +static void +et4000w32p_reset(void *priv) +{ + et4000w32p_t *et4000 = (et4000w32p_t *) priv; + svga_t *svga = (svga_t*) &et4000->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0x17] = 0x0; + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + void * et4000w32p_init(const device_t *info) { @@ -2977,7 +2995,7 @@ const device_t et4000w32_device = { .local = ET4000W32, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -2991,7 +3009,7 @@ const device_t et4000w32_onboard_device = { .local = ET4000W32, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3005,7 +3023,7 @@ const device_t et4000w32i_isa_device = { .local = ET4000W32I, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32i_isa_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3019,7 +3037,7 @@ const device_t et4000w32i_vlb_device = { .local = ET4000W32I, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32i_vlb_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3033,7 +3051,7 @@ const device_t et4000w32p_videomagic_revb_vlb_device = { .local = ET4000W32P_VIDEOMAGIC_REVB, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_videomagic_revb_vlb_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3047,7 +3065,7 @@ const device_t et4000w32p_videomagic_revb_pci_device = { .local = ET4000W32P_VIDEOMAGIC_REVB, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_videomagic_revb_vlb_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3061,7 +3079,7 @@ const device_t et4000w32p_revc_vlb_device = { .local = ET4000W32P_REVC, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_revc_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3075,7 +3093,7 @@ const device_t et4000w32p_revc_pci_device = { .local = ET4000W32P_REVC, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_revc_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3089,7 +3107,7 @@ const device_t et4000w32p_noncardex_vlb_device = { .local = ET4000W32P, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_noncardex_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3103,7 +3121,7 @@ const device_t et4000w32p_noncardex_pci_device = { .local = ET4000W32P, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_noncardex_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3117,7 +3135,7 @@ const device_t et4000w32p_cardex_vlb_device = { .local = ET4000W32P_CARDEX, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_cardex_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3131,7 +3149,7 @@ const device_t et4000w32p_cardex_pci_device = { .local = ET4000W32P_CARDEX, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_cardex_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3145,7 +3163,7 @@ const device_t et4000w32p_vlb_device = { .local = ET4000W32P_DIAMOND, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, @@ -3159,7 +3177,7 @@ const device_t et4000w32p_pci_device = { .local = ET4000W32P_DIAMOND, .init = et4000w32p_init, .close = et4000w32p_close, - .reset = NULL, + .reset = et4000w32p_reset, { .available = et4000w32p_available }, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index b87d936659..1b203decd2 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -653,7 +653,7 @@ ht216_recalctimings(svga_t *svga) ht216->adjust_cursor = 0; - if (!svga->scrblank && svga->attr_palette_enable) { + if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ if (svga->seqregs[1] & 8) /*40 column*/ { svga->render = svga_render_text_40; @@ -1470,6 +1470,24 @@ radius_mca_feedb(UNUSED(void *priv)) return 1; } +static void +ht216_reset(void *priv) +{ + ht216_t *ht216 = (ht216_t *) priv; + svga_t *svga = (svga_t*) &ht216->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0x17] = 0x0; + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + void * ht216_init(const device_t *info, uint32_t mem_size, int has_rom) { @@ -1757,7 +1775,7 @@ const device_t g2_gc205_device = { .local = 0x7070, .init = g2_gc205_init, .close = ht216_close, - .reset = NULL, + .reset = ht216_reset, { .available = g2_gc205_available }, .speed_changed = ht216_speed_changed, .force_redraw = ht216_force_redraw, @@ -1771,7 +1789,7 @@ const device_t v7_vga_1024i_device = { .local = 0x7140, .init = v7_vga_1024i_init, .close = ht216_close, - .reset = NULL, + .reset = ht216_reset, { .available = v7_vga_1024i_available }, .speed_changed = ht216_speed_changed, .force_redraw = ht216_force_redraw, @@ -1785,7 +1803,7 @@ const device_t ht216_32_pb410a_device = { .local = 0x7861, /*HT216-32*/ .init = ht216_pb410a_init, .close = ht216_close, - .reset = NULL, + .reset = ht216_reset, { .available = NULL }, .speed_changed = ht216_speed_changed, .force_redraw = ht216_force_redraw, @@ -1799,7 +1817,7 @@ const device_t ht216_32_standalone_device = { .local = 0x7861, /*HT216-32*/ .init = ht216_standalone_init, .close = ht216_close, - .reset = NULL, + .reset = ht216_reset, { .available = ht216_standalone_available }, .speed_changed = ht216_speed_changed, .force_redraw = ht216_force_redraw, @@ -1813,7 +1831,7 @@ const device_t radius_svga_multiview_isa_device = { .local = 0x7152, /*HT209*/ .init = radius_svga_multiview_init, .close = ht216_close, - .reset = NULL, + .reset = ht216_reset, { .available = radius_svga_multiview_available }, .speed_changed = ht216_speed_changed, .force_redraw = ht216_force_redraw, @@ -1827,7 +1845,7 @@ const device_t radius_svga_multiview_mca_device = { .local = 0x7152, /*HT209*/ .init = radius_svga_multiview_init, .close = ht216_close, - .reset = NULL, + .reset = ht216_reset, { .available = radius_svga_multiview_available }, .speed_changed = ht216_speed_changed, .force_redraw = ht216_force_redraw, diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index f5bc449e69..10e9fb81a1 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -414,6 +414,25 @@ oti_recalctimings(svga_t *svga) svga->render = svga_render_15bpp_highres; svga->hdisp >>= 1; } + + svga->dpms = !(svga->crtc[0x17] & 0x80); +} + +static void +oti_reset(void *priv) +{ + oti_t *oti = (oti_t *) priv; + svga_t *svga = (svga_t*) &oti->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); } static void * @@ -634,7 +653,7 @@ const device_t oti037c_device = { .local = 0, .init = oti_init, .close = oti_close, - .reset = NULL, + .reset = oti_reset, { .available = oti037c_available }, .speed_changed = oti_speed_changed, .force_redraw = oti_force_redraw, @@ -648,7 +667,7 @@ const device_t oti067_device = { .local = 2, .init = oti_init, .close = oti_close, - .reset = NULL, + .reset = oti_reset, { .available = oti067_077_available }, .speed_changed = oti_speed_changed, .force_redraw = oti_force_redraw, @@ -662,7 +681,7 @@ const device_t oti067_m300_device = { .local = 4, .init = oti_init, .close = oti_close, - .reset = NULL, + .reset = oti_reset, { .available = oti067_m300_available }, .speed_changed = oti_speed_changed, .force_redraw = oti_force_redraw, @@ -676,7 +695,7 @@ const device_t oti067_ama932j_device = { .local = 3, .init = oti_init, .close = oti_close, - .reset = NULL, + .reset = oti_reset, { .available = oti067_ama932j_available }, .speed_changed = oti_speed_changed, .force_redraw = oti_force_redraw, @@ -690,7 +709,7 @@ const device_t oti077_device = { .local = 5, .init = oti_init, .close = oti_close, - .reset = NULL, + .reset = oti_reset, { .available = oti067_077_available }, .speed_changed = oti_speed_changed, .force_redraw = oti_force_redraw, diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 30666e82cc..852e48932c 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -581,6 +581,21 @@ paradise_readw(uint32_t addr, void *priv) return svga_readw_linear(addr, svga); } +static void +paradise_reset(void *priv) +{ + paradise_t *paradise = (paradise_t *) priv; + svga_t *svga = (svga_t*) ¶dise->svga; + + svga->crtc[0x17] &= ~0x80; + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + void * paradise_init(const device_t *info, uint32_t memsize) { @@ -859,7 +874,7 @@ const device_t paradise_pvga1a_ncr3302_device = { .local = PVGA1A, .init = paradise_pvga1a_ncr3302_init, .close = paradise_close, - .reset = NULL, + .reset = paradise_reset, { .available = NULL }, .speed_changed = paradise_speed_changed, .force_redraw = paradise_force_redraw, @@ -873,7 +888,7 @@ const device_t paradise_pvga1a_device = { .local = PVGA1A, .init = paradise_pvga1a_standalone_init, .close = paradise_close, - .reset = NULL, + .reset = paradise_reset, { .available = paradise_pvga1a_standalone_available }, .speed_changed = paradise_speed_changed, .force_redraw = paradise_force_redraw, @@ -887,7 +902,7 @@ const device_t paradise_wd90c11_megapc_device = { .local = WD90C11, .init = paradise_wd90c11_megapc_init, .close = paradise_close, - .reset = NULL, + .reset = paradise_reset, { .available = NULL }, .speed_changed = paradise_speed_changed, .force_redraw = paradise_force_redraw, @@ -901,7 +916,7 @@ const device_t paradise_wd90c11_device = { .local = WD90C11, .init = paradise_wd90c11_standalone_init, .close = paradise_close, - .reset = NULL, + .reset = paradise_reset, { .available = paradise_wd90c11_standalone_available }, .speed_changed = paradise_speed_changed, .force_redraw = paradise_force_redraw, @@ -942,7 +957,7 @@ const device_t paradise_wd90c30_device = { .local = WD90C30, .init = paradise_wd90c30_standalone_init, .close = paradise_close, - .reset = NULL, + .reset = paradise_reset, { .available = paradise_wd90c30_standalone_available }, .speed_changed = paradise_speed_changed, .force_redraw = paradise_force_redraw, diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index e82763d15b..e2d862ca97 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -297,6 +297,24 @@ rtg_recalctimings(svga_t *svga) } } +static void +rtg_reset(void *priv) +{ + rtg_t *dev = (rtg_t *) priv; + svga_t *svga = (svga_t*) &dev->svga; + + memset(svga->crtc, 0x00, sizeof(svga->crtc)); + memset(svga->attrregs, 0x00, sizeof(svga->attrregs)); + memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); + svga->crtc[0x17] = 0x0; + svga->crtc[0] = 63; + svga->crtc[6] = 255; + svga->dispontime = 1000ULL << 32; + svga->dispofftime = 1000ULL << 32; + svga->bpp = 8; + svga_recalctimings(svga); +} + static void * rtg_init(const device_t *info) { @@ -449,7 +467,7 @@ const device_t realtek_rtg3105_device = { .local = 1, .init = rtg_init, .close = rtg_close, - .reset = NULL, + .reset = rtg_reset, { .available = rtg3105_available }, .speed_changed = rtg_speed_changed, .force_redraw = rtg_force_redraw, @@ -463,7 +481,7 @@ const device_t realtek_rtg3106_device = { .local = 2, .init = rtg_init, .close = rtg_close, - .reset = NULL, + .reset = rtg_reset, { .available = rtg3106_available }, .speed_changed = rtg_speed_changed, .force_redraw = rtg_force_redraw, diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index 115cdd382a..b50be7a79e 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -110,6 +110,7 @@ vga_reset(void *priv) svga_t *svga = (svga_t*) &vga->svga; memset(svga->crtc, 0x00, sizeof(svga->crtc)); + svga->crtc[0x17] = 0x0; svga->crtc[0] = 63; svga->crtc[6] = 255; svga->dispontime = 1000ULL << 32;