]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2500b28
authorToni Wilen <twilen@winuae.net>
Thu, 29 Nov 2012 19:13:30 +0000 (21:13 +0200)
committerToni Wilen <twilen@winuae.net>
Thu, 29 Nov 2012 19:13:30 +0000 (21:13 +0200)
blkdev.cpp
od-win32/ahidsound_dsonly.cpp
od-win32/screenshot.cpp
od-win32/win32.h
od-win32/winuaechangelog.txt

index 9ceccee03d3769f6329679e793944bb30537c46c..ff298a3f8f72990e8c2c03a6675caa542ee4019c 100644 (file)
@@ -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;
 }
 
index 02eca16f5334ef59c6ba61487eb0bd34a3d99dfb..5e28a280c77a1dd4d9250ee867c85bdaa93e3332 100644 (file)
@@ -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;
index 6c02511bef71fb978c96857f06e5081d83b720a3..94378c4c04ff9510f8699b904dc628d1b92808d6 100644 (file)
@@ -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
index 4d4e264ea4a659e37168c831a58e850624c6162a..a8d106328fcb4ea85452941e1e46d31817c39083 100644 (file)
@@ -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("")
 
index a98ae691a1e3d1e4e0708bb3735d125da31bb591..d0b7c7a2628da8d6350de483c2824c0ab87790c0 100644 (file)
@@ -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.