The BusLogic SCSI controllers now correctly return invalid status for invalid controller commands, fixes the Windows 95 BusLogic driver;

Applied PCem commits that fix the Sound Blaster Pro compatibility registers on the Sound Blaster 16, CMS/Game Blaster, and Trident TGUI9440.
This commit is contained in:
OBattler
2017-10-20 08:02:04 +02:00
parent 2be1c21c8a
commit fdec9fa684
4 changed files with 76 additions and 25 deletions

View File

@@ -118,6 +118,8 @@ typedef struct tgui_t
int blitter_busy;
uint64_t blitter_time;
uint64_t status_time;
volatile int write_blitter;
} tgui_t;
void tgui_recalcmapping(tgui_t *tgui);
@@ -132,7 +134,8 @@ void tgui_accel_write(uint32_t addr, uint8_t val, void *priv);
void tgui_accel_write_w(uint32_t addr, uint16_t val, void *priv);
void tgui_accel_write_l(uint32_t addr, uint32_t val, void *priv);
void tgui_accel_write_fb_b(uint32_t addr, uint8_t val, void *priv);
void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *priv);
void tgui_accel_write_fb_l(uint32_t addr, uint32_t val, void *priv);
void tgui_out(uint16_t addr, uint8_t val, void *p)
@@ -541,7 +544,7 @@ void *tgui9440_init(device_t *info)
tgui_hwcursor_draw,
NULL);
mem_mapping_add(&tgui->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, NULL, 0, &tgui->svga);
mem_mapping_add(&tgui->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l, NULL, 0, &tgui->svga);
mem_mapping_add(&tgui->accel_mapping, 0xbc000, 0x4000, tgui_accel_read, tgui_accel_read_w, tgui_accel_read_l, tgui_accel_write, tgui_accel_write_w, tgui_accel_write_l, NULL, 0, tgui);
mem_mapping_disable(&tgui->accel_mapping);
@@ -635,9 +638,6 @@ enum
svga->changedvram[((addr) & 0xfffff) >> 11] = changeframecount; \
}
void tgui_accel_write_fb_b(uint32_t addr, uint8_t val, void *priv);
void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *priv);
void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
{
svga_t *svga = &tgui->svga;
@@ -722,7 +722,9 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
if (count == -1)
{
if (svga->crtc[0x21] & 0x20)
mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l);
{
tgui->write_blitter = 1;
}
if (tgui->accel.use_src)
return;
@@ -772,7 +774,7 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
{
if (svga->crtc[0x21] & 0x20)
{
mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear);
tgui->write_blitter = 0;
}
return;
}
@@ -787,7 +789,9 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
if (count == -1)
{
if (svga->crtc[0x21] & 0x20)
mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_accel_write_fb_b, tgui_accel_write_fb_w, tgui_accel_write_fb_l);
{
tgui->write_blitter = 1;
}
if (tgui->accel.use_src)
return;
@@ -828,7 +832,7 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
{
if (svga->crtc[0x21] & 0x20)
{
mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear);
tgui->write_blitter = 0;
}
return;
}
@@ -1238,21 +1242,33 @@ void tgui_accel_write_fb_b(uint32_t addr, uint8_t val, void *p)
{
svga_t *svga = (svga_t *)p;
tgui_t *tgui = (tgui_t *)svga->p;
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_BYTE);
if (tgui->write_blitter)
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_BYTE);
else
svga_write_linear(addr, val, svga);
}
void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *p)
{
svga_t *svga = (svga_t *)p;
tgui_t *tgui = (tgui_t *)svga->p;
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_WORD);
if (tgui->write_blitter)
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_WORD);
else
svga_writew_linear(addr, val, svga);
}
void tgui_accel_write_fb_l(uint32_t addr, uint32_t val, void *p)
{
svga_t *svga = (svga_t *)p;
tgui_t *tgui = (tgui_t *)svga->p;
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_LONG);
if (tgui->write_blitter)
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_LONG);
else
svga_writel_linear(addr, val, svga);
}
void tgui_add_status_info(char *s, int max_len, void *p)