mirror of
https://github.com/86Box/86Box.git
synced 2025-01-22 17:22:25 -05:00
More ATI accel fixes and undocumented stuff.
1. Apparently some stuff uses read-only port 0x86ee and expects it to return 0 while port 0xf6ee is an alias to 0x82e8, this should fix hangs in Majong 8514 using ATI's DOS drivers. 2. 8514 data available bits are reset properly when new parameters for a new command are installed (port 0xCEEE), fixes remaining hangs with some stuff.
This commit is contained in:
parent
46d01e30da
commit
d9dfa8d8d5
1 changed files with 28 additions and 19 deletions
|
@ -135,8 +135,9 @@ typedef struct mach_t {
|
|||
uint16_t scratch1;
|
||||
uint16_t test;
|
||||
uint16_t pattern;
|
||||
uint8_t test2[2];
|
||||
uint8_t test3[2];
|
||||
uint16_t test2;
|
||||
uint16_t test3;
|
||||
uint16_t test4;
|
||||
int src_y_dir;
|
||||
int cmd_type;
|
||||
int block_write_mono_pattern_enable;
|
||||
|
@ -1361,7 +1362,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
|
|||
return;
|
||||
}
|
||||
if (dev->accel.sy >= mach->accel.height) {
|
||||
if ((mono_src == 2) || (mono_src == 3) || (frgd_sel == 2) || (frgd_sel == 3) || (bkgd_sel == 2) || (bkgd_sel == 3))
|
||||
if ((mono_src == 2) || (mono_src == 3) || (frgd_sel == 3) || (bkgd_sel == 3))
|
||||
return;
|
||||
if ((mono_src == 1) && (frgd_sel == 5) && (dev->accel_bpp == 24) && (mach->accel.patt_len_reg & 0x4000))
|
||||
return;
|
||||
|
@ -2623,7 +2624,7 @@ mach_recalctimings(svga_t *svga)
|
|||
|
||||
if (dev->accel.advfunc_cntl & 4) {
|
||||
if (mach->shadow_set & 2) {
|
||||
if (dev->h_disp == 8) {
|
||||
if ((dev->h_disp == 8) && !dev->bpp) {
|
||||
dev->h_disp = 1024;
|
||||
dev->dispend = 768;
|
||||
dev->v_total = 1536;
|
||||
|
@ -2634,7 +2635,7 @@ mach_recalctimings(svga_t *svga)
|
|||
} else
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen);
|
||||
} else {
|
||||
if (dev->h_disp == 1024) {
|
||||
if ((dev->h_disp == 1024) && !dev->bpp) {
|
||||
dev->h_disp = 640;
|
||||
dev->dispend = 480;
|
||||
}
|
||||
|
@ -2819,9 +2820,12 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
|
|||
int bkgd_sel;
|
||||
int mono_src;
|
||||
|
||||
mach_log("[%04X:%08X]: Port FIFO OUT=%04x, val=%04x, len=%d.\n", CS, cpu_state.pc, port, val, len);
|
||||
|
||||
switch (port) {
|
||||
case 0x82e8:
|
||||
case 0xc2e8:
|
||||
case 0xf6ee:
|
||||
if (len == 1) {
|
||||
dev->accel.cur_y = (dev->accel.cur_y & 0x700) | val;
|
||||
} else {
|
||||
|
@ -2830,6 +2834,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
|
|||
break;
|
||||
case 0x82e9:
|
||||
case 0xc2e9:
|
||||
case 0xf6ef:
|
||||
if (len == 1) {
|
||||
dev->accel.cur_y = (dev->accel.cur_y & 0xff) | ((val & 0x07) << 8);
|
||||
}
|
||||
|
@ -3497,6 +3502,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
|
|||
if (len == 1)
|
||||
mach->accel.dp_config = (mach->accel.dp_config & 0xff00) | val;
|
||||
else {
|
||||
dev->data_available = 0;
|
||||
dev->data_available2 = 0;
|
||||
mach->accel.dp_config = val;
|
||||
}
|
||||
break;
|
||||
|
@ -3631,7 +3638,7 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
|||
svga_t *svga = &mach->svga;
|
||||
ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
|
||||
mach_log("Port accel out = %04x, val = %04x.\n", port, val);
|
||||
mach_log("[%04X:%08X]: Port NORMAL OUT=%04x, val=%04x.\n", CS, cpu_state.pc, port, val);
|
||||
|
||||
switch (port) {
|
||||
case 0x2e8:
|
||||
|
@ -3830,12 +3837,12 @@ mach_accel_out(uint16_t port, uint8_t val, mach_t *mach)
|
|||
|
||||
case 0x42ee:
|
||||
case 0x42ef:
|
||||
mach->accel.test2[port & 1] = val;
|
||||
WRITE8(port, mach->accel.test2, val);
|
||||
break;
|
||||
|
||||
case 0x46ee:
|
||||
case 0x46ef:
|
||||
mach->accel.test3[port & 1] = val;
|
||||
WRITE8(port, mach->accel.test3, val);
|
||||
break;
|
||||
|
||||
case 0x4aee:
|
||||
|
@ -4183,6 +4190,11 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
|
|||
temp = mach->accel.patt_data_idx;
|
||||
break;
|
||||
|
||||
case 0x86ee:
|
||||
case 0x86ef:
|
||||
temp = 0x0000;
|
||||
break;
|
||||
|
||||
case 0x8eee:
|
||||
if (len == 1)
|
||||
temp = mach->accel.ext_ge_config & 0xff;
|
||||
|
@ -4352,7 +4364,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
|
|||
break;
|
||||
}
|
||||
|
||||
mach_log("Port FIFO IN=%04x, temp=%04x, len=%d.\n", port, temp, len);
|
||||
mach_log("[%04X:%08X]: Port FIFO IN=%04x, temp=%04x, len=%d.\n", CS, cpu_state.pc, port, temp, len);
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
@ -4362,8 +4374,8 @@ mach_accel_in(uint16_t port, mach_t *mach)
|
|||
svga_t *svga = &mach->svga;
|
||||
ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
|
||||
uint8_t temp = 0;
|
||||
int vpos = 0;
|
||||
int vblankend = svga->vblankstart + svga->crtc[0x16];
|
||||
uint16_t vpos = 0;
|
||||
uint16_t vblankend = svga->vblankstart + svga->crtc[0x16];
|
||||
|
||||
switch (port) {
|
||||
case 0x2e8:
|
||||
|
@ -4469,17 +4481,13 @@ mach_accel_in(uint16_t port, mach_t *mach)
|
|||
break;
|
||||
|
||||
case 0x42ee:
|
||||
temp = mach->accel.test2[0];
|
||||
break;
|
||||
case 0x42ef:
|
||||
temp = mach->accel.test2[1];
|
||||
READ8(port, mach->accel.test2);
|
||||
break;
|
||||
|
||||
case 0x46ee:
|
||||
temp = mach->accel.test3[0];
|
||||
break;
|
||||
case 0x46ef:
|
||||
temp = mach->accel.test3[1];
|
||||
READ8(port, mach->accel.test3);
|
||||
break;
|
||||
|
||||
case 0x4aee:
|
||||
|
@ -4547,7 +4555,7 @@ mach_accel_in(uint16_t port, mach_t *mach)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
mach_log("Port accel in = %04x, temp = %04x.\n", port, temp);
|
||||
mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
@ -5478,6 +5486,7 @@ mach_io_set(mach_t *mach)
|
|||
io_sethandler(0x7aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0x7eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0x82ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0x86ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0x8eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0x92ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0x96ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
|
@ -5502,6 +5511,7 @@ mach_io_set(mach_t *mach)
|
|||
io_sethandler(0xe6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0xeeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0xf2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0xf6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0xfaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
io_sethandler(0xfeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
|
||||
}
|
||||
|
@ -5781,7 +5791,6 @@ mach8_init(const device_t *info)
|
|||
else
|
||||
mach->config1 |= 0x06;
|
||||
mach->config1 |= 0x0400;
|
||||
mach->config1 |= 0x1000;
|
||||
svga->clock_gen = device_add(&ati18811_1_device);
|
||||
} else if (mach->pci_bus) {
|
||||
video_inform(VIDEO_FLAG_TYPE_8514, &timing_mach32_pci);
|
||||
|
|
Loading…
Reference in a new issue