From 83703f5eb19b440791fd8f56c7f3a783e92245e2 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 29 Nov 2012 21:13:30 +0200 Subject: [PATCH] 2500b28 --- blkdev.cpp | 168 +++++++++++++++++++++------------- od-win32/ahidsound_dsonly.cpp | 14 ++- od-win32/screenshot.cpp | 2 +- od-win32/win32.h | 6 +- od-win32/winuaechangelog.txt | 8 +- 5 files changed, 125 insertions(+), 73 deletions(-) diff --git a/blkdev.cpp b/blkdev.cpp index 9ceccee0..ff298a3f 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -1199,8 +1199,9 @@ static int scsi_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, case 0x15: // MODE SELECT(6) { uae_u8 *p; + bool mode10 = cmdbuf[0] == 0x55; p = scsi_data + 4; - if (cmdbuf[0] == 0x55) + if (mode10) p += 4; int pcode = p[0] & 0x3f; if (pcode == 14) { // CD audio control @@ -1209,6 +1210,8 @@ static int scsi_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, sys_command_cd_volume (unitnum, vol_left, vol_right); scsi_len = 0; } else { + if (log_scsiemu) + write_log (_T("MODE SELECT PC=%d not supported\n"), pcode); goto errreq; } } @@ -1217,6 +1220,9 @@ static int scsi_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, case 0x1a: /* MODE SENSE(6) */ { uae_u8 *p; + bool pcodeloop = false; + bool sense10 = cmdbuf[0] == 0x5a; + int psize, totalsize, bdsize; int pc = cmdbuf[2] >> 6; int pcode = cmdbuf[2] & 0x3f; int dbd = cmdbuf[1] & 8; @@ -1225,9 +1231,8 @@ static int scsi_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (log_scsiemu) write_log (_T("MODE SENSE PC=%d CODE=%d DBD=%d\n"), pc, pcode, dbd); p = r; - if (cmdbuf[0] == 0x5a) { - p[0] = 8 - 1; - p[1] = 0; + if (sense10) { + totalsize = 8 - 2; p[2] = 0; p[3] = 0; p[4] = 0; @@ -1236,70 +1241,101 @@ static int scsi_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, p[7] = 0; p += 8; } else { - p[0] = 4 - 1; + totalsize = 4 - 1; p[1] = 0; p[2] = 0; p[3] = 0; p += 4; } + bdsize = 0; if (!dbd) { if (nodisk (&di)) goto nodisk; uae_u32 blocks = di.sectorspertrack * di.cylinders * di.trackspercylinder; - p[-1] = 8; + bdsize = 8; wl(p + 0, blocks); wl(p + 4, di.bytespersector); p += 8; } - if (pcode == 0) { - p[0] = 0; - p[1] = 0; - p[2] = 0x20; - p[3] = 0; - r[0] += 4; - } else if (pcode == 3) { - if (nodisk (&di)) - goto nodisk; - p[0] = 3; - p[1] = 24; - p[3] = 1; - p[10] = di.trackspercylinder >> 8; - p[11] = di.trackspercylinder; - p[12] = di.bytespersector >> 8; - p[13] = di.bytespersector; - p[15] = 1; // interleave - p[20] = 0x80; - r[0] += p[1]; - } else if (pcode == 4) { - if (nodisk (&di)) - goto nodisk; - p[0] = 4; - wl(p + 1, di.cylinders); - p[1] = 24; - p[5] = 1; - wl(p + 13, di.cylinders); - ww(p + 20, 0); - r[0] += p[1]; - } else if (pcode == 14) { // CD audio control - uae_u32 vol = sys_command_cd_volume (unitnum, 0xffff, 0xffff); - p[0] = 0x0e; - p[1] = 0x0e; - p[2] = 1; - p[3] = 4; - p[6] = 0; - p[7] = 75; - p[8] = 1; - p[9] = pc == 0 ? (vol >> 7) & 0xff : 0xff; - p[10] = 2; - p[11] = pc == 0 ? (vol >> (16 + 7)) & 0xff : 0xff; - r[0] += p[1]; + if (pcode == 0x3f) { + pcode = 1; // page = 0 must be last + pcodeloop = true; + } + for (;;) { + psize = 0; + if (pcode == 0) { + p[0] = 0; + p[1] = 0; + p[2] = 0x20; + p[3] = 0; + psize = 4; + } else if (pcode == 3) { + if (nodisk (&di)) + goto nodisk; + p[0] = 3; + p[1] = 24; + p[3] = 1; + p[10] = di.trackspercylinder >> 8; + p[11] = di.trackspercylinder; + p[12] = di.bytespersector >> 8; + p[13] = di.bytespersector; + p[15] = 1; // interleave + p[20] = 0x80; + psize = p[1]; + } else if (pcode == 4) { + if (nodisk (&di)) + goto nodisk; + p[0] = 4; + wl(p + 1, di.cylinders); + p[1] = 24; + p[5] = 1; + wl(p + 13, di.cylinders); + ww(p + 20, 0); + psize = p[1]; + } else if (pcode == 14) { // CD audio control + uae_u32 vol = sys_command_cd_volume (unitnum, 0xffff, 0xffff); + p[0] = 0x0e; + p[1] = 0x0e; + p[2] = 1; + p[3] = 4; + p[6] = 0; + p[7] = 75; + p[8] = 1; + p[9] = pc == 0 ? (vol >> 7) & 0xff : 0xff; + p[10] = 2; + p[11] = pc == 0 ? (vol >> (16 + 7)) & 0xff : 0xff; + psize = p[1]; + } else { + if (!pcodeloop) + goto err; + } + totalsize += psize; + p += psize; + if (!pcodeloop) + break; + if (pcode == 0) + break; + pcode++; + if (pcode == 0x3f) + pcode = 0; + } + if (sense10) { + totalsize += bdsize; + r[6] = bdsize >> 8; + r[7] = bdsize & 0xff; + r[0] = totalsize >> 8; + r[1] = totalsize & 0xff; } else { - goto err; + totalsize += bdsize; + r[3] = bdsize & 0xff; + r[0] = totalsize & 0xff; } - r[0] += r[3]; - scsi_len = lr = r[0] + 1; + scsi_len = lr = totalsize + 1; } break; + case 0x01: /* REZERO UNIT */ + scsi_len = 0; + break; case 0x1d: /* SEND DIAGNOSTICS */ scsi_len = 0; break; @@ -1665,28 +1701,28 @@ readprot: s[0] = 0x70; s[2] = 7; /* DATA PROTECT */ s[12] = 0x27; /* WRITE PROTECTED */ - ls = 12; + ls = 0x12; break; nodisk: status = 2; /* CHECK CONDITION */ s[0] = 0x70; s[2] = 2; /* NOT READY */ s[12] = 0x3A; /* MEDIUM NOT PRESENT */ - ls = 12; + ls = 0x12; break; readerr: status = 2; /* CHECK CONDITION */ s[0] = 0x70; s[2] = 2; /* NOT READY */ s[12] = 0x11; /* UNRECOVERED READ ERROR */ - ls = 12; + ls = 0x12; break; notdatatrack: status = 2; s[0] = 0x70; s[2] = 5; s[12] = 0x64; /* ILLEGAL MODE FOR THIS TRACK */ - ls = 12; + ls = 0x12; break; default: @@ -1698,13 +1734,17 @@ errreq: s[0] = 0x70; s[2] = 5; /* ILLEGAL REQUEST */ s[12] = 0x24; /* ILLEGAL FIELD IN CDB */ - ls = 12; + ls = 0x12; break; } end: *data_len = scsi_len; *reply_len = lr; *sense_len = ls; + if (ls) { + //s[0] |= 0x80; + s[7] = ls - 7; // additional sense length + } if (cmdbuf[0] && log_scsiemu) write_log (_T("-> DATAOUT=%d ST=%d SENSELEN=%d\n"), scsi_len, status, ls); return status; @@ -1712,7 +1752,6 @@ end: static int execscsicmd_direct (int unitnum, struct amigascsi *as) { - int sactual = 0; int io_error = 0; uae_u8 *scsi_datap, *scsi_datap_org; uae_u32 scsi_cmd_len_orig = as->cmd_len; @@ -1732,7 +1771,7 @@ static int execscsicmd_direct (int unitnum, struct amigascsi *as) as->cmdactual = as->status != 0 ? 0 : as->cmd_len; /* fake scsi_CmdActual */ if (as->status) { io_error = IOERR_BadStatus; - as->sense_len = senselen; + as->sactual = senselen; as->actual = 0; /* scsi_Actual */ } else { int i; @@ -1743,7 +1782,6 @@ static int execscsicmd_direct (int unitnum, struct amigascsi *as) } for (i = 0; i < as->sense_len; i++) as->sensedata[i] = 0; - sactual = 0; if (datalen < 0) { io_error = IOERR_NotSpecified; as->actual = 0; /* scsi_Actual */ @@ -1753,7 +1791,6 @@ static int execscsicmd_direct (int unitnum, struct amigascsi *as) as->actual = as->len; /* scsi_Actual */ } } - as->sactual = sactual; return io_error; } @@ -1775,7 +1812,7 @@ int sys_command_scsi_direct_native (int unitnum, struct amigascsi *as) int sys_command_scsi_direct (int unitnum, uaecptr acmd) { int ret, i; - struct amigascsi as; + struct amigascsi as = { 0 }; uaecptr ap; addrbank *bank; @@ -1805,10 +1842,11 @@ int sys_command_scsi_direct (int unitnum, uaecptr acmd) put_byte (acmd + 21, as.status); put_word (acmd + 28, as.sactual); - ap = get_long (acmd + 22); - for (i = 0; i < as.sactual; i++) - put_byte (ap, as.sensedata[i]); - + if (as.flags & (2 | 4)) { // autosense + ap = get_long (acmd + 22); + for (i = 0; i < as.sactual && i < as.sense_len; i++) + put_byte (ap + i, as.sensedata[i]); + } return ret; } diff --git a/od-win32/ahidsound_dsonly.cpp b/od-win32/ahidsound_dsonly.cpp index 02eca16f..5e28a280 100644 --- a/od-win32/ahidsound_dsonly.cpp +++ b/od-win32/ahidsound_dsonly.cpp @@ -48,7 +48,6 @@ static uae_u8 soundneutral; static LPSTR lpData,sndptrout; extern uae_u32 chipmem_mask; -unsigned int *sndbufrecpt; static uae_u8 *ahisndbuffer, *sndrecbuffer; static int ahisndbufsize, *ahisndbufpt, ahitweak;; int ahi_pollrate = 40; @@ -527,10 +526,19 @@ uae_u32 REGPARAM2 ahi_demux (TrapContext *context) else cap_pos = 0; addr = m68k_areg (regs, 0); - sndbufrecpt = (unsigned int*)pos1; + uae_u16 *sndbufrecpt = (uae_u16*)pos1; t /= 4; for (i = 0; i < t; i++) { - put_long (addr, *sndbufrecpt++); + uae_u32 s1, s2; + if (currprefs.sound_stereo_swap_ahi) { + s1 = sndbufrecpt[1]; + s2 = sndbufrecpt[0]; + } else { + s1 = sndbufrecpt[0]; + s2 = sndbufrecpt[1]; + } + sndbufrecpt += 2; + put_long (addr, (s1 << 16) | s2); addr += 4; } t *= 4; diff --git a/od-win32/screenshot.cpp b/od-win32/screenshot.cpp index 6c02511b..94378c4c 100644 --- a/od-win32/screenshot.cpp +++ b/od-win32/screenshot.cpp @@ -348,7 +348,7 @@ static int savebmp (FILE *fp) if (fwrite (bi->bmiColors, 1, bi->bmiHeader.biClrUsed * sizeof RGBQUAD, fp) < bi->bmiHeader.biClrUsed * sizeof RGBQUAD) return 0; // failed to write bitmap file header } - if (fwrite (&bi, 1, sizeof (BITMAPINFOHEADER), fp) < sizeof (BITMAPINFOHEADER)) + if (fwrite (bi, 1, sizeof (BITMAPINFOHEADER), fp) < sizeof (BITMAPINFOHEADER)) return 0; // failed to write bitmap infomation header if (fwrite (lpvBits, 1, bi->bmiHeader.biSizeImage, fp) < bi->bmiHeader.biSizeImage) return 0; // failed to write the bitmap diff --git a/od-win32/win32.h b/od-win32/win32.h index 4d4e264e..a8d10632 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -19,9 +19,9 @@ #define LANG_DLL 1 //#define WINUAEBETA _T("") -#define WINUAEBETA _T("27") -#define WINUAEDATE MAKEBD(2012, 11, 24) -#define WINUAEEXTRA _T(" RC3") +#define WINUAEBETA _T("28") +#define WINUAEDATE MAKEBD(2012, 11, 29) +#define WINUAEEXTRA _T(" RC4") //#define WINUAEEXTRA _T("AmiKit Preview") #define WINUAEREV _T("") diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index a98ae691..d0b7c7a2 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,9 +1,15 @@ - restore only single input target to default. +Beta 28 RC4: + +- uaescsi.device SCSI sense data is now returned correctly (For example MakeCD shows error messages that make sense now) +- AHI channel swap also swaps AHI recording channels. +- BMP screenshots were corrupted. + Beta 27 RC3: -- Modulated volume value wasn't range checked, caused noise if volume word was not between 0 to 63. (Platou title music) +- Modulated volume value wasn't range checked, caused noise if volume word was not between 0 to 64. (Platou title music) - Fixed SPTI mode CDFS crash. - CDFS didn't correctly remove hidden trailing ;1's in some Joliet CD filenames. - SPTI standard CD access: Use READ (10), not READ CD when requesting standard 2048 byte user sectors, not all BD/DVD drives support READ CD when reading DVDs. -- 2.47.3