Cirrus, ATI Mach8/32 and XGA fixes.
1. Update svga->fast to account for packed chain mode toggles, fixes issues on Descent II for DOS using the Cirrus cards. 2. Re-organized ATI Mach8/32 LFB access as well as 8514/A/ATI mode toggles, should end the video mode issues once and for all. 3. Fixed a small but major pattern issue with IBM OS/2 1.30.1's XGA driver (not .2, which is fine as is).
This commit is contained in:
@@ -137,7 +137,7 @@ typedef struct ibm8514_t {
|
||||
} accel;
|
||||
|
||||
uint16_t test;
|
||||
int ibm_mode;
|
||||
int vendor_mode[2];
|
||||
|
||||
int v_total;
|
||||
int dispend;
|
||||
|
||||
@@ -2009,7 +2009,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
if (dev->accel.cur_y >= 0x600)
|
||||
dev->accel.cy |= ~0x5ff;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2061,7 +2061,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
if (!(dev->accel.cmd & 0x40) && (frgd_mix == 2) && (bkgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) {
|
||||
if (!(dev->accel.sx & 1)) {
|
||||
dev->accel.output = 1;
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
|
||||
else
|
||||
dev->accel.newdest_out = (dev->accel.cy + 1) * dev->pitch;
|
||||
@@ -2075,7 +2075,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
||||
if (!(dev->accel.cmd & 2) && (frgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) {
|
||||
if (!(dev->accel.sx & 1)) {
|
||||
dev->accel.input = 1;
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
|
||||
else
|
||||
dev->accel.newdest_in = (dev->accel.cy + 1) * dev->pitch;
|
||||
@@ -2258,7 +2258,7 @@ rect_fill_pix:
|
||||
break;
|
||||
}
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2343,7 +2343,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2435,7 +2435,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2494,7 +2494,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
|
||||
} else {
|
||||
@@ -2519,7 +2519,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
|
||||
} else {
|
||||
@@ -2575,7 +2575,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
|
||||
} else {
|
||||
@@ -2600,7 +2600,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
|
||||
} else {
|
||||
@@ -2690,7 +2690,7 @@ rect_fill_pix:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2767,7 +2767,7 @@ rect_fill:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2838,7 +2838,7 @@ rect_fill:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2923,7 +2923,7 @@ rect_fill:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -2990,7 +2990,7 @@ rect_fill:
|
||||
else
|
||||
dev->accel.cy--;
|
||||
|
||||
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
|
||||
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
|
||||
else
|
||||
dev->accel.dest = dev->accel.cy * dev->pitch;
|
||||
@@ -3685,7 +3685,7 @@ bitblt:
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ((dev->accel_bpp == 24) && (dev->local >= 2) && (dev->accel.cmd == 0xc2b5)) {
|
||||
if ((dev->accel_bpp == 24) && ((dev->local & 0xff) >= 0x02) && (dev->accel.cmd == 0xc2b5)) {
|
||||
int64_t cx;
|
||||
int64_t dx;
|
||||
|
||||
|
||||
@@ -101,7 +101,6 @@ typedef struct mach_t {
|
||||
uint8_t bank_r;
|
||||
uint16_t shadow_set;
|
||||
int ext_on[2];
|
||||
int ati_mode[2];
|
||||
|
||||
struct {
|
||||
uint8_t line_idx;
|
||||
@@ -1173,7 +1172,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
READ(dev->accel.src + ((dev->accel.cx)), mix);
|
||||
READ(dev->accel.src + dev->accel.cx, mix);
|
||||
mix = (mix & rd_mask) == rd_mask;
|
||||
break;
|
||||
|
||||
@@ -1296,6 +1295,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
||||
dev->accel.cx += mach->accel.src_width;
|
||||
else
|
||||
dev->accel.cx -= mach->accel.src_width;
|
||||
|
||||
dev->accel.cy += (mach->accel.src_y_dir ? 1 : -1);
|
||||
if (dev->bpp)
|
||||
dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * (dev->pitch));
|
||||
@@ -2267,7 +2267,7 @@ mach_accel_out_pixtrans(mach_t *mach, ibm8514_t *dev, uint16_t val)
|
||||
case 0x000: /*8-bit size*/
|
||||
if (mono_src == 2) {
|
||||
if ((frgd_sel != 2) && (bkgd_sel != 2)) {
|
||||
if ((mach->accel.dp_config & 0x1000) && (dev->local >= 2))
|
||||
if ((mach->accel.dp_config & 0x1000) && ((dev->local & 0xff) >= 0x02))
|
||||
val = (val >> 8) | (val << 8);
|
||||
mach_accel_start(mach->accel.cmd_type, 1, 8, val | (val << 16), 0, mach, dev);
|
||||
} else
|
||||
@@ -2325,7 +2325,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
case 0xad:
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if ((old ^ val) & 0x0c)
|
||||
svga_recalctimings(svga);
|
||||
}
|
||||
@@ -2341,7 +2341,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
if (mach->regs[0xbe] & 0x08) { /* Read/write bank mode */
|
||||
mach->bank_r = (((mach->regs[0xb2] & 1) << 3) | ((mach->regs[0xb2] & 0xe0) >> 5));
|
||||
mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
mach->bank_r |= ((mach->regs[0xae] & 0x0c) << 2);
|
||||
mach->bank_w |= ((mach->regs[0xae] & 3) << 4);
|
||||
}
|
||||
@@ -2349,7 +2349,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
mach_log("Separate B2Bank = %02x, AEbank = %02x.\n", mach->regs[0xb2], mach->regs[0xae]);
|
||||
} else { /* Single bank mode */
|
||||
mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
mach->bank_w |= ((mach->regs[0xae] & 3) << 4);
|
||||
}
|
||||
mach->bank_r = mach->bank_w;
|
||||
@@ -2377,7 +2377,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
case 0xb8:
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if ((old ^ val) & 0x40)
|
||||
svga_recalctimings(svga);
|
||||
} else {
|
||||
@@ -2401,7 +2401,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x2ed:
|
||||
rs2 = !!(mach->accel.ext_ge_config & 0x1000);
|
||||
rs3 = !!(mach->accel.ext_ge_config & 0x2000);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
ati68860_ramdac_out((addr & 3) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga);
|
||||
else
|
||||
@@ -2416,7 +2416,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x3C9:
|
||||
rs2 = !!(mach->regs[0xa0] & 0x20);
|
||||
rs3 = !!(mach->regs[0xa0] & 0x40);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
ati68860_ramdac_out((addr & 3) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga);
|
||||
else
|
||||
@@ -2484,7 +2484,7 @@ mach_in(uint16_t addr, void *priv)
|
||||
break;
|
||||
case 0xb0:
|
||||
temp = mach->regs[0xb0] | 0x80;
|
||||
if (dev->local >= 2) { /*Mach32 VGA 1MB memory*/
|
||||
if ((dev->local & 0xff) >= 0x02) { /*Mach32 VGA 1MB memory*/
|
||||
temp |= 0x08;
|
||||
temp &= ~0x10;
|
||||
} else { /*ATI 28800 VGA 512kB memory*/
|
||||
@@ -2514,7 +2514,7 @@ mach_in(uint16_t addr, void *priv)
|
||||
case 0x2ed:
|
||||
rs2 = !!(mach->accel.ext_ge_config & 0x1000);
|
||||
rs3 = !!(mach->accel.ext_ge_config & 0x2000);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
temp = ati68860_ramdac_in((addr & 3) | (rs2 << 2) | (rs3 << 3), svga->ramdac, svga);
|
||||
else
|
||||
@@ -2529,7 +2529,7 @@ mach_in(uint16_t addr, void *priv)
|
||||
case 0x3C9:
|
||||
rs2 = !!(mach->regs[0xa0] & 0x20);
|
||||
rs3 = !!(mach->regs[0xa0] & 0x40);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->pci_bus && !mach->ramdac_type)
|
||||
temp = ati68860_ramdac_in((addr & 3) | (rs2 << 2) | (rs3 << 3), svga->ramdac, svga);
|
||||
else
|
||||
@@ -2564,7 +2564,7 @@ mach_recalctimings(svga_t *svga)
|
||||
|
||||
clock_sel = ((svga->miscout >> 2) & 3) | ((mach->regs[0xbe] & 0x10) >> 1) | ((mach->regs[0xb9] & 2) << 1);
|
||||
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->regs[0xad] & 0x04)
|
||||
svga->ma_latch |= 0x40000;
|
||||
|
||||
@@ -2583,14 +2583,18 @@ mach_recalctimings(svga_t *svga)
|
||||
svga->htotal <<= 1;
|
||||
svga->rowoffset <<= 1;
|
||||
svga->gdcreg[5] &= ~0x40;
|
||||
svga->attrregs[0x10] &= ~0x40;
|
||||
}
|
||||
|
||||
if (mach->regs[0xb0] & 0x20)
|
||||
if (mach->regs[0xb0] & 0x20) {
|
||||
svga->gdcreg[5] |= 0x40;
|
||||
svga->attrregs[0x10] |= 0x40;
|
||||
}
|
||||
|
||||
mach_log("ON[0]=%d, ON[1]=%d, exton[0]=%d, exton[1]=%d, vendormode0=%d, vendormode1=%d.\n", dev->on[0], dev->on[1], mach->ext_on[0], mach->ext_on[1], dev->vendor_mode[0], dev->vendor_mode[1]);
|
||||
if (dev->on[0] || dev->on[1]) {
|
||||
mach_log("8514/A ON.\n");
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
dev->h_disp = (dev->hdisp + 1) << 3;
|
||||
dev->h_total = (dev->htotal + 1);
|
||||
dev->v_total = (dev->vtotal + 1);
|
||||
@@ -2639,7 +2643,6 @@ mach_recalctimings(svga_t *svga)
|
||||
dev->v_syncstart >>= 1;
|
||||
dev->v_total >>= 1;
|
||||
}
|
||||
|
||||
dev->pitch = dev->ext_pitch;
|
||||
dev->rowoffset = dev->ext_crt_pitch;
|
||||
if ((mach->accel.ext_ge_config & 0x800) || (!(mach->accel.ext_ge_config & 0x8000) && !(mach->accel.ext_ge_config & 0x800))) {
|
||||
@@ -2757,39 +2760,58 @@ mach_recalctimings(svga_t *svga)
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen);
|
||||
if (mach->regs[0xa7] & 0x80)
|
||||
svga->clock *= 3;
|
||||
switch (svga->gdcreg[5] & 0x60) {
|
||||
case 0x00:
|
||||
if (svga->bpp <= 8) {
|
||||
if (svga->attrregs[0x10] & 0x40) { /*8bpp mode*/
|
||||
svga->map8 = svga->pallook;
|
||||
if (svga->lowres) /*Low res (320)*/
|
||||
svga->render = svga_render_8bpp_lowres;
|
||||
else {
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
svga->ma_latch <<= 1;
|
||||
svga->rowoffset <<= 1;
|
||||
}
|
||||
} else {
|
||||
mach_log("4bpp.\n");
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
svga->render = svga_render_4bpp_lowres;
|
||||
else
|
||||
svga->render = svga_render_4bpp_highres;
|
||||
break;
|
||||
case 0x20: /*4 colours*/
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
svga->render = svga_render_2bpp_lowres;
|
||||
else
|
||||
svga->render = svga_render_2bpp_highres;
|
||||
break;
|
||||
case 0x40:
|
||||
case 0x60: /*256+ colours*/
|
||||
switch (svga->bpp) {
|
||||
default:
|
||||
case 8:
|
||||
svga->map8 = svga->pallook;
|
||||
if (svga->lowres)
|
||||
svga->render = svga_render_8bpp_lowres;
|
||||
else {
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
svga->ma_latch <<= 1;
|
||||
svga->rowoffset <<= 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (svga->gdcreg[5] & 0x60) {
|
||||
case 0x00:
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
svga->render = svga_render_4bpp_lowres;
|
||||
else
|
||||
svga->render = svga_render_4bpp_highres;
|
||||
break;
|
||||
case 0x20: /*4 colours*/
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
svga->render = svga_render_2bpp_lowres;
|
||||
else
|
||||
svga->render = svga_render_2bpp_highres;
|
||||
break;
|
||||
case 0x40:
|
||||
case 0x60: /*256+ colours*/
|
||||
switch (svga->bpp) {
|
||||
default:
|
||||
case 8:
|
||||
svga->map8 = svga->pallook;
|
||||
if (svga->lowres)
|
||||
svga->render = svga_render_8bpp_lowres;
|
||||
else {
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
svga->ma_latch <<= 1;
|
||||
svga->rowoffset <<= 1;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3689,11 +3711,11 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
|
||||
WRITE8(port, dev->accel.advfunc_cntl, val);
|
||||
dev->on[port & 1] = (dev->accel.advfunc_cntl & 0x01);
|
||||
mach_log("%04x: ON=%d.\n", port, dev->on[port & 1]);
|
||||
mach_log("ATI 8514/A: (0x%04x): ON=%d.\n", port, dev->on[port & 1]);
|
||||
vga_on = !dev->on[port & 1];
|
||||
mach->ext_on[port & 1] = dev->on[port & 1];
|
||||
mach32_updatemapping(mach);
|
||||
mach->ati_mode[port & 1] = 0;
|
||||
dev->vendor_mode[port & 1] = 0;
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3770,6 +3792,7 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
else
|
||||
dev->ext_crt_pitch <<= 1;
|
||||
}
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3814,9 +3837,10 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
case 0x4aef:
|
||||
WRITE8(port, mach->accel.clock_sel, val);
|
||||
dev->on[port & 1] = mach->accel.clock_sel & 0x01;
|
||||
mach_log("ATI 8514/A: (0x%04x): ON=%d.\n", port, dev->on[port & 1]);
|
||||
mach->ext_on[port & 1] = dev->on[port & 1];
|
||||
vga_on = !dev->on[port & 1];
|
||||
mach->ati_mode[port & 1] = 1;
|
||||
dev->vendor_mode[port & 1] = 1;
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3837,9 +3861,7 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
case 0x5aee:
|
||||
case 0x5aef:
|
||||
WRITE8(port, mach->shadow_set, val);
|
||||
if (port & 1)
|
||||
mach_log("Shadow set = %02x.\n", mach->shadow_set & 0x03);
|
||||
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3882,13 +3904,14 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
case 0x76ef:
|
||||
WRITE8(port, mach->accel.ge_pitch, val);
|
||||
dev->ext_pitch = ((mach->accel.ge_pitch & 0xff) << 3);
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
case 0x7aee:
|
||||
case 0x7aef:
|
||||
WRITE8(port, mach->accel.ext_ge_config, val);
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->accel.crt_pitch & 0xff)
|
||||
dev->ext_crt_pitch = mach->accel.crt_pitch & 0xff;
|
||||
switch (mach->accel.ext_ge_config & 0x30) {
|
||||
@@ -3912,9 +3935,10 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
break;
|
||||
}
|
||||
svga_set_ramdac_type(svga, !!(mach->accel.ext_ge_config & 0x4000));
|
||||
mach->ati_mode[port & 1] = 1;
|
||||
dev->vendor_mode[port & 1] = 1;
|
||||
mach32_updatemapping(mach);
|
||||
}
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -3922,7 +3946,7 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
||||
case 0x7eef:
|
||||
WRITE8(port, mach->accel.eeprom_control, val);
|
||||
ati_eeprom_write(&mach->eeprom, mach->accel.eeprom_control & 4, mach->accel.eeprom_control & 2, mach->accel.eeprom_control & 1);
|
||||
mach_log("[%04X]: 7EEE+%d VGA ON = %d, Ext = %i, val = %04x, pagesel = %04x.\n", CS, port & 1, vga_on, ibm8514_on, mach->accel.eeprom_control & 0x10ff, (mach->accel.eeprom_control & 0xf0) << 7);
|
||||
mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
|
||||
@@ -4274,7 +4298,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
|
||||
case 0xdaee:
|
||||
if (len != 1) {
|
||||
temp = mach->accel.src_x;
|
||||
if (dev->local >= 2)
|
||||
if ((dev->local & 0xff) >= 0x02)
|
||||
temp &= 0x7ff;
|
||||
} else
|
||||
temp = mach->accel.src_x & 0xff;
|
||||
@@ -4287,7 +4311,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
|
||||
case 0xdeee:
|
||||
if (len != 1) {
|
||||
temp = mach->accel.src_y;
|
||||
if (dev->local >= 2)
|
||||
if ((dev->local & 0xff) >= 0x02)
|
||||
temp &= 0x7ff;
|
||||
} else
|
||||
temp = mach->accel.src_y & 0xff;
|
||||
@@ -4617,10 +4641,47 @@ mach_accel_inl(uint16_t port, void *priv)
|
||||
return temp;
|
||||
}
|
||||
|
||||
static void
|
||||
mach32_write_linear(uint32_t addr, uint8_t val, void *priv)
|
||||
static uint32_t
|
||||
mach32_decode_addr(svga_t *svga, uint32_t addr, int write)
|
||||
{
|
||||
svga_t *svga = (svga_t *) priv;
|
||||
int memory_map_mode = (svga->gdcreg[6] >> 2) & 3;
|
||||
|
||||
addr &= 0x1ffff;
|
||||
|
||||
switch (memory_map_mode) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
if (addr >= 0x10000)
|
||||
return 0xffffffff;
|
||||
break;
|
||||
case 2:
|
||||
addr -= 0x10000;
|
||||
if (addr >= 0x8000)
|
||||
return 0xffffffff;
|
||||
break;
|
||||
default:
|
||||
case 3:
|
||||
addr -= 0x18000;
|
||||
if (addr >= 0x8000)
|
||||
return 0xffffffff;
|
||||
break;
|
||||
}
|
||||
|
||||
if (memory_map_mode <= 1) {
|
||||
if (write)
|
||||
addr = (addr & svga->banked_mask) + svga->write_bank;
|
||||
else
|
||||
addr = (addr & svga->banked_mask) + svga->read_bank;
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
static __inline void
|
||||
mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach)
|
||||
{
|
||||
svga_t *svga = &mach->svga;
|
||||
ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
int writemask2 = svga->writemask;
|
||||
int reset_wm = 0;
|
||||
@@ -4631,6 +4692,12 @@ mach32_write_linear(uint32_t addr, uint8_t val, void *priv)
|
||||
|
||||
cycles -= svga->monitor->mon_video_timing_write_b;
|
||||
|
||||
if (!linear) {
|
||||
addr = mach32_decode_addr(svga, addr, 1);
|
||||
if (addr == 0xffffffff)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(svga->gdcreg[6] & 1))
|
||||
svga->fullchange = 2;
|
||||
|
||||
@@ -4639,6 +4706,9 @@ mach32_write_linear(uint32_t addr, uint8_t val, void *priv)
|
||||
addr &= ~3;
|
||||
} else if (svga->chain4 && (svga->writemode < 4)) {
|
||||
writemask2 = 1 << (addr & 3);
|
||||
if (!linear)
|
||||
addr &= ~3;
|
||||
|
||||
addr = ((addr & 0xfffc) << 2) | ((addr & 0x30000) >> 14) | (addr & ~0x3ffff);
|
||||
} else if (svga->chain2_write) {
|
||||
writemask2 &= ~0xa;
|
||||
@@ -4750,40 +4820,31 @@ static void
|
||||
mach32_write(uint32_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
|
||||
addr = (addr & svga->banked_mask) + svga->write_bank;
|
||||
mach32_write_linear(addr, val, svga);
|
||||
mach32_write_common(addr, val, 0, mach);
|
||||
}
|
||||
|
||||
static void
|
||||
mach32_writew(uint32_t addr, uint16_t val, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
|
||||
addr = (addr & svga->banked_mask) + svga->write_bank;
|
||||
mach32_write_linear(addr, val & 0xff, svga);
|
||||
mach32_write_linear(addr + 1, val >> 8, svga);
|
||||
mach32_write_common(addr, val & 0xff, 0, mach);
|
||||
mach32_write_common(addr + 1, val >> 8, 0, mach);
|
||||
}
|
||||
|
||||
static void
|
||||
mach32_writel(uint32_t addr, uint32_t val, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
|
||||
addr = (addr & svga->banked_mask) + svga->write_bank;
|
||||
mach32_write_linear(addr, val & 0xff, svga);
|
||||
mach32_write_linear(addr + 1, val >> 8, svga);
|
||||
mach32_write_linear(addr + 2, val >> 16, svga);
|
||||
mach32_write_linear(addr + 3, val >> 24, svga);
|
||||
mach32_write_common(addr, val & 0xff, 0, mach);
|
||||
mach32_write_common(addr + 1, val >> 8, 0, mach);
|
||||
mach32_write_common(addr + 2, val >> 16, 0, mach);
|
||||
mach32_write_common(addr + 3, val >> 24, 0, mach);
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
mach32_read_linear(uint32_t addr, void *priv)
|
||||
static __inline uint8_t
|
||||
mach32_read_common(uint32_t addr, int linear, mach_t *mach)
|
||||
{
|
||||
svga_t *svga = (svga_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint32_t latch_addr = 0;
|
||||
int readplane = svga->readplane;
|
||||
@@ -4793,6 +4854,12 @@ mach32_read_linear(uint32_t addr, void *priv)
|
||||
|
||||
cycles -= svga->monitor->mon_video_timing_read_b;
|
||||
|
||||
if (!linear) {
|
||||
addr = mach32_decode_addr(svga, addr, 0);
|
||||
if (addr == 0xffffffff)
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
count = 2;
|
||||
|
||||
latch_addr = (addr << count) & svga->decode_mask;
|
||||
@@ -4865,11 +4932,9 @@ static uint8_t
|
||||
mach32_read(uint32_t addr, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
uint8_t ret;
|
||||
|
||||
addr = (addr & svga->banked_mask) + svga->read_bank;
|
||||
ret = mach32_read_linear(addr, svga);
|
||||
ret = mach32_read_common(addr, 0, mach);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4877,12 +4942,10 @@ static uint16_t
|
||||
mach32_readw(uint32_t addr, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
uint16_t ret;
|
||||
|
||||
addr = (addr & svga->banked_mask) + svga->read_bank;
|
||||
ret = mach32_read_linear(addr, svga);
|
||||
ret |= (mach32_read_linear(addr + 1, svga) << 8);
|
||||
ret = mach32_read_common(addr, 0, mach);
|
||||
ret |= (mach32_read_common(addr + 1, 0, mach) << 8);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4890,23 +4953,22 @@ static uint32_t
|
||||
mach32_readl(uint32_t addr, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
uint32_t ret;
|
||||
|
||||
addr = (addr & svga->banked_mask) + svga->read_bank;
|
||||
ret = mach32_read_linear(addr, svga);
|
||||
ret |= (mach32_read_linear(addr + 1, svga) << 8);
|
||||
ret |= (mach32_read_linear(addr + 2, svga) << 16);
|
||||
ret |= (mach32_read_linear(addr + 3, svga) << 24);
|
||||
ret = mach32_read_common(addr, 0, mach);
|
||||
ret |= (mach32_read_common(addr + 1, 0, mach) << 8);
|
||||
ret |= (mach32_read_common(addr + 2, 0, mach) << 16);
|
||||
ret |= (mach32_read_common(addr + 3, 0, mach) << 24);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
mach32_ap_writeb(uint32_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
|
||||
if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) &&
|
||||
((addr >= ((mach->ap_size << 20) - 0x200)) && (addr < (mach->ap_size << 20)))) {
|
||||
@@ -4918,17 +4980,21 @@ mach32_ap_writeb(uint32_t addr, uint8_t val, void *priv)
|
||||
mach_accel_outb(0x02e8 + (addr & 1) + (port_dword << 8), val, mach);
|
||||
}
|
||||
} else {
|
||||
mach_log("Linear WORDB Write=%08x.\n", addr);
|
||||
mach32_write_linear(addr, val, svga);
|
||||
mach_log("Linear WORDB Write=%08x, val=%02x.\n", addr, val);
|
||||
if (dev->on[0] || dev->on[1])
|
||||
mach32_write_common(addr, val, 1, mach);
|
||||
else
|
||||
svga_write_linear(addr, val, svga);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mach32_ap_writew(uint32_t addr, uint16_t val, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
|
||||
if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) &&
|
||||
((addr >= ((mach->ap_size << 20) - 0x200)) && (addr < (mach->ap_size << 20)))) {
|
||||
@@ -4940,18 +5006,22 @@ mach32_ap_writew(uint32_t addr, uint16_t val, void *priv)
|
||||
mach_accel_outw(0x02e8 + (port_dword << 8), val, mach);
|
||||
}
|
||||
} else {
|
||||
mach_log("Linear WORDW Write=%08x.\n", addr);
|
||||
mach32_write_linear(addr, val & 0xff, svga);
|
||||
mach32_write_linear(addr + 1, val >> 8, svga);
|
||||
mach_log("Linear WORDW Write=%08x, val=%04x.\n", addr, val);
|
||||
if (dev->on[0] || dev->on[1]) {
|
||||
mach32_write_common(addr, val & 0xff, 1, mach);
|
||||
mach32_write_common(addr + 1, val >> 8, 1, mach);
|
||||
} else
|
||||
svga_writew_linear(addr, val, svga);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mach32_ap_writel(uint32_t addr, uint32_t val, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
|
||||
if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) &&
|
||||
((addr >= ((mach->ap_size << 20) - 0x200)) && (addr < (mach->ap_size << 20)))) {
|
||||
@@ -4965,31 +5035,40 @@ mach32_ap_writel(uint32_t addr, uint32_t val, void *priv)
|
||||
mach_accel_outw(0x02e8 + (port_dword << 8) + 4, val >> 16, mach);
|
||||
}
|
||||
} else {
|
||||
mach_log("Linear WORDL Write=%08x.\n", addr);
|
||||
mach32_write_linear(addr, val & 0xff, svga);
|
||||
mach32_write_linear(addr + 1, val >> 8, svga);
|
||||
mach32_write_linear(addr + 2, val >> 16, svga);
|
||||
mach32_write_linear(addr + 3, val >> 24, svga);
|
||||
mach_log("Linear WORDL Write=%08x, val=%08x.\n", addr, val);
|
||||
if (dev->on[0] || dev->on[1]) {
|
||||
mach32_write_common(addr, val & 0xff, 1, mach);
|
||||
mach32_write_common(addr + 1, val >> 8, 1, mach);
|
||||
mach32_write_common(addr + 2, val >> 16, 1, mach);
|
||||
mach32_write_common(addr + 3, val >> 24, 1, mach);
|
||||
} else
|
||||
svga_writel_linear(addr, val, svga);
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
mach32_ap_readb(uint32_t addr, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint8_t temp;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
|
||||
if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) &&
|
||||
((addr >= ((mach->ap_size << 20) - 0x200)) && (addr < (mach->ap_size << 20)))) {
|
||||
if (addr & 0x100) {
|
||||
if (addr & 0x100)
|
||||
temp = mach_accel_inb(0x02ee + (addr & 1) + (port_dword << 8), mach);
|
||||
} else {
|
||||
else
|
||||
temp = mach_accel_inb(0x02e8 + (addr & 1) + (port_dword << 8), mach);
|
||||
}
|
||||
} else
|
||||
temp = mach32_read_linear(addr, svga);
|
||||
} else {
|
||||
if (dev->on[0] || dev->on[1])
|
||||
temp = mach32_read_common(addr, 1, mach);
|
||||
else
|
||||
temp = svga_read_linear(addr, svga);
|
||||
|
||||
mach_log("Linear WORDB Read=%08x, ret=%02x, fast=%d.\n", addr, temp, svga->fast);
|
||||
}
|
||||
|
||||
return temp;
|
||||
}
|
||||
@@ -4997,21 +5076,26 @@ mach32_ap_readb(uint32_t addr, void *priv)
|
||||
static uint16_t
|
||||
mach32_ap_readw(uint32_t addr, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint16_t temp;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
|
||||
if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) &&
|
||||
((addr >= ((mach->ap_size << 20) - 0x200)) && (addr < (mach->ap_size << 20)))) {
|
||||
if (addr & 0x100) {
|
||||
if (addr & 0x100)
|
||||
temp = mach_accel_inw(0x02ee + (port_dword << 8), mach);
|
||||
} else {
|
||||
else
|
||||
temp = mach_accel_inw(0x02e8 + (port_dword << 8), mach);
|
||||
}
|
||||
} else {
|
||||
temp = mach32_read_linear(addr, svga);
|
||||
temp |= (mach32_read_linear(addr + 1, svga) << 8);
|
||||
if (dev->on[0] || dev->on[1]) {
|
||||
temp = mach32_read_common(addr, 1, mach);
|
||||
temp |= (mach32_read_common(addr + 1, 1, mach) << 8);
|
||||
} else
|
||||
temp = svga_readw_linear(addr, svga);
|
||||
|
||||
mach_log("Linear WORDW Read=%08x, ret=%04x.\n", addr, temp);
|
||||
}
|
||||
|
||||
return temp;
|
||||
@@ -5020,10 +5104,11 @@ mach32_ap_readw(uint32_t addr, void *priv)
|
||||
static uint32_t
|
||||
mach32_ap_readl(uint32_t addr, void *priv)
|
||||
{
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
mach_t *mach = (mach_t *) priv;
|
||||
svga_t *svga = &mach->svga;
|
||||
const ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint32_t temp;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
uint8_t port_dword = addr & 0xfc;
|
||||
|
||||
if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) &&
|
||||
((addr >= ((mach->ap_size << 20) - 0x200)) && (addr < (mach->ap_size << 20)))) {
|
||||
@@ -5035,10 +5120,15 @@ mach32_ap_readl(uint32_t addr, void *priv)
|
||||
temp |= (mach_accel_inw(0x02e8 + (port_dword << 8) + 4, mach) << 8);
|
||||
}
|
||||
} else {
|
||||
temp = mach32_read_linear(addr, svga);
|
||||
temp |= (mach32_read_linear(addr + 1, svga) << 8);
|
||||
temp |= (mach32_read_linear(addr + 2, svga) << 16);
|
||||
temp |= (mach32_read_linear(addr + 3, svga) << 24);
|
||||
if (dev->on[0] || dev->on[1]) {
|
||||
temp = mach32_read_common(addr, 1, mach);
|
||||
temp |= (mach32_read_common(addr + 1, 1, mach) << 8);
|
||||
temp |= (mach32_read_common(addr + 2, 1, mach) << 16);
|
||||
temp |= (mach32_read_common(addr + 3, 1, mach) << 24);
|
||||
} else
|
||||
temp = svga_readl_linear(addr, svga);
|
||||
|
||||
mach_log("Linear WORDL Read=%08x, ret=%08x, ON0=%d, ON1=%d.\n", addr, temp, dev->on[0], dev->on[1]);
|
||||
}
|
||||
|
||||
return temp;
|
||||
@@ -5098,7 +5188,7 @@ mach32_updatemapping(mach_t *mach)
|
||||
mach->ap_size = 4;
|
||||
mem_mapping_disable(&mach->mmio_linear_mapping);
|
||||
}
|
||||
if ((mach->ext_on[0] || mach->ext_on[1]) && (dev->local >= 2) && (mach->ati_mode[0] || mach->ati_mode[1])) {
|
||||
if (((dev->local & 0xff) >= 0x02) && (dev->on[0] || dev->on[1]) && (mach->ext_on[0] || mach->ext_on[1]) && (dev->vendor_mode[0] || dev->vendor_mode[1])) {
|
||||
mach_log("ExtON.\n");
|
||||
mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel);
|
||||
mem_mapping_set_p(&svga->mapping, mach);
|
||||
@@ -5120,18 +5210,25 @@ mach32_hwcursor_draw(svga_t *svga, int displine)
|
||||
uint32_t color0;
|
||||
uint32_t color1;
|
||||
|
||||
if (dev->accel_bpp == 8) {
|
||||
color0 = dev->pallook[mach->cursor_col_0];
|
||||
color1 = dev->pallook[mach->cursor_col_1];
|
||||
} else if (dev->accel_bpp == 15) {
|
||||
color0 = video_15to32[((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0) & 0xffff];
|
||||
color1 = video_15to32[((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1) & 0xffff];
|
||||
} else if (dev->accel_bpp == 16) {
|
||||
color0 = video_16to32[((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0) & 0xffff];
|
||||
color1 = video_16to32[((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1) & 0xffff];
|
||||
} else {
|
||||
color0 = ((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0);
|
||||
color1 = ((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1);
|
||||
switch (dev->accel_bpp) {
|
||||
case 8:
|
||||
color0 = dev->pallook[mach->cursor_col_0];
|
||||
color1 = dev->pallook[mach->cursor_col_1];
|
||||
break;
|
||||
case 15:
|
||||
color0 = video_15to32[((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0) & 0xffff];
|
||||
color1 = video_15to32[((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1) & 0xffff];
|
||||
break;
|
||||
case 16:
|
||||
color0 = video_16to32[((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0) & 0xffff];
|
||||
color1 = video_16to32[((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1) & 0xffff];
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
default:
|
||||
color0 = ((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0);
|
||||
color1 = ((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (dev->interlace && dev->hwcursor_oddeven)
|
||||
@@ -5603,7 +5700,7 @@ mach8_init(const device_t *info)
|
||||
mach->memory = device_get_config_int("memory");
|
||||
mach->ramdac_type = mach->pci_bus ? device_get_config_int("ramdac") : 1;
|
||||
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
if (mach->pci_bus) {
|
||||
if (mach->has_bios) {
|
||||
rom_init(&mach->bios_rom,
|
||||
@@ -5639,7 +5736,7 @@ mach8_init(const device_t *info)
|
||||
0, MEM_MAPPING_EXTERNAL);
|
||||
}
|
||||
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
svga_init(info, svga, mach, mach->memory << 10, /*default: 2MB for Mach32*/
|
||||
mach_recalctimings,
|
||||
mach_in, mach_out,
|
||||
@@ -5721,7 +5818,7 @@ mach8_init(const device_t *info)
|
||||
io_sethandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach);
|
||||
mach_io_set(mach);
|
||||
|
||||
if (dev->local >= 2) {
|
||||
if ((dev->local & 0xff) >= 0x02) {
|
||||
svga->decode_mask = (4 << 20) - 1;
|
||||
mach->cursor_col_1 = 0xff;
|
||||
mach->ext_cur_col_1_r = 0xff;
|
||||
|
||||
@@ -650,6 +650,23 @@ gd54xx_is_5434(svga_t *svga)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
gd54xx_set_svga_fast(gd54xx_t *gd54xx)
|
||||
{
|
||||
svga_t *svga = &gd54xx->svga;
|
||||
|
||||
if ((svga->crtc[0x27] == CIRRUS_ID_CLGD5422) || (svga->crtc[0x27] == CIRRUS_ID_CLGD5424))
|
||||
svga->fast = ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) &&
|
||||
!svga->gdcreg[1]) &&
|
||||
((svga->chain4 && svga->packed_chain4) || svga->fb_only) &&
|
||||
!(svga->adv_flags & FLAG_ADDR_BY8);
|
||||
/* TODO: needs verification on other Cirrus chips */
|
||||
else
|
||||
svga->fast = ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) &&
|
||||
!svga->gdcreg[1]) && ((svga->chain4 && svga->packed_chain4) ||
|
||||
svga->fb_only);
|
||||
}
|
||||
|
||||
static void
|
||||
gd54xx_out(uint16_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
@@ -793,13 +810,14 @@ gd54xx_out(uint16_t addr, uint8_t val, void *priv)
|
||||
break;
|
||||
case 0x07:
|
||||
svga->packed_chain4 = svga->seqregs[7] & 1;
|
||||
svga_recalctimings(svga);
|
||||
if (gd54xx_is_5422(svga))
|
||||
gd543x_recalc_mapping(gd54xx);
|
||||
else
|
||||
svga->seqregs[svga->seqaddr] &= 0x0f;
|
||||
if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5429)
|
||||
svga->set_reset_disabled = svga->seqregs[7] & 1;
|
||||
gd54xx_set_svga_fast(gd54xx);
|
||||
svga_recalctimings(svga);
|
||||
break;
|
||||
case 0x17:
|
||||
if (gd54xx_is_5422(svga))
|
||||
@@ -919,10 +937,8 @@ gd54xx_out(uint16_t addr, uint8_t val, void *priv)
|
||||
break;
|
||||
}
|
||||
|
||||
if ((svga->crtc[0x27] == CIRRUS_ID_CLGD5422) || (svga->crtc[0x27] == CIRRUS_ID_CLGD5424))
|
||||
svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && ((svga->chain4 && svga->packed_chain4) || svga->fb_only) && !(svga->adv_flags & FLAG_ADDR_BY8); /*TODO: needs verification on other Cirrus chips*/
|
||||
else
|
||||
svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && ((svga->chain4 && svga->packed_chain4) || svga->fb_only);
|
||||
gd54xx_set_svga_fast(gd54xx);
|
||||
|
||||
if (((svga->gdcaddr == 5) && ((val ^ o) & 0x70)) || ((svga->gdcaddr == 6) && ((val ^ o) & 1)))
|
||||
svga_recalctimings(svga);
|
||||
} else {
|
||||
|
||||
@@ -219,7 +219,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv)
|
||||
dev->on[1] = dev->on[0];
|
||||
}
|
||||
|
||||
svga_log("3C3: XGA ON = %d.\n", xga->on);
|
||||
svga_log("3C3: VGA ON = %d.\n", val & 0x01);
|
||||
vga_on = val & 0x01;
|
||||
break;
|
||||
case 0x3c4:
|
||||
@@ -611,7 +611,7 @@ svga_recalctimings(svga_t *svga)
|
||||
|
||||
svga->clock = (svga->vidclock) ? VGACONST2 : VGACONST1;
|
||||
|
||||
svga->lowres = svga->attrregs[0x10] & 0x40;
|
||||
svga->lowres = !!(svga->attrregs[0x10] & 0x40);
|
||||
|
||||
svga->interlace = 0;
|
||||
|
||||
@@ -742,7 +742,7 @@ svga_recalctimings(svga_t *svga)
|
||||
}
|
||||
|
||||
if (ibm8514_active && (svga->dev8514 != NULL)) {
|
||||
if (!dev->local)
|
||||
if ((dev->local & 0xff) == 0x00)
|
||||
ibm8514_recalctimings(svga);
|
||||
}
|
||||
|
||||
|
||||
@@ -519,7 +519,6 @@ xga_ext_outb(uint16_t addr, uint8_t val, void *priv)
|
||||
xga_updatemapping(svga);
|
||||
break;
|
||||
case 4:
|
||||
xga->access_mode &= ~8;
|
||||
if ((xga->disp_cntl_2 & 7) == 4)
|
||||
xga->aperture_cntl = 0;
|
||||
break;
|
||||
@@ -926,16 +925,22 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b
|
||||
addr += (x >> 3);
|
||||
if (!skip) {
|
||||
READ(addr, byte);
|
||||
} else {
|
||||
} else
|
||||
byte = mem_readb_phys(addr);
|
||||
}
|
||||
if (xga->linear_endian_reverse) {
|
||||
|
||||
if (xga->linear_endian_reverse)
|
||||
bits = 7 - (x & 7);
|
||||
} else {
|
||||
if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8))
|
||||
bits = (x & 7);
|
||||
else {
|
||||
bits = 7 - (x & 7);
|
||||
else {
|
||||
if (xga->accel.px_map_format[xga->accel.dst_map] & 8) {
|
||||
if ((xga->accel.px_map_format[xga->accel.src_map] & 8) && (xga->accel.px_map_format[map] & 8))
|
||||
bits = (x & 7);
|
||||
else
|
||||
bits = 7 - (x & 7);
|
||||
} else {
|
||||
if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8))
|
||||
bits = (x & 7);
|
||||
else
|
||||
bits = 7 - (x & 7);
|
||||
}
|
||||
}
|
||||
px = (byte >> bits) & 1;
|
||||
@@ -966,17 +971,16 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int
|
||||
addr += (x >> 3);
|
||||
if (!skip) {
|
||||
READ(addr, byte);
|
||||
} else {
|
||||
} else
|
||||
byte = mem_readb_phys(addr);
|
||||
}
|
||||
if (xga->linear_endian_reverse) {
|
||||
|
||||
if (xga->linear_endian_reverse)
|
||||
bits = 7 - (x & 7);
|
||||
} else {
|
||||
else {
|
||||
if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8))
|
||||
bits = (x & 7);
|
||||
else {
|
||||
else
|
||||
bits = 7 - (x & 7);
|
||||
}
|
||||
}
|
||||
px = (byte >> bits) & 1;
|
||||
return px;
|
||||
@@ -985,9 +989,9 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int
|
||||
addr += (x >> 1);
|
||||
if (!skip) {
|
||||
READ(addr, byte);
|
||||
} else {
|
||||
} else
|
||||
byte = mem_readb_phys(addr);
|
||||
}
|
||||
|
||||
return byte;
|
||||
case 3: /*8-bit*/
|
||||
addr += (y * width);
|
||||
@@ -1010,9 +1014,8 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int
|
||||
} else {
|
||||
if (!skip) {
|
||||
READW(addr, byte);
|
||||
} else {
|
||||
} else
|
||||
byte = mem_readb_phys(addr) | (mem_readb_phys(addr + 1) << 8);
|
||||
}
|
||||
}
|
||||
return byte;
|
||||
|
||||
@@ -1045,9 +1048,9 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui
|
||||
addr += (x >> 3);
|
||||
if (!skip) {
|
||||
READ(addr, byte);
|
||||
} else {
|
||||
} else
|
||||
byte = mem_readb_phys(addr);
|
||||
}
|
||||
|
||||
if (xga->linear_endian_reverse) {
|
||||
mask = 1 << (7 - (x & 7));
|
||||
} else {
|
||||
@@ -1079,14 +1082,13 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui
|
||||
} else {
|
||||
byte = mem_readb_phys(addr);
|
||||
}
|
||||
if (xga->linear_endian_reverse) {
|
||||
if (xga->linear_endian_reverse)
|
||||
mask = 0x0f << ((1 - (x & 1)) << 2);
|
||||
} else {
|
||||
if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) {
|
||||
else {
|
||||
if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8))
|
||||
mask = 0x0f << ((x & 1) << 2);
|
||||
} else {
|
||||
else
|
||||
mask = 0x0f << ((1 - (x & 1)) << 2);
|
||||
}
|
||||
}
|
||||
byte = (byte & ~mask) | (pixel & mask);
|
||||
if (!skip) {
|
||||
@@ -1136,8 +1138,8 @@ xga_short_stroke(svga_t *svga, uint8_t ssv)
|
||||
uint32_t srcbase = xga->accel.px_map_base[xga->accel.src_map];
|
||||
int y = ssv & 0x0f;
|
||||
int x = 0;
|
||||
int dx;
|
||||
int dy;
|
||||
int16_t dx;
|
||||
int16_t dy;
|
||||
int dirx = 0;
|
||||
int diry = 0;
|
||||
|
||||
@@ -1269,41 +1271,29 @@ xga_line_draw_write(svga_t *svga)
|
||||
int err;
|
||||
int tmpswap;
|
||||
int steep = 1;
|
||||
int xdir;
|
||||
int ydir;
|
||||
int xdir = (xga->accel.octant & 0x04) ? -1 : 1;
|
||||
int ydir = (xga->accel.octant & 0x02) ? -1 : 1;
|
||||
int y = xga->accel.blt_width;
|
||||
int x = 0;
|
||||
int dx;
|
||||
int dy;
|
||||
int16_t dx;
|
||||
int16_t dy;
|
||||
int draw_pixel;
|
||||
|
||||
dminor = (xga->accel.bres_k1);
|
||||
dminor = xga->accel.bres_k1;
|
||||
if (xga->accel.bres_k1 & 0x2000)
|
||||
dminor |= ~0x1fff;
|
||||
dminor >>= 1;
|
||||
|
||||
destxtmp = (xga->accel.bres_k2);
|
||||
destxtmp = xga->accel.bres_k2;
|
||||
if (xga->accel.bres_k2 & 0x2000)
|
||||
destxtmp |= ~0x1fff;
|
||||
|
||||
dmajor = -(destxtmp - (dminor << 1)) >> 1;
|
||||
|
||||
err = (xga->accel.bres_err_term);
|
||||
err = xga->accel.bres_err_term;
|
||||
if (xga->accel.bres_err_term & 0x2000)
|
||||
err |= ~0x1fff;
|
||||
|
||||
if (xga->accel.octant & 0x02) {
|
||||
ydir = -1;
|
||||
} else {
|
||||
ydir = 1;
|
||||
}
|
||||
|
||||
if (xga->accel.octant & 0x04) {
|
||||
xdir = -1;
|
||||
} else {
|
||||
xdir = 1;
|
||||
}
|
||||
|
||||
dx = xga->accel.dst_map_x & 0x1fff;
|
||||
if (xga->accel.dst_map_x >= 0x1800)
|
||||
dx |= ~0x17ff;
|
||||
@@ -1492,26 +1482,14 @@ xga_bitblt(svga_t *svga)
|
||||
uint32_t srcwidth = xga->accel.px_map_width[xga->accel.src_map];
|
||||
uint32_t patheight = xga->accel.px_map_height[xga->accel.pat_src];
|
||||
uint32_t srcheight = xga->accel.px_map_height[xga->accel.src_map];
|
||||
#if 0
|
||||
uint32_t dstheight = xga->accel.px_map_height[xga->accel.dst_map];
|
||||
#endif
|
||||
uint32_t frgdcol = xga->accel.frgd_color;
|
||||
uint32_t bkgdcol = xga->accel.bkgd_color;
|
||||
int16_t dx;
|
||||
int16_t dy;
|
||||
int mix = 0;
|
||||
int xdir;
|
||||
int ydir;
|
||||
|
||||
if (xga->accel.octant & 0x02) {
|
||||
ydir = -1;
|
||||
} else {
|
||||
ydir = 1;
|
||||
}
|
||||
|
||||
if (xga->accel.octant & 0x04) {
|
||||
xdir = -1;
|
||||
} else {
|
||||
xdir = 1;
|
||||
}
|
||||
int xdir = (xga->accel.octant & 0x04) ? -1 : 1;
|
||||
int ydir = (xga->accel.octant & 0x02) ? -1 : 1;
|
||||
|
||||
xga->accel.x = xga->accel.blt_width & 0xfff;
|
||||
xga->accel.y = xga->accel.blt_height & 0xfff;
|
||||
@@ -1520,12 +1498,13 @@ xga_bitblt(svga_t *svga)
|
||||
xga->accel.sy = xga->accel.src_map_y & 0xfff;
|
||||
xga->accel.px = xga->accel.pat_map_x & 0xfff;
|
||||
xga->accel.py = xga->accel.pat_map_y & 0xfff;
|
||||
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
|
||||
dx = xga->accel.dst_map_x & 0x1fff;
|
||||
dy = xga->accel.dst_map_y & 0x1fff;
|
||||
if (xga->accel.dst_map_x >= 0x1800)
|
||||
xga->accel.dx |= ~0x17ff;
|
||||
xga->accel.dy = xga->accel.dst_map_y & 0x1fff;
|
||||
dx |= ~0x17ff;
|
||||
if (xga->accel.dst_map_y >= 0x1800)
|
||||
xga->accel.dy |= ~0x17ff;
|
||||
dy |= ~0x17ff;
|
||||
xga_log("D(%d,%d), SWH(%d,%d), BLT(%d,%d), dstwidth=%d.\n", dx, dy, xga->accel.x, xga->accel.y, srcwidth, srcheight, dstwidth);
|
||||
|
||||
xga->accel.pattern = 0;
|
||||
|
||||
@@ -1544,44 +1523,46 @@ xga_bitblt(svga_t *svga)
|
||||
xga->accel.pattern = 1;
|
||||
else {
|
||||
if ((dstwidth == (xga->h_disp - 1)) && (srcwidth == 1)) {
|
||||
if ((xga->accel.dst_map == 1) && (xga->accel.src_map == 2) && xga->linear_endian_reverse) {
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px_map_format[xga->accel.src_map] >= 0x0b)) {
|
||||
if ((xga->accel.dst_map == 1) && (xga->accel.src_map == 2)) {
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px_map_format[xga->accel.src_map] >= 0x0b))
|
||||
xga->accel.pattern = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xga_log("PAT8: PatFormat=%x, SrcFormat=%x, DstFormat=%x.\n", xga->accel.px_map_format[xga->accel.pat_src] & 8, (xga->accel.px_map_format[xga->accel.src_map]), (xga->accel.px_map_format[xga->accel.dst_map]));
|
||||
xga_log("Pattern Map = 8: CMD = %08x: SRCBase = %08x, DSTBase = %08x, from/to vram dir = %d, "
|
||||
"cmd dir = %06x\n", xga->accel.command, srcbase, dstbase, xga->from_to_vram,
|
||||
xga->accel.dir_cmd);
|
||||
xga_log("CMD = %08x: Y = %d, X = %d, patsrc = %02x, srcmap = %d, dstmap = %d, py = %d, "
|
||||
"sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d\n",
|
||||
xga->accel.command, xga->accel.y, xga->accel.x, xga->accel.pat_src, xga->accel.src_map,
|
||||
xga->accel.dst_map, xga->accel.py, xga->accel.sy, xga->accel.dy,
|
||||
xga->accel.dst_map, xga->accel.py, xga->accel.sy, dy,
|
||||
xga->accel.px_map_width[0], xga->accel.px_map_width[1],
|
||||
xga->accel.px_map_width[2], xga->accel.px_map_width[3]);
|
||||
|
||||
while (xga->accel.y >= 0) {
|
||||
if (xga->accel.command & 0xc0) {
|
||||
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
|
||||
if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(1, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(1, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
if ((dx >= 0) && (dx <= dstwidth) && (dy >= 0) && (dy <= dstheight)) {
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(1, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1589,17 +1570,19 @@ xga_bitblt(svga_t *svga)
|
||||
xga->accel.sx = ((xga->accel.sx + xdir) & srcwidth) | (xga->accel.sx & ~srcwidth);
|
||||
else
|
||||
xga->accel.sx += xdir;
|
||||
xga->accel.dx += xdir;
|
||||
|
||||
dx += xdir;
|
||||
xga->accel.x--;
|
||||
if (xga->accel.x < 0) {
|
||||
xga->accel.x = (xga->accel.blt_width & 0xfff);
|
||||
xga->accel.x = xga->accel.blt_width & 0xfff;
|
||||
|
||||
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
|
||||
dx = xga->accel.dst_map_x & 0x1fff;
|
||||
if (xga->accel.dst_map_x >= 0x1800)
|
||||
xga->accel.dx |= ~0x17ff;
|
||||
dx |= ~0x17ff;
|
||||
xga->accel.sx = xga->accel.src_map_x & 0xfff;
|
||||
|
||||
xga->accel.dy += ydir;
|
||||
dy += ydir;
|
||||
|
||||
if (xga->accel.pattern)
|
||||
xga->accel.sy = ((xga->accel.sy + ydir) & srcheight) | (xga->accel.sy & ~srcheight);
|
||||
else
|
||||
@@ -1608,8 +1591,8 @@ xga_bitblt(svga_t *svga)
|
||||
xga->accel.y--;
|
||||
|
||||
if (xga->accel.y < 0) {
|
||||
xga->accel.dst_map_x = xga->accel.dx;
|
||||
xga->accel.dst_map_y = xga->accel.dy;
|
||||
xga->accel.dst_map_x = dx;
|
||||
xga->accel.dst_map_y = dy;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1620,13 +1603,12 @@ xga_bitblt(svga_t *svga)
|
||||
else {
|
||||
if (dstwidth == (xga->h_disp - 1)) {
|
||||
if (srcwidth == (xga->h_disp - 1)) {
|
||||
if ((xga->accel.src_map == 1) && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2) && xga->linear_endian_reverse) {
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) {
|
||||
if ((xga->accel.src_map == 1) && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2)) {
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3))
|
||||
xga->accel.pattern = 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!xga->accel.src_map && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2) && xga->linear_endian_reverse) {
|
||||
if (!xga->accel.src_map && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2)) {
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) {
|
||||
if ((patwidth >= 7) && ((xga->accel.command & 0xc0) == 0x40))
|
||||
xga->accel.pattern = 0;
|
||||
@@ -1638,6 +1620,7 @@ xga_bitblt(svga_t *svga)
|
||||
}
|
||||
}
|
||||
|
||||
xga_log("PAT%d: PatFormat=%x, SrcFormat=%x, DstFormat=%x.\n", xga->accel.pat_src, xga->accel.px_map_format[xga->accel.pat_src] & 8, (xga->accel.px_map_format[xga->accel.src_map]), (xga->accel.px_map_format[xga->accel.dst_map]));
|
||||
xga_log("XGA bitblt linear endian reverse=%d, octanty=%d, src command = %08x, pxsrcmap=%x, "
|
||||
"pxdstmap=%x, srcmap=%d, patmap=%d, dstmap=%d, dstwidth=%d, dstheight=%d, srcwidth=%d, "
|
||||
"srcheight=%d, dstbase=%08x, srcbase=%08x.\n", xga->linear_endian_reverse, ydir,
|
||||
@@ -1661,7 +1644,7 @@ xga_bitblt(svga_t *svga)
|
||||
area_state ^= 1;
|
||||
|
||||
if (xga->accel.command & 0xc0) {
|
||||
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
|
||||
if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
|
||||
if (area_state)
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
else
|
||||
@@ -1670,56 +1653,58 @@ xga_bitblt(svga_t *svga)
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) <= 3)
|
||||
src_dat &= 0xff;
|
||||
|
||||
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(area_state, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_log("1SRCDat=%02x, DSTDat=%02x, Old=%02x, MIX=%d.\n", src_dat, dest_dat, old_dest_dat, area_state);
|
||||
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (area_state)
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
else
|
||||
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
|
||||
if ((dx >= 0) && (dx <= dstwidth) && (dy >= 0) && (dy <= dstheight)) {
|
||||
if (area_state)
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
else
|
||||
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
|
||||
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) <= 3)
|
||||
src_dat &= 0xff;
|
||||
if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) <= 3)
|
||||
src_dat &= 0xff;
|
||||
|
||||
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(area_state, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_log("2Fill: NumXY(%d,%d): DXY(%d,%d): SRCDat=%02x, DSTDat=%02x, Old=%02x, frgdcol=%02x, bkgdcol=%02x, MIX=%d, frgdmix=%02x, bkgdmix=%02x, dstmapfmt=%02x, srcmapfmt=%02x, srcmapnum=%d.\n", x, y, xga->accel.dx, xga->accel.dy, src_dat, dest_dat, old_dest_dat, frgdcol, bkgdcol, area_state, xga->accel.frgd_mix & 0x1f, xga->accel.bkgd_mix & 0x1f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.src_map);
|
||||
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(area_state, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_log("2Fill: NumXY(%d,%d): DXY(%d,%d): SRCDat=%02x, DSTDat=%02x, Old=%02x, frgdcol=%02x, bkgdcol=%02x, MIX=%d, frgdmix=%02x, bkgdmix=%02x, dstmapfmt=%02x, srcmapfmt=%02x, srcmapnum=%d.\n", x, y, dx, dy, src_dat, dest_dat, old_dest_dat, frgdcol, bkgdcol, area_state, xga->accel.frgd_mix & 0x1f, xga->accel.bkgd_mix & 0x1f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.src_map);
|
||||
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xga->accel.sx = ((xga->accel.sx + 1) & srcwidth) | (xga->accel.sx & ~srcwidth);
|
||||
xga->accel.px = ((xga->accel.px + 1) & patwidth) | (xga->accel.px & ~patwidth);
|
||||
xga->accel.dx++;
|
||||
dx++;
|
||||
xga->accel.x--;
|
||||
if (xga->accel.x < 0) {
|
||||
area_state = 0;
|
||||
xga->accel.y--;
|
||||
xga->accel.x = xga->accel.blt_width & 0xfff;
|
||||
|
||||
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
|
||||
dx = xga->accel.dst_map_x & 0x1fff;
|
||||
if (xga->accel.dst_map_x >= 0x1800)
|
||||
xga->accel.dx |= ~0x17ff;
|
||||
dx |= ~0x17ff;
|
||||
xga->accel.sx = xga->accel.src_map_x & 0xfff;
|
||||
xga->accel.px = xga->accel.pat_map_x & 0xfff;
|
||||
|
||||
xga->accel.sy = ((xga->accel.sy + ydir) & srcheight) | (xga->accel.sy & ~srcheight);
|
||||
xga->accel.py += ydir;
|
||||
xga->accel.dy += ydir;
|
||||
dy += ydir;
|
||||
|
||||
if (xga->accel.y < 0) {
|
||||
xga->accel.dst_map_x = xga->accel.dx;
|
||||
xga->accel.dst_map_y = xga->accel.dy;
|
||||
xga->accel.dst_map_x = dx;
|
||||
xga->accel.dst_map_y = dy;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1729,32 +1714,34 @@ xga_bitblt(svga_t *svga)
|
||||
mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1);
|
||||
|
||||
if (xga->accel.command & 0xc0) {
|
||||
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
|
||||
if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
|
||||
if (mix) {
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
} else {
|
||||
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
|
||||
}
|
||||
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(mix, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (mix) {
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
} else {
|
||||
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
|
||||
}
|
||||
dest_dat = xga_accel_read_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(mix, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_accel_write_map_pixel(svga, xga->accel.dx, xga->accel.dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
if ((dx >= 0) && (dx <= dstwidth) && (dy >= 0) && (dy <= dstheight)) {
|
||||
if (mix) {
|
||||
src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol;
|
||||
} else {
|
||||
src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol;
|
||||
}
|
||||
dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0);
|
||||
if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) {
|
||||
old_dest_dat = dest_dat;
|
||||
ROP(mix, dest_dat, src_dat);
|
||||
dest_dat = (dest_dat & plane_mask) | (old_dest_dat & ~plane_mask);
|
||||
xga_accel_write_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dest_dat, dstwidth + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1763,15 +1750,16 @@ xga_bitblt(svga_t *svga)
|
||||
xga->accel.px = ((xga->accel.px + xdir) & patwidth) | (xga->accel.px & ~patwidth);
|
||||
else
|
||||
xga->accel.px += xdir;
|
||||
xga->accel.dx += xdir;
|
||||
|
||||
dx += xdir;
|
||||
xga->accel.x--;
|
||||
if (xga->accel.x < 0) {
|
||||
xga->accel.y--;
|
||||
xga->accel.x = (xga->accel.blt_width & 0xfff);
|
||||
xga->accel.x = xga->accel.blt_width & 0xfff;
|
||||
|
||||
xga->accel.dx = xga->accel.dst_map_x & 0x1fff;
|
||||
dx = xga->accel.dst_map_x & 0x1fff;
|
||||
if (xga->accel.dst_map_x >= 0x1800)
|
||||
xga->accel.dx |= ~0x17ff;
|
||||
dx |= ~0x17ff;
|
||||
xga->accel.sx = xga->accel.src_map_x & 0xfff;
|
||||
xga->accel.px = xga->accel.pat_map_x & 0xfff;
|
||||
|
||||
@@ -1780,11 +1768,12 @@ xga_bitblt(svga_t *svga)
|
||||
xga->accel.py = ((xga->accel.py + ydir) & patheight) | (xga->accel.py & ~patheight);
|
||||
else
|
||||
xga->accel.py += ydir;
|
||||
xga->accel.dy += ydir;
|
||||
|
||||
dy += ydir;
|
||||
|
||||
if (xga->accel.y < 0) {
|
||||
xga->accel.dst_map_x = xga->accel.dx;
|
||||
xga->accel.dst_map_y = xga->accel.dy;
|
||||
xga->accel.dst_map_x = dx;
|
||||
xga->accel.dst_map_y = dy;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user