]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2600b6
authorToni Wilen <twilen@winuae.net>
Sun, 3 Feb 2013 13:50:51 +0000 (15:50 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 3 Feb 2013 13:50:51 +0000 (15:50 +0200)
28 files changed:
a2091.cpp
blkdev.cpp
cfgfile.cpp
cpummu.cpp
cpummu30.cpp
fpp.cpp
gayle.cpp
include/mmu_common.h
include/options.h
od-win32/build68k_msvc/build68k_msvc.vcxproj
od-win32/direct3d.cpp
od-win32/genblitter_msvc/genblitter_msvc.vcxproj
od-win32/gencomp_msvc/gencomp_msvc.vcxproj
od-win32/gencpu_msvc/gencpu_msvc.vcxproj
od-win32/genlinetoscr_msvc/genlinetoscr_msvc.vcxproj
od-win32/hardfile_win32.cpp
od-win32/prowizard/prowizard.vcxproj
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/uaeunp/uaeunp.vcxproj
od-win32/unpackers/unpackers.vcxproj
od-win32/win32.h
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuae_msvc11/winuae_msvc.sln
od-win32/winuae_msvc11/winuae_msvc.vcxproj
od-win32/winuaechangelog.txt
scsi.cpp

index f63c2711b7077ae5c403469f8105767b45f324ed..cfcda1b9291abe3bd130627ebd15586a2d2f922e 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
@@ -31,6 +31,7 @@
 #include "autoconf.h"
 #include "cdtv.h"
 #include "savestate.h"
+#include "threaddep/thread.h"
 
 #define ROM_VECTOR 0x2000
 #define ROM_OFFSET 0x2000
@@ -185,19 +186,22 @@ static uae_u32 dmac_dawr;
 static uae_u32 dmac_acr;
 static uae_u32 dmac_wtc;
 static int dmac_dma;
-static uae_u8 sasr, scmd, auxstatus;
-static int wd_used;
-static int wd_phase, wd_next_phase, wd_busy, wd_data_avail;
-static bool wd_selected;
-static int wd_dataoffset;
-static uae_u8 wd_data[32];
+static volatile uae_u8 sasr, scmd, auxstatus;
+static volatile int wd_used;
+static volatile int wd_phase, wd_next_phase, wd_busy, wd_data_avail;
+static volatile bool wd_selected;
+static volatile int wd_dataoffset;
+static volatile uae_u8 wd_data[32];
 
 static int superdmac;
 
 #define WD_STATUS_QUEUE 2
-static int scsidelay_irq[WD_STATUS_QUEUE];
-static uae_u8 scsidelay_status[WD_STATUS_QUEUE];
-static int queue_index;
+static volatile int scsidelay_irq[WD_STATUS_QUEUE];
+static volatile uae_u8 scsidelay_status[WD_STATUS_QUEUE];
+static volatile int queue_index;
+
+static smp_comm_pipe requests;
+static volatile int scsi_thread_running;
 
 static int wd33c93_ver = 1; // A
 
@@ -306,10 +310,13 @@ static void set_status (uae_u8 status, int delay)
        queue_index++;
        if (queue_index >= WD_STATUS_QUEUE)
                queue_index = 0;
-       scsidelay_irq[queue_index] = delay <= 2 ? 2 : delay;
-       if (scsidelay_irq[1] == scsidelay_irq[0])
-               scsidelay_irq[1]++;
        scsidelay_status[queue_index] = status;
+       scsidelay_irq[queue_index] = delay == 0 ? 1 : (delay <= 2 ? 2 : delay);
+}
+
+static void set_status (uae_u8 status)
+{
+       set_status (status, 0);
 }
 
 static uae_u32 gettc (void)
@@ -398,7 +405,7 @@ static bool do_dma (void)
                                break;
                }
 #if WD33C93_DEBUG > 0
-               write_log (_T("%s DMA from WD, %d/%d %08X\n"), WD33C93, scsi->offset, scsi->data_len, odmac_acr);
+               write_log (_T("%s Done DMA from WD, %d/%d %08X\n"), WD33C93, scsi->offset, scsi->data_len, odmac_acr);
 #endif
                return true;
        } else if (scsi->direction > 0) {
@@ -416,7 +423,7 @@ static bool do_dma (void)
                                break;
                }
 #if WD33C93_DEBUG > 0
-               write_log (_T("%s DMA to WD, %d/%d %08x\n"), WD33C93, scsi->offset, scsi->data_len, odmac_acr);
+               write_log (_T("%s Done DMA to WD, %d/%d %08x\n"), WD33C93, scsi->offset, scsi->data_len, odmac_acr);
 #endif
                return true;
        }
@@ -539,6 +546,7 @@ static void wd_cmd_sel_xfer (bool atn)
        int i, tmp_tc;
        int delay = 0;
 
+       wd_data_avail = 0;
        tmp_tc = gettc ();
        scsi = scsis[wdregs[WD_DESTINATION_ID] & 7];
        if (!scsi) {
@@ -595,17 +603,23 @@ static void wd_cmd_sel_xfer (bool atn)
        }
 
        // target replied or start/continue data phase (if data available)
-       if (wdregs[WD_COMMAND_PHASE] == 0x44 || wdregs[WD_COMMAND_PHASE] == 0x45) {
+       if (wdregs[WD_COMMAND_PHASE] == 0x44) {
+               if (scsi->direction < 0) {
+                       scsi_emulate_cmd (scsi);
+               }
+               scsi_start_transfer (scsi);
+               wdregs[WD_COMMAND_PHASE] = 0x45;
+       }
+               
+       if (wdregs[WD_COMMAND_PHASE] == 0x45) {
                settc (tmp_tc);
                wd_dataoffset = 0;
                setphase (0x45);
-               scsi_start_transfer (scsi);
 
                if (gettc () == 0) {
                        if (scsi->direction != 0) {
                                // TC = 0 but we may have data
                                if (scsi->direction < 0) {
-                                       scsi_emulate_cmd (scsi);
                                        if (scsi->data_len == 0) {
                                                // no data, continue normally to status phase
                                                setphase (0x46);
@@ -623,21 +637,37 @@ static void wd_cmd_sel_xfer (bool atn)
                }
 
                if (scsi->direction) {
-                       scsi_start_transfer (scsi);
                        if (canwddma ()) {
-                               if (scsi->direction <=  0) {
-                                       scsi_emulate_cmd (scsi);
+                               if (scsi->direction <= 0) {
                                        do_dma ();
+                                       if (scsi->offset < scsi->data_len) {
+                                               // buffer not completely retrieved?
+                                               wd_phase = CSR_UNEXP | PHS_DATA_IN;
+                                               set_status (wd_phase, 1);
+                                               return;
+                                       }
+                                       if (gettc () > 0) {
+                                               // requested more data than was available.
+                                               wd_phase = CSR_UNEXP | PHS_STATUS;
+                                               set_status (wd_phase, 1);
+                                               return;
+                                       }
                                        setphase (0x46);
                                } else {
                                        if (do_dma ()) {
                                                setphase (0x46);
+                                               if (scsi->offset < scsi->data_len) {
+                                                       // not enough data?
+                                                       wd_phase = CSR_UNEXP | PHS_DATA_OUT;
+                                                       set_status (wd_phase, 1);
+                                                       return;
+                                               }
+                                               // got all data -> execute it
                                                scsi_emulate_cmd (scsi);
                                        }
                                }
                        } else {
-                               if (scsi->direction <  0)
-                                       scsi_emulate_cmd (scsi);
+                               // no dma = Service Request
                                wd_phase = CSR_SRV_REQ;
                                if (scsi->direction < 0)
                                        wd_phase |= PHS_DATA_IN;
@@ -647,13 +677,12 @@ static void wd_cmd_sel_xfer (bool atn)
                                return;
                        }
                } else {
+                       // TC > 0 but no data to transfer
                        if (gettc ()) {
                                wd_phase = CSR_UNEXP | PHS_STATUS;
                                set_status (wd_phase, 1);
                                return;
                        }
-
-                       // there was nothing to transfer
                        wdregs[WD_COMMAND_PHASE] = 0x46;
                }
        }
@@ -757,6 +786,9 @@ static void wd_cmd_sel (bool atn)
 
        scsi = scsis[wdregs[WD_DESTINATION_ID] & 7];
        if (!scsi) {
+#if WD33C93_DEBUG > 0
+               write_log (_T("%s no drive\n"), WD33C93);
+#endif
                set_status (CSR_TIMEOUT, 1000);
                return;
        }
@@ -765,11 +797,11 @@ static void wd_cmd_sel (bool atn)
        scsi->message[0] = 0x80;
        set_status (CSR_SELECT, 2);
        if (atn) {
-               set_status (CSR_SRV_REQ | PHS_MESS_OUT, 4);
                wdregs[WD_COMMAND_PHASE] = 0x10;
+               set_status (CSR_SRV_REQ | PHS_MESS_OUT, 4);
        } else {
-               set_status (CSR_SRV_REQ | PHS_COMMAND, 4);
                wdregs[WD_COMMAND_PHASE] = 0x10; // connected as an initiator
+               set_status (CSR_SRV_REQ | PHS_COMMAND, 4);
        } 
 }
 
@@ -836,6 +868,16 @@ static int writeonlyreg (int reg)
        return 0;
 }
 
+static uae_u32 makecmd (struct scsi_data *s, int msg, uae_u8 cmd)
+{
+       uae_u32 v = 0;
+       if (s)
+               v |= s->id << 24;
+       v |= msg << 8;
+       v |= cmd;
+       return v;
+}
+
 static void writewdreg (int sasr, uae_u8 val)
 {
        switch (sasr)
@@ -887,40 +929,15 @@ void wdscsi_put (uae_u8 d)
                wd_data_avail = 1;
                if (scsi_send_data (scsi, wdregs[sasr]) || gettc () == 0) {
                        wd_data_avail = 0;
-                       wd_do_transfer_out ();
+                       write_comm_pipe_u32 (&requests, makecmd (scsi, 2, 0), 1);
                }
        } else if (sasr == WD_COMMAND) {
                wd_busy = true;
-               switch (d & 0x7f)
-               {
-               case WD_CMD_RESET:
-                       wd_cmd_reset (true);
-                       break;
-               case WD_CMD_ABORT:
-                       wd_cmd_abort ();
-                       break;
-               case WD_CMD_SEL:
-                       wd_cmd_sel (false);
-                       break;
-               case WD_CMD_SEL_ATN:
-                       wd_cmd_sel (true);
-                       break;
-               case WD_CMD_SEL_ATN_XFER:
-                       wd_cmd_sel_xfer (true);
-                       break;
-               case WD_CMD_SEL_XFER:
-                       wd_cmd_sel_xfer (false);
-                       break;
-               case WD_CMD_TRANS_INFO:
-                       wd_cmd_trans_info ();
-                       break;
-               default:
-                       wd_busy = false;
-                       write_log (_T("%s unimplemented/unknown command %02X\n"), WD33C93, d);
-                       break;
-               }
+               write_comm_pipe_u32 (&requests, makecmd (scsi, 0, d), 1);
+               if (scsi && scsi->cd_emu_unit >= 0)
+                       gui_flicker_led (LED_CD, scsi->id, 1);
        }
-       incsasr(1);
+       incsasr (1);
 }
 
 void wdscsi_sasr (uae_u8 b)
@@ -957,7 +974,7 @@ uae_u8 wdscsi_get (void)
                wd_data_avail = 1;
                if (status || gettc () == 0) {
                        wd_data_avail = 0;
-                       wd_do_transfer_in ();
+                       write_comm_pipe_u32 (&requests, makecmd (scsi, 1, 0), 1);
                }
        } else if (sasr == WD_SCSI_STATUS) {
                uae_int_requested &= ~2;
@@ -1558,6 +1575,67 @@ static void ew (int addr, uae_u32 value)
        }
 }
 
+static void *scsi_thread (void *null)
+{
+       for (;;) {
+               uae_u32 v = read_comm_pipe_u32_blocking (&requests);
+               if (scsi_thread_running == 0 || v == 0xfffffff)
+                       break;
+               int cmd = v & 0x7f;
+               int msg = (v >> 8) & 0xff;
+               int unit = (v >> 24) & 0xff;
+               //write_log (_T("scsi_thread got msg=%d cmd=%d\n"), msg, cmd);
+               if (msg == 0) {
+                       if (WD33C93_DEBUG > 0)
+                               write_log (_T("%s command %02X\n"), WD33C93, cmd);
+                       switch (cmd)
+                       {
+                       case WD_CMD_RESET:
+                               wd_cmd_reset (true);
+                               break;
+                       case WD_CMD_ABORT:
+                               wd_cmd_abort ();
+                               break;
+                       case WD_CMD_SEL:
+                               wd_cmd_sel (false);
+                               break;
+                       case WD_CMD_SEL_ATN:
+                               wd_cmd_sel (true);
+                               break;
+                       case WD_CMD_SEL_ATN_XFER:
+                               wd_cmd_sel_xfer (true);
+                               break;
+                       case WD_CMD_SEL_XFER:
+                               wd_cmd_sel_xfer (false);
+                               break;
+                       case WD_CMD_TRANS_INFO:
+                               wd_cmd_trans_info ();
+                               break;
+                       default:
+                               wd_busy = false;
+                               write_log (_T("%s unimplemented/unknown command %02X\n"), WD33C93, cmd);
+                               set_status (CSR_INVALID, 10);
+                               break;
+                       }
+               } else if (msg == 1) {
+                       wd_do_transfer_in ();
+               } else if (msg == 2) {
+                       wd_do_transfer_out ();
+               }
+       }
+       scsi_thread_running = -1;
+       return 0;
+}
+
+static void init_scsi (void)
+{
+       if (!scsi_thread_running) {
+               scsi_thread_running = 1;
+               init_comm_pipe (&requests, 100, 1);
+               uae_start_thread (_T("scsi"), scsi_thread, 0, NULL);
+       }
+}
+
 static void freescsi (struct scsi_data *sd)
 {
        if (!sd)
@@ -1647,6 +1725,7 @@ static void addnativescsi (void)
 
 int a3000_add_scsi_unit (int ch, struct uaedev_config_info *ci)
 {
+       init_scsi ();
        if (ci->cd_emu_unit >= 0)
                return add_scsi_cd (ch, ci->cd_emu_unit);
        else
@@ -1662,10 +1741,18 @@ void a3000scsi_reset (void)
 void a3000scsi_free (void)
 {
        freenativescsi ();
+       if (scsi_thread_running > 0) {
+               scsi_thread_running = 0;
+               write_comm_pipe_u32 (&requests, 0xffffffff, 1);
+               while(scsi_thread_running == 0)
+                       sleep_millis (10);
+               scsi_thread_running = 0;
+       }
 }
 
 int a2091_add_scsi_unit (int ch, struct uaedev_config_info *ci)
 {
+       init_scsi ();
        if (ci->cd_emu_unit >= 0)
                return add_scsi_cd (ch, ci->cd_emu_unit);
        else
@@ -1697,6 +1784,7 @@ void a2091_init (void)
        struct romlist *rl;
        struct romdata *rd;
 
+       init_scsi ();
        configured = 0;
        memset (dmacmemory, 0xff, sizeof dmacmemory);
        ew (0x00, 0xc0 | 0x01 | 0x10);
index 3b1490b93019f1ed4af3cbb9899e82964e2ba8e6..a64b7d3616ef7690c39f8ce285a55be1c54dcddf 100644 (file)
@@ -3,7 +3,7 @@
 *
 * lowlevel cd device glue, scsi emulator
 *
-* Copyright 2009-2010 Toni Wilen
+* Copyright 2009-2013 Toni Wilen
 *
 */
 
@@ -19,6 +19,7 @@
 #include "threaddep/thread.h"
 #include "execio.h"
 #include "zfile.h"
+#include "scsi.h"
 #ifdef RETROPLATFORM
 #include "rp.h"
 #endif
@@ -1154,6 +1155,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
        int status = 0;
        struct device_info di;
        uae_u8 cmd = cmdbuf[0];
+       int dlen = *data_len;
 
        *reply_len = *sense_len = 0;
        memset (r, 0, 256);
@@ -1171,7 +1173,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                write_log (_T("SCSIEMU %d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X CMDLEN=%d DATA=%08X LEN=%d\n"), unitnum,
                        cmdbuf[0], cmdbuf[1], cmdbuf[2], cmdbuf[3], cmdbuf[4], cmdbuf[5], cmdbuf[6], 
                        cmdbuf[7], cmdbuf[8], cmdbuf[9], cmdbuf[10], cmdbuf[11],
-                       scsi_cmd_len, scsi_data, *data_len);
+                       scsi_cmd_len, scsi_data, dlen);
        switch (cmdbuf[0])
        {
        case 0x03: /* REQUEST SENSE */
@@ -1403,6 +1405,8 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                        len = cmdbuf[4];
                        if (!len)
                                len = 256;
+                       if (len * di.bytespersector > SCSI_DATA_BUFFER_SIZE)
+                               goto toolarge;
                        scsi_len = (uae_u32)cmd_readx (unitnum, scsi_data, offset, len) * di.bytespersector;;
                } else {
                        goto notdatatrack;
@@ -1420,6 +1424,8 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                struct cd_toc *t = gettoc (&di.toc, offset);
                if ((t->control & 0x0c) == 0x04) {
                        len = rl (cmdbuf + 7 - 2) & 0xffff;
+                       if (len * di.bytespersector > SCSI_DATA_BUFFER_SIZE)
+                               goto toolarge;
                        scsi_len = cmd_readx (unitnum, scsi_data, offset, len) * di.bytespersector;
                } else {
                        goto notdatatrack;
@@ -1437,6 +1443,8 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                struct cd_toc *t = gettoc (&di.toc, offset);
                if ((t->control & 0x0c) == 0x04) {
                        len = rl (cmdbuf + 6);
+                       if (len * di.bytespersector > SCSI_DATA_BUFFER_SIZE)
+                               goto toolarge;
                        scsi_len = (uae_u32)cmd_readx (unitnum, scsi_data, offset, len) * di.bytespersector;;
                } else {
                        goto notdatatrack;
@@ -1804,8 +1812,16 @@ notdatatrack:
                s[12] = 0x64; /* ILLEGAL MODE FOR THIS TRACK */
                ls = 0x12;
                break;
+toolarge:
+               write_log (_T("CDEMU: too large scsi data tranfer %d > %d\n"), len, dlen);
+               status = 2; /* CHECK CONDITION */
+               s[0] = 0x70;
+               s[2] = 2; /* NOT READY */
+               s[12] = 0x11; /* UNRECOVERED READ ERROR */
+               ls = 0x12;
+               break;
 
-       default:
+               default:
 err:
                write_log (_T("CDEMU: unsupported scsi command 0x%02X\n"), cmdbuf[0]);
 errreq:
index b9437a637eaf12daa449d8d639a1748eff28149d..4ad84cb0f1532148334d156737a396fe32dbfcff 100644 (file)
@@ -906,8 +906,16 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        cfgfile_dwrite (f, _T("gfx_horizontal_tweak"), _T("%d"), p->gfx_extrawidth);
 
 #ifdef GFXFILTER
-       if (p->gfx_filtershader[0] && p->gfx_api) {
-               cfgfile_dwrite (f, _T("gfx_filter"), _T("D3D:%s"), p->gfx_filtershader);
+       for (int i = 0; i <MAX_FILTERSHADERS; i++) {
+               if (p->gfx_filtershader[i][0])
+                       cfgfile_write (f, _T("gfx_filter_pre"), _T("D3D:%s"), p->gfx_filtershader[i]);
+       }
+       for (int i = 0; i <MAX_FILTERSHADERS; i++) {
+               if (p->gfx_filtershader[i + MAX_FILTERSHADERS][0])
+                       cfgfile_write (f, _T("gfx_filter_post"), _T("D3D:%s"), p->gfx_filtershader[i + MAX_FILTERSHADERS]);
+       }
+       if (p->gfx_filtershader[0][0] && p->gfx_api) {
+               cfgfile_dwrite (f, _T("gfx_filter"), _T("D3D:%s"), p->gfx_filtershader[0]);
        } else if (p->gfx_filter > 0) {
                int i = 0;
                struct uae_filter *uf;
@@ -1904,16 +1912,42 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value)
                return 1;
        }
 
+       if (_tcscmp (option, _T("gfx_filter_pre")) == 0 || _tcscmp (option, _T("gfx_filter_post")) == 0) {
+               TCHAR *s = _tcschr (value, ':');
+               if (s) {
+                       *s++ = 0;
+                       if (!_tcscmp (value, _T("D3D"))) {
+                               p->gfx_api = 1;
+                               if (_tcscmp (option, _T("gfx_filter_pre")) == 0) {
+                                       for (int i = 0; i < MAX_FILTERSHADERS; i++) {
+                                               if (p->gfx_filtershader[i][0] == 0) {
+                                                       _tcscpy (p->gfx_filtershader[i], s);
+                                                       break;
+                                               }
+                                       }
+                               } else {
+                                       for (int i = 0; i < MAX_FILTERSHADERS; i++) {
+                                               if (p->gfx_filtershader[i + MAX_FILTERSHADERS][0] == 0) {
+                                                       _tcscpy (p->gfx_filtershader[i + MAX_FILTERSHADERS], s);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return 1;
+       }
+
        if (_tcscmp (option, _T("gfx_filter")) == 0) {
                int i = 0;
                TCHAR *s = _tcschr (value, ':');
-               p->gfx_filtershader[0] = 0;
+               p->gfx_filtershader[0][0] = 0;
                p->gfx_filter = 0;
                if (s) {
                        *s++ = 0;
                        if (!_tcscmp (value, _T("D3D"))) {
                                p->gfx_api = 1;
-                               _tcscpy (p->gfx_filtershader, s);
+                               _tcscpy (p->gfx_filtershader[0], s);
                        }
                }
                if (!_tcscmp (value, _T("direct3d"))) {
@@ -2329,8 +2363,23 @@ struct uaedev_config_data *add_filesys_config (struct uae_prefs *p, int index, s
                if (ci->controller > HD_CONTROLLER_SCSI6 || ci->controller < HD_CONTROLLER_IDE0)
                        return NULL;
        }
-
        if (index < 0) {
+               if (ci->controller != HD_CONTROLLER_UAE) {
+                       int ctrl = ci->controller;
+                       for (;;) {
+                               for (i = 0; i < p->mountitems; i++) {
+                                       if (p->mountconfig[i].ci.controller == ctrl) {
+                                               ctrl++;
+                                               if (ctrl == HD_CONTROLLER_IDE3 + 1 || ctrl == HD_CONTROLLER_SCSI6 + 1)
+                                                       return 0;
+                                       }
+                               }
+                               if (i == p->mountitems) {
+                                       ci->controller = ctrl;
+                                       break;
+                               }
+                       }
+               }
                if (ci->type == UAEDEV_CD) {
                        for (i = 0; i < p->mountitems; i++) {
                                if (p->mountconfig[i].ci.type == UAEDEV_CD)
@@ -4590,7 +4639,9 @@ void default_prefs (struct uae_prefs *p, int type)
        p->cs_resetwarning = 1;
 
        p->gfx_filter = 0;
-       p->gfx_filtershader[0] = 0;
+       for (int i = 0; i < 2 * MAX_FILTERSHADERS; i++) {
+               p->gfx_filtershader[i][0] = 0;
+       }
        p->gfx_filtermask[0] = 0;
        p->gfx_filter_horiz_zoom_mult = 1.0;
        p->gfx_filter_vert_zoom_mult = 1.0;
index 6d0543d44e3600fa0de53454a640df18a72ffab5..a0770cb11d1c62f60602091b3f74b89eeae8f681 100644 (file)
@@ -300,7 +300,9 @@ static void mmu_bus_error(uaecptr addr, int fc, bool write, int size, bool rmw,
                        ssw |= MMU_SSW_CM;
                        regs.mmu_effective_addr = mmu040_movem_ea;
                        mmu040_movem = 0;
+#if MMUDEBUGMISC > 0
                        write_log (_T("040 MMU_SSW_CM EA=%08X\n"), mmu040_movem_ea);
+#endif
                }
                if (locked_rmw_cycle) {
                        ssw |= MMU_SSW_LK | MMU_SSW_RW;
@@ -593,9 +595,6 @@ static void misalignednotfirst(uaecptr addr)
 
 static void misalignednotfirstcheck(uaecptr addr)
 {
-#if MMUDEBUGMISC > 0
-       write_log (_T("misalignednotfirstcheck %08x -> %08x %08X\n"), regs.mmu_fault_addr, addr, regs.instruction_pc);
-#endif
        if (regs.mmu_fault_addr == addr)
                return;
        misalignednotfirst (addr);
@@ -1131,7 +1130,9 @@ void m68k_do_rte_mmu040 (uaecptr a7)
        if (ssr & MMU_SSW_CM) {
                mmu040_movem = 1;
                mmu040_movem_ea = get_long_mmu040 (a7 + 8);
+#if MMUDEBUGMISC > 0
                write_log (_T("MMU restarted MOVEM EA=%08X\n"), mmu040_movem_ea);
+#endif
        }
 }
 
index 31a955908707abc1af5b83ab284d62df5fec093d..e0c47b5b29921a270b2e9bcd1d5367ac5607dae7 100644 (file)
@@ -1566,7 +1566,7 @@ static void mmu030_page_fault(uaecptr addr, bool read, int flags, uae_u32 fc) {
        regs.mmu_ssw |= fc;
     bBusErrorReadWrite = read; 
        mm030_stageb_address = addr;
-#if 1
+#if MMUDEBUG
        write_log(_T("MMU: page fault (logical addr=%08X SSW=%04x read=%d size=%d fc=%d pc=%08x ob=%08x ins=%04X)\n"),
                addr, regs.mmu_ssw, read, (flags & MMU030_SSW_SIZE_B) ? 1 : (flags & MMU030_SSW_SIZE_W) ? 2 : 4, fc,
                regs.instruction_pc, (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) ? mmu030_data_buffer : mmu030_ad[mmu030_idx].val, mmu030_opcode & 0xffff);
diff --git a/fpp.cpp b/fpp.cpp
index c8c949ce947069e2f394a84bb0fa909aff51afb5..21787b386421252fd3b17325449b4438e841b921 100644 (file)
--- a/fpp.cpp
+++ b/fpp.cpp
@@ -1555,6 +1555,7 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
 
                case 0:
                case 2: /* Extremely common */
+                       regs.fpiar =  pc;
                        reg = (extra >> 7) & 7;
                        if ((extra & 0xfc00) == 0x5c00) {
                                if (fault_if_no_fpu (opcode, 0, pc))
index 6e6adcba83fec5c55922869930dea192e84b3bed..441a341cef7db51c92a487c34bf6b35f3a206a66 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -3,7 +3,7 @@
 *
 * Gayle (and motherboard resources) memory bank
 *
-* (c) 2006 - 2011 Toni Wilen
+* (c) 2006 - 2013 Toni Wilen
 */
 
 #define GAYLE_LOG 0
@@ -167,8 +167,10 @@ read 1 byte to stop reset */
 #define IDE_GAYLE 0
 #define IDE_ADIDE 1
 
+
+#define ATAPI_MAX_TRANSFER 32768
 #define MAX_IDE_MULTIPLE_SECTORS 64
-#define SECBUF_SIZE (512 * (MAX_IDE_MULTIPLE_SECTORS * 2))
+#define SECBUF_SIZE (131072 * 2)
 
 struct ide_registers
 {
@@ -189,6 +191,7 @@ struct ide_hdf
        int data_offset;
        int data_size;
        int data_multi;
+       int direction; // 0 = read, 1 = write
        int lba48;
        uae_u8 multiple_mode;
        int irq_delay;
@@ -202,8 +205,10 @@ struct ide_hdf
        bool atapi;
        bool atapi_drdy;
        int cd_unit_num;
-       int packet_cnt;
+       int packet_state;
        int packet_data_size;
+       int packet_data_offset;
+       int packet_transfer_size;
        struct scsi_data scsi;
 };
 
@@ -433,6 +438,10 @@ static void ide_interrupt (void)
 {
        ide->irq_delay = 2;
 }
+static void ide_fast_interrupt (void)
+{
+       ide->irq_delay = 1;
+}
 
 static void ide_interrupt_do (struct ide_hdf *ide)
 {
@@ -490,7 +499,7 @@ static void ide_identify_drive (void)
        if (IDE_LOG > 0)
                write_log (_T("IDE%d identify drive\n"), ide->num);
        ide_data_ready ();
-       ide->data_size *= -1;
+       ide->direction = 0;
        pw (0, atapi ? 0x85c0 : 1 << 6);
        pw (1, ide->hdhfd.cyls_def);
        pw (2, 0xc837);
@@ -570,6 +579,7 @@ static void set_signature (struct ide_hdf *ide)
                ide->regs.ide_status = 0;
        }
        ide->regs.ide_error = 0x01; // device ok
+       ide->packet_state = 0;
 }
 
 static void reset_device (bool both)
@@ -723,6 +733,177 @@ static void check_maxtransfer (int state)
        }
 }
 
+static void process_rw_command (void)
+{
+       ide->regs.ide_status |= IDE_STATUS_BSY;
+       ide->regs.ide_status &= ~IDE_STATUS_DRQ;
+       write_comm_pipe_u32 (&requests, ide->num, 1);
+}
+static void process_packet_command (void)
+{
+       ide->regs.ide_status |= IDE_STATUS_BSY;
+       ide->regs.ide_status &= ~IDE_STATUS_DRQ;
+       write_comm_pipe_u32 (&requests, ide->num | 0x80, 1);
+}
+
+static void atapi_data_done (void)
+{
+       ide->regs.ide_nsector = ATAPI_IO | ATAPI_CD;
+       ide->regs.ide_status = IDE_STATUS_DRDY;
+       ide->data_size = 0;
+       ide->packet_data_offset = 0;
+       ide->data_offset = 0;
+}
+
+static bool atapi_set_size (struct ide_hdf *ide)
+{
+       int size;
+       size = ide->data_size;
+       ide->data_offset = 0;
+       if (!size) {
+               ide->packet_state = 0;
+               ide->packet_transfer_size = 0;
+               return true;
+       }
+       if (ide->packet_state == 2) {
+               if (size > ide->packet_data_size)
+                       size = ide->packet_data_size;
+               if (size > ATAPI_MAX_TRANSFER)
+                       size = ATAPI_MAX_TRANSFER;
+               ide->packet_transfer_size = size & ~1;
+               ide->regs.ide_lcyl = size & 0xff;
+               ide->regs.ide_hcyl = size >> 8;
+       } else {
+               ide->packet_transfer_size = 12;
+       }
+       ide->regs.ide_status = IDE_STATUS_DRQ;
+       write_log (_T("ATAPI data transfer %d/%d bytes\n"), ide->packet_transfer_size, ide->data_size);
+       return false;
+}
+
+static void atapi_packet (void)
+{
+       ide->packet_data_offset = 0;
+       ide->packet_data_size = (ide->regs.ide_hcyl << 8) | ide->regs.ide_lcyl;
+       if (ide->packet_data_size == 65535)
+               ide->packet_data_size = 65534;
+       ide->data_size = 12;
+       if (IDE_LOG > 0)
+               write_log (_T("ATAPI packet command. Data size = %d\n"), ide->packet_data_size);
+       ide->packet_state = 1;
+       ide->data_multi = 1;
+       ide->data_offset = 0;
+       ide->regs.ide_nsector = ATAPI_CD;
+       ide->regs.ide_error = 0;
+       atapi_set_size (ide);
+}
+
+static void do_packet_command (struct ide_hdf *ide)
+{
+       memcpy (ide->scsi.cmd, ide->secbuf, 12);
+       ide->scsi.cmd_len = 12;
+       if (IDE_LOG > 0) {
+               uae_u8 *c = ide->scsi.cmd;
+               write_log (_T("ATASCSI %02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x\n"),
+                       c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11], c[12]);
+       }
+       ide->direction = 0;
+       scsi_emulate_analyze (&ide->scsi);
+       if (ide->scsi.direction <= 0) {
+               // data in
+               ide->scsi.data_len = SECBUF_SIZE;
+               scsi_emulate_cmd (&ide->scsi);
+               ide->data_size = ide->scsi.data_len;
+               ide->regs.ide_status = 0;
+               if (ide->scsi.status) {
+                       // error
+                       ide->regs.ide_status = ATAPI_STATUS_CHK;
+                       ide->regs.ide_error = ide->scsi.status << 4;
+                       atapi_data_done ();
+               } else if (ide->scsi.data_len) {
+                       // data in
+                       memcpy (ide->secbuf, ide->scsi.buffer, ide->scsi.data_len);
+                       ide->regs.ide_nsector = ATAPI_IO;
+               } else {
+                       // no data
+                       atapi_data_done ();
+               }
+       } else {
+               // data out
+               ide->direction = 1;
+               ide->regs.ide_nsector = 0;
+               ide->data_size = ide->scsi.data_len;
+       }
+       ide->packet_state = 2; // data phase
+       atapi_set_size (ide);
+}
+
+static void do_process_packet_command (struct ide_hdf *ide)
+{
+       if (ide->packet_state == 1) {
+               do_packet_command (ide);
+       } else {
+               ide->packet_data_offset += ide->packet_transfer_size;
+               if (!ide->direction) {
+                       // data still remaining, next transfer
+                       atapi_set_size (ide);
+               } else {
+                       if (atapi_set_size (ide)) {
+                               memcpy (&ide->scsi.buffer, ide->secbuf, ide->data_size);
+                               ide->scsi.data_len = ide->data_size;
+                               scsi_emulate_cmd (&ide->scsi);
+                               if (IDE_LOG > 1)
+                                       write_log (_T("IDE%d ATAPI write finished, %d bytes\n"), ide->num, ide->data_size);
+                       }
+               }
+       }
+       ide->irq_delay = 1;
+}
+
+static void do_process_rw_command (struct ide_hdf *ide)
+{
+       unsigned int cyl, head, sec, nsec;
+       uae_u64 lba;
+       bool last;
+
+       ide->data_offset = 0;
+       get_lbachs (ide, &lba, &cyl, &head, &sec, ide->lba48);
+       nsec = get_nsec (ide->lba48);
+       if (nsec * ide->blocksize > ide->hdhfd.size - lba * ide->blocksize)
+               nsec = (ide->hdhfd.size - lba * ide->blocksize) / ide->blocksize;
+       if (nsec <= 0) {
+               ide_data_ready ();
+               ide_fail_err (IDE_ERR_IDNF);
+               return;
+       }
+       if (nsec > ide->data_multi)
+               nsec = ide->data_multi;
+
+       if (ide->direction) {
+               hdf_write (&ide->hdhfd.hfd, ide->secbuf, lba * ide->blocksize, nsec * ide->blocksize);
+               if (IDE_LOG > 1)
+                       write_log (_T("IDE%d write, %d bytes written\n"), ide->num, nsec * ide->blocksize);
+       } else {
+               hdf_read (&ide->hdhfd.hfd, ide->secbuf, lba * ide->blocksize, nsec * ide->blocksize);
+               if (IDE_LOG > 1)
+                       write_log (_T("IDE%d read, read %d bytes\n"), ide->num, nsec * ide->blocksize);
+       }
+       ide->regs.ide_status |= IDE_STATUS_DRQ;
+       last = dec_nsec (ide->lba48, nsec) == 0;
+       put_lbachs (ide, lba, cyl, head, sec, last ? nsec - 1 : nsec, ide->lba48);
+       if (last) {
+               if (ide->direction) {
+                       if (IDE_LOG > 1)
+                               write_log (_T("IDE%d write finished\n"), ide->num);
+                       ide->regs.ide_status &= ~IDE_STATUS_DRQ;
+               } else {
+                       if (IDE_LOG > 1)
+                               write_log (_T("IDE%d read finished\n"), ide->num);
+               }
+       }
+       ide->irq_delay = 1;
+}
+
 static void ide_read_sectors (int flags)
 {
        unsigned int cyl, head, sec, nsec;
@@ -749,7 +930,9 @@ static void ide_read_sectors (int flags)
        ide->data_offset = 0;
        ide->regs.ide_status |= IDE_STATUS_DRQ;
        ide->data_size = nsec * ide->blocksize;
-       ide_interrupt ();
+       ide->direction = 0;
+
+       process_rw_command ();
 }
 
 static void ide_write_sectors (int flags)
@@ -785,24 +968,9 @@ static void ide_write_sectors (int flags)
        ide->data_offset = 0;
        ide->regs.ide_status |= IDE_STATUS_DRQ;
        ide->data_size = nsec * ide->blocksize;
-       ide_interrupt ();
-}
+       ide->direction = 1;
 
-static void atapi_packet (void)
-{
-       ide->data_size = (ide->regs.ide_hcyl << 8) | ide->regs.ide_lcyl;
-       if (ide->data_size == 65535)
-               ide->data_size = 65534;
-       ide->packet_data_size = (ide->data_size + 1) & ~1;
-       ide->data_size = 12;
-       if (IDE_LOG > 1)
-               write_log (_T("ATAPI packet command\n"));
-       ide->packet_cnt = 1;
-       ide->data_multi = 1;
-       ide->data_offset = 0;
-       ide->regs.ide_status = IDE_STATUS_DRQ;
-       ide->regs.ide_nsector = ATAPI_CD;
-       ide->regs.ide_error = 0;
+       ide_fast_interrupt ();
 }
 
 static void ide_do_command (uae_u8 cmd)
@@ -816,8 +984,11 @@ static void ide_do_command (uae_u8 cmd)
 
        if (ide->atapi) {
 
+               gui_flicker_led (LED_CD, ide->num, 1);
                ide->atapi_drdy = true;
-               if (cmd == 0x08) { /* device reset */
+               if (cmd == 0x00) { /* nop */
+                       ide_interrupt ();
+               } else if (cmd == 0x08) { /* device reset */
                        ide_execute_drive_diagnostics (true);
                } else if (cmd == 0xa1) { /* identify packet device */
                        ide_identify_drive ();
@@ -878,63 +1049,8 @@ static void ide_do_command (uae_u8 cmd)
        }
 }
 
-static void atapi_data_done (void)
-{
-       ide->regs.ide_nsector = ATAPI_IO | ATAPI_CD;
-       ide->regs.ide_status = IDE_STATUS_DRDY;
-}
-
-static void do_packet_command (void)
-{
-       memcpy (ide->scsi.cmd, ide->secbuf, 12);
-       ide->scsi.cmd_len = 12;
-       if (IDE_LOG > 0) {
-               uae_u8 *c = ide->scsi.cmd;
-               write_log (_T("SCSI %02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x\n"),
-                       c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11], c[12]);
-       }
-       ide->packet_cnt = 0;
-       scsi_emulate_analyze (&ide->scsi);
-       if (ide->scsi.direction <= 0) {
-               // data in
-               scsi_emulate_cmd (&ide->scsi);
-               ide->data_size = ide->scsi.data_len;
-               if (ide->data_size > ide->packet_data_size)
-                       ide->data_size = ide->packet_data_size;
-               ide->data_offset = 0;
-               ide->regs.ide_status = 0;
-               if (ide->scsi.status) {
-                       // error
-                       ide->regs.ide_status = ATAPI_STATUS_CHK;
-                       ide->regs.ide_error = ide->scsi.status << 4;
-                       atapi_data_done ();
-               } else if (ide->scsi.data_len) {
-                       // data
-                       ide->regs.ide_status = IDE_STATUS_DRQ;
-                       memcpy (ide->secbuf, ide->scsi.buffer, ide->scsi.data_len);
-                       ide->packet_cnt = -1;
-                       ide->regs.ide_nsector = ATAPI_IO;
-               } else {
-                       // no data
-                       atapi_data_done ();
-               }
-       } else {
-               // data out
-               ide->regs.ide_status = IDE_STATUS_DRQ;
-               ide->packet_cnt = -1;
-               ide->regs.ide_nsector = 0;
-               ide->data_size = ide->scsi.data_len;
-               if (ide->data_size > ide->packet_data_size)
-                       ide->data_size = ide->packet_data_size;
-       }
-       ide->regs.ide_lcyl = ide->data_size & 0xff;
-       ide->regs.ide_hcyl = ide->data_size >> 8;
-}
-
 static uae_u16 ide_get_data (void)
 {
-       unsigned int cyl, head, sec, nsec;
-       uae_u64 lba;
        bool irq = false;
        bool last = false;
        uae_u16 v;
@@ -948,41 +1064,27 @@ static uae_u16 ide_get_data (void)
                        return 0xffff;
                return 0;
        }
-       if (ide->packet_cnt) {
-               v = ide->secbuf[ide->data_offset + 1] | (ide->secbuf[ide->data_offset + 0] << 8);
+       if (ide->packet_state) {
+               v = ide->secbuf[ide->packet_data_offset + ide->data_offset + 1] | (ide->secbuf[ide->packet_data_offset + ide->data_offset + 0] << 8);
                ide->data_offset += 2;
                if (ide->data_size < 0)
                        ide->data_size += 2;
                else
                        ide->data_size -= 2;
-               if (ide->data_size == 0) {
-                       ide->packet_cnt = 0;
-                       atapi_data_done ();
+               if (ide->data_offset == ide->packet_transfer_size) {
                        if (IDE_LOG > 1)
-                               write_log (_T("IDE%d ATAPI read finished\n"), ide->num);
-                       irq = true;
-               }
-       } else {
-               nsec = 0;
-               if (ide->data_offset == 0 && ide->data_size >= 0) {
-                       get_lbachs (ide, &lba, &cyl, &head, &sec, ide->lba48);
-                       nsec = get_nsec (ide->lba48);
-                       if (nsec * ide->blocksize > ide->hdhfd.size - lba * ide->blocksize)
-                               nsec = (ide->hdhfd.size - lba * ide->blocksize) / ide->blocksize;
-                       if (nsec <= 0) {
-                               ide_data_ready ();
-                               ide_fail_err (IDE_ERR_IDNF);
-                               return 0;
+                               write_log (_T("IDE%d ATAPI partial read finished, %d bytes remaining\n"), ide->num, ide->data_size);
+                       if (ide->data_size == 0) {
+                               ide->packet_state = 0;
+                               atapi_data_done ();
+                               if (IDE_LOG > 1)
+                                       write_log (_T("IDE%d ATAPI read finished, %d bytes\n"), ide->num, ide->packet_data_offset + ide->data_offset);
+                               irq = true;
+                       } else {
+                               process_packet_command ();
                        }
-                       if (nsec > ide->data_multi)
-                               nsec = ide->data_multi;
-                       hdf_read (&ide->hdhfd.hfd, ide->secbuf, lba * ide->blocksize, nsec * ide->blocksize);
-                       if (!dec_nsec (ide->lba48, nsec))
-                               last = true;
-                       if (IDE_LOG > 1)
-                               write_log (_T("IDE%d read, read %d bytes to buffer\n"), ide->num, nsec * ide->blocksize);
                }
-
+       } else {
                v = ide->secbuf[ide->data_offset + 1] | (ide->secbuf[ide->data_offset + 0] << 8);
                ide->data_offset += 2;
                if (ide->data_size < 0) {
@@ -990,8 +1092,8 @@ static uae_u16 ide_get_data (void)
                } else {
                        ide->data_size -= 2;
                        if (((ide->data_offset % ide->blocksize) == 0) && ((ide->data_offset / ide->blocksize) % ide->data_multi) == 0) {
-                               irq = true;
-                               ide->data_offset = 0;
+                               if (ide->data_size)
+                                       process_rw_command ();
                        }
                }
                if (ide->data_size == 0) {
@@ -999,37 +1101,14 @@ static uae_u16 ide_get_data (void)
                        if (IDE_LOG > 1)
                                write_log (_T("IDE%d read finished\n"), ide->num);
                }
-               if (nsec) {
-                       put_lbachs (ide, lba, cyl, head, sec, last ? nsec - 1 : nsec, ide->lba48);
-               }
-       }
-       if (irq) {
-               ide_interrupt ();
        }
+       if (irq)
+               ide_fast_interrupt ();
        return v;
 }
 
-static void ide_write_drive (bool last)
-{
-       unsigned int cyl, head, sec, nsec;
-       uae_u64 lba;
-
-       nsec = ide->data_offset / ide->blocksize;
-       if (!nsec)
-               return;
-       get_lbachs (ide, &lba, &cyl, &head, &sec, ide->lba48);
-       hdf_write (&ide->hdhfd.hfd, ide->secbuf, lba * ide->blocksize, ide->data_offset);
-       put_lbachs (ide, lba, cyl, head, sec, last ? nsec - 1 : nsec, ide->lba48);
-       dec_nsec (ide->lba48, nsec);
-       if (IDE_LOG > 1)
-               write_log (_T("IDE%d write interrupt, %d bytes written\n"), ide->num, ide->data_offset);
-       ide->data_offset = 0;
-}
-
 static void ide_put_data (uae_u16 v)
 {
-       bool irq = false;
-
        if (IDE_LOG > 4)
                write_log (_T("IDE%d DATA write %04x %d/%d\n"), ide->num, v, ide->data_offset, ide->data_size);
        if (ide->data_size == 0) {
@@ -1037,38 +1116,25 @@ static void ide_put_data (uae_u16 v)
                        write_log (_T("IDE%d DATA write without DRQ!? PC=%08X\n"), ide->num, m68k_getpc ());
                return;
        }
-       ide->secbuf[ide->data_offset + 1] = v & 0xff;
-       ide->secbuf[ide->data_offset + 0] = v >> 8;
+       ide->secbuf[ide->packet_data_offset + ide->data_offset + 1] = v & 0xff;
+       ide->secbuf[ide->packet_data_offset + ide->data_offset + 0] = v >> 8;
        ide->data_offset += 2;
        ide->data_size -= 2;
-       if (ide->packet_cnt) {
-               if (ide->data_size == 0) {
-                       if (ide->packet_cnt > 0) {
-                               do_packet_command ();
-                       } else if (ide->packet_cnt < 0) {
-                               ide->packet_cnt = 0;
-                               memcpy (&ide->scsi.buffer, ide->secbuf, ide->data_size);
-                               ide->scsi.data_len = ide->data_size;
-                               scsi_emulate_cmd (&ide->scsi);
-                               if (IDE_LOG > 1)
-                                       write_log (_T("IDE%d ATAPI write finished\n"), ide->num);
+       if (ide->packet_state) {
+               if (ide->data_offset == ide->packet_transfer_size) {
+                       if (IDE_LOG > 0) {
+                               uae_u16 v = (ide->regs.ide_hcyl << 8) | ide->regs.ide_lcyl;
+                               write_log (_T("Data size after command received = %d (%d)\n"), v, ide->packet_data_size);
                        }
-                       irq = true;
+                       process_packet_command ();
                }
        } else {
                if (ide->data_size == 0) {
-                       irq = true;
-                       ide_write_drive (true);
-                       ide->regs.ide_status &= ~IDE_STATUS_DRQ;
-                       if (IDE_LOG > 1)
-                               write_log (_T("IDE%d write finished\n"), ide->num);
+                       process_rw_command ();
                } else if (((ide->data_offset % ide->blocksize) == 0) && ((ide->data_offset / ide->blocksize) % ide->data_multi) == 0) {
-                       irq = 1;
-                       ide_write_drive (false);
+                       process_rw_command ();
                }
        }
-       if (irq)
-               ide_interrupt ();
 }
 
 static int get_gayle_ide_reg (uaecptr addr)
@@ -1241,9 +1307,6 @@ static void ide_write_reg (int ide_reg, uae_u32 val)
                        ide->regs.ide_status |= IDE_STATUS_BSY;
                        ide_do_command (val);
                }
-#if 0
-               write_comm_pipe_u32 (&requests, (ide->num << 8) | val, 1);
-#endif
                break;
        }
 }
@@ -2549,10 +2612,15 @@ int gayle_modify_pcmcia_ide_unit (const TCHAR *path, int readonly, int insert)
 static void *ide_thread (void *null)
 {
        for (;;) {
-               uae_u32 command = read_comm_pipe_u32_blocking (&requests);
-               if (gayle_thread_running == 0 || command == 0xfffffff)
+               uae_u32 unit = read_comm_pipe_u32_blocking (&requests);
+               struct ide_hdf *ide;
+               if (gayle_thread_running == 0 || unit == 0xfffffff)
                        break;
-               ide_do_command ((uae_u8)command);
+               ide = idedrive[unit & 0x7f];
+               if (unit & 0x80)
+                       do_process_packet_command (ide);
+               else
+                       do_process_rw_command (ide);
        }
        gayle_thread_running = -1;
        return 0;
index db1a7873eaf54f97fb7a4d82d2e331dab0ec688f..af7cbce29ffe9bc0143796f38deb9c3d4b34816e 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef MMU_COMMON_H
 #define MMU_COMMON_H
 
-#define MMUDEBUG 1
+#define MMUDEBUG 0
 #define MMUINSDEBUG 0
 #define MMUDEBUGMISC 0
 
index 0680b784a4e3faaf61176291c75f044b7a06b9ec..9596340416ac7c258b9269249d7d699b78ec540e 100644 (file)
@@ -179,6 +179,8 @@ enum { CP_GENERIC = 1, CP_CDTV, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000,
 #define MONITOREMU_A2024 2
 #define MONITOREMU_GRAFFITI 3
 
+#define MAX_FILTERSHADERS 4
+
 #define MAX_CHIPSET_REFRESH 10
 #define MAX_CHIPSET_REFRESH_TOTAL (MAX_CHIPSET_REFRESH + 2)
 #define CHIPSET_REFRESH_PAL (MAX_CHIPSET_REFRESH + 0)
@@ -311,7 +313,7 @@ struct uae_prefs {
        int gfx_extrawidth;
 
        int gfx_filter;
-       TCHAR gfx_filtershader[MAX_DPATH];
+       TCHAR gfx_filtershader[2 * MAX_FILTERSHADERS][MAX_DPATH];
        TCHAR gfx_filtermask[MAX_DPATH];
        TCHAR gfx_filteroverlay[MAX_DPATH];
        struct wh gfx_filteroverlay_pos;
index b90f95b1c922c3d8bbf562cf09a0d3134941254f..efb96115519334d36273ac947c63a24952a17757 100644 (file)
       <Configuration>TestRelease</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectName>build68k</ProjectName>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
   </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup>
     <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
       <Message>creating cpudefs.cpp</Message>
       <Command>build68k.exe &gt;..\..\cpudefs.cpp &lt;..\..\table68k
 del build68k.exe
+</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <Midl>
+      <TypeLibraryName>.\Release/build68k_msvc.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeaderOutputFile>.\Release/build68k_msvc.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <CompileAs>Default</CompileAs>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <PreLinkEvent>
+      <Message>deleting cpudefs.cpp</Message>
+      <Command>del ..\..\cpudefs.cpp</Command>
+    </PreLinkEvent>
+    <Link>
+      <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+      <OutputFile>build68k.exe</OutputFile>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <ProgramDatabaseFile>.\Release/build68k.pdb</ProgramDatabaseFile>
+      <SubSystem>Console</SubSystem>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+    </Link>
+    <PostBuildEvent>
+      <Message>creating cpudefs.cpp</Message>
+      <Command>build68k.exe &gt;..\..\cpudefs.cpp &lt;..\..\table68k
+del build68k.exe
 </Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
index d3d2480bd7d22ae7c40776801d8eecb6857a00a2..8e8950ed5ae424eff5add6291bcd3e4065b9a255 100644 (file)
@@ -41,12 +41,50 @@ int forcedframelatency = -1;
 #include "direct3d.h"
 
 static TCHAR *D3DHEAD = _T("-");
-static int psEnabled, psActive, psPreProcess, shaderon;
+static int psEnabled, psActive, shaderon;
 
 static bool showoverlay = true;
 
 #define MAX_PASSES 2
 
+#define SHADERTYPE_BEFORE 1
+#define SHADERTYPE_AFTER 2
+#define SHADERTYPE_POST 3
+
+struct shaderdata
+{
+       int type; // 0 = before , 1 = after, 2 = post
+       int psPreProcess;
+       LPDIRECT3DTEXTURE9 lpWorkTexture1;
+       LPDIRECT3DTEXTURE9 lpWorkTexture2;
+       LPDIRECT3DTEXTURE9 lpTempTexture;
+       LPD3DXEFFECT pEffect;
+       D3DXEFFECT_DESC EffectDesc;
+       // Technique stuff
+       D3DXHANDLE m_PreprocessTechnique1EffectHandle;
+       D3DXHANDLE m_PreprocessTechnique2EffectHandle;
+       D3DXHANDLE m_CombineTechniqueEffectHandle;
+       // Matrix Handles
+       D3DXHANDLE m_MatWorldEffectHandle;
+       D3DXHANDLE m_MatViewEffectHandle;
+       D3DXHANDLE m_MatProjEffectHandle;
+       D3DXHANDLE m_MatWorldViewEffectHandle;
+       D3DXHANDLE m_MatViewProjEffectHandle;
+       D3DXHANDLE m_MatWorldViewProjEffectHandle;
+       // Texture Handles
+       D3DXHANDLE m_SourceDimsEffectHandle;
+       D3DXHANDLE m_TexelSizeEffectHandle;
+       D3DXHANDLE m_SourceTextureEffectHandle;
+       D3DXHANDLE m_WorkingTexture1EffectHandle;
+       D3DXHANDLE m_WorkingTexture2EffectHandle;
+};
+static LPDIRECT3DVOLUMETEXTURE9 lpHq2xLookupTexture;
+static LPDIRECT3DTEXTURE9 lpPostTempTexture;
+
+#define MAX_SHADERS 10
+#define SHADER_POST 0
+static struct shaderdata shaders[MAX_SHADERS];
+
 static D3DFORMAT tformat;
 static int d3d_enabled, d3d_ex;
 static IDirect3D9 *d3d;
@@ -63,9 +101,7 @@ static int masktexture_w, masktexture_h;
 static float mask2texture_w, mask2texture_h, mask2texture_ww, mask2texture_wh;
 static float mask2texture_wwx, mask2texture_hhx, mask2texture_minusx, mask2texture_minusy;
 static float mask2texture_multx, mask2texture_multy, mask2texture_offsetw;
-static LPDIRECT3DTEXTURE9 lpWorkTexture1[2], lpWorkTexture2[2], lpTempTexture;
 LPDIRECT3DTEXTURE9 cursorsurfaced3d;
-static LPDIRECT3DVOLUMETEXTURE9 lpHq2xLookupTexture;
 static IDirect3DVertexBuffer9 *vertexBuffer;
 static ID3DXSprite *sprite;
 static HWND d3dhwnd;
@@ -77,7 +113,6 @@ RECT mask2rect;
 static bool wasstilldrawing_broken;
 static bool renderdisabled;
 static HANDLE filenotificationhandle;
-static int extrapasses;
 
 static bool fakemode;
 static uae_u8 *fakebitmap;
@@ -217,12 +252,20 @@ static D3DXMATRIX* MatrixTranslation (D3DXMATRIXA16 *pOut, float tx, float ty, f
 
 static TCHAR *D3DX_ErrorString (HRESULT hr, LPD3DXBUFFER Errors)
 {
-       static TCHAR buffer[1000];
+       static TCHAR *buffer;
+       static int buffersize;
        TCHAR *s = NULL;
+       int size = 0;
 
-       buffer[0] = 0;
        if (Errors)
                s = au ((char*)Errors->GetBufferPointer ());
+       size = (s == NULL ? 0 : _tcslen (s)) + 1000;
+       if (size + 1000 > buffersize) {
+               xfree (buffer);
+               buffer = xmalloc (TCHAR, size);
+               buffersize = size;
+       }
+       buffer[0] = 0;
        if (hr != S_OK)
                _tcscpy (buffer, D3D_ErrorString (hr));
        if (s) {
@@ -241,7 +284,6 @@ static int isd3d (void)
        return 1;
 }
 
-static LPD3DXEFFECT postEffect;
 static D3DXHANDLE postSourceTextureHandle;
 static D3DXHANDLE postMaskTextureHandle;
 static D3DXHANDLE postTechnique, postTechniquePlain, postTechniqueAlpha;
@@ -250,31 +292,13 @@ static D3DXHANDLE postMaskMult, postMaskShift;
 static D3DXHANDLE postFilterMode;
 static D3DXHANDLE postTexelSize;
 
-static LPD3DXEFFECT pEffect;
-static D3DXEFFECT_DESC EffectDesc;
 static float m_scale;
 static LPCSTR m_strName;
-// Matrix Handles
-static D3DXHANDLE m_MatWorldEffectHandle;
-static D3DXHANDLE m_MatViewEffectHandle;
-static D3DXHANDLE m_MatProjEffectHandle;
-static D3DXHANDLE m_MatWorldViewEffectHandle;
-static D3DXHANDLE m_MatViewProjEffectHandle;
-static D3DXHANDLE m_MatWorldViewProjEffectHandle;
-// Texture Handles
-static D3DXHANDLE m_SourceDimsEffectHandle;
-static D3DXHANDLE m_TexelSizeEffectHandle;
-static D3DXHANDLE m_SourceTextureEffectHandle;
-static D3DXHANDLE m_WorkingTexture1EffectHandle;
-static D3DXHANDLE m_WorkingTexture2EffectHandle;
 static D3DXHANDLE m_Hq2xLookupTextureHandle;
-// Technique stuff
-static D3DXHANDLE m_PreprocessTechnique1EffectHandle;
-static D3DXHANDLE m_PreprocessTechnique2EffectHandle;
-static D3DXHANDLE m_CombineTechniqueEffectHandle;
+
 enum psEffect_Pass { psEffect_None, psEffect_PreProcess1, psEffect_PreProcess2, psEffect_Combine };
 
-static int postEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DXEFFECT effect)
+static int postEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DXEFFECT effect, struct shaderdata *s)
 {
        postSourceTextureHandle = effect->GetParameterByName (NULL, "SourceTexture");
        postMaskTextureHandle = effect->GetParameterByName (NULL, "OverlayTexture");
@@ -293,7 +317,7 @@ static int postEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3
        return true;
 }
 
-static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DXEFFECT effect)
+static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DXEFFECT effect, struct shaderdata *s)
 {
        HRESULT hr = S_OK;
        // Look at parameters for semantics and annotations that we know how to interpret
@@ -307,7 +331,7 @@ static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DX
        if(effect == NULL)
                return 0;
 
-       for(iParam = 0; iParam < EffectDesc.Parameters; iParam++) {
+       for(iParam = 0; iParam < s->EffectDesc.Parameters; iParam++) {
                LPCSTR pstrName = NULL;
                LPCSTR pstrFunction = NULL;
                D3DXHANDLE pstrFunctionHandle = NULL;
@@ -327,45 +351,45 @@ static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DX
                if(ParamDesc.Semantic != NULL) {
                        if(ParamDesc.Class == D3DXPC_MATRIX_ROWS || ParamDesc.Class == D3DXPC_MATRIX_COLUMNS) {
                                if(strcmpi(ParamDesc.Semantic, "world") == 0)
-                                       m_MatWorldEffectHandle = hParam;
+                                       s->m_MatWorldEffectHandle = hParam;
                                else if(strcmpi(ParamDesc.Semantic, "view") == 0)
-                                       m_MatViewEffectHandle = hParam;
+                                       s->m_MatViewEffectHandle = hParam;
                                else if(strcmpi(ParamDesc.Semantic, "projection") == 0)
-                                       m_MatProjEffectHandle = hParam;
+                                       s->m_MatProjEffectHandle = hParam;
                                else if(strcmpi(ParamDesc.Semantic, "worldview") == 0)
-                                       m_MatWorldViewEffectHandle = hParam;
+                                       s->m_MatWorldViewEffectHandle = hParam;
                                else if(strcmpi(ParamDesc.Semantic, "viewprojection") == 0)
-                                       m_MatViewProjEffectHandle = hParam;
+                                       s->m_MatViewProjEffectHandle = hParam;
                                else if(strcmpi(ParamDesc.Semantic, "worldviewprojection") == 0)
-                                       m_MatWorldViewProjEffectHandle = hParam;
+                                       s->m_MatWorldViewProjEffectHandle = hParam;
                        } else if(ParamDesc.Class == D3DXPC_VECTOR && ParamDesc.Type == D3DXPT_FLOAT) {
                                if(strcmpi(ParamDesc.Semantic, "sourcedims") == 0)
-                                       m_SourceDimsEffectHandle = hParam;
+                                       s->m_SourceDimsEffectHandle = hParam;
                                else if(strcmpi(ParamDesc.Semantic, "texelsize") == 0)
-                                       m_TexelSizeEffectHandle = hParam;
+                                       s->m_TexelSizeEffectHandle = hParam;
                        } else if(ParamDesc.Class == D3DXPC_SCALAR && ParamDesc.Type == D3DXPT_FLOAT) {
                                if(strcmpi(ParamDesc.Semantic, "SCALING") == 0)
                                        hr = effect->GetFloat(hParam, &m_scale);
                        } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_TEXTURE) {
                                if(strcmpi(ParamDesc.Semantic, "SOURCETEXTURE") == 0)
-                                       m_SourceTextureEffectHandle = hParam;
+                                       s->m_SourceTextureEffectHandle = hParam;
                                if(strcmpi(ParamDesc.Semantic, "WORKINGTEXTURE") == 0)
-                                       m_WorkingTexture1EffectHandle = hParam;
+                                       s->m_WorkingTexture1EffectHandle = hParam;
                                if(strcmpi(ParamDesc.Semantic, "WORKINGTEXTURE1") == 0)
-                                       m_WorkingTexture2EffectHandle = hParam;
+                                       s->m_WorkingTexture2EffectHandle = hParam;
                                if(strcmpi(ParamDesc.Semantic, "HQ2XLOOKUPTEXTURE") == 0)
                                        m_Hq2xLookupTextureHandle = hParam;
                        } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_STRING) {
                                LPCSTR pstrTechnique = NULL;
                                if(strcmpi(ParamDesc.Semantic, "COMBINETECHNIQUE") == 0) {
                                        hr = effect->GetString(hParam, &pstrTechnique);
-                                       m_CombineTechniqueEffectHandle = effect->GetTechniqueByName(pstrTechnique);
+                                       s->m_CombineTechniqueEffectHandle = effect->GetTechniqueByName(pstrTechnique);
                                } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE") == 0) {
                                        hr = effect->GetString(hParam, &pstrTechnique);
-                                       m_PreprocessTechnique1EffectHandle = effect->GetTechniqueByName(pstrTechnique);
+                                       s->m_PreprocessTechnique1EffectHandle = effect->GetTechniqueByName(pstrTechnique);
                                } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE1") == 0) {
                                        hr = effect->GetString(hParam, &pstrTechnique);
-                                       m_PreprocessTechnique2EffectHandle = effect->GetTechniqueByName(pstrTechnique);
+                                       s->m_PreprocessTechnique2EffectHandle = effect->GetTechniqueByName(pstrTechnique);
                                } else if(strcmpi(ParamDesc.Semantic, "NAME") == 0) {
                                        hr = effect->GetString(hParam, &m_strName);
                                }
@@ -473,8 +497,8 @@ static int psEffect_ParseParameters (LPD3DXEFFECTCOMPILER EffectCompiler, LPD3DX
        return 1;
 }
 
-static int psEffect_hasPreProcess (void) { return m_PreprocessTechnique1EffectHandle != 0; }
-static int psEffect_hasPreProcess2 (void) { return m_PreprocessTechnique2EffectHandle != 0; }
+static int psEffect_hasPreProcess (struct shaderdata *s) { return s->m_PreprocessTechnique1EffectHandle != 0; }
+static int psEffect_hasPreProcess2 (struct shaderdata *s) { return s->m_PreprocessTechnique2EffectHandle != 0; }
 
 int D3D_goodenough (void)
 {
@@ -749,7 +773,7 @@ static const char *fx20 = {
 "}\n"
 };     
 
-static LPD3DXEFFECT psEffect_LoadEffect (const TCHAR *shaderfile, int full)
+static bool psEffect_LoadEffect (const TCHAR *shaderfile, int full, struct shaderdata *s)
 {
        int ret = 0;
        LPD3DXEFFECTCOMPILER EffectCompiler = NULL;
@@ -834,16 +858,16 @@ static LPD3DXEFFECT psEffect_LoadEffect (const TCHAR *shaderfile, int full)
                write_log (_T("%s: D3DXCreateEffect failed: %s\n"), D3DHEAD, D3DX_ErrorString (hr, Errors));
                goto end;
        }
-       hr = effect->GetDesc (&EffectDesc);
+       hr = effect->GetDesc (&s->EffectDesc);
        if (FAILED (hr)) {
                write_log (_T("%s: effect->GetDesc() failed: %s\n"), D3DHEAD, D3DX_ErrorString (hr, Errors));
                goto end;
        }
        if (full) {
-               if (!psEffect_ParseParameters (EffectCompiler, effect))
+               if (!psEffect_ParseParameters (EffectCompiler, effect, s))
                        goto end;
        } else {
-               if (!postEffect_ParseParameters (EffectCompiler, effect))
+               if (!postEffect_ParseParameters (EffectCompiler, effect, s))
                        goto end;
        }
        ret = 1;
@@ -858,12 +882,11 @@ end:
                EffectCompiler->Release ();
 
        if (full) {
-               psActive = FALSE;
-               psPreProcess = FALSE;
+               s->psPreProcess = FALSE;
                if (ret) {
                        psActive = TRUE;
-                       if (psEffect_hasPreProcess ())
-                               psPreProcess = TRUE;
+                       if (psEffect_hasPreProcess (s))
+                               s->psPreProcess = TRUE;
                }
        }
 
@@ -871,57 +894,58 @@ end:
                write_log (_T("%s: pixelshader filter '%s' enabled\n"), D3DHEAD, tmp);
        else
                write_log (_T("%s: pixelshader filter '%s' failed to initialize\n"), D3DHEAD, tmp);
-       return effect;
+       s->pEffect = effect;
+       return effect != NULL;
 }
 
-static int psEffect_SetMatrices (D3DXMATRIXA16 *matProj, D3DXMATRIXA16 *matView, D3DXMATRIXA16 *matWorld)
+static int psEffect_SetMatrices (D3DXMATRIXA16 *matProj, D3DXMATRIXA16 *matView, D3DXMATRIXA16 *matWorld, struct shaderdata *s)
 {
        HRESULT hr;
 
-       if (m_MatWorldEffectHandle) {
-               hr = pEffect->SetMatrix (m_MatWorldEffectHandle, matWorld);
+       if (s->m_MatWorldEffectHandle) {
+               hr = s->pEffect->SetMatrix (s->m_MatWorldEffectHandle, matWorld);
                if (FAILED (hr)) {
                        write_log (_T("%s: Create:SetMatrix:matWorld %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_MatViewEffectHandle) {
-               hr = pEffect->SetMatrix (m_MatViewEffectHandle, matView);
+       if (s->m_MatViewEffectHandle) {
+               hr = s->pEffect->SetMatrix (s->m_MatViewEffectHandle, matView);
                if (FAILED (hr)) {
                        write_log (_T("%s: Create:SetMatrix:matView %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_MatProjEffectHandle) {
-               hr = pEffect->SetMatrix (m_MatProjEffectHandle, matProj);
+       if (s->m_MatProjEffectHandle) {
+               hr = s->pEffect->SetMatrix (s->m_MatProjEffectHandle, matProj);
                if (FAILED (hr)) {
                        write_log (_T("%s: Create:SetMatrix:matProj %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_MatWorldViewEffectHandle) {
+       if (s->m_MatWorldViewEffectHandle) {
                D3DXMATRIXA16 matWorldView;
                D3DXMatrixMultiply (&matWorldView, matWorld, matView);
-               hr = pEffect->SetMatrix (m_MatWorldViewEffectHandle, &matWorldView);
+               hr = s->pEffect->SetMatrix (s->m_MatWorldViewEffectHandle, &matWorldView);
                if (FAILED (hr)) {
                        write_log (_T("%s: Create:SetMatrix:matWorldView %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_MatViewProjEffectHandle) {
+       if (s->m_MatViewProjEffectHandle) {
                D3DXMATRIXA16 matViewProj;
                D3DXMatrixMultiply (&matViewProj, matView, matProj);
-               hr = pEffect->SetMatrix (m_MatViewProjEffectHandle, &matViewProj);
+               hr = s->pEffect->SetMatrix (s->m_MatViewProjEffectHandle, &matViewProj);
                if (FAILED (hr)) {
                        write_log (_T("%s: Create:SetMatrix:matViewProj %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_MatWorldViewProjEffectHandle) {
+       if (s->m_MatWorldViewProjEffectHandle) {
                D3DXMATRIXA16 tmp, matWorldViewProj;
                D3DXMatrixMultiply (&tmp, matWorld, matView);
                D3DXMatrixMultiply (&matWorldViewProj, &tmp, matProj);
-               hr = pEffect->SetMatrix (m_MatWorldViewProjEffectHandle, &matWorldViewProj);
+               hr = s->pEffect->SetMatrix (s->m_MatWorldViewProjEffectHandle, &matWorldViewProj);
                if (FAILED (hr)) {
                        write_log (_T("%s: Create:SetMatrix:matWorldViewProj %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
@@ -930,37 +954,36 @@ static int psEffect_SetMatrices (D3DXMATRIXA16 *matProj, D3DXMATRIXA16 *matView,
        return 1;
 }
 
-static int psEffect_SetTextures (LPDIRECT3DTEXTURE9 lpSource, LPDIRECT3DTEXTURE9 lpWorking1,
-       LPDIRECT3DTEXTURE9 lpWorking2, LPDIRECT3DVOLUMETEXTURE9 lpHq2xLookupTexture)
+static int psEffect_SetTextures (LPDIRECT3DTEXTURE9 lpSource, LPDIRECT3DVOLUMETEXTURE9 lpHq2xLookupTexture, struct shaderdata *s)
 {
        HRESULT hr;
        D3DXVECTOR4 fDims, fTexelSize;
 
-       if (!m_SourceTextureEffectHandle) {
+       if (!s->m_SourceTextureEffectHandle) {
                write_log (_T("%s: Texture with SOURCETEXTURE semantic not found\n"), D3DHEAD);
                return 0;
        }
-       hr = pEffect->SetTexture (m_SourceTextureEffectHandle, lpSource);
+       hr = s->pEffect->SetTexture (s->m_SourceTextureEffectHandle, lpSource);
        if (FAILED (hr)) {
                write_log (_T("%s: SetTextures:lpSource %s\n"), D3DHEAD, D3D_ErrorString (hr));
                return 0;
        }
-       if (m_WorkingTexture1EffectHandle) {
-               hr = pEffect->SetTexture (m_WorkingTexture1EffectHandle, lpWorking1);
+       if (s->m_WorkingTexture1EffectHandle) {
+               hr = s->pEffect->SetTexture (s->m_WorkingTexture1EffectHandle, s->lpWorkTexture1);
                if (FAILED (hr)) {
                        write_log (_T("%s: SetTextures:lpWorking1 %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_WorkingTexture2EffectHandle) {
-               hr = pEffect->SetTexture (m_WorkingTexture2EffectHandle, lpWorking2);
+       if (s->m_WorkingTexture2EffectHandle) {
+               hr = s->pEffect->SetTexture (s->m_WorkingTexture2EffectHandle, s->lpWorkTexture2);
                if (FAILED (hr)) {
                        write_log (_T("%s: SetTextures:lpWorking2 %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
        if (m_Hq2xLookupTextureHandle) {
-               hr = pEffect->SetTexture (m_Hq2xLookupTextureHandle, lpHq2xLookupTexture);
+               hr = s->pEffect->SetTexture (m_Hq2xLookupTextureHandle, lpHq2xLookupTexture);
                if (FAILED (hr)) {
                        write_log (_T("%s: SetTextures:lpHq2xLookupTexture %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
@@ -978,15 +1001,15 @@ static int psEffect_SetTextures (LPDIRECT3DTEXTURE9 lpSource, LPDIRECT3DTEXTURE9
        fTexelSize.x = 1.0f / fDims.x;
        fTexelSize.y = 1.0f / fDims.y;
 
-       if (m_SourceDimsEffectHandle) {
-               hr = pEffect->SetVector (m_SourceDimsEffectHandle, &fDims);
+       if (s->m_SourceDimsEffectHandle) {
+               hr = s->pEffect->SetVector (s->m_SourceDimsEffectHandle, &fDims);
                if (FAILED (hr)) {
                        write_log (_T("%s: SetTextures:SetVector:Source %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
                }
        }
-       if (m_TexelSizeEffectHandle) {
-               hr = pEffect->SetVector (m_TexelSizeEffectHandle, &fTexelSize);
+       if (s->m_TexelSizeEffectHandle) {
+               hr = s->pEffect->SetVector (s->m_TexelSizeEffectHandle, &fTexelSize);
                if (FAILED (hr)) {
                        write_log (_T("%s: SetTextures:SetVector:Texel %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
@@ -996,19 +1019,20 @@ static int psEffect_SetTextures (LPDIRECT3DTEXTURE9 lpSource, LPDIRECT3DTEXTURE9
        return 1;
 }
 
-static int psEffect_Begin (LPD3DXEFFECT effect, enum psEffect_Pass pass, UINT *pPasses)
+static int psEffect_Begin (enum psEffect_Pass pass, UINT *pPasses, struct shaderdata *s)
 {
        HRESULT hr;
+       LPD3DXEFFECT effect = s->pEffect;
        switch (pass)
        {
        case psEffect_PreProcess1:
-               hr = effect->SetTechnique (m_PreprocessTechnique1EffectHandle);
+               hr = effect->SetTechnique (s->m_PreprocessTechnique1EffectHandle);
                break;
        case psEffect_PreProcess2:
-               hr = effect->SetTechnique (m_PreprocessTechnique2EffectHandle);
+               hr = effect->SetTechnique (s->m_PreprocessTechnique2EffectHandle);
                break;
        case psEffect_Combine:
-               hr = effect->SetTechnique (m_CombineTechniqueEffectHandle);
+               hr = effect->SetTechnique (s->m_CombineTechniqueEffectHandle);
                break;
        default:
                hr = S_OK;
@@ -1096,14 +1120,14 @@ static LPDIRECT3DTEXTURE9 createtext (int w, int h, D3DFORMAT format)
 
 static int worktex_width, worktex_height;
 
-static int allocextratextures (int index, int w, int h)
+static int allocextratextures (struct shaderdata *s, int w, int h)
 {
        HRESULT hr;
-       if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpWorkTexture1[index], NULL))) {
+       if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &s->lpWorkTexture1, NULL))) {
                write_log (_T("%s: Failed to create temp texture: %s\n"), D3DHEAD, D3D_ErrorString (hr));
                return 0;
        }
-       if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpWorkTexture2[index], NULL))) {
+       if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &s->lpWorkTexture2, NULL))) {
                write_log (_T("%s: Failed to create working texture2: %s\n"), D3DHEAD, D3D_ErrorString (hr));
                return 0;
        }
@@ -1120,8 +1144,12 @@ static int createamigatexture (int w, int h)
        write_log (_T("%s: %d*%d texture allocated, bits per pixel %d\n"), D3DHEAD, w, h, t_depth);
        if (psActive) {
                D3DLOCKED_BOX lockedBox;
-               if (!allocextratextures (0, w, h))
-                       return 0;
+               for (int i = 0; i < MAX_SHADERS; i++) {
+                       if (shaders[i].type == SHADERTYPE_BEFORE) {
+                               if (!allocextratextures (&shaders[i], w, h))
+                                       return 0;
+                       }
+               }
                if (FAILED (hr = lpHq2xLookupTexture->LockBox (0, &lockedBox, NULL, 0))) {
                        write_log (_T("%s: Failed to lock box of volume texture: %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
@@ -1137,6 +1165,7 @@ static int createtexture (int ow, int oh, int win_w, int win_h)
        HRESULT hr;
 
        int w, h;
+#if 0
        if (ow > win_w * multx && oh > win_h * multx) {
                w = ow;
                h = oh;
@@ -1144,20 +1173,32 @@ static int createtexture (int ow, int oh, int win_w, int win_h)
                w = win_w * multx;
                h = win_h * multx;
        }
+#else
+       w = ow;
+       h = oh;
+#endif
        worktex_width = w;
        worktex_height = h;
-       if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpTempTexture, NULL))) {
+       for (int i = 0; i < MAX_SHADERS; i++) {
+               if (shaders[i].type == SHADERTYPE_BEFORE || shaders[i].type == SHADERTYPE_AFTER) {
+                       if (FAILED (hr = d3ddev->CreateTexture (w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &shaders[i].lpTempTexture, NULL))) {
+                               write_log (_T("%s: Failed to create working texture1: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+                               return 0;
+                       }
+                       if (shaders[i].type == SHADERTYPE_AFTER) {
+                               if (!allocextratextures (&shaders[i], window_w, window_h))
+                                       return 0;
+                       }
+               }
+       }
+       if (FAILED (hr = d3ddev->CreateTexture (window_w, window_h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpPostTempTexture, NULL))) {
                write_log (_T("%s: Failed to create working texture1: %s\n"), D3DHEAD, D3D_ErrorString (hr));
                return 0;
        }
-       write_log (_T("%s: %d*%d working texture allocated, bits per pixel %d\n"), D3DHEAD, w, h, t_depth);
+       write_log (_T("%s: working texture allocated pre %d*%d, post %d*%d, bits per pixel %d\n"), D3DHEAD, w, h, window_w, window_h, t_depth);
        texelsize.x = 1.0f / w; texelsize.y = 1.0f / h; texelsize.z = 1; texelsize.w = 1; 
 
        if (psActive) {
-               if (extrapasses) {
-                       if (!allocextratextures (1, w, h))
-                               return 0;
-               }
                if (FAILED (hr = d3ddev->CreateVolumeTexture (256, 16, 256, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpHq2xLookupTexture, NULL))) {
                        write_log (_T("%s: Failed to create volume texture: %s\n"), D3DHEAD, D3D_ErrorString (hr));
                        return 0;
@@ -1792,7 +1833,7 @@ static void createvertex (void)
                write_log (_T("%s: Vertexbuffer unlock failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
 }
 
-static void settransform (void)
+static void settransform (struct shaderdata *s)
 {
        // Projection is (0,0,0) -> (1,1,1)
        MatrixOrthoOffCenterLH (&m_matPreProj, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
@@ -1800,7 +1841,6 @@ static void settransform (void)
        MatrixTranslation (&m_matPreView, -0.5f / tout_w, 0.5f / tout_h, 0.0f);
        // Identity for world
        D3DXMatrixIdentity (&m_matPreWorld);
-       psEffect_SetMatrices (&m_matProj, &m_matView, &m_matWorld);
 
        MatrixOrthoOffCenterLH (&m_matProj2, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
 
@@ -1808,26 +1848,27 @@ static void settransform (void)
        D3DXMatrixIdentity (&m_matWorld2);
 }
 
+static void settransform2 (struct shaderdata *s)
+{
+       // Projection is (0,0,0) -> (1,1,1)
+       MatrixOrthoOffCenterLH (&m_matPreProj, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
+       // Align texels with pixels
+       MatrixTranslation (&m_matPreView, -0.5f / window_w, 0.5f / window_h, 0.0f);
+       // Identity for world
+       D3DXMatrixIdentity (&m_matPreWorld);
+
+       MatrixOrthoOffCenterLH (&m_matProj2, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
+
+       MatrixTranslation (&m_matView2, 0.5f - 0.5f / window_w, 0.5f + 0.5f / window_h, 0.0f);
+       D3DXMatrixIdentity (&m_matWorld2);
+}
+
 static void freetextures (void)
 {
        if (texture) {
                texture->Release ();
                texture = NULL;
        }
-       if (lpTempTexture) {
-               lpTempTexture->Release ();
-               lpTempTexture = NULL;
-       }
-       for (int i = 0; i < MAX_PASSES; i++) {
-               if (lpWorkTexture1[i]) {
-                       lpWorkTexture1[i]->Release ();
-                       lpWorkTexture1[i] = NULL;
-               }
-               if (lpWorkTexture2[i]) {
-                       lpWorkTexture2[i]->Release ();
-                       lpWorkTexture2[i] = NULL;
-               }
-       }
        if (lpHq2xLookupTexture) {
                lpHq2xLookupTexture->Release ();
                lpHq2xLookupTexture = NULL;
@@ -1882,13 +1923,28 @@ static void invalidatedeviceobjects (void)
                cursorsurfaced3d->Release ();
                cursorsurfaced3d = NULL;
        }
-       if (pEffect) {
-               pEffect->Release ();
-               pEffect = NULL;
+       for (int i = 0; i < MAX_SHADERS; i++) {
+               if (shaders[i].pEffect) {
+                       shaders[i].pEffect->Release ();
+                       shaders[i].pEffect = NULL;
+               }
+               if (shaders[i].lpTempTexture) {
+                       shaders[i].lpTempTexture->Release ();
+                       shaders[i].lpTempTexture = NULL;
+               }
+               if (shaders[i].lpWorkTexture1) {
+                       shaders[i].lpWorkTexture1->Release ();
+                       shaders[i].lpWorkTexture1 = NULL;
+               }
+               if (shaders[i].lpWorkTexture2) {
+                       shaders[i].lpWorkTexture2->Release ();
+                       shaders[i].lpWorkTexture2 = NULL;
+               }
+               memset (&shaders[i], 0, sizeof (struct shaderdata));
        }
-       if (postEffect) {
-               postEffect->Release ();
-               postEffect = NULL;
+       if (lpPostTempTexture) {
+               lpPostTempTexture->Release();
+               lpPostTempTexture = NULL;
        }
        if (d3ddev)
                d3ddev->SetStreamSource (0, NULL, 0, 0);
@@ -1900,26 +1956,23 @@ static void invalidatedeviceobjects (void)
                d3dswapchain->Release ();
                d3dswapchain = NULL;
        }
-       m_MatWorldEffectHandle = NULL;
-       m_MatViewEffectHandle = NULL;
-       m_MatProjEffectHandle = NULL;
-       m_MatWorldViewEffectHandle = NULL;
-       m_MatViewProjEffectHandle = NULL;
-       m_MatWorldViewProjEffectHandle = NULL;
-       m_SourceDimsEffectHandle = NULL;
-       m_TexelSizeEffectHandle = NULL;
-       m_SourceTextureEffectHandle = NULL;
-       m_WorkingTexture1EffectHandle = NULL;
-       m_WorkingTexture2EffectHandle = NULL;
        m_Hq2xLookupTextureHandle = NULL;
-       m_PreprocessTechnique1EffectHandle = NULL;
-       m_PreprocessTechnique2EffectHandle = NULL;
-       m_CombineTechniqueEffectHandle = NULL;
        locked = 0;
        maskshift.x = maskshift.y = maskshift.z = maskshift.w = 0;
        maskmult.x = maskmult.y = maskmult.z = maskmult.w = 0;
 }
 
+static struct shaderdata *allocshaderslot (int type)
+{
+       for (int i = 0; i < MAX_SHADERS; i++) {
+               if (shaders[i].type == 0) {
+                       shaders[i].type = type;
+                       return &shaders[i];
+               }
+       }
+       return NULL;
+}
+
 static int restoredeviceobjects (void)
 {
        int vbsize;
@@ -1930,15 +1983,27 @@ static int restoredeviceobjects (void)
        getswapchain ();
 
        while (shaderon > 0) {
-               postEffect = psEffect_LoadEffect (psEnabled ? _T("_winuae.fx") : _T("_winuae_old.fx"), false);
-               if (!postEffect) {
+               shaders[SHADER_POST].type = SHADERTYPE_POST;
+               if (!psEffect_LoadEffect (psEnabled ? _T("_winuae.fx") : _T("_winuae_old.fx"), false, &shaders[SHADER_POST])) {
                        shaderon = 0;
                        break;
                }
-               if (currprefs.gfx_filtershader[0]) {
-                       if (!(pEffect = psEffect_LoadEffect (currprefs.gfx_filtershader, true))) {
-                               currprefs.gfx_filtershader[0] = changed_prefs.gfx_filtershader[0] = 0;
-                               break;
+               for (int i = 0; i < MAX_FILTERSHADERS; i++) {
+                       if (currprefs.gfx_filtershader[i][0]) {
+                               struct shaderdata *s = allocshaderslot (SHADERTYPE_BEFORE);
+                               if (!psEffect_LoadEffect (currprefs.gfx_filtershader[i], true, s)) {
+                                       currprefs.gfx_filtershader[i][0] = changed_prefs.gfx_filtershader[i][0] = 0;
+                                       break;
+                               }
+                       }
+               }
+               for (int i = 0; i < MAX_FILTERSHADERS; i++) {
+                       if (currprefs.gfx_filtershader[i + MAX_FILTERSHADERS][0]) {
+                               struct shaderdata *s = allocshaderslot (SHADERTYPE_AFTER);
+                               if (!psEffect_LoadEffect (currprefs.gfx_filtershader[i + MAX_FILTERSHADERS], true, s)) {
+                                       currprefs.gfx_filtershader[i + MAX_FILTERSHADERS][0] = changed_prefs.gfx_filtershader[i + MAX_FILTERSHADERS][0] = 0;
+                                       break;
+                               }
                        }
                }
                if (currprefs.gfx_filter_scanlines > 0) {
@@ -1980,7 +2045,7 @@ static int restoredeviceobjects (void)
        hr = d3ddev->SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
        hr = d3ddev->SetRenderState (D3DRS_LIGHTING, FALSE);
 
-       settransform ();
+       settransform (NULL);
 
        return 1;
 }
@@ -1997,7 +2062,6 @@ static void D3D_free2 (void)
                d3d = NULL;
        }
        d3d_enabled = 0;
-       psPreProcess = 0;
        psActive = 0;
        resetcount = 0;
        devicelost = 0;
@@ -2554,6 +2618,88 @@ void D3D_clear (void)
        }
 }
 
+static LPDIRECT3DTEXTURE9 processshader(LPDIRECT3DTEXTURE9 srctex, struct shaderdata *s, bool rendertarget)
+{
+       HRESULT hr;
+       UINT uPasses, uPass;
+       LPDIRECT3DSURFACE9 lpRenderTarget;
+       LPDIRECT3DSURFACE9 lpNewRenderTarget;
+       LPDIRECT3DTEXTURE9 lpWorkTexture;
+
+       if (!psEffect_SetTextures (srctex, lpHq2xLookupTexture, s))
+               return NULL;
+       if (s->psPreProcess) {
+               if (!psEffect_SetMatrices (&m_matPreProj, &m_matPreView, &m_matPreWorld, s))
+                       return NULL;
+
+               if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget)))
+                       write_log (_T("%s: GetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               lpWorkTexture = s->lpWorkTexture1;
+               lpNewRenderTarget = NULL;
+pass2:
+               if (FAILED (hr = lpWorkTexture->GetSurfaceLevel (0, &lpNewRenderTarget)))
+                       write_log (_T("%s: GetSurfaceLevel: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               if (FAILED (hr = d3ddev->SetRenderTarget (0, lpNewRenderTarget)))
+                       write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+
+               uPasses = 0;
+               if (psEffect_Begin ((lpWorkTexture == s->lpWorkTexture1) ? psEffect_PreProcess1 : psEffect_PreProcess2, &uPasses, s)) {
+                       for (uPass = 0; uPass < uPasses; uPass++) {
+                               if (psEffect_BeginPass (s->pEffect, uPass)) {
+                                       if (FAILED (hr = d3ddev->DrawPrimitive (D3DPT_TRIANGLESTRIP, 4, 2))) {
+                                               write_log (_T("%s: Effect DrawPrimitive failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+                                       }
+                                       psEffect_EndPass (s->pEffect);
+                               }
+                       }
+                       psEffect_End (s->pEffect);
+               }
+               if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget)))
+                       write_log (_T("%s: Effect RenderTarget reset failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               lpNewRenderTarget->Release ();
+               lpNewRenderTarget = NULL;
+               if (psEffect_hasPreProcess2 (s) && lpWorkTexture == s->lpWorkTexture1) {
+                       lpWorkTexture = s->lpWorkTexture2;
+                       goto pass2;
+               }
+               lpRenderTarget->Release ();
+               lpRenderTarget = NULL;
+       }
+       psEffect_SetMatrices (&m_matProj2, &m_matView2, &m_matWorld2, s);
+
+       if (rendertarget) {
+#if TWOPASS
+               if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget)))
+                       write_log (_T("%s: GetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               if (FAILED (hr = s->lpTempTexture->GetSurfaceLevel (0, &lpNewRenderTarget)))
+                       write_log (_T("%s: GetSurfaceLevel: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               if (FAILED (hr = d3ddev->SetRenderTarget (0, lpNewRenderTarget)))
+                       write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+#endif
+       }
+
+       uPasses = 0;
+       if (psEffect_Begin (psEffect_Combine, &uPasses, s)) {
+               for (uPass = 0; uPass < uPasses; uPass++) {
+                       if (!psEffect_BeginPass (s->pEffect, uPass))
+                               return NULL;
+                       if (FAILED (hr = d3ddev->DrawPrimitive (D3DPT_TRIANGLESTRIP, 0, 2)))
+                               write_log (_T("%s: Effect2 DrawPrimitive failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+                       psEffect_EndPass (s->pEffect);
+               }
+               psEffect_End (s->pEffect);
+       }
+       if (rendertarget) {
+#if TWOPASS
+               if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget)))
+                       write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               lpNewRenderTarget->Release ();
+               lpRenderTarget->Release ();
+#endif
+       }
+       return s->lpTempTexture;
+}
+
 static void D3D_render2 (void)
 {
        HRESULT hr;
@@ -2569,89 +2715,41 @@ static void D3D_render2 (void)
                write_log (_T("%s: BeginScene: %s\n"), D3DHEAD, D3D_ErrorString (hr));
                return;
        }
-       if (shaderon > 0 && postEffect) {
-               if (psActive) {
-                       LPDIRECT3DSURFACE9 lpRenderTarget;
-                       LPDIRECT3DSURFACE9 lpNewRenderTarget;
-                       LPDIRECT3DTEXTURE9 lpWorkTexture;
-
-                       settransform ();
-                       if (!psEffect_SetTextures (texture, lpWorkTexture1[0], lpWorkTexture2[0], lpHq2xLookupTexture))
-                               return;
-                       if (psPreProcess) {
-                               if (!psEffect_SetMatrices (&m_matPreProj, &m_matPreView, &m_matPreWorld))
+       if (shaderon > 0 && shaders[SHADER_POST].pEffect) {
+               for (int i = 0; i < MAX_SHADERS; i++) {
+                       struct shaderdata *s = &shaders[i];
+                       if (s->type == SHADERTYPE_BEFORE) {
+                               settransform (s);
+                               srctex = processshader (srctex, s, true);
+                               if (!srctex)
                                        return;
-
-                               if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget)))
-                                       write_log (_T("%s: GetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                               lpWorkTexture = lpWorkTexture1[0];
-                               lpNewRenderTarget = NULL;
-       pass2:
-                               if (FAILED (hr = lpWorkTexture->GetSurfaceLevel (0, &lpNewRenderTarget)))
-                                       write_log (_T("%s: GetSurfaceLevel: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                               if (FAILED (hr = d3ddev->SetRenderTarget (0, lpNewRenderTarget)))
-                                       write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-
-                               uPasses = 0;
-                               if (psEffect_Begin (pEffect, (lpWorkTexture == lpWorkTexture1[0]) ? psEffect_PreProcess1 : psEffect_PreProcess2, &uPasses)) {
-                                       for (uPass = 0; uPass < uPasses; uPass++) {
-                                               if (psEffect_BeginPass (pEffect, uPass)) {
-                                                       if (FAILED (hr = d3ddev->DrawPrimitive (D3DPT_TRIANGLESTRIP, 4, 2))) {
-                                                               write_log (_T("%s: Effect DrawPrimitive failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                                                       }
-                                                       psEffect_EndPass (pEffect);
-                                               }
-                                       }
-                                       psEffect_End (pEffect);
-                               }
-                               if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget)))
-                                       write_log (_T("%s: Effect RenderTarget reset failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                               lpNewRenderTarget->Release ();
-                               lpNewRenderTarget = NULL;
-                               if (psEffect_hasPreProcess2 () && lpWorkTexture == lpWorkTexture1[0]) {
-                                       lpWorkTexture = lpWorkTexture2[0];
-                                       goto pass2;
-                               }
-                               lpRenderTarget->Release ();
-                               lpRenderTarget = NULL;
                        }
-                       psEffect_SetMatrices (&m_matProj2, &m_matView2, &m_matWorld2);
+               }
+       }
 
 #if TWOPASS
-                       if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget)))
-                               write_log (_T("%s: GetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                       if (FAILED (hr = lpTempTexture->GetSurfaceLevel (0, &lpNewRenderTarget)))
-                               write_log (_T("%s: GetSurfaceLevel: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                       if (FAILED (hr = d3ddev->SetRenderTarget (0, lpNewRenderTarget)))
-                               write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-#endif
-                       hr = d3ddev->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, d3ddebug ? 0x80 : 0), 0, 0);
-
-                       uPasses = 0;
-                       if (psEffect_Begin (pEffect, psEffect_Combine, &uPasses)) {
-                               for (uPass = 0; uPass < uPasses; uPass++) {
-                                       if (!psEffect_BeginPass (pEffect, uPass))
-                                               return;
-                                       if (FAILED (hr = d3ddev->DrawPrimitive (D3DPT_TRIANGLESTRIP, 0, 2)))
-                                               write_log (_T("%s: Effect2 DrawPrimitive failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                                       psEffect_EndPass (pEffect);
-                               }
-                               psEffect_End (pEffect);
-                       }
-#if TWOPASS
-                       if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget)))
-                               write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-                       lpNewRenderTarget->Release ();
-                       lpRenderTarget->Release ();
-#endif
-                       srctex = lpTempTexture;
+       if (shaderon > 0 && shaders[SHADER_POST].pEffect) {
+               LPDIRECT3DSURFACE9 lpRenderTarget;
+               LPDIRECT3DSURFACE9 lpNewRenderTarget;
+               struct shaderdata *s = &shaders[SHADER_POST];
+               LPD3DXEFFECT postEffect = s->pEffect;
+               int after = -1;
 
+               for (int i = 0; i < MAX_SHADERS; i++) {
+                       struct shaderdata *s = &shaders[i];
+                       if (s->type == SHADERTYPE_AFTER)
+                               after = i;
                }
 
-       }
+               setupscenecoords ();
+               hr = d3ddev->SetTransform (D3DTS_PROJECTION, &m_matProj);
+               hr = d3ddev->SetTransform (D3DTS_VIEW, &m_matView);
+               hr = d3ddev->SetTransform (D3DTS_WORLD, &m_matWorld);
 
-#if TWOPASS
-       if (shaderon > 0 && postEffect) {
+               hr = postEffect->SetMatrix (postMatrixSource, &postproj);
+               hr = postEffect->SetVector (postMaskMult, &maskmult);
+               hr = postEffect->SetVector (postMaskShift, &maskshift);
+               hr = postEffect->SetVector (postTexelSize, &texelsize);
 
                if (masktexture) {
                        if (FAILED (hr = postEffect->SetTechnique (postTechnique)))
@@ -2671,14 +2769,18 @@ static void D3D_render2 (void)
 
                if (FAILED (hr = postEffect->SetTexture (postSourceTextureHandle, srctex)))
                        write_log (_T("%s: SetTexture(srctex) failed: %s\n"), D3DHEAD, D3D_ErrorString (hr));
-               setupscenecoords ();
-               hr = postEffect->SetMatrix (postMatrixSource, &postproj);
-               hr = postEffect->SetVector (postMaskMult, &maskmult);
-               hr = postEffect->SetVector (postMaskShift, &maskshift);
-               hr = postEffect->SetVector (postTexelSize, &texelsize);
+
+               if (after >= 0) {
+                       if (FAILED (hr = d3ddev->GetRenderTarget (0, &lpRenderTarget)))
+                               write_log (_T("%s: GetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+                       if (FAILED (hr = lpPostTempTexture->GetSurfaceLevel (0, &lpNewRenderTarget)))
+                               write_log (_T("%s: GetSurfaceLevel: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+                       if (FAILED (hr = d3ddev->SetRenderTarget (0, lpNewRenderTarget)))
+                               write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+               }
 
                uPasses = 0;
-               if (psEffect_Begin (postEffect, psEffect_None, &uPasses)) {
+               if (psEffect_Begin (psEffect_None, &uPasses, s)) {
                        for (uPass = 0; uPass < uPasses; uPass++) {
                                if (psEffect_BeginPass (postEffect, uPass)) {
                                        if (FAILED (hr = d3ddev->DrawPrimitive (D3DPT_TRIANGLESTRIP, 0, 2)))
@@ -2689,6 +2791,24 @@ static void D3D_render2 (void)
                        psEffect_End (postEffect);
                }
 
+               if (after >= 0) {
+                       if (FAILED (hr = d3ddev->SetRenderTarget (0, lpRenderTarget)))
+                               write_log (_T("%s: SetRenderTarget: %s\n"), D3DHEAD, D3D_ErrorString (hr));
+                       lpNewRenderTarget->Release ();
+                       lpRenderTarget->Release ();
+
+                       srctex = lpPostTempTexture;
+                       for (int i = 0; i < MAX_SHADERS; i++) {
+                               struct shaderdata *s = &shaders[i];
+                               if (s->type == SHADERTYPE_AFTER) {
+                                       settransform2 (s);
+                                       srctex = processshader (srctex, s, i != after);
+                                       if (!srctex)
+                                               return;
+                               }
+                       }
+               }
+
        } else {
 
                // non-shader version
index 9bc77b76a776b1c463b287a83a8b7af0b0308ea0..b809cd2ad29d162c6ef8847bf168544c4c5a231b 100644 (file)
       <Configuration>TestRelease</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectName>genblitter</ProjectName>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
   </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup>
     <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
@@ -126,6 +142,57 @@ genblitter.exe f &gt;..\..\blitfunc.cpp
 genblitter.exe h &gt;..\..\blitfunc.h
 genblitter.exe t &gt;..\..\blittable.cpp
 del genblitter.exe
+</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <Midl>
+      <TypeLibraryName>.\Release/genblitter_msvc.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeaderOutputFile>.\Release/genblitter_msvc.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <CompileAs>Default</CompileAs>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <PreLinkEvent>
+      <Message>deleting blitter files</Message>
+      <Command>del ..\..\blit.h
+del ..\..\blitfunc.cpp
+del ..\..\blitfunc.h
+del ..\..\blittable.cpp</Command>
+    </PreLinkEvent>
+    <Link>
+      <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+      <OutputFile>genblitter.exe</OutputFile>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <ProgramDatabaseFile>.\Release/genblitter.pdb</ProgramDatabaseFile>
+      <SubSystem>Console</SubSystem>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+    </Link>
+    <PostBuildEvent>
+      <Message>generating blitter files</Message>
+      <Command>genblitter.exe i &gt;..\..\blit.h
+genblitter.exe f &gt;..\..\blitfunc.cpp
+genblitter.exe h &gt;..\..\blitfunc.h
+genblitter.exe t &gt;..\..\blittable.cpp
+del genblitter.exe
 </Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
index b55431e0532c68ee9f5ff143a67a7cb96d1007c3..cd361aa4cfa4f349079c3cfca10fc0916953accd 100644 (file)
       <Configuration>TestRelease</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectName>gencomp</ProjectName>
     <CharacterSet>MultiByte</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <UseOfAtl>false</UseOfAtl>
+    <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
   </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup>
     <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
 od-win32\gencomp_msvc\gencomp.exe
 del od-win32\gencomp_msvc\gencomp.exe
 
+</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <Midl>
+      <TypeLibraryName>.\Release/gencomp_msvc.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeaderOutputFile>.\Release/gencomp_msvc.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <CompileAs>Default</CompileAs>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+      <OutputFile>gencomp.exe</OutputFile>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <ProgramDatabaseFile>.\Release/gencomp.pdb</ProgramDatabaseFile>
+      <SubSystem>Console</SubSystem>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+    </Link>
+    <PostBuildEvent>
+      <Message>generating gencomp files</Message>
+      <Command>cd ..\..
+od-win32\gencomp_msvc\gencomp.exe
+del od-win32\gencomp_msvc\gencomp.exe
+
 </Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
index c886114f790b0925d178eae2dee7120be5b84511..51f9f42a74b1cfbeb75bd85fd645d3d48e2902fc 100644 (file)
       <Configuration>TestRelease</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectName>gencpu</ProjectName>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
@@ -59,6 +69,9 @@
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">.\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <EmbedManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</EmbedManifest>
+    <EmbedManifest Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</EmbedManifest>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='TestRelease|Win32'">$(Configuration)\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='TestRelease|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='TestRelease|Win32'">false</LinkIncremental>
 del ..\..\cpustbl.cpp
 del ..\..\cpuemu.cpp
 
+</Command>
+    </PreLinkEvent>
+    <Link>
+      <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+      <OutputFile>gencpu.exe</OutputFile>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <ProgramDatabaseFile>.\Release/gencpu.pdb</ProgramDatabaseFile>
+      <SubSystem>Console</SubSystem>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+    </Link>
+    <PostBuildEvent>
+      <Message>generating gencpu files</Message>
+      <Command>cd ..\..
+od-win32\gencpu_msvc\gencpu.exe
+del od-win32\gencpu_msvc\gencpu.exe
+</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <Midl>
+      <TypeLibraryName>.\Release/gencpu_msvc.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeaderOutputFile>.\Release/gencpu_msvc.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <CompileAs>Default</CompileAs>
+      <CallingConvention>Cdecl</CallingConvention>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <PreLinkEvent>
+      <Message>deleting gencpu files</Message>
+      <Command>del ..\..\cputbl.h
+del ..\..\cpustbl.cpp
+del ..\..\cpuemu.cpp
+
 </Command>
     </PreLinkEvent>
     <Link>
index 349de0d6e02331e87f58ee6c68af059177c913d7..f1ad082585589aed9d9e9ee2f5579da3fe432ab0 100644 (file)
       <Configuration>Release</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectName>genlinetoscr</ProjectName>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
@@ -47,6 +57,9 @@
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">false</LinkIncremental>
       <Message>generating linetoscr.c</Message>
       <Command>genlinetoscr.exe &gt;..\..\linetoscr.cpp
 del genlinetoscr.exe
+</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <PreBuildEvent>
+      <Command>
+      </Command>
+    </PreBuildEvent>
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <PreLinkEvent>
+      <Message>deleteing linetoscr.cpp</Message>
+      <Command>del ..\..\linetoscr.cpp
+</Command>
+    </PreLinkEvent>
+    <Link>
+      <OutputFile>genlinetoscr.exe</OutputFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+    <PostBuildEvent>
+      <Message>generating linetoscr.c</Message>
+      <Command>genlinetoscr.exe &gt;..\..\linetoscr.cpp
+del genlinetoscr.exe
 </Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
index d2c000b8e45df958246919bda3accab714fb73ca..971328c9eb32d090c8befefa50bf6f7fd0b0ed0a 100644 (file)
@@ -1903,9 +1903,14 @@ int harddrive_to_hdf (HWND hDlg, struct uae_prefs *p, int idx)
        goto ok;
 
 err:
+       DWORD err = GetLastError ();
+       LPWSTR pBuffer = NULL;
        WIN32GUI_LoadUIString (IDS_HDCLONE_FAIL, tmp, MAX_DPATH);
-       _stprintf (tmp2, tmp, progressdialogreturn, GetLastError());
+       if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&pBuffer, 0, NULL))
+               pBuffer = NULL;
+       _stprintf (tmp2, tmp, progressdialogreturn, err, pBuffer ? _T("<unknown>") : pBuffer);
        gui_message (tmp2);
+       LocalFree (pBuffer);
 
 ok:
        if (h != INVALID_HANDLE_VALUE)
index 9a7dac872b453f5c154a4902057f6092004622f3..7b22e7ac3631d557aae14a5ac81f08a0ecb6d2c3 100644 (file)
       <Configuration>Release</Configuration>
       <Platform>x64</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|x64">
+      <Configuration>Test</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}</ProjectGuid>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <WholeProgramOptimization>false</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>StaticLibrary</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>StaticLibrary</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\..\..\lib\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\..\..\lib\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">$(SolutionDir)$(Configuration)\..\..\lib\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">$(Configuration)\</IntDir>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\..\..\..\lib\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|x64'">$(SolutionDir)$(Platform)\$(Configuration)\..\..\..\lib\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|x64'">$(Platform)\$(Configuration)\</IntDir>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(ProjectName)_x64</TargetName>
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Test|x64'">$(ProjectName)_x64</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <LinkTimeCodeGeneration>false</LinkTimeCodeGeneration>
     </Lib>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <WholeProgramOptimization>false</WholeProgramOptimization>
+      <AdditionalIncludeDirectories>..\..\prowizard\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <CallingConvention>StdCall</CallingConvention>
+      <CompileAs>Default</CompileAs>
+      <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+    </ClCompile>
+    <Lib>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+      <ModuleDefinitionFile>
+      </ModuleDefinitionFile>
+      <ExportNamedFunctions>
+      </ExportNamedFunctions>
+      <LinkTimeCodeGeneration>false</LinkTimeCodeGeneration>
+    </Lib>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
       <TargetEnvironment>X64</TargetEnvironment>
       <LinkTimeCodeGeneration>false</LinkTimeCodeGeneration>
     </Lib>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'">
+    <Midl>
+      <TargetEnvironment>X64</TargetEnvironment>
+    </Midl>
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <WholeProgramOptimization>false</WholeProgramOptimization>
+      <AdditionalIncludeDirectories>..\..\prowizard\include;..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <CallingConvention>StdCall</CallingConvention>
+      <CompileAs>Default</CompileAs>
+      <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+    </ClCompile>
+    <Lib>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+      <ModuleDefinitionFile>
+      </ModuleDefinitionFile>
+      <ExportNamedFunctions>prowizard_search;%(ExportNamedFunctions)</ExportNamedFunctions>
+      <LinkTimeCodeGeneration>false</LinkTimeCodeGeneration>
+    </Lib>
+  </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\..\prowizard\misc\misc.c" />
     <ClCompile Include="..\..\prowizard\prowiz.c" />
index 93f4ed6fd4bcdfcf3804eb713cc011657a2f745f..712d48f802238bde7b429e37d044d01af4f58785 100644 (file)
 #define IDC_LISTDIALOG_LIST             1813
 #define IDC_LOGPATH                     1814
 #define IDC_MIDIROUTER                  1815
+#define IDC_CDLIST                      1815
 #define IDC_CS_IDE4                     1816
 #define IDC_CS_DF0IDHW                  1817
+#define IDC_FILTERSTACK                 1818
 #define ID__FLOPPYDRIVES                40004
 #define ID_FLOPPYDRIVES_DF0             40005
 #define ID_ST_CONFIGURATION             40010
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        388
 #define _APS_NEXT_COMMAND_VALUE         40050
-#define _APS_NEXT_CONTROL_VALUE         1815
+#define _APS_NEXT_CONTROL_VALUE         1819
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
index 056a6f7e04c7d1d28dd02ffc20427495d0ca4375..53361a723ea5521882bf74760835785cde3f1221 100644 (file)
@@ -770,10 +770,10 @@ STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
     GROUPBOX        "Filter Settings",-1,1,1,393,146
-    COMBOBOX        IDC_FILTERMODE,20,15,188,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTERMODE,9,15,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_FILTERFILTER,215,15,63,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Reset to defaults",IDC_FILTERDEFAULT,283,15,106,14
-    COMBOBOX        IDC_FILTEROVERLAYTYPE,20,36,108,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_FILTEROVERLAYTYPE,9,36,118,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_FILTEROVERLAY,134,36,145,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     COMBOBOX        IDC_FILTERAUTOSCALE,284,36,104,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     RTEXT           "Horiz. size:",-1,7,63,81,10,SS_CENTERIMAGE
@@ -806,6 +806,7 @@ BEGIN
     PUSHBUTTON      "Load",IDC_FILTERPRESETLOAD,205,259,55,14
     PUSHBUTTON      "Save",IDC_FILTERPRESETSAVE,265,259,55,14
     PUSHBUTTON      "Delete",IDC_FILTERPRESETDELETE,325,259,55,14
+    COMBOBOX        IDC_FILTERSTACK,182,15,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
 END
 
 IDD_HARDDRIVE DIALOGEX 0, 0, 396, 109
@@ -1108,7 +1109,7 @@ BEGIN
     CONTROL         "",IDC_LISTDIALOG_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,7,302,171
 END
 
-IDD_CDDRIVE DIALOGEX 0, 0, 396, 109
+IDD_CDDRIVE DIALOGEX 0, 0, 395, 109
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "CD Settings"
 FONT 8, "MS Sans Serif", 0, 0, 0x0
@@ -1117,6 +1118,7 @@ BEGIN
     COMBOBOX        IDC_HDF_CONTROLLER,91,89,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     DEFPUSHBUTTON   "Add CD Drive",IDOK,236,87,73,14
     PUSHBUTTON      "Cancel",IDCANCEL,316,87,73,14
+    CONTROL         "",IDC_CDLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,4,387,77
 END
 
 
@@ -1705,7 +1707,7 @@ BEGIN
     IDS_NUMSG_KICKREPNO     "The floppy disk (image file) in DF0: is not compatible with the system ROM replacement functionality."
     IDS_NUMSG_NOROM         "Could not load system ROM, trying system ROM replacement."
     IDS_HDCLONE_OK          "Hard drive image file created succesfully."
-    IDS_HDCLONE_FAIL        "Hard drive image file creation failed.\nError code %d:%d."
+    IDS_HDCLONE_FAIL        "Hard drive image file creation failed.\nError %d:%d (%s)."
     IDS_NUMSG_KS68030       "The selected system ROM requires a 68030 CPU."
     IDS_NUMSG_EXPROMNEED    "One of the following expansion boot ROMs is required:\n\n%s\n\nCheck the System ROM path in the Paths panel and click Rescan ROMs."
     IDS_SB_FAVORITENAME     "Enter name..."
index e58ae48bc51fa214c9aae59d77f9918afae7fd33..1d7bf67614add47eb6e19aa0243a6bcc81b280c6 100644 (file)
@@ -9,6 +9,10 @@
       <Configuration>Release</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{6181E50C-5F32-42DC-BEF6-827AA8A5429D}</ProjectGuid>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
@@ -33,6 +43,9 @@
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">d:\amiga\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">d:\amiga\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\dev\include;$(IncludePath)</IncludePath>
+    <IncludePath Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">C:\dev\include;$(IncludePath)</IncludePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\dev\lib;$(LibraryPath)</LibraryPath>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">C:\dev\lib;$(LibraryPath)</LibraryPath>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\dev\include;$(IncludePath)</IncludePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\dev\lib;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
       <AdditionalLibraryDirectories>$(SolutionDir)\..\lib\</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;..\..\prowizard\include;..\tun;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_IE=0x0700;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <CallingConvention>StdCall</CallingConvention>
+      <StringPooling>true</StringPooling>
+      <ExceptionHandling>Sync</ExceptionHandling>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>zlibstat.lib;wininet.lib;lzmalib.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <DelayLoadDLLs>wininet.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <TargetMachine>MachineX86</TargetMachine>
+      <AdditionalLibraryDirectories>$(SolutionDir)\..\lib\</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\..\archivers\dms\crc_csum.cpp" />
     <ClCompile Include="..\..\archivers\dms\getbits.cpp" />
index 501a452d61de53be3ca1cacc5811f0778105768b..c10ff8ea1198bbae6c80099e855365557355a2a0 100644 (file)
       <Configuration>Release</Configuration>
       <Platform>x64</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|x64">
+      <Configuration>Test</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{98BA115B-829F-4085-9729-ABD0D779A60A}</ProjectGuid>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>false</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>StaticLibrary</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
   </ImportGroup>
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <OutDir>$(SolutionDir)$(Configuration)\..\..\lib\</OutDir>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <OutDir>$(SolutionDir)$(Configuration)\..\..\lib\</OutDir>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\..\..\..\lib\</OutDir>
     <TargetName>$(ProjectName)_x64</TargetName>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'">
+    <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\..\..\..\lib\</OutDir>
+    <TargetName>$(ProjectName)_x64</TargetName>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <OutDir>$(SolutionDir)$(Configuration)\..\..\lib\</OutDir>
   </PropertyGroup>
       </LinkLibraryDependencies>
     </ProjectReference>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WINVER=0x0500;NDEBUG;_WIN32_IE=0x0700;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <CallingConvention>StdCall</CallingConvention>
+      <AdditionalIncludeDirectories>..\..\include;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+    <ProjectReference>
+      <LinkLibraryDependencies>
+      </LinkLibraryDependencies>
+    </ProjectReference>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <OptimizeReferences>true</OptimizeReferences>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <CallingConvention>StdCall</CallingConvention>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;..\..\prowizard\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
index 105a1ec5c37ff2a195a66bc09231096b6da5a912..8c14b40ece7f3e27349fc6f9a704adba4c03d6b8 100644 (file)
 #define LANG_DLL 1
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("5")
+#define WINUAEBETA _T("6")
 #else
 #define WINUAEBETA _T("")
 #endif
-#define WINUAEDATE MAKEBD(2013, 2, 1)
+#define WINUAEDATE MAKEBD(2013, 2, 3)
 #define WINUAEEXTRA _T("")
 //#define WINUAEEXTRA _T("AmiKit Preview")
 #define WINUAEREV _T("")
index 84d675cb57771b4e17ba463ef0298a7747beb378..1b8ccae7ba4616a635c349c0802d7e25b3e3f190 100644 (file)
@@ -1711,8 +1711,11 @@ int check_prefs_changed_gfx (void)
        c |= currprefs.gfx_autoresolution != changed_prefs.gfx_autoresolution ? (2|8|16) : 0;
        c |= currprefs.gfx_api != changed_prefs.gfx_api ? (1|8|32) : 0;
 
+       for (int i = 0; i < 2 * MAX_FILTERSHADERS; i++) {
+               c |= _tcscmp (currprefs.gfx_filtershader[i], changed_prefs.gfx_filtershader[i]) ? (2|8) : 0;
+       }
+
        c |= currprefs.gfx_filter != changed_prefs.gfx_filter ? (2|8) : 0;
-       c |= _tcscmp (currprefs.gfx_filtershader, changed_prefs.gfx_filtershader) ? (2|8) : 0;
        c |= _tcscmp (currprefs.gfx_filtermask, changed_prefs.gfx_filtermask) ? (2|8) : 0;
        c |= _tcscmp (currprefs.gfx_filteroverlay, changed_prefs.gfx_filteroverlay) ? (2|8) : 0;
        c |= currprefs.gfx_filter_filtermode != changed_prefs.gfx_filter_filtermode ? (2|8) : 0;
@@ -1797,8 +1800,10 @@ int check_prefs_changed_gfx (void)
                        display_change_requested = 0;
                }
 
+               for (int i = 0; i < 2 * MAX_FILTERSHADERS; i++) {
+                       _tcscpy (currprefs.gfx_filtershader[i], changed_prefs.gfx_filtershader[i]);
+               }
                currprefs.gfx_filter = changed_prefs.gfx_filter;
-               _tcscpy (currprefs.gfx_filtershader, changed_prefs.gfx_filtershader);
                _tcscpy (currprefs.gfx_filtermask, changed_prefs.gfx_filtermask);
                _tcscpy (currprefs.gfx_filteroverlay, changed_prefs.gfx_filteroverlay);
                currprefs.gfx_filter_filtermode = changed_prefs.gfx_filter_filtermode;
index 29e52dac8c4f3bfc3b99830081184de935e8ee50..ccdbc551f558c1918de2e06f3fd5ce4ae33df94d 100644 (file)
@@ -137,6 +137,7 @@ extern int mouseactive;
 TCHAR config_filename[256] = _T("");
 static TCHAR stored_path[MAX_DPATH];
 static int gui_size_changed;
+static int filterstackpos = 0;
 
 #define Error(x) MessageBox (NULL, (x), _T("WinUAE Error"), MB_OK)
 
@@ -3581,6 +3582,7 @@ static int clicked_entry = -1;
 #define INPUTMAP_COLUMNS 1
 #define MISC1_COLUMNS 1
 #define MAX_COLUMN_HEADING_WIDTH 20
+#define CD_COLUMNS 3
 
 #define LV_LOADSAVE 1
 #define LV_HARDDISK 2
@@ -3589,7 +3591,8 @@ static int clicked_entry = -1;
 #define LV_MISC2 5
 #define LV_INPUTMAP 6
 #define LV_MISC1 7
-#define LV_MAX 8
+#define LV_CD 8
+#define LV_MAX 9
 
 static int lv_oldidx[LV_MAX];
 static int lv_old_type = -1;
@@ -3707,7 +3710,7 @@ void InitializeListView (HWND hDlg)
                list = GetDlgItem (hDlg, IDC_MISCLIST);
                extraflags = LVS_EX_CHECKBOXES;
 
-       } else {
+       } else if (hDlg == pages[DISK_ID]) {
 
                listview_num_columns = DISK_COLUMNS;
                lv_type = LV_DISK;
@@ -3716,6 +3719,14 @@ void InitializeListView (HWND hDlg)
                WIN32GUI_LoadUIString (IDS_DISK_DRIVENAME, column_heading[2], MAX_COLUMN_HEADING_WIDTH);
                list = GetDlgItem (hDlg, IDC_DISK);
 
+       } else {
+               // CD dialog
+               listview_num_columns = CD_COLUMNS;
+               lv_type = LV_CD;
+               _tcscpy (column_heading[0], _T("*"));
+               WIN32GUI_LoadUIString (IDS_DEVICE, column_heading[1], MAX_COLUMN_HEADING_WIDTH);
+               WIN32GUI_LoadUIString (IDS_PATH, column_heading[2], MAX_COLUMN_HEADING_WIDTH);
+               list = GetDlgItem (hDlg, IDC_CDLIST);
        }
 
        int flags = LVS_EX_DOUBLEBUFFER | extraflags;
@@ -3878,10 +3889,35 @@ void InitializeListView (HWND hDlg)
                listview_column_width[1] = 336;
                listview_column_width[2] = 50;
 
+       } else if (lv_type == LV_CD) {
+
+               listview_column_width[2] = 450;
+               for (i = 0; i < MAX_TOTAL_SCSI_DEVICES; i++) {
+                       TCHAR tmp[10];
+                       struct device_info di = { 0 };
+                       struct cdslot *cds = &workprefs.cdslots[i];                     
+                       
+                       if (cds->inuse)
+                               blkdev_get_info (&workprefs, i, &di);
+                       _stprintf (tmp, _T("%d"), i);
+                       lvstruct.mask     = LVIF_TEXT | LVIF_PARAM;
+                       lvstruct.pszText  = cds->inuse ? (di.media_inserted ? _T("*") : _T("E")) : _T("-");
+                       lvstruct.lParam   = 0;
+                       lvstruct.iItem    = i;
+                       lvstruct.iSubItem = 0;
+                       result = ListView_InsertItem (list, &lvstruct);
+                       ListView_SetItemText(list, result, 1, tmp);
+                       ListView_SetItemText(list, result, 2, cds->name);
+                       width = ListView_GetStringWidth(list, cds->name) + 10;
+                       if (width > listview_column_width[2])
+                               listview_column_width[2] = width;
+                       break;
+               }
+
        } else if (lv_type == LV_HARDDISK) {
 #ifdef FILESYS
                listview_column_width[1] = 60;
-               for(i = 0; i < workprefs.mountitems; i++)
+               for (i = 0; i < workprefs.mountitems; i++)
                {
                        struct uaedev_config_data *uci = &workprefs.mountconfig[i];
                        struct uaedev_config_info *ci = &uci->ci;
@@ -9183,10 +9219,12 @@ static void default_fsvdlg (struct fsvdlg_vals *f)
 }
 static void default_hfdlg (struct hfdlg_vals *f, bool rdb)
 {
+       int ctrl = f->ci.controller;
        memset (f, 0, sizeof (struct hfdlg_vals));
        uci_set_defaults (&f->ci, rdb);
        f->original = true;
        f->ci.type = UAEDEV_HDF;
+       f->ci.controller = ctrl;
 }
 
 static void volumeselectfile (HWND hDlg)
@@ -9576,11 +9614,21 @@ static INT_PTR CALLBACK CDDriveSettingsProc (HWND hDlg, UINT msg, WPARAM wParam,
        case WM_INITDIALOG:
                recursive++;
                inithdcontroller (hDlg);
+               if (current_cddlg.ci.controller < HD_CONTROLLER_IDE0)
+                       current_cddlg.ci.controller = (workprefs.cs_a2091 || workprefs.cs_cdtvscsi || workprefs.cs_mbdmac == 1) ? HD_CONTROLLER_SCSI0 : HD_CONTROLLER_IDE0;
                SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_SETCURSEL, current_cddlg.ci.controller, 0);
+               InitializeListView (hDlg);
                recursive--;
                customDlgType = IDD_CDDRIVE;
                customDlg = hDlg;
                return TRUE;
+       case WM_NOTIFY:
+               if (((LPNMHDR) lParam)->idFrom == IDC_CDLIST) {
+                       NM_LISTVIEW *nmlistview = (NM_LISTVIEW *)lParam;
+                       if (nmlistview->hdr.code == NM_DBLCLK)
+                               EndDialog (hDlg, 1);
+               }
+               break;          
        case WM_COMMAND:
                if (recursive)
                        break;
@@ -13433,6 +13481,7 @@ static void enable_for_hw3ddlg (HWND hDlg)
        ew (hDlg, IDC_FILTERXTRA, vv2);
        ew (hDlg, IDC_FILTERDEFAULT, v);
        ew (hDlg, IDC_FILTERFILTER, workprefs.gfx_api);
+       ew (hDlg, IDC_FILTERSTACK, workprefs.gfx_api);
        ew (hDlg, IDC_FILTERKEEPASPECT, v);
        ew (hDlg, IDC_FILTERASPECT, v);
        ew (hDlg, IDC_FILTERASPECT2, v && workprefs.gfx_filter_keep_aspect);
@@ -13623,6 +13672,14 @@ static void values_to_hw3ddlg (HWND hDlg)
        SendDlgItemMessage (hDlg, IDC_FILTERAUTOSCALE, CB_ADDSTRING, 0, (LPARAM)txt);
        SendDlgItemMessage (hDlg, IDC_FILTERAUTOSCALE, CB_SETCURSEL, workprefs.gfx_filter_autoscale, 0);
 
+       SendDlgItemMessage (hDlg, IDC_FILTERSTACK, CB_RESETCONTENT, 0, 0);
+       for (int i = -4; i <= 3; i++) {
+               int j = i < 0 ? i : i + 1;
+               _stprintf (tmp, _T("%d%s"), j, workprefs.gfx_filtershader[i + 4][0] ? _T(" *") : _T(""));
+               SendDlgItemMessage (hDlg, IDC_FILTERSTACK, CB_ADDSTRING, 0, (LPARAM)tmp);
+       }
+       SendDlgItemMessage (hDlg, IDC_FILTERSTACK, CB_SETCURSEL, filterstackpos, 0);
+
        int range1 = workprefs.gfx_filter_autoscale == AUTOSCALE_MANUAL ? -1 : -9999;
        int range2 = workprefs.gfx_filter_autoscale == AUTOSCALE_MANUAL ? 1800 : 9999;
 
@@ -13652,6 +13709,7 @@ static void values_to_hw3ddlg (HWND hDlg)
                i++;
        }
        if (workprefs.gfx_api && D3D_canshaders ()) {
+               bool gotit = false;
                HANDLE h;
                WIN32_FIND_DATA wfd;
                TCHAR tmp[MAX_DPATH];
@@ -13664,8 +13722,10 @@ static void values_to_hw3ddlg (HWND hDlg)
                                _stprintf (tmp2, _T("D3D: %s"), wfd.cFileName);
                                tmp2[_tcslen (tmp2) - 3] = 0;
                                SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_ADDSTRING, 0, (LPARAM)tmp2);
-                               if (workprefs.gfx_api && !_tcscmp (workprefs.gfx_filtershader, wfd.cFileName))
+                               if (workprefs.gfx_api && !_tcscmp (workprefs.gfx_filtershader[filterstackpos], wfd.cFileName)) {
                                        fltnum = j;
+                                       gotit = true;
+                               }
                                j++;
                        }
                        if (!FindNextFile (h, &wfd)) {
@@ -13673,6 +13733,10 @@ static void values_to_hw3ddlg (HWND hDlg)
                                h = INVALID_HANDLE_VALUE;
                        }
                }
+               for (int i = 1; i < 2 * MAX_FILTERSHADERS; i++) {
+                       if (workprefs.gfx_filtershader[i][0] && !gotit)
+                               fltnum = UAE_FILTER_NULL;
+               }
        }
        int overlaytype = SendDlgItemMessage (hDlg, IDC_FILTEROVERLAYTYPE, CB_GETCURSEL, 0, 0L);
        if (workprefs.gfx_api && D3D_goodenough () > 1) {
@@ -13954,9 +14018,9 @@ static void filter_handle (HWND hDlg)
                int of = workprefs.gfx_filter;
                int off = workprefs.gfx_filter_filtermode;
                tmp[0] = 0;
-               _tcscpy (oldsh, workprefs.gfx_filtershader);
+               _tcscpy (oldsh, workprefs.gfx_filtershader[filterstackpos]);
                SendDlgItemMessage (hDlg, IDC_FILTERMODE, CB_GETLBTEXT, (WPARAM)item, (LPARAM)tmp);
-               workprefs.gfx_filtershader[0] = 0;
+               workprefs.gfx_filtershader[filterstackpos][0] = 0;
                workprefs.gfx_filter = 0;
                workprefs.gfx_filter_filtermode = 0;
                if (workprefs.gfx_api) {
@@ -13966,7 +14030,7 @@ static void filter_handle (HWND hDlg)
                }
                if (item > 0) {
                        if (item > UAE_FILTER_LAST) {
-                               _stprintf (workprefs.gfx_filtershader, _T("%s.fx"), tmp + 5);
+                               _stprintf (workprefs.gfx_filtershader[filterstackpos], _T("%s.fx"), tmp + 5);
                        } else {
                                item--;
                                workprefs.gfx_filter = uaefilters[item].type;
@@ -13976,6 +14040,10 @@ static void filter_handle (HWND hDlg)
                                hw3d_changed = 1;
                        }
                }
+               for (int i = 1; i < MAX_FILTERSHADERS; i++) {
+                       if (workprefs.gfx_filtershader[i][0])
+                               workprefs.gfx_filter = UAE_FILTER_NULL;
+               }
                if (workprefs.gfx_filter == 0 && !workprefs.gfx_api)
                        workprefs.gfx_filter_autoscale = 0;
        }
@@ -14104,6 +14172,14 @@ static INT_PTR CALLBACK hw3dDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
                        if (HIWORD (wParam) == CBN_SELCHANGE || HIWORD (wParam) == CBN_KILLFOCUS)  {
                                switch (LOWORD (wParam))
                                {
+                               case IDC_FILTERSTACK:
+                                       item = SendDlgItemMessage (hDlg, IDC_FILTERSTACK, CB_GETCURSEL, 0, 0L);
+                                       if (item != CB_ERR) {
+                                               filterstackpos = item;
+                                               values_to_hw3ddlg (hDlg);
+                                               enable_for_hw3ddlg (hDlg);
+                                       }
+                                       break;
                                case IDC_FILTERAUTOSCALE:
                                        item = SendDlgItemMessage (hDlg, IDC_FILTERAUTOSCALE, CB_GETCURSEL, 0, 0L);
                                        if (item != CB_ERR) {
index d54f5bc57406068138938428e20a27c2d2b78689..81261be79fc90b7eee20e3d8c67463fd952202db 100644 (file)
@@ -1,5 +1,5 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winuae", "winuae_msvc.vcxproj", "{4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencpu", "..\gencpu_msvc\gencpu_msvc.vcxproj", "{DEF7ACF7-050E-4069-BB99-5B5D93F60521}"
@@ -38,6 +38,8 @@ Global
                FullRelease|x64 = FullRelease|x64
                Release|Win32 = Release|Win32
                Release|x64 = Release|x64
+               Test|Win32 = Test|Win32
+               Test|x64 = Test|x64
        EndGlobalSection
        GlobalSection(ProjectConfigurationPlatforms) = postSolution
                {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -52,90 +54,122 @@ Global
                {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Release|Win32.Build.0 = Release|Win32
                {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Release|x64.ActiveCfg = Release|x64
                {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Release|x64.Build.0 = Release|x64
+               {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Test|Win32.ActiveCfg = Test|Win32
+               {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Test|Win32.Build.0 = Test|Win32
+               {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Test|x64.ActiveCfg = Test|x64
+               {4ADAA943-1AC8-4FB5-82E5-4FB753B6C2DA}.Test|x64.Build.0 = Test|x64
                {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.Debug|Win32.ActiveCfg = Debug|Win32
                {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.Debug|x64.ActiveCfg = Debug|Win32
                {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.Release|Win32.ActiveCfg = Release|Win32
                {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.Release|x64.ActiveCfg = Release|Win32
+               {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.Test|Win32.ActiveCfg = Test|Win32
+               {DEF7ACF7-050E-4069-BB99-5B5D93F60521}.Test|x64.ActiveCfg = Test|Win32
                {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.Debug|Win32.ActiveCfg = Debug|Win32
                {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.Debug|x64.ActiveCfg = Debug|Win32
                {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.Release|Win32.ActiveCfg = Release|Win32
                {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.Release|x64.ActiveCfg = Release|Win32
+               {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.Test|Win32.ActiveCfg = Test|Win32
+               {54197DFF-9CAA-4A9F-B9C2-2881EA04EACB}.Test|x64.ActiveCfg = Test|Win32
                {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.Debug|Win32.ActiveCfg = Debug|Win32
                {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.Debug|x64.ActiveCfg = Debug|Win32
                {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.Release|Win32.ActiveCfg = Release|Win32
                {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.Release|x64.ActiveCfg = Release|Win32
+               {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.Test|Win32.ActiveCfg = Test|Win32
+               {765B0AF0-B8D3-4998-89AF-D6F939E1CD18}.Test|x64.ActiveCfg = Test|Win32
                {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.Debug|Win32.ActiveCfg = Debug|Win32
                {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.Debug|x64.ActiveCfg = Debug|Win32
                {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.Release|Win32.ActiveCfg = Release|Win32
                {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.Release|x64.ActiveCfg = Release|Win32
+               {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.Test|Win32.ActiveCfg = Test|Win32
+               {AF3DBBDE-E006-4DC3-9A26-CB0D7D82AE3C}.Test|x64.ActiveCfg = Test|Win32
                {DAF2EB1A-546A-41B3-9755-187562C01E3C}.Debug|Win32.ActiveCfg = Debug|Win32
                {DAF2EB1A-546A-41B3-9755-187562C01E3C}.Debug|x64.ActiveCfg = Debug|Win32
                {DAF2EB1A-546A-41B3-9755-187562C01E3C}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {DAF2EB1A-546A-41B3-9755-187562C01E3C}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {DAF2EB1A-546A-41B3-9755-187562C01E3C}.Release|Win32.ActiveCfg = Release|Win32
                {DAF2EB1A-546A-41B3-9755-187562C01E3C}.Release|x64.ActiveCfg = Release|Win32
+               {DAF2EB1A-546A-41B3-9755-187562C01E3C}.Test|Win32.ActiveCfg = Test|Win32
+               {DAF2EB1A-546A-41B3-9755-187562C01E3C}.Test|x64.ActiveCfg = Test|Win32
                {C85288FB-A035-42CA-B5FB-8E6214319E97}.Debug|Win32.ActiveCfg = Debug|Win32
                {C85288FB-A035-42CA-B5FB-8E6214319E97}.Debug|x64.ActiveCfg = Debug|Win32
                {C85288FB-A035-42CA-B5FB-8E6214319E97}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {C85288FB-A035-42CA-B5FB-8E6214319E97}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {C85288FB-A035-42CA-B5FB-8E6214319E97}.Release|Win32.ActiveCfg = Release|Win32
                {C85288FB-A035-42CA-B5FB-8E6214319E97}.Release|x64.ActiveCfg = Release|Win32
+               {C85288FB-A035-42CA-B5FB-8E6214319E97}.Test|Win32.ActiveCfg = Test|Win32
+               {C85288FB-A035-42CA-B5FB-8E6214319E97}.Test|x64.ActiveCfg = Test|Win32
                {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.Debug|Win32.ActiveCfg = Debug|Win32
                {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.Debug|x64.ActiveCfg = Debug|Win32
                {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.Release|Win32.ActiveCfg = Release|Win32
                {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.Release|x64.ActiveCfg = Release|Win32
+               {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.Test|Win32.ActiveCfg = Test|Win32
+               {960E83B5-9118-4EBD-AF50-18EFC1DC764B}.Test|x64.ActiveCfg = Test|Win32
                {79BDABE6-5308-4D64-8884-A5A35909D8D3}.Debug|Win32.ActiveCfg = Debug|Win32
                {79BDABE6-5308-4D64-8884-A5A35909D8D3}.Debug|x64.ActiveCfg = Debug|Win32
                {79BDABE6-5308-4D64-8884-A5A35909D8D3}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {79BDABE6-5308-4D64-8884-A5A35909D8D3}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {79BDABE6-5308-4D64-8884-A5A35909D8D3}.Release|Win32.ActiveCfg = Release|Win32
                {79BDABE6-5308-4D64-8884-A5A35909D8D3}.Release|x64.ActiveCfg = Release|Win32
+               {79BDABE6-5308-4D64-8884-A5A35909D8D3}.Test|Win32.ActiveCfg = Test|Win32
+               {79BDABE6-5308-4D64-8884-A5A35909D8D3}.Test|x64.ActiveCfg = Test|Win32
                {E9F73E11-A463-45C6-A733-2BED75852BA1}.Debug|Win32.ActiveCfg = Debug|Win32
                {E9F73E11-A463-45C6-A733-2BED75852BA1}.Debug|x64.ActiveCfg = Debug|Win32
                {E9F73E11-A463-45C6-A733-2BED75852BA1}.FullRelease|Win32.ActiveCfg = FullRelease|Win32
                {E9F73E11-A463-45C6-A733-2BED75852BA1}.FullRelease|x64.ActiveCfg = FullRelease|Win32
                {E9F73E11-A463-45C6-A733-2BED75852BA1}.Release|Win32.ActiveCfg = Release|Win32
                {E9F73E11-A463-45C6-A733-2BED75852BA1}.Release|x64.ActiveCfg = Release|Win32
+               {E9F73E11-A463-45C6-A733-2BED75852BA1}.Test|Win32.ActiveCfg = Test|Win32
+               {E9F73E11-A463-45C6-A733-2BED75852BA1}.Test|x64.ActiveCfg = Test|Win32
                {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.Debug|Win32.ActiveCfg = Debug|Win32
                {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.Debug|x64.ActiveCfg = Debug|Win32
                {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.FullRelease|Win32.ActiveCfg = Release|Win32
                {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.FullRelease|x64.ActiveCfg = Release|Win32
                {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.Release|Win32.ActiveCfg = Release|Win32
                {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.Release|x64.ActiveCfg = Release|Win32
+               {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.Test|Win32.ActiveCfg = Test|Win32
+               {38FAC3FB-A2B7-453F-8A6A-73B97201BB04}.Test|x64.ActiveCfg = Test|Win32
                {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.Debug|Win32.ActiveCfg = Debug|Win32
                {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.Debug|x64.ActiveCfg = Debug|Win32
                {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.FullRelease|Win32.ActiveCfg = Release|Win32
                {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.FullRelease|x64.ActiveCfg = Release|Win32
                {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.Release|Win32.ActiveCfg = Release|Win32
                {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.Release|x64.ActiveCfg = Release|Win32
+               {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.Test|Win32.ActiveCfg = Test|Win32
+               {6181E50C-5F32-42DC-BEF6-827AA8A5429D}.Test|x64.ActiveCfg = Test|Win32
                {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.Debug|Win32.ActiveCfg = Debug|Win32
                {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.Debug|x64.ActiveCfg = Debug|Win32
                {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.FullRelease|Win32.ActiveCfg = Release|Win32
                {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.FullRelease|x64.ActiveCfg = Release|Win32
                {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.Release|Win32.ActiveCfg = Release|Win32
                {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.Release|x64.ActiveCfg = Release|x64
+               {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.Test|Win32.ActiveCfg = Test|Win32
+               {2C44DD04-F5D6-4CC3-B0D6-1F4E51A0D962}.Test|x64.ActiveCfg = Test|x64
                {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Debug|Win32.ActiveCfg = Debug|Win32
                {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Debug|x64.ActiveCfg = Debug|Win32
                {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.FullRelease|Win32.ActiveCfg = Release|Win32
                {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.FullRelease|x64.ActiveCfg = Release|Win32
                {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Release|Win32.ActiveCfg = Release|Win32
                {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Release|x64.ActiveCfg = Release|x64
+               {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Test|Win32.ActiveCfg = Test|Win32
+               {8627DA33-98D1-4F60-B404-ECCEE0EE7BF9}.Test|x64.ActiveCfg = Test|x64
                {98BA115B-829F-4085-9729-ABD0D779A60A}.Debug|Win32.ActiveCfg = Debug|Win32
                {98BA115B-829F-4085-9729-ABD0D779A60A}.Debug|x64.ActiveCfg = Debug|Win32
                {98BA115B-829F-4085-9729-ABD0D779A60A}.FullRelease|Win32.ActiveCfg = Release|Win32
                {98BA115B-829F-4085-9729-ABD0D779A60A}.FullRelease|x64.ActiveCfg = Release|Win32
                {98BA115B-829F-4085-9729-ABD0D779A60A}.Release|Win32.ActiveCfg = Release|Win32
                {98BA115B-829F-4085-9729-ABD0D779A60A}.Release|x64.ActiveCfg = Release|x64
+               {98BA115B-829F-4085-9729-ABD0D779A60A}.Test|Win32.ActiveCfg = Test|Win32
+               {98BA115B-829F-4085-9729-ABD0D779A60A}.Test|x64.ActiveCfg = Test|x64
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
index d4da90058c3309ce0c9158134b78b4b2a5ffe442..c831dd704af3ffa22c146b42efa3436fd9feee31 100644 (file)
       <Configuration>Release</Configuration>
       <Platform>x64</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|Win32">
+      <Configuration>Test</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Test|x64">
+      <Configuration>Test</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectName>winuae</ProjectName>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110_xp</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
@@ -79,6 +99,9 @@
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</GenerateManifest>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">d:\amiga\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">d:\amiga\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">false</LinkIncremental>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">d:\amiga\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Test|x64'">d:\amiga\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Test|x64'">$(Platform)\$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Test|x64'">false</LinkIncremental>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</GenerateManifest>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">d:\amiga\</OutDir>
     <IntDir Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">$(Configuration)\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">false</LinkIncremental>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</GenerateManifest>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">winuae64</TargetName>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">winuae64</TargetName>
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Test|x64'">winuae64</TargetName>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">winuae64</TargetName>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
+    <IncludePath Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;C:\dev\lib;C:\dev\WinDDK\7600.16385.1\lib\win7\i386;$(LibraryPath)</LibraryPath>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;C:\dev\lib;C:\dev\WinDDK\7600.16385.1\lib\win7\i386;$(LibraryPath)</LibraryPath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;C:\dev\lib;C:\dev\WinDDK\7600.16385.1\lib\win7\i386;$(LibraryPath)</LibraryPath>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
     <ReferencePath Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">$(ReferencePath)</ReferencePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;C:\dev\lib;$(LibraryPath)</LibraryPath>
     <EmbedManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</EmbedManifest>
+    <EmbedManifest Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">true</EmbedManifest>
     <EmbedManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</EmbedManifest>
     <EmbedManifest Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">true</EmbedManifest>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">C:\dev\include;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath)</IncludePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">C:\dev\lib\x64;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath)</LibraryPath>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
+    <IncludePath Condition="'$(Configuration)|$(Platform)'=='Test|x64'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;C:\dev\lib\x64;$(LibraryPath)</LibraryPath>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Test|x64'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;C:\dev\lib\x64;$(LibraryPath)</LibraryPath>
     <IncludePath Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;C:\dev\include;$(IncludePath)</IncludePath>
     <LibraryPath Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;C:\dev\lib\x64;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
       <AdditionalOptions>/validate_manifest %(AdditionalOptions)</AdditionalOptions>
     </Manifest>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">
+    <Midl>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <TargetEnvironment>Win32</TargetEnvironment>
+      <TypeLibraryName>.\Release/winuae_msvc.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
+      <OmitFramePointers>false</OmitFramePointers>
+      <WholeProgramOptimization>false</WholeProgramOptimization>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;..\..\prowizard\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WINVER=0x0500;NDEBUG;_WIN32_IE=0x0700;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <ExceptionHandling>Sync</ExceptionHandling>
+      <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
+      <FloatingPointModel>Precise</FloatingPointModel>
+      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <PrecompiledHeaderOutputFile>.\Test/winuae_msvc.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\Test/</AssemblerListingLocation>
+      <ObjectFileName>.\Test/</ObjectFileName>
+      <ProgramDataBaseFileName>.\Test/</ProgramDataBaseFileName>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <CallingConvention>StdCall</CallingConvention>
+      <CompileAs>Default</CompileAs>
+      <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+      <ForcedIncludeFiles>%(ForcedIncludeFiles)</ForcedIncludeFiles>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalDependencies>ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;libpng15.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;enet.lib;lzmalib.lib;prowizard.lib;libFLAC_static.lib;Avrt.lib;hid.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\</AdditionalLibraryDirectories>
+      <AdditionalManifestDependencies>%(AdditionalManifestDependencies)</AdditionalManifestDependencies>
+      <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+      <DelayLoadDLLs>wpcap.dll;packet.dll;d3dx9_43.dll;openal32.dll;wintab32.dll;portaudio_x86.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;wininet.dll;avrt.dll;ddraw.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ProgramDatabaseFile>.\Test/winuae.pdb</ProgramDatabaseFile>
+      <SubSystem>Windows</SubSystem>
+      <StackReserveSize>2621440</StackReserveSize>
+      <StackCommitSize>2621440</StackCommitSize>
+      <LargeAddressAware>true</LargeAddressAware>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <LinkTimeCodeGeneration>
+      </LinkTimeCodeGeneration>
+      <RandomizedBaseAddress>true</RandomizedBaseAddress>
+      <FixedBaseAddress>false</FixedBaseAddress>
+      <DataExecutionPrevention>true</DataExecutionPrevention>
+      <TargetMachine>MachineX86</TargetMachine>
+      <MinimumRequiredVersion>5.01</MinimumRequiredVersion>
+      <ImageHasSafeExceptionHandlers>
+      </ImageHasSafeExceptionHandlers>
+    </Link>
+    <Manifest>
+      <AdditionalManifestFiles>../resources/winuae.exe.manifest</AdditionalManifestFiles>
+      <EnableDPIAwareness>true</EnableDPIAwareness>
+      <OutputManifestFile>$(IntDir)$(TargetName)$(TargetExt).embed.manifest</OutputManifestFile>
+      <AdditionalOptions>/validate_manifest %(AdditionalOptions)</AdditionalOptions>
+    </Manifest>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <EnableDPIAwareness>true</EnableDPIAwareness>
     </Manifest>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Test|x64'">
+    <Midl>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MkTypLibCompatible>true</MkTypLibCompatible>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <TargetEnvironment>X64</TargetEnvironment>
+      <TypeLibraryName>.\Release/winuae_msvc.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <Optimization>Full</Optimization>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+      <OmitFramePointers>true</OmitFramePointers>
+      <WholeProgramOptimization>false</WholeProgramOptimization>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\;..\resources;..\osdep;..\sounddep;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WINVER=0x0500;NDEBUG;_WIN32_IE=0x0700;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <ExceptionHandling>Sync</ExceptionHandling>
+      <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
+      <FloatingPointModel>Precise</FloatingPointModel>
+      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)/winuae_msvc.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
+      <ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
+      <ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
+      <WarningLevel>Level3</WarningLevel>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <CallingConvention>StdCall</CallingConvention>
+      <CompileAs>Default</CompileAs>
+      <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+      <ForcedIncludeFiles>%(ForcedIncludeFiles)</ForcedIncludeFiles>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalDependencies>ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng15.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard_x64.lib;lzmalib.lib;libFLAC_static.lib;avrt.lib;hid.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <ShowProgress>NotSet</ShowProgress>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\</AdditionalLibraryDirectories>
+      <IgnoreSpecificDefaultLibraries>LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
+      <DelayLoadDLLs>wpcap.dll;packet.dll;d3dx9_43.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;avrt.dll;Dwmapi.lib;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ProgramDatabaseFile>$(Platform)\$(Configuration)\winuae.pdb</ProgramDatabaseFile>
+      <SubSystem>Windows</SubSystem>
+      <StackReserveSize>0</StackReserveSize>
+      <StackCommitSize>0</StackCommitSize>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <LinkTimeCodeGeneration>
+      </LinkTimeCodeGeneration>
+      <RandomizedBaseAddress>true</RandomizedBaseAddress>
+      <FixedBaseAddress>false</FixedBaseAddress>
+      <DataExecutionPrevention>true</DataExecutionPrevention>
+      <TargetMachine>MachineX64</TargetMachine>
+    </Link>
+    <Manifest>
+      <AdditionalManifestFiles>..\resources\winuae64.exe.manifest</AdditionalManifestFiles>
+      <EnableDPIAwareness>true</EnableDPIAwareness>
+    </Manifest>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">
     <Midl>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='FullRelease|Win32'">\projects\winuae\src\od-win32\resources</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">\projects\winuae\src\od-win32\resources</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\projects\winuae\src\od-win32\resources</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Test|Win32'">\projects\winuae\src\od-win32\resources</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\projects\winuae\src\od-win32\resources</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Test|x64'">\projects\winuae\src\od-win32\resources</AdditionalIncludeDirectories>
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</ExcludedFromBuild>
       <FileType>Document</FileType>
     </Library>
     <Library Include="..\hq2x32.obj">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</ExcludedFromBuild>
       <FileType>Document</FileType>
     </Library>
     <Library Include="..\hq3x16.obj">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</ExcludedFromBuild>
       <FileType>Document</FileType>
     </Library>
     <Library Include="..\hq3x32.obj">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</ExcludedFromBuild>
       <FileType>Document</FileType>
     </Library>
     <Library Include="..\hq4x16.obj">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</ExcludedFromBuild>
       <FileType>Document</FileType>
     </Library>
     <Library Include="..\hq4x32.obj">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='FullRelease|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Test|x64'">true</ExcludedFromBuild>
       <FileType>Document</FileType>
     </Library>
   </ItemGroup>
index 5e3c84f2ff63c7425c8a8ff93d55610d146521d9..6ee4bbf20c38eefa23ca8bab73212f99de35608a 100644 (file)
@@ -1,6 +1,29 @@
 
 - restore only single input target to default.
 
+MMU emulation is now considered mostly done. Some minor bugs probably still exist but Amix, NetBSD, Debian
+Linux, Enforcer and WHDLoad MMU option seem to work fine.
+
+Beta 6:
+
+- SCSI and IDE emulation HD and CD read and write commands are now executed in background thread, slow devices
+  (for example real optical drive) won't temporarily pause the emulation anymore.
+- ATAPI CD emulation didn't support split data transfers. Fixes NetBSD installer unpack error.
+- Show also error code converted to string if HD to HDF image creation fails.
+- Added mostly useless CD list to CD drive GUI. (Someday there will be more than 1 option)
+- Do not allow multiple identical HD/CD controllers (if not UAE).
+- Increased size of ATAPI data buffer and added size checks. 65536 was too low. (Debian installer)
+- SCSI emulation didn't handle WD33C93 Select-and-Transfer command scatter/gather DMA. (Debian installer)
+- CD led didn't flicker during SCSI and ATAPI CD access.
+- Fixed D3D shader error/warning string buffer overflow crash. Some shaders can output really long warning messages.
+- D3D internal texture size was incorrect in some situations, causing some shaders to have incorrect geometry.
+- Added support for "post" shader filters. Post = apply shader to final output (after scaling, D3D scanlines
+  and RGB masks), Pre = apply shader to internal Amiga display (same as in previous versions).
+- D3D shaders can be "stacked", max 4 pre and post shaders supported. (-4 to -1 = pre, 1 to 4 = post),
+  Output of previous shader is input to next shader. Can be useful if you want to have "normal" filter and CRT
+  geometry filter active at the same time. Also stacking same filter multiple times makes interesting results :)
+  D3D only, software filters not supported.
+
 Beta 5:
 
 - RDB hardfile dragndrop to hardfiles panel added empty hardfile.
index 9045ede052031f60ed82c87f707fa5fe76cf24ca..473e09ab2049f8e912a88c34f7b1101ec4fb6c18 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -15,8 +15,8 @@
 #include "filesys.h"
 #include "blkdev.h"
 
-static int outcmd[] = { 0x0a, 0x2a, 0x2f, 0xaa, -1 };
-static int incmd[] = { 0x03, 0x08, 0x12, 0x1a, 0x25, 0x28, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, -1 };
+static int outcmd[] = { 0x0a, 0x2a, 0x2f, 0xaa, 0x15, 0x55, -1 };
+static int incmd[] = { 0x03, 0x08, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, -1 };
 static int nonecmd[] = { 0x00, 0x1b, 0x1e, 0x35, -1 };
 static int scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 10 };