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:
@@ -962,6 +962,10 @@ buslogic_cmds(void *p)
|
|||||||
|
|
||||||
dev->DataReply = 0;
|
dev->DataReply = 0;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
dev->DataReplyLeft = 0;
|
||||||
|
dev->Status |= STAT_INVCMD;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ typedef struct cms_t
|
|||||||
int noisecount[2][2];
|
int noisecount[2][2];
|
||||||
int noisetype[2][2];
|
int noisetype[2][2];
|
||||||
|
|
||||||
|
uint8_t latched_data;
|
||||||
|
|
||||||
int16_t buffer[SOUNDBUFLEN * 2];
|
int16_t buffer[SOUNDBUFLEN * 2];
|
||||||
|
|
||||||
int pos;
|
int pos;
|
||||||
@@ -111,12 +113,16 @@ void cms_write(uint16_t addr, uint8_t val, void *p)
|
|||||||
int voice;
|
int voice;
|
||||||
int chip = (addr & 2) >> 1;
|
int chip = (addr & 2) >> 1;
|
||||||
|
|
||||||
pclog("cms_write : addr %04X val %02X\n", addr, val);
|
switch (addr & 0xf)
|
||||||
|
|
||||||
if (addr & 1)
|
|
||||||
cms->addrs[chip] = val & 31;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
case 1:
|
||||||
|
cms->addrs[0] = val & 31;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
cms->addrs[1] = val & 31;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0: case 2:
|
||||||
cms_update(cms);
|
cms_update(cms);
|
||||||
cms->regs[chip][cms->addrs[chip] & 31] = val;
|
cms->regs[chip][cms->addrs[chip] & 31] = val;
|
||||||
switch (cms->addrs[chip] & 31)
|
switch (cms->addrs[chip] & 31)
|
||||||
@@ -145,18 +151,29 @@ void cms_write(uint16_t addr, uint8_t val, void *p)
|
|||||||
cms->noisetype[chip][1] = (val >> 4) & 3;
|
cms->noisetype[chip][1] = (val >> 4) & 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case 0x6: case 0x7:
|
||||||
|
cms->latched_data = val;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t cms_read(uint16_t addr, void *p)
|
uint8_t cms_read(uint16_t addr, void *p)
|
||||||
{
|
{
|
||||||
cms_t *cms = (cms_t *)p;
|
cms_t *cms = (cms_t *)p;
|
||||||
int chip = (addr & 2) >> 1;
|
|
||||||
|
|
||||||
if (addr & 1)
|
switch (addr & 0xf)
|
||||||
return cms->addrs[chip];
|
{
|
||||||
|
case 0x1:
|
||||||
return cms->regs[chip][cms->addrs[chip] & 31];
|
return cms->addrs[0];
|
||||||
|
case 0x3:
|
||||||
|
return cms->addrs[1];
|
||||||
|
case 0x4:
|
||||||
|
return 0x7f;
|
||||||
|
case 0xa: case 0xb:
|
||||||
|
return cms->latched_data;
|
||||||
|
}
|
||||||
|
return 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *cms_init(device_t *info)
|
void *cms_init(device_t *info)
|
||||||
@@ -165,7 +182,7 @@ void *cms_init(device_t *info)
|
|||||||
memset(cms, 0, sizeof(cms_t));
|
memset(cms, 0, sizeof(cms_t));
|
||||||
|
|
||||||
pclog("cms_init\n");
|
pclog("cms_init\n");
|
||||||
io_sethandler(0x0220, 0x0004, cms_read, NULL, NULL, cms_write, NULL, NULL, cms);
|
io_sethandler(0x0220, 0x0010, cms_read, NULL, NULL, cms_write, NULL, NULL, cms);
|
||||||
sound_add_handler(cms_get_buffer, cms);
|
sound_add_handler(cms_get_buffer, cms);
|
||||||
return cms;
|
return cms;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -792,9 +792,23 @@ uint8_t sb_ct1745_mixer_read(uint16_t addr, void *p)
|
|||||||
}
|
}
|
||||||
switch (mixer->index)
|
switch (mixer->index)
|
||||||
{
|
{
|
||||||
case 0x00: case 0x04: case 0x0A: case 0x22: case 0x26: case 0x28: case 0x2E:
|
case 0x00:
|
||||||
return mixer->regs[mixer->index];
|
return mixer->regs[mixer->index];
|
||||||
|
|
||||||
|
/*SB Pro compatibility*/
|
||||||
|
case 0x04:
|
||||||
|
return ((mixer->regs[0x33] >> 4) & 0x0f) | (mixer->regs[0x32] & 0xf0);
|
||||||
|
case 0x0a:
|
||||||
|
return (mixer->regs[0x2a] - 10) / 3;
|
||||||
|
case 0x22:
|
||||||
|
return ((mixer->regs[0x31] >> 4) & 0x0f) | (mixer->regs[0x30] & 0xf0);
|
||||||
|
case 0x26:
|
||||||
|
return ((mixer->regs[0x35] >> 4) & 0x0f) | (mixer->regs[0x34] & 0xf0);
|
||||||
|
case 0x28:
|
||||||
|
return ((mixer->regs[0x37] >> 4) & 0x0f) | (mixer->regs[0x36] & 0xf0);
|
||||||
|
case 0x2e:
|
||||||
|
return ((mixer->regs[0x39] >> 4) & 0x0f) | (mixer->regs[0x38] & 0xf0);
|
||||||
|
|
||||||
case 0x48:
|
case 0x48:
|
||||||
// Undocumented. The Creative Windows Mixer calls this after calling 3C (input selector). even when writing.
|
// Undocumented. The Creative Windows Mixer calls this after calling 3C (input selector). even when writing.
|
||||||
// Also, the version I have (5.17) does not use the MIDI.L/R input selectors. it uses the volume to mute (Affecting the output, obviously)
|
// Also, the version I have (5.17) does not use the MIDI.L/R input selectors. it uses the volume to mute (Affecting the output, obviously)
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ typedef struct tgui_t
|
|||||||
int blitter_busy;
|
int blitter_busy;
|
||||||
uint64_t blitter_time;
|
uint64_t blitter_time;
|
||||||
uint64_t status_time;
|
uint64_t status_time;
|
||||||
|
|
||||||
|
volatile int write_blitter;
|
||||||
} tgui_t;
|
} tgui_t;
|
||||||
|
|
||||||
void tgui_recalcmapping(tgui_t *tgui);
|
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_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_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_accel_write_fb_l(uint32_t addr, uint32_t val, void *priv);
|
||||||
|
|
||||||
void tgui_out(uint16_t addr, uint8_t val, void *p)
|
void tgui_out(uint16_t addr, uint8_t val, void *p)
|
||||||
@@ -541,7 +544,7 @@ void *tgui9440_init(device_t *info)
|
|||||||
tgui_hwcursor_draw,
|
tgui_hwcursor_draw,
|
||||||
NULL);
|
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_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);
|
mem_mapping_disable(&tgui->accel_mapping);
|
||||||
|
|
||||||
@@ -635,9 +638,6 @@ enum
|
|||||||
svga->changedvram[((addr) & 0xfffff) >> 11] = changeframecount; \
|
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)
|
void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
||||||
{
|
{
|
||||||
svga_t *svga = &tgui->svga;
|
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 (count == -1)
|
||||||
{
|
{
|
||||||
if (svga->crtc[0x21] & 0x20)
|
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)
|
if (tgui->accel.use_src)
|
||||||
return;
|
return;
|
||||||
@@ -772,7 +774,7 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
{
|
{
|
||||||
if (svga->crtc[0x21] & 0x20)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
@@ -787,7 +789,9 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
if (count == -1)
|
if (count == -1)
|
||||||
{
|
{
|
||||||
if (svga->crtc[0x21] & 0x20)
|
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)
|
if (tgui->accel.use_src)
|
||||||
return;
|
return;
|
||||||
@@ -828,7 +832,7 @@ void tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui)
|
|||||||
{
|
{
|
||||||
if (svga->crtc[0x21] & 0x20)
|
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;
|
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;
|
svga_t *svga = (svga_t *)p;
|
||||||
tgui_t *tgui = (tgui_t *)svga->p;
|
tgui_t *tgui = (tgui_t *)svga->p;
|
||||||
|
|
||||||
|
if (tgui->write_blitter)
|
||||||
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_BYTE);
|
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)
|
void tgui_accel_write_fb_w(uint32_t addr, uint16_t val, void *p)
|
||||||
{
|
{
|
||||||
svga_t *svga = (svga_t *)p;
|
svga_t *svga = (svga_t *)p;
|
||||||
tgui_t *tgui = (tgui_t *)svga->p;
|
tgui_t *tgui = (tgui_t *)svga->p;
|
||||||
|
|
||||||
|
if (tgui->write_blitter)
|
||||||
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_WORD);
|
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)
|
void tgui_accel_write_fb_l(uint32_t addr, uint32_t val, void *p)
|
||||||
{
|
{
|
||||||
svga_t *svga = (svga_t *)p;
|
svga_t *svga = (svga_t *)p;
|
||||||
tgui_t *tgui = (tgui_t *)svga->p;
|
tgui_t *tgui = (tgui_t *)svga->p;
|
||||||
|
|
||||||
|
if (tgui->write_blitter)
|
||||||
tgui_queue(tgui, addr, val, FIFO_WRITE_FB_LONG);
|
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)
|
void tgui_add_status_info(char *s, int max_len, void *p)
|
||||||
|
|||||||
Reference in New Issue
Block a user