Merge pull request #3044 from Cacodemon345/svga-multi-monitor

Add SVGA multi-monitor support
This commit is contained in:
Miran Grča
2023-01-26 05:34:36 +01:00
committed by GitHub
10 changed files with 174 additions and 151 deletions

View File

@@ -33,6 +33,8 @@
# define FLAG_RAMDAC_SHIFT 64 # define FLAG_RAMDAC_SHIFT 64
# define FLAG_128K_MASK 128 # define FLAG_128K_MASK 128
struct monitor_t;
typedef struct { typedef struct {
int ena, int ena,
x, y, xoff, yoff, cur_xsize, cur_ysize, 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); uint32_t (*remap_func)(struct svga_t *svga, uint32_t in_addr);
void *ramdac, *clock_gen; void *ramdac, *clock_gen;
/* Monitor Index */
uint8_t monitor_index;
/* Pointer to monitor */
monitor_t* monitor;
} svga_t; } svga_t;
extern int vga_on, ibm8514_on; extern int vga_on, ibm8514_on;

View File

@@ -506,6 +506,7 @@ typedef struct voodoo_t {
uint8_t *vram, *changedvram; uint8_t *vram, *changedvram;
void *p; void *p;
uint8_t monitor_index;
} voodoo_t; } voodoo_t;
typedef struct voodoo_set_t { typedef struct voodoo_set_t {

View File

@@ -178,7 +178,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index)
break; 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); ui->comboBoxVideoSecondary->addItem(name, c);
if (c == curVideoCard_2) if (c == curVideoCard_2)
ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1); ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1);

View File

@@ -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]; uint8_t *src2 = &svga->vram[(svga->ma - (svga->hdisp * bytesperpix)) & svga->vram_display_mask];
int occl, ckval; 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; src2 += gd54xx->overlay.region1size * bytesperpix;
OVERLAY_SAMPLE(); OVERLAY_SAMPLE();
@@ -1858,16 +1858,16 @@ gd54xx_hwcursor_draw(svga_t *svga, int displine)
break; break;
case 1: case 1:
/* The pixel is shown in the cursor background color */ /* 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; break;
case 2: case 2:
/* The pixel is shown as the inverse of the original screen pixel /* The pixel is shown as the inverse of the original screen pixel
(XOR cursor) */ (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; break;
case 3: case 3:
/* The pixel is shown in the cursor foreground color */ /* 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; break;
} }
} }
@@ -2219,7 +2219,7 @@ gd54xx_readw_linear(uint32_t addr, void *p)
temp |= (svga_readb_linear(addr, svga) << 8); temp |= (svga_readb_linear(addr, svga) << 8);
if (svga->fast) if (svga->fast)
cycles -= video_timing_read_w; cycles -= svga->monitor->mon_video_timing_read_w;
return temp; return temp;
case 3: case 3:
@@ -2268,7 +2268,7 @@ gd54xx_readl_linear(uint32_t addr, void *p)
temp |= (svga_readb_linear(addr + 2, svga) << 24); temp |= (svga_readb_linear(addr + 2, svga) << 24);
if (svga->fast) if (svga->fast)
cycles -= video_timing_read_l; cycles -= svga->monitor->mon_video_timing_read_l;
return temp; return temp;
case 2: case 2:
@@ -2278,7 +2278,7 @@ gd54xx_readl_linear(uint32_t addr, void *p)
temp |= (svga_readb_linear(addr, svga) << 24); temp |= (svga_readb_linear(addr, svga) << 24);
if (svga->fast) if (svga->fast)
cycles -= video_timing_read_l; cycles -= svga->monitor->mon_video_timing_read_l;
return temp; return temp;
case 3: case 3:
@@ -2454,7 +2454,7 @@ gd54xx_writew_linear(uint32_t addr, uint16_t val, void *p)
svga_writeb_linear(addr, val >> 8, svga); svga_writeb_linear(addr, val >> 8, svga);
if (svga->fast) if (svga->fast)
cycles -= video_timing_write_w; cycles -= svga->monitor->mon_video_timing_write_w;
case 3: case 3:
return; return;
} }
@@ -4267,7 +4267,7 @@ gd54xx_force_redraw(void *p)
{ {
gd54xx_t *gd54xx = (gd54xx_t *) p; gd54xx_t *gd54xx = (gd54xx_t *) p;
gd54xx->svga.fullchange = changeframecount; gd54xx->svga.fullchange = gd54xx->svga.monitor->mon_changeframecount;
} }
// clang-format off // clang-format off

View File

@@ -1776,7 +1776,7 @@ s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val)
case 0x8180: case 0x8180:
s3->streams.pri_ctrl = val; s3->streams.pri_ctrl = val;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x8184: case 0x8184:
s3->streams.chroma_ctrl = val; 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: case 0x81c0:
s3->streams.pri_fb0 = val & 0x3fffff; s3->streams.pri_fb0 = val & 0x3fffff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81c4: case 0x81c4:
s3->streams.pri_fb1 = val & 0x3fffff; s3->streams.pri_fb1 = val & 0x3fffff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81c8: case 0x81c8:
s3->streams.pri_stride = val & 0xfff; s3->streams.pri_stride = val & 0xfff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81cc: case 0x81cc:
s3->streams.buffer_ctrl = val; s3->streams.buffer_ctrl = val;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81d0: case 0x81d0:
s3->streams.sec_fb0 = val; s3->streams.sec_fb0 = val;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81d4: case 0x81d4:
s3->streams.sec_fb1 = val; s3->streams.sec_fb1 = val;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81d8: case 0x81d8:
s3->streams.sec_stride = val; s3->streams.sec_stride = val;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81dc: case 0x81dc:
s3->streams.overlay_ctrl = val; 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_x = (val >> 16) & 0x7ff;
s3->streams.pri_y = val & 0x7ff; s3->streams.pri_y = val & 0x7ff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81f4: case 0x81f4:
s3->streams.pri_size = val; s3->streams.pri_size = val;
s3->streams.pri_w = (val >> 16) & 0x7ff; s3->streams.pri_w = (val >> 16) & 0x7ff;
s3->streams.pri_h = val & 0x7ff; s3->streams.pri_h = val & 0x7ff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81f8: case 0x81f8:
s3->streams.sec_start = val; s3->streams.sec_start = val;
s3->streams.sec_x = (val >> 16) & 0x7ff; s3->streams.sec_x = (val >> 16) & 0x7ff;
s3->streams.sec_y = val & 0x7ff; s3->streams.sec_y = val & 0x7ff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x81fc: case 0x81fc:
s3->streams.sec_size = val; s3->streams.sec_size = val;
s3->streams.sec_w = (val >> 16) & 0x7ff; s3->streams.sec_w = (val >> 16) & 0x7ff;
s3->streams.sec_h = val & 0x7ff; s3->streams.sec_h = val & 0x7ff;
svga_recalctimings(svga); svga_recalctimings(svga);
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
break; break;
case 0x8504: 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)) if ((((svga->crtc[0x67] & 0xc) != 0xc) && (s3->chip >= S3_TRIO64V)) || (s3->chip < S3_TRIO64V))
svga->ma_latch |= (s3->ma_ext << 16); svga->ma_latch |= (s3->ma_ext << 16);
} else { } else {
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
svga_recalctimings(svga); svga_recalctimings(svga);
} }
} }
@@ -3626,10 +3626,10 @@ s3_accel_out(uint16_t port, uint8_t val, void *p)
s3->accel.advfunc_cntl = val; s3->accel.advfunc_cntl = val;
if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) {
s3->width = (val & 4) ? 1600 : 800; s3->width = (val & 4) ? 1600 : 800;
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
svga_recalctimings(svga); svga_recalctimings(svga);
} else if (s3->chip <= S3_86C805) { } else if (s3->chip <= S3_86C805) {
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
svga_recalctimings(svga); svga_recalctimings(svga);
} }
if (s3->chip > S3_86C924) if (s3->chip > S3_86C924)
@@ -5653,16 +5653,16 @@ polygon_setup(s3_t *s3)
#define WRITE(addr, dat) \ #define WRITE(addr, dat) \
if (s3->bpp == 0 && !s3->color_16bit) { \ if (s3->bpp == 0 && !s3->color_16bit) { \
svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ 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) { \ } else if (s3->bpp == 1 || s3->color_16bit) { \
vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)] = dat; \ 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) { \ } else if (s3->bpp == 2) { \
svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ 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 { \ } else { \
vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \ 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 static __inline void
@@ -8554,7 +8554,7 @@ s3_force_redraw(void *p)
{ {
s3_t *s3 = (s3_t *) 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[] = { static const device_config_t s3_orchid_86c911_config[] = {

View File

@@ -84,24 +84,24 @@ void
svga_set_override(svga_t *svga, int val) svga_set_override(svga_t *svga, int val)
{ {
if (svga->override && !val) if (svga->override && !val)
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
svga->override = val; svga->override = val;
if (!val) { if (!val) {
/* Override turned off, restore overscan X and Y per the CRTC. */ /* Override turned off, restore overscan X and Y per the CRTC. */
if (enable_overscan) { if (enable_overscan) {
overscan_y = (svga->rowcount + 1) << 1; svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1;
if (overscan_y < 16) if (svga->monitor->mon_overscan_y < 16)
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) if (svga->seqregs[1] & 8)
overscan_x <<= 1; svga->monitor->mon_overscan_x <<= 1;
} else } 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. */ /* 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 { } else {
if ((svga->attraddr == 0x13) && (svga->attrregs[0x13] != val)) if ((svga->attraddr == 0x13) && (svga->attrregs[0x13] != val))
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
o = svga->attrregs[svga->attraddr & 31]; o = svga->attrregs[svga->attraddr & 31];
svga->attrregs[svga->attraddr & 31] = val; svga->attrregs[svga->attraddr & 31] = val;
if (svga->attraddr < 16) if (svga->attraddr < 16)
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
if (svga->attraddr == 0x10 || svga->attraddr == 0x14 || svga->attraddr < 0x10) { if (svga->attraddr == 0x10 || svga->attraddr == 0x14 || svga->attraddr < 0x10) {
for (c = 0; c < 16; c++) { for (c = 0; c < 16; c++) {
if (svga->attrregs[0x10] & 0x80) { 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->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 /* Recalculate timings on change of attribute register 0x11
(overscan border color) too. */ (overscan border color) too. */
@@ -150,7 +150,7 @@ svga_out(uint16_t addr, uint8_t val, void *p)
svga_recalctimings(svga); svga_recalctimings(svga);
} else if (svga->attraddr == 0x12) { } else if (svga->attraddr == 0x12) {
if ((val & 0xf) != svga->plane_mask) if ((val & 0xf) != svga->plane_mask)
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
svga->plane_mask = val & 0xf; svga->plane_mask = val & 0xf;
} }
} }
@@ -211,7 +211,7 @@ svga_out(uint16_t addr, uint8_t val, void *p)
case 0x3c9: case 0x3c9:
if (svga->adv_flags & FLAG_RAMDAC_SHIFT) if (svga->adv_flags & FLAG_RAMDAC_SHIFT)
val <<= 2; val <<= 2;
svga->fullchange = changeframecount; svga->fullchange = svga->monitor->mon_changeframecount;
switch (svga->dac_pos) { switch (svga->dac_pos) {
case 0: case 0:
svga->dac_r = val; svga->dac_r = val;
@@ -552,19 +552,19 @@ svga_recalctimings(svga_t *svga)
svga->char_width = (svga->seqregs[1] & 1) ? 8 : 9; svga->char_width = (svga->seqregs[1] & 1) ? 8 : 9;
if (enable_overscan) { if (enable_overscan) {
overscan_y = (svga->rowcount + 1) << 1; svga->monitor->mon_overscan_y = (svga->rowcount + 1) << 1;
if (overscan_y < 16) if (svga->monitor->mon_overscan_y < 16)
overscan_y = 16; svga->monitor->mon_overscan_y = 16;
} }
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { 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) if (svga->seqregs[1] & 8)
overscan_x <<= 1; svga->monitor->mon_overscan_x <<= 1;
} else } else
overscan_x = 16; svga->monitor->mon_overscan_x = 16;
if (vga_on) { if (vga_on) {
if (svga->recalctimings_ex) { if (svga->recalctimings_ex) {
@@ -577,8 +577,8 @@ svga_recalctimings(svga_t *svga)
xga_recalctimings(svga); xga_recalctimings(svga);
} }
svga->y_add = (overscan_y >> 1) - (svga->crtc[8] & 0x1f); svga->y_add = (svga->monitor->mon_overscan_y >> 1) - (svga->crtc[8] & 0x1f);
svga->x_add = (overscan_x >> 1); svga->x_add = (svga->monitor->mon_overscan_x >> 1);
if (svga->vblankstart < svga->dispend) if (svga->vblankstart < svga->dispend)
svga->dispend = svga->vblankstart; svga->dispend = svga->vblankstart;
@@ -631,10 +631,10 @@ svga_do_render(svga_t *svga)
if (!svga->override) { if (!svga->override) {
svga->render(svga); 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_left(svga);
svga_render_overscan_right(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) { if (svga->overlay_on) {
@@ -719,7 +719,7 @@ svga_poll(void *p)
svga->ma &= svga->vram_display_mask; svga->ma &= svga->vram_display_mask;
if (svga->firstline == 2000) { if (svga->firstline == 2000) {
svga->firstline = svga->displine; 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) { if (svga->hwcursor_on || svga->dac_hwcursor_on || svga->overlay_on) {
@@ -813,7 +813,7 @@ svga_poll(void *p)
svga->sc = 0; svga->sc = 0;
if (svga->attrregs[0x10] & 0x20) { if (svga->attrregs[0x10] & 0x20) {
svga->scrollcache = 0; 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; svga->oddeven ^= 1;
changeframecount = svga->interlace ? 3 : 2; svga->monitor->mon_changeframecount = svga->interlace ? 3 : 2;
svga->vslines = 0; svga->vslines = 0;
if (svga->interlace && svga->oddeven) if (svga->interlace && svga->oddeven)
@@ -909,7 +909,7 @@ svga_poll(void *p)
if ((svga->seqregs[1] & 8) || (svga->render == svga_render_8bpp_lowres)) if ((svga->seqregs[1] & 8) || (svga->render == svga_render_8bpp_lowres))
svga->scrollcache <<= 1; 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; svga->linecountff = 0;
@@ -938,6 +938,8 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize,
int c, d, e; int c, d, e;
svga->p = p; svga->p = p;
svga->monitor_index = monitor_index_global;
svga->monitor = &monitors[svga->monitor_index];
for (c = 0; c < 256; c++) { for (c = 0; c < 256; c++) {
e = 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->attrregs[0x11] = 0;
svga->overscan_color = 0x000000; svga->overscan_color = 0x000000;
overscan_x = 16; svga->monitor->mon_overscan_x = 16;
overscan_y = 32; svga->monitor->mon_overscan_y = 32;
svga->x_add = 8; svga->x_add = 8;
svga->y_add = 16; 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) if (svga->adv_flags & FLAG_ADDR_BY8)
writemask2 = svga->seqregs[2]; writemask2 = svga->seqregs[2];
cycles -= video_timing_write_b; cycles -= svga->monitor->mon_video_timing_write_b;
if (!linear) { if (!linear) {
if (xga_enabled) { 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; addr &= svga->vram_mask;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
count = 4; count = 4;
if (svga->adv_flags & FLAG_LATCH8) 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) if (svga->adv_flags & FLAG_ADDR_BY8)
readplane = svga->gdcreg[4] & 7; readplane = svga->gdcreg[4] & 7;
cycles -= video_timing_read_b; cycles -= svga->monitor->mon_video_timing_read_b;
if (!linear) { if (!linear) {
if (xga_enabled) { if (xga_enabled) {
@@ -1405,11 +1407,11 @@ svga_doblit(int wx, int wy, svga_t *svga)
int i, j; int i, j;
int xs_temp, ys_temp; int xs_temp, ys_temp;
y_add = (enable_overscan) ? overscan_y : 0; y_add = (enable_overscan) ? svga->monitor->mon_overscan_y : 0;
x_add = (enable_overscan) ? overscan_x : 0; x_add = (enable_overscan) ? svga->monitor->mon_overscan_x : 0;
y_start = (enable_overscan) ? 0 : (overscan_y >> 1); y_start = (enable_overscan) ? 0 : (svga->monitor->mon_overscan_y >> 1);
x_start = (enable_overscan) ? 0 : (overscan_x >> 1); x_start = (enable_overscan) ? 0 : (svga->monitor->mon_overscan_x >> 1);
bottom = (overscan_y >> 1) + (svga->crtc[8] & 0x1f); bottom = (svga->monitor->mon_overscan_y >> 1) + (svga->crtc[8] & 0x1f);
if (svga->vertical_linedbl) { if (svga->vertical_linedbl) {
y_add <<= 1; y_add <<= 1;
@@ -1432,12 +1434,12 @@ svga_doblit(int wx, int wy, svga_t *svga)
if (ys_temp < 32) if (ys_temp < 32)
ys_temp = 200; 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. */ /* Screen res has changed.. fix up, and let them know. */
xsize = xs_temp; svga->monitor->mon_xsize = xs_temp;
ysize = ys_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, /* 2048x2048 is the biggest safe render texture, to account for overscan,
we suppress overscan starting from x 1984 and y 2016. */ we suppress overscan starting from x 1984 and y 2016. */
x_add = 0; 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 /* Block resolution changes while in DPMS mode to avoid getting a bogus
screen width (320). We're already rendering a blank screen anyway. */ screen width (320). We're already rendering a blank screen anyway. */
if (!svga->dpms) 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()) if (video_force_resize_get_monitor(svga->monitor_index))
video_force_resize_set(0); video_force_resize_set_monitor(0, svga->monitor_index);
} }
if ((wx >= 160) && ((wy + 1) >= 120)) { if ((wx >= 160) && ((wy + 1) >= 120)) {
/* Draw (overscan_size - scroll size) lines of overscan on top and bottom. */ /* Draw (overscan_size - scroll size) lines of overscan on top and bottom. */
for (i = 0; i < svga->y_add; i++) { 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; p[j] = svga->overscan_color;
} }
for (i = 0; i < bottom; i++) { 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; 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) if (svga->vertical_linedbl)
svga->vertical_linedbl >>= 1; svga->vertical_linedbl >>= 1;
@@ -1492,7 +1494,7 @@ svga_writeb_linear(uint32_t addr, uint8_t val, void *p)
if (addr >= svga->vram_max) if (addr >= svga->vram_max)
return; return;
addr &= svga->vram_mask; addr &= svga->vram_mask;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
*(uint8_t *) &svga->vram[addr] = val; *(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; return;
} }
cycles -= video_timing_write_w; cycles -= svga->monitor->mon_video_timing_write_w;
if (!linear) { if (!linear) {
addr = svga_decode_addr(svga, addr, 1); 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); uint32_t addr2 = svga->translate_address(addr, p);
if (addr2 < svga->vram_max) { if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = val & 0xff; 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); addr2 = svga->translate_address(addr + 1, p);
if (addr2 < svga->vram_max) { if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff; svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount; svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount;
} }
return; return;
} }
@@ -1534,7 +1536,7 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p)
return; return;
addr &= svga->vram_mask; addr &= svga->vram_mask;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
*(uint16_t *) &svga->vram[addr] = val; *(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; return;
} }
cycles -= video_timing_write_l; cycles -= svga->monitor->mon_video_timing_write_l;
if (!linear) { if (!linear) {
addr = svga_decode_addr(svga, addr, 1); 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); uint32_t addr2 = svga->translate_address(addr, p);
if (addr2 < svga->vram_max) { if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = val & 0xff; 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); addr2 = svga->translate_address(addr + 1, p);
if (addr2 < svga->vram_max) { if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff; 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); addr2 = svga->translate_address(addr + 2, p);
if (addr2 < svga->vram_max) { if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 16) & 0xff; 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); addr2 = svga->translate_address(addr + 3, p);
if (addr2 < svga->vram_max) { if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 24) & 0xff; svga->vram[addr2 & svga->vram_mask] = (val >> 24) & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount; svga->changedvram[addr2 >> 12] = svga->monitor->mon_changeframecount;
} }
return; return;
} }
@@ -1600,7 +1602,7 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p)
return; return;
addr &= svga->vram_mask; addr &= svga->vram_mask;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount;
*(uint32_t *) &svga->vram[addr] = val; *(uint32_t *) &svga->vram[addr] = val;
} }
@@ -1639,7 +1641,7 @@ svga_readw_common(uint32_t addr, uint8_t linear, void *p)
if (!svga->fast) if (!svga->fast)
return svga_read_common(addr, linear, p) | (svga_read_common(addr + 1, linear, p) << 8); 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) { if (!linear) {
addr = svga_decode_addr(svga, addr, 0); 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); 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) { if (!linear) {
addr = svga_decode_addr(svga, addr, 0); addr = svga_decode_addr(svga, addr, 0);

View File

@@ -67,7 +67,7 @@ svga_render_blank(svga_t *svga)
break; 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); uint32_t line_width = (uint32_t) (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t);
memset(line_ptr, 0, line_width); memset(line_ptr, 0, line_width);
} }
@@ -83,7 +83,7 @@ svga_render_overscan_left(svga_t *svga)
if (svga->scrblank || (svga->hdisp == 0)) if (svga->scrblank || (svga->hdisp == 0))
return; 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++) for (i = 0; i < svga->x_add; i++)
*line_ptr++ = svga->overscan_color; *line_ptr++ = svga->overscan_color;
} }
@@ -99,7 +99,7 @@ svga_render_overscan_right(svga_t *svga)
if (svga->scrblank || (svga->hdisp == 0)) if (svga->scrblank || (svga->hdisp == 0))
return; 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); right = (overscan_x >> 1);
for (i = 0; i < right; i++) for (i = 0; i < right; i++)
*line_ptr++ = svga->overscan_color; *line_ptr++ = svga->overscan_color;
@@ -124,7 +124,7 @@ svga_render_text_40(svga_t *svga)
svga->lastline_draw = svga->displine; svga->lastline_draw = svga->displine;
if (svga->fullchange) { 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; xinc = (svga->seqregs[1] & 1) ? 16 : 18;
for (x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { 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; svga->lastline_draw = svga->displine;
if (svga->fullchange) { 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; xinc = (svga->seqregs[1] & 1) ? 8 : 9;
for (x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { 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; svga->lastline_draw = svga->displine;
if (svga->fullchange) { 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; 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; 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) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -442,7 +442,7 @@ svga_render_2bpp_lowres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; 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; 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) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -539,7 +539,7 @@ svga_render_2bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; 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); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -641,7 +641,7 @@ svga_render_4bpp_lowres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -701,7 +701,7 @@ svga_render_4bpp_lowres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; 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; changed_offset = (svga->ma + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12;
if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -819,7 +819,7 @@ svga_render_4bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -874,7 +874,7 @@ svga_render_8bpp_lowres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -897,7 +897,7 @@ svga_render_8bpp_lowres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -946,7 +946,7 @@ svga_render_8bpp_highres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -974,7 +974,7 @@ svga_render_8bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1026,7 +1026,7 @@ svga_render_8bpp_tseng_lowres(svga_t *svga)
return; return;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1068,7 +1068,7 @@ svga_render_8bpp_tseng_highres(svga_t *svga)
return; return;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1129,7 +1129,7 @@ svga_render_15bpp_lowres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1153,7 +1153,7 @@ svga_render_15bpp_lowres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1200,7 +1200,7 @@ svga_render_15bpp_highres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1230,7 +1230,7 @@ svga_render_15bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1281,7 +1281,7 @@ svga_render_15bpp_mix_lowres(svga_t *svga)
return; return;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1316,7 +1316,7 @@ svga_render_15bpp_mix_highres(svga_t *svga)
return; return;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1361,7 +1361,7 @@ svga_render_16bpp_lowres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1383,7 +1383,7 @@ svga_render_16bpp_lowres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1430,7 +1430,7 @@ svga_render_16bpp_highres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1460,7 +1460,7 @@ svga_render_16bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; 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); fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
svga->ma += 3; svga->ma += 3;
svga->ma &= svga->vram_display_mask; 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 { } else {
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1588,7 +1588,7 @@ svga_render_24bpp_highres(svga_t *svga)
if (svga->force_old_addr) { if (svga->force_old_addr) {
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1615,7 +1615,7 @@ svga_render_24bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; 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); dat = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
svga->ma += 4; svga->ma += 4;
svga->ma &= svga->vram_display_mask; 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 { } else {
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1724,7 +1724,7 @@ svga_render_32bpp_highres(svga_t *svga)
if (svga->force_old_addr) { 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) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1741,7 +1741,7 @@ svga_render_32bpp_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1781,7 +1781,7 @@ svga_render_ABGR8888_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;
@@ -1820,7 +1820,7 @@ svga_render_RGBA8888_highres(svga_t *svga)
changed_addr = svga->remap_func(svga, svga->ma); changed_addr = svga->remap_func(svga, svga->ma);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { 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) if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine; svga->firstline_draw = svga->displine;

View File

@@ -163,10 +163,10 @@ video_cards[] = {
{ &et4000w32p_pci_device }, { &et4000w32p_pci_device },
{ &gd5430_pci_device, }, { &gd5430_pci_device, },
{ &gd5434_pci_device }, { &gd5434_pci_device },
{ &gd5436_pci_device }, { &gd5436_pci_device, VIDEO_FLAG_TYPE_SPECIAL },
{ &gd5440_pci_device }, { &gd5440_pci_device },
{ &gd5446_pci_device }, { &gd5446_pci_device, VIDEO_FLAG_TYPE_SPECIAL },
{ &gd5446_stb_pci_device }, { &gd5446_stb_pci_device,VIDEO_FLAG_TYPE_SPECIAL },
{ &gd5480_pci_device }, { &gd5480_pci_device },
{ &s3_spea_mercury_lite_86c928_pci_device }, { &s3_spea_mercury_lite_86c928_pci_device },
{ &s3_diamond_stealth64_964_pci_device }, { &s3_diamond_stealth64_964_pci_device },
@@ -350,7 +350,6 @@ video_reset(int card)
if (!(card == VID_NONE) if (!(card == VID_NONE)
&& !machine_has_flags(machine, MACHINE_VIDEO_ONLY) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY)
&& gfxcard_2 != 0 && gfxcard_2 != 0
&& (video_cards[gfxcard_2].flags != video_cards[gfxcard].flags)
&& device_is_valid(video_card_getdevice(gfxcard_2), machine)) { && device_is_valid(video_card_getdevice(gfxcard_2), machine)) {
video_monitor_init(1); video_monitor_init(1);
monitor_index_global = 1; monitor_index_global = 1;

View File

@@ -453,7 +453,7 @@ banshee_render_16bpp_tiled(svga_t *svga)
{ {
banshee_t *banshee = (banshee_t *) svga->p; banshee_t *banshee = (banshee_t *) svga->p;
int x; 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; uint32_t addr;
int drawn = 0; int drawn = 0;
@@ -1602,6 +1602,10 @@ banshee_read_linear(uint32_t addr, void *p)
cycles -= voodoo->read_time; 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; addr &= svga->decode_mask;
if (addr >= voodoo->tile_base) { if (addr >= voodoo->tile_base) {
int x, y; int x, y;
@@ -1616,7 +1620,7 @@ banshee_read_linear(uint32_t addr, void *p)
if (addr >= svga->vram_max) if (addr >= svga->vram_max)
return 0xff; 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]); // 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); return banshee_read_linear(addr, p) | (banshee_read_linear(addr + 1, p) << 8);
cycles -= voodoo->read_time; 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; addr &= svga->decode_mask;
if (addr >= voodoo->tile_base) { if (addr >= voodoo->tile_base) {
int x, y; int x, y;
@@ -1648,7 +1656,7 @@ banshee_read_linear_w(uint32_t addr, void *p)
if (addr >= svga->vram_max) if (addr >= svga->vram_max)
return 0xff; 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]); // 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; 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; addr &= svga->decode_mask;
if (addr >= voodoo->tile_base) { if (addr >= voodoo->tile_base) {
int x, y; int x, y;
@@ -1681,7 +1693,7 @@ banshee_read_linear_l(uint32_t addr, void *p)
if (addr >= svga->vram_max) if (addr >= svga->vram_max)
return 0xff; 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]); // 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) if (addr >= svga->vram_max)
return; return;
cycles -= video_timing_write_b; cycles -= svga->monitor->mon_video_timing_write_b;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = changeframecount;
svga->vram[addr & svga->vram_mask] = val; 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) if (addr >= svga->vram_max)
return; return;
cycles -= video_timing_write_w; cycles -= svga->monitor->mon_video_timing_write_w;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = changeframecount;
*(uint16_t *) &svga->vram[addr & svga->vram_mask] = val; *(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) if (addr >= svga->vram_max)
return; return;
cycles -= video_timing_write_l; cycles -= svga->monitor->mon_video_timing_write_l;
svga->changedvram[addr >> 12] = changeframecount; svga->changedvram[addr >> 12] = changeframecount;
*(uint32_t *) &svga->vram[addr & svga->vram_mask] = val; *(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) { if (x_off > -8) {
for (xx = 0; xx < 8; xx++) { for (xx = 0; xx < 8; xx++) {
if (plane0[x >> 3] & (1 << 7)) 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; plane0[x >> 3] <<= 1;
plane1[x >> 3] <<= 1; plane1[x >> 3] <<= 1;
@@ -1877,9 +1889,9 @@ banshee_hwcursor_draw(svga_t *svga, int displine)
if (x_off > -8) { if (x_off > -8) {
for (xx = 0; xx < 8; xx++) { for (xx = 0; xx < 8; xx++) {
if (!(plane0[x >> 3] & (1 << 7))) 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)) 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; plane0[x >> 3] <<= 1;
plane1[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); // 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) // if (src_addr >= 0x800000)
// fatal("overlay out of range!\n"); // 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) 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)); 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));

View File

@@ -495,6 +495,7 @@ void
voodoo_callback(void *p) voodoo_callback(void *p)
{ {
voodoo_t *voodoo = (voodoo_t *) p; voodoo_t *voodoo = (voodoo_t *) p;
monitor_t* monitor = &monitors[voodoo->monitor_index];
if (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) { if (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) {
if (voodoo->line < voodoo->v_disp) { if (voodoo->line < voodoo->v_disp) {
@@ -518,7 +519,7 @@ voodoo_callback(void *p)
} }
if (draw_voodoo->dirty_line[draw_line]) { 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]; uint16_t *src = (uint16_t *) &draw_voodoo->fb_mem[draw_voodoo->front_offset + draw_line * draw_voodoo->row_width];
int x; int x;
@@ -526,14 +527,14 @@ voodoo_callback(void *p)
if (voodoo->line < voodoo->dirty_line_low) { if (voodoo->line < voodoo->dirty_line_low) {
voodoo->dirty_line_low = voodoo->line; 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) if (voodoo->line > voodoo->dirty_line_high)
voodoo->dirty_line_high = voodoo->line; voodoo->dirty_line_high = voodoo->line;
/* Draw left overscan. */ /* Draw left overscan. */
for (x = 0; x < 8; x++) 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) { if (voodoo->scrfilter && voodoo->scrfilterEnabled) {
uint8_t *fil = malloc((voodoo->h_disp) * 3); /* interleaved 24-bit RGB */ uint8_t *fil = malloc((voodoo->h_disp) * 3); /* interleaved 24-bit RGB */
@@ -556,7 +557,7 @@ voodoo_callback(void *p)
/* Draw right overscan. */ /* Draw right overscan. */
for (x = 0; x < 8; x++) 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;
} }
} }
} }