diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index d79b31a5d..5df57fdc8 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -962,6 +962,10 @@ buslogic_cmds(void *p) dev->DataReply = 0; break; + default: + dev->DataReplyLeft = 0; + dev->Status |= STAT_INVCMD; + break; } return 0; } diff --git a/src/sound/snd_cms.c b/src/sound/snd_cms.c index ff10b7a57..7ddf04825 100644 --- a/src/sound/snd_cms.c +++ b/src/sound/snd_cms.c @@ -27,6 +27,8 @@ typedef struct cms_t uint16_t noisefreq[2][2]; int noisecount[2][2]; int noisetype[2][2]; + + uint8_t latched_data; int16_t buffer[SOUNDBUFLEN * 2]; @@ -111,12 +113,16 @@ void cms_write(uint16_t addr, uint8_t val, void *p) int voice; int chip = (addr & 2) >> 1; - pclog("cms_write : addr %04X val %02X\n", addr, val); - - if (addr & 1) - cms->addrs[chip] = val & 31; - else + switch (addr & 0xf) { + case 1: + cms->addrs[0] = val & 31; + break; + case 3: + cms->addrs[1] = val & 31; + break; + + case 0: case 2: cms_update(cms); cms->regs[chip][cms->addrs[chip] & 31] = val; 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; break; } + break; + case 0x6: case 0x7: + cms->latched_data = val; + break; } } uint8_t cms_read(uint16_t addr, void *p) { cms_t *cms = (cms_t *)p; - int chip = (addr & 2) >> 1; - - if (addr & 1) - return cms->addrs[chip]; - - return cms->regs[chip][cms->addrs[chip] & 31]; + + switch (addr & 0xf) + { + case 0x1: + 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) @@ -165,7 +182,7 @@ void *cms_init(device_t *info) memset(cms, 0, sizeof(cms_t)); 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); return cms; } diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index f1f8c6536..d7d4ad5fe 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -792,8 +792,22 @@ uint8_t sb_ct1745_mixer_read(uint16_t addr, void *p) } switch (mixer->index) { - case 0x00: case 0x04: case 0x0A: case 0x22: case 0x26: case 0x28: case 0x2E: + case 0x00: 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: // Undocumented. The Creative Windows Mixer calls this after calling 3C (input selector). even when writing. diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index e540423b3..c88d32eb5 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -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)