From c0bb63bd8232e543574ee2244b71d79205899b7e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 Mar 2018 21:46:38 +0100 Subject: [PATCH] Fixed minor bugs in the NCR 53C810 and Adaptec/Buslogic SCSI emulations; FDC reads and writes now use up ISA cycles; Fixed Mach64 mono-source blits, fixes NT 3.1 and 3.5 drivers; Incresed maximum emulated CD-ROM speed to 72x; Fixed a minor bug in the Cirrus Logic CL-GD 54xx emulation. --- src/floppy/fdc.c | 8 +++++++- src/scsi/scsi_ncr53c810.c | 4 +--- src/scsi/scsi_x54x.c | 3 ++- src/video/vid_ati_mach64.c | 33 +++++++++++++++++++++++++-------- src/video/vid_cl54xx.c | 4 ++-- src/win/win_settings.c | 4 ++-- 6 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 45648c706..04b9c118b 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -9,7 +9,7 @@ * Implementation of the NEC uPD-765 and compatible floppy disk * controller. * - * Version: @(#)fdc->c 1.0.17 2018/03/02 + * Version: @(#)fdc->c 1.0.18 2018/03/08 * * Authors: Sarah Walker, * Miran Grca, @@ -689,6 +689,8 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) fdc_log("Write FDC %04X %02X\n", addr, val); + cycles -= ISA_CYCLES(8); + switch (addr&7) { case 0: return; @@ -1145,7 +1147,11 @@ fdc_read(uint16_t addr, void *priv) { fdc_t *fdc = (fdc_t *) priv; uint8_t ret; + int drive; + + cycles -= ISA_CYCLES(8); + switch (addr&7) { case 0: /* STA */ ret = 0xff; diff --git a/src/scsi/scsi_ncr53c810.c b/src/scsi/scsi_ncr53c810.c index b7b7b2b32..339e72da0 100644 --- a/src/scsi/scsi_ncr53c810.c +++ b/src/scsi/scsi_ncr53c810.c @@ -10,7 +10,7 @@ * NCR and later Symbios and LSI. This controller was designed * for the PCI bus. * - * Version: @(#)scsi_ncr53c810.c 1.0.7 2018/03/07 + * Version: @(#)scsi_ncr53c810.c 1.0.8 2018/03/09 * * Authors: Paul Brook (QEMU) * Artyom Tarasenko (QEMU) @@ -1297,8 +1297,6 @@ again: ncr53c810_log("NCR 810: SCRIPTS: Waiting\n"); } - return; - ncr53c810_log("SCRIPTS execution stopped\n"); } diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index a234e6c3f..9ed018692 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -11,7 +11,7 @@ * series of SCSI Host Adapters made by Mylex. * These controllers were designed for various buses. * - * Version: @(#)scsi_x54x.c 1.0.18 2018/03/07 + * Version: @(#)scsi_x54x.c 1.0.19 2018/03/09 * * Authors: TheCollector1995, * Miran Grca, @@ -1065,6 +1065,7 @@ x54x_req_setup(x54x_t *dev, uint32_t CCBPointer, Mailbox32_t *Mailbox32) /* Fetch data from the Command Control Block. */ DMAPageRead(CCBPointer, (uint8_t *)&req->CmdBlock, sizeof(CCB32)); + x54x_add_to_period(sizeof(CCB32)); req->Is24bit = dev->Mbx24bit; req->CCBPointer = CCBPointer; diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 9c431a7fd..fe349f185 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -8,7 +8,7 @@ * * ATi Mach64 graphics card emulation. * - * Version: @(#)vid_ati_mach64.c 1.0.13 2018/03/02 + * Version: @(#)vid_ati_mach64.c 1.0.14 2018/03/10 * * Authors: Sarah Walker, * Miran Grca, @@ -959,6 +959,13 @@ void mach64_start_fill(mach64_t *mach64) mach64->accel.dst_width = (mach64->dst_height_width >> 16) & 0x1fff; mach64->accel.dst_height = mach64->dst_height_width & 0x1fff; + + if (((mach64->dp_src >> 16) & 7) == MONO_SRC_BLITSRC) + { + if (mach64->accel.dst_width & 7) + mach64->accel.dst_width = (mach64->accel.dst_width & ~7) + 8; + } + mach64->accel.x_count = mach64->accel.dst_width; mach64->accel.src_x = 0; @@ -1140,8 +1147,11 @@ void mach64_start_line(mach64_t *mach64) #define READ(addr, dat, width) if (width == 0) dat = svga->vram[((addr)) & mach64->vram_mask]; \ else if (width == 1) dat = *(uint16_t *)&svga->vram[((addr) << 1) & mach64->vram_mask]; \ else if (width == 2) dat = *(uint32_t *)&svga->vram[((addr) << 2) & mach64->vram_mask]; \ - else dat = (svga->vram[((addr) >> 3) & mach64->vram_mask] >> ((addr) & 7)) & 1; - + else if (mach64->dp_pix_width & DP_BYTE_PIX_ORDER) dat = (svga->vram[((addr) >> 3) & mach64->vram_mask] >> ((addr) & 7)) & 1; \ + else dat = (svga->vram[((addr) >> 3) & mach64->vram_mask] >> (7 - ((addr) & 7))) & 1; + +#define READ1BPP(addr, dat, width) + #define MIX switch (mix ? mach64->accel.mix_fg : mach64->accel.mix_bg) \ { \ case 0x0: dest_dat = ~dest_dat; break; \ @@ -1161,7 +1171,7 @@ void mach64_start_line(mach64_t *mach64) case 0xe: dest_dat = ~src_dat & dest_dat; break; \ case 0xf: dest_dat = ~(src_dat | dest_dat); break; \ } - + #define WRITE(addr, width) if (width == 0) \ { \ svga->vram[(addr) & mach64->vram_mask] = dest_dat; \ @@ -1179,10 +1189,17 @@ void mach64_start_line(mach64_t *mach64) } \ else \ { \ - if (dest_dat & 1) \ - svga->vram[((addr) >> 3) & mach64->vram_mask] |= 1 << ((addr) & 7); \ - else \ - svga->vram[((addr) >> 3) & mach64->vram_mask] &= ~(1 << ((addr) & 7)); \ + if (dest_dat & 1) { \ + if (mach64->dp_pix_width & DP_BYTE_PIX_ORDER) \ + svga->vram[((addr) >> 3) & mach64->vram_mask] |= 1 << ((addr) & 7); \ + else \ + svga->vram[((addr) >> 3) & mach64->vram_mask] |= 1 << (7 - ((addr) & 7)); \ + } else { \ + if (mach64->dp_pix_width & DP_BYTE_PIX_ORDER) \ + svga->vram[((addr) >> 3) & mach64->vram_mask] &= ~(1 << ((addr) & 7)); \ + else \ + svga->vram[((addr) >> 3) & mach64->vram_mask] &= ~(1 << (7 - ((addr) & 7)));\ + } \ svga->changedvram[(((addr) >> 3) & mach64->vram_mask) >> 12] = changeframecount; \ } diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 7d355c197..d53a8404f 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -9,7 +9,7 @@ * Emulation of select Cirrus Logic cards (CL-GD 5428, * CL-GD 5429, 5430, 5434 and 5436 are supported). * - * Version: @(#)vid_cl_54xx.c 1.0.10 2018/03/02 + * Version: @(#)vid_cl_54xx.c 1.0.11 2018/03/08 * * Authors: Sarah Walker, * Barry Rodewald, @@ -2074,7 +2074,7 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga) switch (gd54xx->blt.rop) { case 0x00: dst = 0; break; case 0x05: dst = src & dst; break; - case 0x06: dst = dst; break; + case 0x06: /* dst = dst; */ break; case 0x09: dst = src & ~dst; break; case 0x0b: dst = ~ dst; break; case 0x0d: dst = src; break; diff --git a/src/win/win_settings.c b/src/win/win_settings.c index d06183d72..27359b286 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -8,7 +8,7 @@ * * Windows 86Box Settings dialog handler. * - * Version: @(#)win_settings.c 1.0.42 2018/03/07 + * Version: @(#)win_settings.c 1.0.43 2018/03/10 * * Author: Miran Grca, * @@ -4409,7 +4409,7 @@ static void cdrom_add_locations(HWND hdlg) } h = GetDlgItem(hdlg, IDC_COMBO_CD_SPEED); - for (i = 1; i <= 56; i++) + for (i = 1; i <= 72; i++) { wsprintf(lptsTemp, L"%ix", i); SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);