diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 7f987a2b7..31eabc064 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -33,6 +33,8 @@ # define FLAG_RAMDAC_SHIFT 64 # define FLAG_128K_MASK 128 +struct monitor_t; + typedef struct { int ena, x, y, xoff, yoff, cur_xsize, cur_ysize, @@ -170,6 +172,12 @@ typedef struct svga_t { uint32_t (*remap_func)(struct svga_t *svga, uint32_t in_addr); void *ramdac, *clock_gen; + + /* Monitor Index */ + uint8_t monitor_index; + + /* Pointer to monitor */ + monitor_t* monitor; } svga_t; extern int vga_on, ibm8514_on; diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index 0fd4155ef..7744ed08b 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -506,6 +506,7 @@ typedef struct voodoo_t { uint8_t *vram, *changedvram; void *p; + uint8_t monitor_index; } voodoo_t; typedef struct voodoo_set_t { diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index d459b0e53..10321cb2c 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -178,7 +178,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) break; } - if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard))) { + if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard) && (video_card_get_flags(c) != VIDEO_FLAG_TYPE_SPECIAL))) { ui->comboBoxVideoSecondary->addItem(name, c); if (c == curVideoCard_2) ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index e29d95232..d402050c7 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -525,7 +525,7 @@ gd54xx_overlay_draw(svga_t *svga, int displine) uint8_t *src2 = &svga->vram[(svga->ma - (svga->hdisp * bytesperpix)) & svga->vram_display_mask]; int occl, ckval; - p = &((uint32_t *) buffer32->line[displine])[gd54xx->overlay.region1size + svga->x_add]; + p = &((uint32_t *) svga->monitor->target_buffer->line[displine])[gd54xx->overlay.region1size + svga->x_add]; src2 += gd54xx->overlay.region1size * bytesperpix; OVERLAY_SAMPLE(); @@ -1858,16 +1858,16 @@ gd54xx_hwcursor_draw(svga_t *svga, int displine) break; case 1: /* The pixel is shown in the cursor background color */ - ((uint32_t *) buffer32->line[displine])[offset + svga->x_add] = bgcol; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[offset + svga->x_add] = bgcol; break; case 2: /* The pixel is shown as the inverse of the original screen pixel (XOR cursor) */ - ((uint32_t *) buffer32->line[displine])[offset + svga->x_add] ^= 0xffffff; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[offset + svga->x_add] ^= 0xffffff; break; case 3: /* The pixel is shown in the cursor foreground color */ - ((uint32_t *) buffer32->line[displine])[offset + svga->x_add] = fgcol; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[offset + svga->x_add] = fgcol; break; } } @@ -2219,7 +2219,7 @@ gd54xx_readw_linear(uint32_t addr, void *p) temp |= (svga_readb_linear(addr, svga) << 8); if (svga->fast) - cycles -= video_timing_read_w; + cycles -= svga->monitor->mon_video_timing_read_w; return temp; case 3: @@ -2268,7 +2268,7 @@ gd54xx_readl_linear(uint32_t addr, void *p) temp |= (svga_readb_linear(addr + 2, svga) << 24); if (svga->fast) - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; return temp; case 2: @@ -2278,7 +2278,7 @@ gd54xx_readl_linear(uint32_t addr, void *p) temp |= (svga_readb_linear(addr, svga) << 24); if (svga->fast) - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; return temp; case 3: @@ -2454,7 +2454,7 @@ gd54xx_writew_linear(uint32_t addr, uint16_t val, void *p) svga_writeb_linear(addr, val >> 8, svga); if (svga->fast) - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; case 3: return; } @@ -4267,7 +4267,7 @@ gd54xx_force_redraw(void *p) { gd54xx_t *gd54xx = (gd54xx_t *) p; - gd54xx->svga.fullchange = changeframecount; + gd54xx->svga.fullchange = gd54xx->svga.monitor->mon_changeframecount; } // clang-format off diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index e6630a6c3..c3eaa36a8 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -1776,7 +1776,7 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) case 0x8180: s3->streams.pri_ctrl = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x8184: s3->streams.chroma_ctrl = val; @@ -1806,37 +1806,37 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) case 0x81c0: s3->streams.pri_fb0 = val & 0x3fffff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81c4: s3->streams.pri_fb1 = val & 0x3fffff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81c8: s3->streams.pri_stride = val & 0xfff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81cc: s3->streams.buffer_ctrl = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81d0: s3->streams.sec_fb0 = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81d4: s3->streams.sec_fb1 = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81d8: s3->streams.sec_stride = val; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81dc: s3->streams.overlay_ctrl = val; @@ -1864,28 +1864,28 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) s3->streams.pri_x = (val >> 16) & 0x7ff; s3->streams.pri_y = val & 0x7ff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81f4: s3->streams.pri_size = val; s3->streams.pri_w = (val >> 16) & 0x7ff; s3->streams.pri_h = val & 0x7ff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81f8: s3->streams.sec_start = val; s3->streams.sec_x = (val >> 16) & 0x7ff; s3->streams.sec_y = val & 0x7ff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x81fc: s3->streams.sec_size = val; s3->streams.sec_w = (val >> 16) & 0x7ff; s3->streams.sec_h = val & 0x7ff; svga_recalctimings(svga); - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; break; case 0x8504: @@ -2891,7 +2891,7 @@ s3_out(uint16_t addr, uint8_t val, void *p) if ((((svga->crtc[0x67] & 0xc) != 0xc) && (s3->chip >= S3_TRIO64V)) || (s3->chip < S3_TRIO64V)) svga->ma_latch |= (s3->ma_ext << 16); } else { - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } } @@ -3626,10 +3626,10 @@ s3_accel_out(uint16_t port, uint8_t val, void *p) s3->accel.advfunc_cntl = val; if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { s3->width = (val & 4) ? 1600 : 800; - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } else if (s3->chip <= S3_86C805) { - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } if (s3->chip > S3_86C924) @@ -5653,16 +5653,16 @@ polygon_setup(s3_t *s3) #define WRITE(addr, dat) \ if (s3->bpp == 0 && !s3->color_16bit) { \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ - svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = changeframecount; \ + svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } else if (s3->bpp == 1 || s3->color_16bit) { \ vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)] = dat; \ - svga->changedvram[(dword_remap_w(svga, addr) & (s3->vram_mask >> 1)) >> 11] = changeframecount; \ + svga->changedvram[(dword_remap_w(svga, addr) & (s3->vram_mask >> 1)) >> 11] = svga->monitor->mon_changeframecount; \ } else if (s3->bpp == 2) { \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ - svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = changeframecount; \ + svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } else { \ vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \ - svga->changedvram[(dword_remap_l(svga, addr) & (s3->vram_mask >> 2)) >> 10] = changeframecount; \ + svga->changedvram[(dword_remap_l(svga, addr) & (s3->vram_mask >> 2)) >> 10] = svga->monitor->mon_changeframecount; \ } static __inline void @@ -8554,7 +8554,7 @@ s3_force_redraw(void *p) { s3_t *s3 = (s3_t *) p; - s3->svga.fullchange = changeframecount; + s3->svga.fullchange = s3->svga.monitor->mon_changeframecount; } static const device_config_t s3_orchid_86c911_config[] = { diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 0d493a59e..8b61bf395 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -84,24 +84,24 @@ void svga_set_override(svga_t *svga, int val) { if (svga->override && !val) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga->override = val; if (!val) { /* Override turned off, restore overscan X and Y per the CRTC. */ if (enable_overscan) { - overscan_y = (svga->rowcount + 1) << 1; + svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1; - if (overscan_y < 16) - overscan_y = 16; + if (svga->monitor->mon_overscan_y < 16) + svga->monitor->mon_overscan_y = 16; } - overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; + svga->monitor->mon_overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; if (svga->seqregs[1] & 8) - overscan_x <<= 1; + svga->monitor->mon_overscan_x <<= 1; } else - overscan_x = overscan_y = 16; + svga->monitor->mon_overscan_x = svga->monitor->mon_overscan_y = 16; /* Override turned off, fix overcan X and Y to 16. */ } @@ -124,11 +124,11 @@ svga_out(uint16_t addr, uint8_t val, void *p) } } else { if ((svga->attraddr == 0x13) && (svga->attrregs[0x13] != val)) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; o = svga->attrregs[svga->attraddr & 31]; svga->attrregs[svga->attraddr & 31] = val; if (svga->attraddr < 16) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; if (svga->attraddr == 0x10 || svga->attraddr == 0x14 || svga->attraddr < 0x10) { for (c = 0; c < 16; c++) { if (svga->attrregs[0x10] & 0x80) { @@ -137,7 +137,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) svga->egapal[c] = (svga->attrregs[c] & 0x3f) | ((svga->attrregs[0x14] & 0xc) << 4); } } - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; } /* Recalculate timings on change of attribute register 0x11 (overscan border color) too. */ @@ -150,7 +150,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) svga_recalctimings(svga); } else if (svga->attraddr == 0x12) { if ((val & 0xf) != svga->plane_mask) - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; svga->plane_mask = val & 0xf; } } @@ -211,7 +211,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) case 0x3c9: if (svga->adv_flags & FLAG_RAMDAC_SHIFT) val <<= 2; - svga->fullchange = changeframecount; + svga->fullchange = svga->monitor->mon_changeframecount; switch (svga->dac_pos) { case 0: svga->dac_r = val; @@ -552,19 +552,19 @@ svga_recalctimings(svga_t *svga) svga->char_width = (svga->seqregs[1] & 1) ? 8 : 9; if (enable_overscan) { - overscan_y = (svga->rowcount + 1) << 1; + svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1; - if (overscan_y < 16) - overscan_y = 16; + if (svga->monitor->mon_overscan_y < 16) + svga->monitor->mon_overscan_y = 16; } if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { - overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; + svga->monitor->mon_overscan_x = (svga->seqregs[1] & 1) ? 16 : 18; if (svga->seqregs[1] & 8) - overscan_x <<= 1; + svga->monitor->mon_overscan_x <<= 1; } else - overscan_x = 16; + svga->monitor->mon_overscan_x = 16; if (vga_on) { if (svga->recalctimings_ex) { @@ -577,8 +577,8 @@ svga_recalctimings(svga_t *svga) xga_recalctimings(svga); } - svga->y_add = (overscan_y >> 1) - (svga->crtc[8] & 0x1f); - svga->x_add = (overscan_x >> 1); + svga->y_add = (svga->monitor->mon_overscan_y >> 1) - (svga->crtc[8] & 0x1f); + svga->x_add = (svga->monitor->mon_overscan_x >> 1); if (svga->vblankstart < svga->dispend) svga->dispend = svga->vblankstart; @@ -631,10 +631,10 @@ svga_do_render(svga_t *svga) if (!svga->override) { svga->render(svga); - svga->x_add = (overscan_x >> 1); + svga->x_add = (svga->monitor->mon_overscan_x >> 1); svga_render_overscan_left(svga); svga_render_overscan_right(svga); - svga->x_add = (overscan_x >> 1) - svga->scrollcache; + svga->x_add = (svga->monitor->mon_overscan_x >> 1) - svga->scrollcache; } if (svga->overlay_on) { @@ -719,7 +719,7 @@ svga_poll(void *p) svga->ma &= svga->vram_display_mask; if (svga->firstline == 2000) { svga->firstline = svga->displine; - video_wait_for_buffer(); + video_wait_for_buffer_monitor(svga->monitor_index); } if (svga->hwcursor_on || svga->dac_hwcursor_on || svga->overlay_on) { @@ -813,7 +813,7 @@ svga_poll(void *p) svga->sc = 0; if (svga->attrregs[0x10] & 0x20) { svga->scrollcache = 0; - svga->x_add = (overscan_x >> 1); + svga->x_add = (svga->monitor->mon_overscan_x >> 1); } } } @@ -870,7 +870,7 @@ svga_poll(void *p) svga->oddeven ^= 1; - changeframecount = svga->interlace ? 3 : 2; + svga->monitor->mon_changeframecount = svga->interlace ? 3 : 2; svga->vslines = 0; if (svga->interlace && svga->oddeven) @@ -909,7 +909,7 @@ svga_poll(void *p) if ((svga->seqregs[1] & 8) || (svga->render == svga_render_8bpp_lowres)) svga->scrollcache <<= 1; - svga->x_add = (overscan_x >> 1) - svga->scrollcache; + svga->x_add = (svga->monitor->mon_overscan_x >> 1) - svga->scrollcache; svga->linecountff = 0; @@ -938,6 +938,8 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, int c, d, e; svga->p = p; + svga->monitor_index = monitor_index_global; + svga->monitor = &monitors[svga->monitor_index]; for (c = 0; c < 256; c++) { e = c; @@ -951,8 +953,8 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, svga->attrregs[0x11] = 0; svga->overscan_color = 0x000000; - overscan_x = 16; - overscan_y = 32; + svga->monitor->mon_overscan_x = 16; + svga->monitor->mon_overscan_y = 32; svga->x_add = 8; svga->y_add = 16; @@ -1075,7 +1077,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) if (svga->adv_flags & FLAG_ADDR_BY8) writemask2 = svga->seqregs[2]; - cycles -= video_timing_write_b; + cycles -= svga->monitor->mon_video_timing_write_b; if (!linear) { if (xga_enabled) { @@ -1136,7 +1138,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p) addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; count = 4; if (svga->adv_flags & FLAG_LATCH8) @@ -1276,7 +1278,7 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p) if (svga->adv_flags & FLAG_ADDR_BY8) readplane = svga->gdcreg[4] & 7; - cycles -= video_timing_read_b; + cycles -= svga->monitor->mon_video_timing_read_b; if (!linear) { if (xga_enabled) { @@ -1405,11 +1407,11 @@ svga_doblit(int wx, int wy, svga_t *svga) int i, j; int xs_temp, ys_temp; - y_add = (enable_overscan) ? overscan_y : 0; - x_add = (enable_overscan) ? overscan_x : 0; - y_start = (enable_overscan) ? 0 : (overscan_y >> 1); - x_start = (enable_overscan) ? 0 : (overscan_x >> 1); - bottom = (overscan_y >> 1) + (svga->crtc[8] & 0x1f); + y_add = (enable_overscan) ? svga->monitor->mon_overscan_y : 0; + x_add = (enable_overscan) ? svga->monitor->mon_overscan_x : 0; + y_start = (enable_overscan) ? 0 : (svga->monitor->mon_overscan_y >> 1); + x_start = (enable_overscan) ? 0 : (svga->monitor->mon_overscan_x >> 1); + bottom = (svga->monitor->mon_overscan_y >> 1) + (svga->crtc[8] & 0x1f); if (svga->vertical_linedbl) { y_add <<= 1; @@ -1432,12 +1434,12 @@ svga_doblit(int wx, int wy, svga_t *svga) if (ys_temp < 32) ys_temp = 200; - if ((svga->crtc[0x17] & 0x80) && ((xs_temp != xsize) || (ys_temp != ysize) || video_force_resize_get())) { + if ((svga->crtc[0x17] & 0x80) && ((xs_temp != svga->monitor->mon_xsize) || (ys_temp != svga->monitor->mon_ysize) || video_force_resize_get_monitor(svga->monitor_index))) { /* Screen res has changed.. fix up, and let them know. */ - xsize = xs_temp; - ysize = ys_temp; + svga->monitor->mon_xsize = xs_temp; + svga->monitor->mon_ysize = ys_temp; - if ((xsize > 1984) || (ysize > 2016)) { + if ((svga->monitor->mon_xsize > 1984) || (svga->monitor->mon_ysize > 2016)) { /* 2048x2048 is the biggest safe render texture, to account for overscan, we suppress overscan starting from x 1984 and y 2016. */ x_add = 0; @@ -1449,30 +1451,30 @@ svga_doblit(int wx, int wy, svga_t *svga) /* Block resolution changes while in DPMS mode to avoid getting a bogus screen width (320). We're already rendering a blank screen anyway. */ if (!svga->dpms) - set_screen_size(xsize + x_add, ysize + y_add); + set_screen_size_monitor(svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index); - if (video_force_resize_get()) - video_force_resize_set(0); + if (video_force_resize_get_monitor(svga->monitor_index)) + video_force_resize_set_monitor(0, svga->monitor_index); } if ((wx >= 160) && ((wy + 1) >= 120)) { /* Draw (overscan_size - scroll size) lines of overscan on top and bottom. */ for (i = 0; i < svga->y_add; i++) { - p = &buffer32->line[i & 0x7ff][0]; + p = &svga->monitor->target_buffer->line[i & 0x7ff][0]; - for (j = 0; j < (xsize + x_add); j++) + for (j = 0; j < (svga->monitor->mon_xsize + x_add); j++) p[j] = svga->overscan_color; } for (i = 0; i < bottom; i++) { - p = &buffer32->line[(ysize + svga->y_add + i) & 0x7ff][0]; + p = &svga->monitor->target_buffer->line[(svga->monitor->mon_ysize + svga->y_add + i) & 0x7ff][0]; - for (j = 0; j < (xsize + x_add); j++) + for (j = 0; j < (svga->monitor->mon_xsize + x_add); j++) p[j] = svga->overscan_color; } } - video_blit_memtoscreen(x_start, y_start, xsize + x_add, ysize + y_add); + video_blit_memtoscreen_monitor(x_start, y_start, svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index); if (svga->vertical_linedbl) svga->vertical_linedbl >>= 1; @@ -1492,7 +1494,7 @@ svga_writeb_linear(uint32_t addr, uint8_t val, void *p) if (addr >= svga->vram_max) return; addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint8_t *) &svga->vram[addr] = val; } @@ -1507,7 +1509,7 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) return; } - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; if (!linear) { addr = svga_decode_addr(svga, addr, 1); @@ -1521,12 +1523,12 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) uint32_t addr2 = svga->translate_address(addr, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = val & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 1, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } return; } @@ -1534,7 +1536,7 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p) return; addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint16_t *) &svga->vram[addr] = val; } @@ -1563,7 +1565,7 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) return; } - cycles -= video_timing_write_l; + cycles -= svga->monitor->mon_video_timing_write_l; if (!linear) { addr = svga_decode_addr(svga, addr, 1); @@ -1577,22 +1579,22 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) uint32_t addr2 = svga->translate_address(addr, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = val & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 1, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 2, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 16) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } addr2 = svga->translate_address(addr + 3, p); if (addr2 < svga->vram_max) { svga->vram[addr2 & svga->vram_mask] = (val >> 24) & 0xff; - svga->changedvram[addr2 >> 12] = changeframecount; + svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount; } return; } @@ -1600,7 +1602,7 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p) return; addr &= svga->vram_mask; - svga->changedvram[addr >> 12] = changeframecount; + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint32_t *) &svga->vram[addr] = val; } @@ -1639,7 +1641,7 @@ svga_readw_common(uint32_t addr, uint8_t linear, void *p) if (!svga->fast) return svga_read_common(addr, linear, p) | (svga_read_common(addr + 1, linear, p) << 8); - cycles -= video_timing_read_w; + cycles -= svga->monitor->mon_video_timing_read_w; if (!linear) { addr = svga_decode_addr(svga, addr, 0); @@ -1686,7 +1688,7 @@ svga_readl_common(uint32_t addr, uint8_t linear, void *p) return svga_read_common(addr, linear, p) | (svga_read_common(addr + 1, linear, p) << 8) | (svga_read_common(addr + 2, linear, p) << 16) | (svga_read_common(addr + 3, linear, p) << 24); } - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; if (!linear) { addr = svga_decode_addr(svga, addr, 0); diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index ca843ac74..81621681f 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -67,7 +67,7 @@ svga_render_blank(svga_t *svga) break; } - uint32_t *line_ptr = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; uint32_t line_width = (uint32_t) (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t); memset(line_ptr, 0, line_width); } @@ -83,7 +83,7 @@ svga_render_overscan_left(svga_t *svga) if (svga->scrblank || (svga->hdisp == 0)) return; - uint32_t *line_ptr = buffer32->line[svga->displine + svga->y_add]; + uint32_t *line_ptr = svga->monitor->target_buffer->line[svga->displine + svga->y_add]; for (i = 0; i < svga->x_add; i++) *line_ptr++ = svga->overscan_color; } @@ -99,7 +99,7 @@ svga_render_overscan_right(svga_t *svga) if (svga->scrblank || (svga->hdisp == 0)) return; - uint32_t *line_ptr = &buffer32->line[svga->displine + svga->y_add][svga->x_add + svga->hdisp]; + uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add + svga->hdisp]; right = (overscan_x >> 1); for (i = 0; i < right; i++) *line_ptr++ = svga->overscan_color; @@ -124,7 +124,7 @@ svga_render_text_40(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; xinc = (svga->seqregs[1] & 1) ? 16 : 18; for (x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { @@ -198,7 +198,7 @@ svga_render_text_80(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; xinc = (svga->seqregs[1] & 1) ? 8 : 9; for (x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { @@ -271,7 +271,7 @@ svga_render_text_80_ksc5601(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; xinc = (svga->seqregs[1] & 1) ? 8 : 9; @@ -394,7 +394,7 @@ svga_render_2bpp_lowres(svga_t *svga) changed_offset = ((svga->ma << 1) + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12; if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -442,7 +442,7 @@ svga_render_2bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -491,7 +491,7 @@ svga_render_2bpp_highres(svga_t *svga) changed_offset = ((svga->ma << 1) + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12; if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -539,7 +539,7 @@ svga_render_2bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -588,7 +588,7 @@ svga_render_2bpp_headland_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -641,7 +641,7 @@ svga_render_4bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -701,7 +701,7 @@ svga_render_4bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -759,7 +759,7 @@ svga_render_4bpp_highres(svga_t *svga) changed_offset = (svga->ma + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12; if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -819,7 +819,7 @@ svga_render_4bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -874,7 +874,7 @@ svga_render_8bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -897,7 +897,7 @@ svga_render_8bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -946,7 +946,7 @@ svga_render_8bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -974,7 +974,7 @@ svga_render_8bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1026,7 +1026,7 @@ svga_render_8bpp_tseng_lowres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1068,7 +1068,7 @@ svga_render_8bpp_tseng_highres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1129,7 +1129,7 @@ svga_render_15bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1153,7 +1153,7 @@ svga_render_15bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1200,7 +1200,7 @@ svga_render_15bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1230,7 +1230,7 @@ svga_render_15bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1281,7 +1281,7 @@ svga_render_15bpp_mix_lowres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1316,7 +1316,7 @@ svga_render_15bpp_mix_highres(svga_t *svga) return; if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1361,7 +1361,7 @@ svga_render_16bpp_lowres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1383,7 +1383,7 @@ svga_render_16bpp_lowres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1430,7 +1430,7 @@ svga_render_16bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1460,7 +1460,7 @@ svga_render_16bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1526,14 +1526,14 @@ svga_render_24bpp_lowres(svga_t *svga) fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16); svga->ma += 3; svga->ma &= svga->vram_display_mask; - buffer32->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = buffer32->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = fg; + svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = fg; } } } else { changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1588,7 +1588,7 @@ svga_render_24bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1615,7 +1615,7 @@ svga_render_24bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1677,14 +1677,14 @@ svga_render_32bpp_lowres(svga_t *svga) dat = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16); svga->ma += 4; svga->ma &= svga->vram_display_mask; - buffer32->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = buffer32->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = dat; + svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + svga->x_add] = svga->monitor->target_buffer->line[svga->displine + svga->y_add][(x << 1) + 1 + svga->x_add] = dat; } } } else { changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1724,7 +1724,7 @@ svga_render_32bpp_highres(svga_t *svga) if (svga->force_old_addr) { if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1741,7 +1741,7 @@ svga_render_32bpp_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1781,7 +1781,7 @@ svga_render_ABGR8888_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; @@ -1820,7 +1820,7 @@ svga_render_RGBA8888_highres(svga_t *svga) changed_addr = svga->remap_func(svga, svga->ma); if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { - p = &buffer32->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; if (svga->firstline_draw == 2000) svga->firstline_draw = svga->displine; diff --git a/src/video/vid_table.c b/src/video/vid_table.c index ab2eb5c96..92b82d17a 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -163,10 +163,10 @@ video_cards[] = { { &et4000w32p_pci_device }, { &gd5430_pci_device, }, { &gd5434_pci_device }, - { &gd5436_pci_device }, + { &gd5436_pci_device, VIDEO_FLAG_TYPE_SPECIAL }, { &gd5440_pci_device }, - { &gd5446_pci_device }, - { &gd5446_stb_pci_device }, + { &gd5446_pci_device, VIDEO_FLAG_TYPE_SPECIAL }, + { &gd5446_stb_pci_device,VIDEO_FLAG_TYPE_SPECIAL }, { &gd5480_pci_device }, { &s3_spea_mercury_lite_86c928_pci_device }, { &s3_diamond_stealth64_964_pci_device }, @@ -350,7 +350,6 @@ video_reset(int card) if (!(card == VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) && gfxcard_2 != 0 - && (video_cards[gfxcard_2].flags != video_cards[gfxcard].flags) && device_is_valid(video_card_getdevice(gfxcard_2), machine)) { video_monitor_init(1); monitor_index_global = 1; diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index f1c1347fe..f451c4b58 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -453,7 +453,7 @@ banshee_render_16bpp_tiled(svga_t *svga) { banshee_t *banshee = (banshee_t *) svga->p; int x; - uint32_t *p = &((uint32_t *) buffer32->line[svga->displine + svga->y_add])[svga->x_add]; + uint32_t *p = &((uint32_t *) svga->monitor->target_buffer->line[svga->displine + svga->y_add])[svga->x_add]; uint32_t addr; int drawn = 0; @@ -1602,6 +1602,10 @@ banshee_read_linear(uint32_t addr, void *p) cycles -= voodoo->read_time; + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) + { + return rom_read(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); + } addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { int x, y; @@ -1616,7 +1620,7 @@ banshee_read_linear(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - cycles -= video_timing_read_b; + cycles -= svga->monitor->mon_video_timing_read_b; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1634,6 +1638,10 @@ banshee_read_linear_w(uint32_t addr, void *p) return banshee_read_linear(addr, p) | (banshee_read_linear(addr + 1, p) << 8); cycles -= voodoo->read_time; + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) + { + return rom_readw(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); + } addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { int x, y; @@ -1648,7 +1656,7 @@ banshee_read_linear_w(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - cycles -= video_timing_read_w; + cycles -= svga->monitor->mon_video_timing_read_w; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1667,6 +1675,10 @@ banshee_read_linear_l(uint32_t addr, void *p) cycles -= voodoo->read_time; + if ((banshee->pci_regs[0x30] & 0x01) && addr >= banshee->bios_rom.mapping.base && addr < (banshee->bios_rom.mapping.base + banshee->bios_rom.sz)) + { + return rom_readl(addr & (banshee->bios_rom.sz - 1), &banshee->bios_rom); + } addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { int x, y; @@ -1681,7 +1693,7 @@ banshee_read_linear_l(uint32_t addr, void *p) if (addr >= svga->vram_max) return 0xff; - cycles -= video_timing_read_l; + cycles -= svga->monitor->mon_video_timing_read_l; // banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); @@ -1712,7 +1724,7 @@ banshee_write_linear(uint32_t addr, uint8_t val, void *p) if (addr >= svga->vram_max) return; - cycles -= video_timing_write_b; + cycles -= svga->monitor->mon_video_timing_write_b; svga->changedvram[addr >> 12] = changeframecount; svga->vram[addr & svga->vram_mask] = val; @@ -1747,7 +1759,7 @@ banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) if (addr >= svga->vram_max) return; - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; svga->changedvram[addr >> 12] = changeframecount; *(uint16_t *) &svga->vram[addr & svga->vram_mask] = val; @@ -1790,7 +1802,7 @@ banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) if (addr >= svga->vram_max) return; - cycles -= video_timing_write_l; + cycles -= svga->monitor->mon_video_timing_write_l; svga->changedvram[addr >> 12] = changeframecount; *(uint32_t *) &svga->vram[addr & svga->vram_mask] = val; @@ -1862,7 +1874,7 @@ banshee_hwcursor_draw(svga_t *svga, int displine) if (x_off > -8) { for (xx = 0; xx < 8; xx++) { if (plane0[x >> 3] & (1 << 7)) - ((uint32_t *) buffer32->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; plane0[x >> 3] <<= 1; plane1[x >> 3] <<= 1; @@ -1877,9 +1889,9 @@ banshee_hwcursor_draw(svga_t *svga, int displine) if (x_off > -8) { for (xx = 0; xx < 8; xx++) { if (!(plane0[x >> 3] & (1 << 7))) - ((uint32_t *) buffer32->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[x_off + xx + svga->x_add] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; else if (plane1[x >> 3] & (1 << 7)) - ((uint32_t *) buffer32->line[displine])[x_off + xx + svga->x_add] ^= 0xffffff; + ((uint32_t *) svga->monitor->target_buffer->line[displine])[x_off + xx + svga->x_add] ^= 0xffffff; plane0[x >> 3] <<= 1; plane1[x >> 3] <<= 1; @@ -2204,7 +2216,7 @@ banshee_overlay_draw(svga_t *svga, int displine) // pclog("displine=%i addr=%08x %08x %08x %08x\n", displine, svga->overlay_latch.addr, src_addr, voodoo->overlay.vidOverlayDvdy, *(uint32_t *)src); // if (src_addr >= 0x800000) // fatal("overlay out of range!\n"); - p = &((uint32_t *) buffer32->line[displine])[svga->overlay_latch.x + svga->x_add]; + p = &((uint32_t *) svga->monitor->target_buffer->line[displine])[svga->overlay_latch.x + svga->x_add]; if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) skip_filtering = ((banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_MASK) != VIDPROCCFG_FILTER_MODE_BILINEAR && !(banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) && !(banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_DITHER_4X4) && !(banshee->vidProcCfg & VIDPROCCFG_FILTER_MODE_DITHER_2X2)); diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 68be3b26d..822085127 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -495,6 +495,7 @@ void voodoo_callback(void *p) { voodoo_t *voodoo = (voodoo_t *) p; + monitor_t* monitor = &monitors[voodoo->monitor_index]; if (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) { if (voodoo->line < voodoo->v_disp) { @@ -518,7 +519,7 @@ voodoo_callback(void *p) } if (draw_voodoo->dirty_line[draw_line]) { - uint32_t *p = &buffer32->line[voodoo->line + 8][8]; + uint32_t *p = &monitor->target_buffer->line[voodoo->line + 8][8]; uint16_t *src = (uint16_t *) &draw_voodoo->fb_mem[draw_voodoo->front_offset + draw_line * draw_voodoo->row_width]; int x; @@ -526,14 +527,14 @@ voodoo_callback(void *p) if (voodoo->line < voodoo->dirty_line_low) { voodoo->dirty_line_low = voodoo->line; - video_wait_for_buffer(); + video_wait_for_buffer_monitor(voodoo->monitor_index); } if (voodoo->line > voodoo->dirty_line_high) voodoo->dirty_line_high = voodoo->line; /* Draw left overscan. */ for (x = 0; x < 8; x++) - buffer32->line[voodoo->line + 8][x] = 0x00000000; + monitor->target_buffer->line[voodoo->line + 8][x] = 0x00000000; if (voodoo->scrfilter && voodoo->scrfilterEnabled) { uint8_t *fil = malloc((voodoo->h_disp) * 3); /* interleaved 24-bit RGB */ @@ -556,7 +557,7 @@ voodoo_callback(void *p) /* Draw right overscan. */ for (x = 0; x < 8; x++) - buffer32->line[voodoo->line + 8][voodoo->h_disp + x + 8] = 0x00000000; + monitor->target_buffer->line[voodoo->line + 8][voodoo->h_disp + x + 8] = 0x00000000; } } }