]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2300b16
authorToni Wilen <twilen@winuae.net>
Thu, 9 Sep 2010 16:25:08 +0000 (19:25 +0300)
committerToni Wilen <twilen@winuae.net>
Thu, 9 Sep 2010 16:25:08 +0000 (19:25 +0300)
25 files changed:
audio.cpp
blkdev_cdimage.cpp
custom.cpp
epsonprinter.cpp
expansion.cpp
filesys.asm
filesys.cpp
filesys_bootrom.cpp
gencpu.cpp
include/clipboard.h
include/newcpu.h
od-win32/blkdev_win32_ioctl.cpp
od-win32/cda_play.cpp [new file with mode: 0644]
od-win32/cda_play.h [new file with mode: 0644]
od-win32/clipboard_win32.cpp
od-win32/dinput.cpp
od-win32/mman.cpp
od-win32/sounddep/sound.cpp
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32gfx.cpp
od-win32/win32gui.cpp
od-win32/winuae_msvc10/winuae_msvc.vcxproj
od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters
od-win32/winuaechangelog.txt

index dbaecb1f28aae9edd79ee72965b4306b89d9010a..436a0c7556de30a3d217237ce188a2f8f1c094f7 100644 (file)
--- a/audio.cpp
+++ b/audio.cpp
@@ -1043,7 +1043,6 @@ static void zerostate (int nr)
        cdp->state = 0;
        cdp->evtime = MAX_EV;
        cdp->intreq2 = 0;
-       cdp->dsr = cdp->dr = false;
        cdp->dmaenstore = false;
 #ifdef TEST_AUDIO
        cdp->have_dat = false;
@@ -1302,6 +1301,10 @@ static void audio_state_channel2 (int nr, bool perfin)
                break;
        case 1:
                cdp->evtime = MAX_EV;
+               if (!chan_ena) {
+                       zerostate (nr);
+                       return;
+               }
                if (!cdp->dat_written)
                        return;
 #ifdef TEST_AUDIO
@@ -1318,6 +1321,10 @@ static void audio_state_channel2 (int nr, bool perfin)
                break;
        case 5:
                cdp->evtime = MAX_EV;
+               if (!chan_ena) {
+                       zerostate (nr);
+                       return;
+               }
                if (!cdp->dat_written)
                        return;
 #ifdef DEBUG_AUDIO
@@ -1783,7 +1790,7 @@ void AUDxDAT (int nr, uae_u16 v, uaecptr addr)
                                        do_samplerip (cdp);
 #ifdef DEBUG_AUDIO
                                if (debugchannel (nr))
-                                       write_log (L"AUD%d looped, IRQ=%d, LC=%08X LEN=%d\n", nr, isirq (nr), cdp->pt, cdp->wlen);
+                                       write_log (L"AUD%d looped, IRQ=%d, LC=%08X LEN=%d\n", nr, isirq (nr) ? 1 : 0, cdp->pt, cdp->wlen);
 #endif
                        } else {
                                cdp->wlen = (cdp->wlen - 1) & 0xffff;
index 588bf93f6ec6ed9f1af67735bb1b43b26e45b990..65434c3d9a719999aac755a03b7d6011786fc229 100644 (file)
@@ -23,6 +23,7 @@
 #include "threaddep/thread.h"
 #include "scsidev.h"
 #include "mp3decoder.h"
+#include "cda_play.h"
 #include "memory.h"
 #ifdef RETROPLATFORM
 #include "rp.h"
@@ -210,38 +211,6 @@ static uae_u8 *flac_get_data (struct cdtoc *t)
        return t->data;
 }
 
-#ifdef _WIN32
-
-static HWAVEOUT cdda_wavehandle;
-
-static void cdda_closewav (void)
-{
-       if (cdda_wavehandle != NULL)
-               waveOutClose (cdda_wavehandle);
-       cdda_wavehandle = NULL;
-}
-
-static int cdda_openwav (void)
-{
-       WAVEFORMATEX wav = { 0 };
-       MMRESULT mmr;
-
-       wav.cbSize = 0;
-       wav.nChannels = 2;
-       wav.nSamplesPerSec = 44100;
-       wav.wBitsPerSample = 16;
-       wav.nBlockAlign = wav.wBitsPerSample / 8 * wav.nChannels;
-       wav.nAvgBytesPerSec = wav.nBlockAlign * wav.nSamplesPerSec;
-       wav.wFormatTag = WAVE_FORMAT_PCM;
-       mmr = waveOutOpen (&cdda_wavehandle, WAVE_MAPPER, &wav, 0, 0, WAVE_ALLOWSYNC | WAVE_FORMAT_DIRECT);
-       if (mmr != MMSYSERR_NOERROR) {
-               write_log (L"IMAGE CDDA: wave open %d\n", mmr);
-               cdda_closewav ();
-               return 0;
-       }
-       return 1;
-}
-
 static void sub_to_interleaved (const uae_u8 *s, uae_u8 *d)
 {
        for (int i = 0; i < 8 * 12; i ++) {
@@ -386,255 +355,200 @@ static void *cdda_play_func (void *v)
        int num_sectors = CDDA_BUFFERS;
        int quit = 0;
        int bufnum;
-       int buffered;
-       uae_u8 *px[2], *p;
        int bufon[2];
-       int i;
-       WAVEHDR whdr[2];
-       MMRESULT mmr;
-       int volume[2], volume_main;
        int oldplay;
        int idleframes;
        bool foundsub;
        struct cdunit *cdu = (struct cdunit*)v;
 
-       for (i = 0; i < 2; i++) {
-               memset (&whdr[i], 0, sizeof (WAVEHDR));
-               whdr[i].dwFlags = WHDR_DONE;
-       }
-
        while (cdu->cdda_play == 0)
                Sleep (10);
        oldplay = -1;
 
-       p = xmalloc (uae_u8, 2 * num_sectors * 4096);
-       px[0] = p;
-       px[1] = p + num_sectors * 4096;
        bufon[0] = bufon[1] = 0;
        bufnum = 0;
-       buffered = 0;
-       volume[0] = volume[1] = -1;
-       volume_main = -1;
-
-       if (cdda_openwav ()) {
-
-               for (i = 0; i < 2; i++) {
-                       memset (&whdr[i], 0, sizeof (WAVEHDR));
-                       whdr[i].dwBufferLength = 2352 * num_sectors;
-                       whdr[i].lpData = (LPSTR)px[i];
-                       mmr = waveOutPrepareHeader (cdda_wavehandle, &whdr[i], sizeof (WAVEHDR));
-                       if (mmr != MMSYSERR_NOERROR) {
-                               write_log (L"IMAGE CDDA: waveOutPrepareHeader %d:%d\n", i, mmr);
-                               goto end;
-                       }
-                       whdr[i].dwFlags |= WHDR_DONE;
-               }
 
-               while (cdu->cdda_play > 0) {
+       cda_audio *cda = new cda_audio (num_sectors);
 
-                       if (oldplay != cdu->cdda_play) {
-                               struct cdtoc *t;
-                               int sector, diff;
-                               struct _timeb tb1, tb2;
+       while (cdu->cdda_play > 0) {
 
-                               idleframes = 0;
-                               foundsub = false;
-                               _ftime (&tb1);
-                               cdda_pos = cdu->cdda_start;
-                               oldplay = cdu->cdda_play;
-                               sector = cdu->cd_last_pos = cdda_pos;
-                               t = findtoc (cdu, &sector);
-                               if (!t) {
-                                       write_log (L"IMAGE CDDA: illegal sector number %d\n", cdu->cdda_start);
-                                       setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
-                               } else {
-                                       write_log (L"IMAGE CDDA: playing from %d to %d, track %d ('%s', offset %d, secoffset %d)\n",
-                                               cdu->cdda_start, cdu->cdda_end, t->track, t->fname, t->offset, sector);
-                                       // do this even if audio is not compressed, t->handle also could be
-                                       // compressed and we want to unpack it in background too
-                                       while (cdimage_unpack_active == 1)
-                                               Sleep (10);
-                                       cdimage_unpack_active = 0;
-                                       write_comm_pipe_u32 (&unpack_pipe, cdu - &cdunits[0], 0);
-                                       write_comm_pipe_u32 (&unpack_pipe, t - &cdu->toc[0], 1);
-                                       while (cdimage_unpack_active == 0)
-                                               Sleep (10);
-                               }
-                               idleframes = cdu->cdda_delay_frames;
-                               while (cdu->cdda_paused && cdu->cdda_play > 0) {
+               if (oldplay != cdu->cdda_play) {
+                       struct cdtoc *t;
+                       int sector, diff;
+                       struct _timeb tb1, tb2;
+
+                       idleframes = 0;
+                       foundsub = false;
+                       _ftime (&tb1);
+                       cdda_pos = cdu->cdda_start;
+                       oldplay = cdu->cdda_play;
+                       sector = cdu->cd_last_pos = cdda_pos;
+                       t = findtoc (cdu, &sector);
+                       if (!t) {
+                               write_log (L"IMAGE CDDA: illegal sector number %d\n", cdu->cdda_start);
+                               setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
+                       } else {
+                               write_log (L"IMAGE CDDA: playing from %d to %d, track %d ('%s', offset %d, secoffset %d)\n",
+                                       cdu->cdda_start, cdu->cdda_end, t->track, t->fname, t->offset, sector);
+                               // do this even if audio is not compressed, t->handle also could be
+                               // compressed and we want to unpack it in background too
+                               while (cdimage_unpack_active == 1)
                                        Sleep (10);
-                                       idleframes = -1;
-                               }
+                               cdimage_unpack_active = 0;
+                               write_comm_pipe_u32 (&unpack_pipe, cdu - &cdunits[0], 0);
+                               write_comm_pipe_u32 (&unpack_pipe, t - &cdu->toc[0], 1);
+                               while (cdimage_unpack_active == 0)
+                                       Sleep (10);
+                       }
+                       idleframes = cdu->cdda_delay_frames;
+                       while (cdu->cdda_paused && cdu->cdda_play > 0) {
+                               Sleep (10);
+                               idleframes = -1;
+                       }
 
-                               if (cdu->cdda_scan == 0) {
-                                       // find possible P-subchannel=1 and fudge starting point so that
-                                       // buggy CD32/CDTV software CD+G handling does not miss any frames
-                                       bool seenindex = false;
-                                       for (sector = cdda_pos - 200; sector < cdda_pos; sector++) {
-                                               int sec = sector;
-                                               t = findtoc (cdu, &sec);
-                                               if (t) {
-                                                       uae_u8 subbuf[SUB_CHANNEL_SIZE];
-                                                       getsub_deinterleaved (subbuf, cdu, t, sector);
-                                                       if (seenindex) {
-                                                               for (int i = 2 * SUB_ENTRY_SIZE; i < SUB_CHANNEL_SIZE; i++) {
-                                                                       if (subbuf[i]) { // non-zero R-W subchannels
-                                                                               int diff = cdda_pos - sector + 2;
-                                                                               write_log (L"-> CD+G start pos fudge -> %d (%d)\n", sector, -diff);
-                                                                               idleframes -= diff;
-                                                                               cdda_pos = sector;
-                                                                               break;
-                                                                       }
+                       if (cdu->cdda_scan == 0) {
+                               // find possible P-subchannel=1 and fudge starting point so that
+                               // buggy CD32/CDTV software CD+G handling does not miss any frames
+                               bool seenindex = false;
+                               for (sector = cdda_pos - 200; sector < cdda_pos; sector++) {
+                                       int sec = sector;
+                                       t = findtoc (cdu, &sec);
+                                       if (t) {
+                                               uae_u8 subbuf[SUB_CHANNEL_SIZE];
+                                               getsub_deinterleaved (subbuf, cdu, t, sector);
+                                               if (seenindex) {
+                                                       for (int i = 2 * SUB_ENTRY_SIZE; i < SUB_CHANNEL_SIZE; i++) {
+                                                               if (subbuf[i]) { // non-zero R-W subchannels
+                                                                       int diff = cdda_pos - sector + 2;
+                                                                       write_log (L"-> CD+G start pos fudge -> %d (%d)\n", sector, -diff);
+                                                                       idleframes -= diff;
+                                                                       cdda_pos = sector;
+                                                                       break;
                                                                }
-                                                       } else if (subbuf[0] == 0xff) { // P == 1?
-                                                               seenindex = true;
                                                        }
+                                               } else if (subbuf[0] == 0xff) { // P == 1?
+                                                       seenindex = true;
                                                }
                                        }
                                }
-                               cdda_pos -= idleframes;
-
-                               _ftime (&tb2);
-                               diff = (tb2.time * (uae_s64)1000 + tb2.millitm) - (tb1.time * (uae_s64)1000 + tb1.millitm);
-                               diff -= cdu->cdda_delay;
-                               if (idleframes >= 0 && diff < 0 && cdu->cdda_play > 0)
-                                       Sleep (-diff);
-                               setstate (cdu, AUDIO_STATUS_IN_PROGRESS);
                        }
+                       cdda_pos -= idleframes;
+
+                       _ftime (&tb2);
+                       diff = (tb2.time * (uae_s64)1000 + tb2.millitm) - (tb1.time * (uae_s64)1000 + tb1.millitm);
+                       diff -= cdu->cdda_delay;
+                       if (idleframes >= 0 && diff < 0 && cdu->cdda_play > 0)
+                               Sleep (-diff);
+                       setstate (cdu, AUDIO_STATUS_IN_PROGRESS);
+               }
 
-                       while (!(whdr[bufnum].dwFlags & WHDR_DONE)) {
-                               Sleep (10);
-                               if (!cdu->cdda_play)
-                                       goto end;
-                       }
-                       bufon[bufnum] = 0;
+               cda->wait(bufnum);
+               bufon[bufnum] = 0;
+               if (!cdu->cdda_play)
+                       goto end;
 
-                       if (idleframes <= 0 && !isaudiotrack (&cdu->di.toc, cdda_pos)) {
-                               setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
-                               goto end; // data track?
-                       }
+               if (idleframes <= 0 && !isaudiotrack (&cdu->di.toc, cdda_pos)) {
+                       setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
+                       goto end; // data track?
+               }
 
-                       if ((cdda_pos < cdu->cdda_end || cdu->cdda_end == 0xffffffff) && !cdu->cdda_paused && cdu->cdda_play > 0) {
-                               struct cdtoc *t;
-                               int sector, cnt;
-                               int dofinish = 0;
+               if ((cdda_pos < cdu->cdda_end || cdu->cdda_end == 0xffffffff) && !cdu->cdda_paused && cdu->cdda_play > 0) {
+                       struct cdtoc *t;
+                       int sector, cnt;
+                       int dofinish = 0;
 
-                               gui_flicker_led (LED_CD, cdu->di.unitnum - 1, LED_CD_AUDIO);
+                       gui_flicker_led (LED_CD, cdu->di.unitnum - 1, LED_CD_AUDIO);
 
-                               memset (px[bufnum], 0, num_sectors * 2352);
+                       memset (cda->buffers[bufnum], 0, num_sectors * 2352);
 
-                               for (cnt = 0; cnt < num_sectors; cnt++) {
-                                       uae_u8 *dst = px[bufnum] + cnt * 2352;
-                                       uae_u8 subbuf[SUB_CHANNEL_SIZE];
-                                       sector = cdda_pos;
+                       for (cnt = 0; cnt < num_sectors; cnt++) {
+                               uae_u8 *dst = cda->buffers[bufnum] + cnt * 2352;
+                               uae_u8 subbuf[SUB_CHANNEL_SIZE];
+                               sector = cdda_pos;
 
-                                       memset (subbuf, 0, SUB_CHANNEL_SIZE);
+                               memset (subbuf, 0, SUB_CHANNEL_SIZE);
 
-                                       t = findtoc (cdu, &sector);
-                                       if (t) {
-                                               if (t->handle && !(t->ctrl & 4)) {
-                                                       int totalsize = t->size + t->skipsize;
-                                                       if ((t->enctype == AUDENC_MP3 || t->enctype == AUDENC_FLAC) && t->data) {
-                                                               if (t->filesize >= sector * totalsize + t->offset + t->size)
-                                                                       memcpy (dst, t->data + sector * totalsize + t->offset, t->size);
-                                                       } else if (t->enctype == AUDENC_PCM) {
-                                                               if (sector * totalsize + t->offset + totalsize < t->filesize) {
-                                                                       zfile_fseek (t->handle, sector * totalsize + t->offset, SEEK_SET);
-                                                                       zfile_fread (dst, t->size, 1, t->handle);
-                                                               }
+                               t = findtoc (cdu, &sector);
+                               if (t) {
+                                       if (t->handle && !(t->ctrl & 4)) {
+                                               int totalsize = t->size + t->skipsize;
+                                               if ((t->enctype == AUDENC_MP3 || t->enctype == AUDENC_FLAC) && t->data) {
+                                                       if (t->filesize >= sector * totalsize + t->offset + t->size)
+                                                               memcpy (dst, t->data + sector * totalsize + t->offset, t->size);
+                                               } else if (t->enctype == AUDENC_PCM) {
+                                                       if (sector * totalsize + t->offset + totalsize < t->filesize) {
+                                                               zfile_fseek (t->handle, sector * totalsize + t->offset, SEEK_SET);
+                                                               zfile_fread (dst, t->size, 1, t->handle);
                                                        }
                                                }
-                                               getsub_deinterleaved (subbuf, cdu, t, cdda_pos);
-                                       }
-
-                                       if (idleframes > 0) {
-                                               idleframes--;
-                                               memset (dst, 0, 2352);
-                                               memset (subbuf, 0, SUB_CHANNEL_SIZE);
                                        }
+                                       getsub_deinterleaved (subbuf, cdu, t, cdda_pos);
+                               }
 
-                                       if (cdda_pos < cdu->cdda_start && cdu->cdda_scan == 0)
-                                               memset (dst, 0, 2352);
-
-                                       dosub (cdu, subbuf);
+                               if (idleframes > 0) {
+                                       idleframes--;
+                                       memset (dst, 0, 2352);
+                                       memset (subbuf, 0, SUB_CHANNEL_SIZE);
+                               }
 
-                                       if (cdu->cdda_scan) {
-                                               cdda_pos += cdu->cdda_scan;
-                                               if (cdda_pos < 0)
-                                                       cdda_pos = 0;
-                                       } else  {
-                                               cdda_pos++;
-                                       }
+                               if (cdda_pos < cdu->cdda_start && cdu->cdda_scan == 0)
+                                       memset (dst, 0, 2352);
 
-                                       if (cdda_pos - num_sectors < cdu->cdda_end && cdda_pos >= cdu->cdda_end)
-                                               dofinish = 1;
+                               dosub (cdu, subbuf);
 
-                               }
-       
-                               if (idleframes <= 0)
-                                       cdu->cd_last_pos = cdda_pos;
-
-                               volume_main = currprefs.sound_volume;
-                               int vol_mult[2];
-                               for (int j = 0; j < 2; j++) {
-                                       volume[j] = cdu->cdda_volume[j];
-                                       vol_mult[j] = (100 - volume_main) * volume[j] / 100;
-                                       if (vol_mult[j])
-                                               vol_mult[j]++;
-                                       if (vol_mult[j] >= 32768)
-                                               vol_mult[j] = 32768;
-                               }
-                               uae_s16 *p = (uae_s16*)(px[bufnum]);
-                               for (i = 0; i < num_sectors * 2352 / 4; i++) {
-                                       p[i * 2 + 0] = p[i * 2 + 0] * vol_mult[0] / 32768;
-                                       p[i * 2 + 1] = p[i * 2 + 1] * vol_mult[1] / 32768;
+                               if (cdu->cdda_scan) {
+                                       cdda_pos += cdu->cdda_scan;
+                                       if (cdda_pos < 0)
+                                               cdda_pos = 0;
+                               } else  {
+                                       cdda_pos++;
                                }
 
-                               bufon[bufnum] = 1;
-                               mmr = waveOutWrite (cdda_wavehandle, &whdr[bufnum], sizeof (WAVEHDR));
-                               if (mmr != MMSYSERR_NOERROR) {
-                                       write_log (L"IMAGE CDDA: waveOutWrite %d\n", mmr);
-                                       break;
-                               }
-
-                               if (dofinish) {
-                                       setstate (cdu, AUDIO_STATUS_PLAY_COMPLETE);
-                                       cdu->cdda_play = -1;
-                                       cdda_pos = cdu->cdda_end + 1;
-                               }
+                               if (cdda_pos - num_sectors < cdu->cdda_end && cdda_pos >= cdu->cdda_end)
+                                       dofinish = 1;
 
                        }
+       
+                       if (idleframes <= 0)
+                               cdu->cd_last_pos = cdda_pos;
 
+                       bufon[bufnum] = 1;
+                       cda->setvolume (currprefs.sound_volume, cdu->cdda_volume[0], cdu->cdda_volume[1]);
+                       if (!cda->play (bufnum)) {
+                               setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
+                               goto end;
+                       }
 
-                       if (bufon[0] == 0 && bufon[1] == 0) {
-                               while (!(whdr[0].dwFlags & WHDR_DONE) || !(whdr[1].dwFlags & WHDR_DONE))
-                                       Sleep (10);
-                               while (cdu->cdda_paused && cdu->cdda_play > 0)
-                                       Sleep (10);
+                       if (dofinish) {
+                               setstate (cdu, AUDIO_STATUS_PLAY_COMPLETE);
+                               cdu->cdda_play = -1;
+                               cdda_pos = cdu->cdda_end + 1;
                        }
 
-                       bufnum = 1 - bufnum;
+               }
 
+               if (bufon[0] == 0 && bufon[1] == 0) {
+                       while (cdu->cdda_paused && cdu->cdda_play > 0)
+                               Sleep (10);
                }
+
+               bufnum = 1 - bufnum;
        }
 
 end:
-       while (!(whdr[0].dwFlags & WHDR_DONE) || !(whdr[1].dwFlags & WHDR_DONE))
-               Sleep (10);
-       for (i = 0; i < 2; i++)
-               waveOutUnprepareHeader  (cdda_wavehandle, &whdr[i], sizeof (WAVEHDR));
+       cda->wait (0);
+       cda->wait (1);
 
        while (cdimage_unpack_active == 1)
                Sleep (10);
 
-       cdda_closewav ();
-       xfree (p);
+       delete cda;
+
        cdu->cdda_play = 0;
        write_log (L"IMAGE CDDA: thread killed\n");
        return NULL;
 }
 
-#endif
 
 static void cdda_stop (struct cdunit *cdu)
 {
index 62714acbb9efcddb6b62156317a9f8936f787a7a..00a9d736e53fdba5c96484fd892fdeb238dc6496 100644 (file)
@@ -5286,6 +5286,9 @@ static uae_u16 dmal, dmal_hpos;
 
 static void dmal_emu (uae_u32 v)
 {
+       // Disk and Audio DMA bits are ignored by Agnus, Agnus only checks DMAL and master bit
+       if (!(dmacon & 0x200))
+               return;
        int hpos = current_hpos ();
        if (v >= 6) {
                v -= 6;
index c75fd8fdf2587a9cce0dc8ae0904bc9f52f70449..4f9f2ff5a210e6ca88fb930ddb257b187d2007cb 100644 (file)
@@ -36,7 +36,7 @@
 
 #include <math.h>
 
-//#define DEBUGPRINT L"C:\\Users\\twilen\\Desktop\\pages_1+2_raw.bin"
+//#define DEBUGPRINT L"C:\\Users\\twilen\\Desktop\\CMD_file.1"
 int pngprint = 0;
 
 #ifdef C_LIBPNG
@@ -901,6 +901,7 @@ static void outputPage(void)
 
 static void newPage(int save)
 {
+       printCharBuffer ();
        if (save)
                outputPage ();
        if (page == NULL) {
@@ -1908,6 +1909,7 @@ static int processCommandChar(Bit8u ch)
                }
                return true;
        case 0x0c:              // Form feed (FF)
+               printCharBuffer ();
                if (style & STYLE_DOUBLEWIDTHONELINE)
                {
                        style &= 0xFFFF - STYLE_DOUBLEWIDTHONELINE;
index f36c0e72d2db42c9843c84ce73ee5419b75c58f3..87dad465340e153d3d5d447507b62bd7f677f597 100644 (file)
@@ -1168,7 +1168,7 @@ static void allocate_expamem (void)
        z3fastmem_start = currprefs.z3fastmem_start;
        if (currprefs.z3chipmem_size)
                z3fastmem_start += currprefs.z3chipmem_size + 16 * 1024 * 1024;
-       z3fastmem2_start = currprefs.z3fastmem_start + currprefs.z3fastmem_size;
+       z3fastmem2_start = z3fastmem_start + currprefs.z3fastmem_size;
 
        if (allocated_fastmem != currprefs.fastmem_size) {
                free_fastmemory ();
index 523b44d2f4e1516d845ba3cd7bef3e24b0d74230..aaf0aceeda990e4a3b0730368ab538d869753079 100644 (file)
@@ -2307,6 +2307,8 @@ clipsignal
        moveq #12,d1
        bsr.w getrtbase
        jsr (a0)
+       tst.l d0
+       beq.s .nowrite
        ; and now we should have the data in CLIP_WRITE_ALLOC
        tst.l CLIP_WRITE_ALLOC(a5)
        beq.s .nowrite
index ca9b96f73bbe198a1573fb2d574b894eeae32908..69b0d35863038f5de0f12d321d3c4ac464f8feee 100644 (file)
@@ -5796,7 +5796,7 @@ static uae_u32 REGPARAM2 mousehack_done (TrapContext *context)
        } else if (mode == 11) {
                amiga_clipboard_got_data (m68k_areg (regs, 2), m68k_dreg (regs, 2), m68k_dreg (regs, 0) + 8);
        } else if (mode == 12) {
-               amiga_clipboard_want_data ();
+               return amiga_clipboard_want_data ();
        } else if (mode == 13) {
                return amiga_clipboard_proc_start ();
        } else if (mode == 14) {
index 9b150eb3f356e6a5ca02c965bd5ce87e9ee0c671..bdf3d7eacac6206fdb611994d93b022dccc7b3a5 100644 (file)
@@ -3,7 +3,7 @@
  db(0x00); db(0x00); db(0x08); db(0x2c); db(0x00); db(0x00); db(0x00); db(0xd0);
  db(0x00); db(0x00); db(0x02); db(0x54); db(0x00); db(0x00); db(0x00); db(0x24);
  db(0x00); db(0x00); db(0x03); db(0x10); db(0x00); db(0x00); db(0x0e); db(0x1c);
- db(0x00); db(0x00); db(0x12); db(0xac); db(0x43); db(0xfa); db(0x17); db(0x82);
+ db(0x00); db(0x00); db(0x12); db(0xac); db(0x43); db(0xfa); db(0x17); db(0x86);
  db(0x4e); db(0xae); db(0xff); db(0xa0); db(0x20); db(0x40); db(0x20); db(0x28);
  db(0x00); db(0x16); db(0x20); db(0x40); db(0x4e); db(0x90); db(0x4e); db(0x75);
  db(0x48); db(0xe7); db(0xe0); db(0xe2); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x20); db(0x5f); db(0x58); db(0x8f); db(0x48); db(0xe7); db(0xff); db(0x7e);
  db(0x22); db(0x4e); db(0x20); db(0x08); db(0x30); db(0x7c); db(0xff); db(0xb8);
  db(0x4e); db(0xae); db(0xfe); db(0x5c); db(0x61); db(0x00); db(0x11); db(0xfe);
- db(0x61); db(0x00); db(0x15); db(0xb0); db(0x4c); db(0xdf); db(0x7e); db(0xff);
+ db(0x61); db(0x00); db(0x15); db(0xb4); db(0x4c); db(0xdf); db(0x7e); db(0xff);
  db(0x4e); db(0x75); db(0x00); db(0x00); db(0x08); db(0x00); db(0x00); db(0x02);
  db(0x67); db(0x06); db(0x4e); db(0xb9); db(0x00); db(0xf0); db(0x00); db(0x00);
  db(0x4e); db(0xf9); db(0x00); db(0xf0); db(0x00); db(0x00); db(0x00); db(0x00);
  db(0x48); db(0xe7); db(0xff); db(0xfe); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x30); db(0x3c); db(0xff); db(0xfc); db(0x61); db(0x00); db(0x0b); db(0xaa);
- db(0x2a); db(0x50); db(0x43); db(0xfa); db(0x16); db(0xf3); db(0x70); db(0x24);
+ db(0x2a); db(0x50); db(0x43); db(0xfa); db(0x16); db(0xf7); db(0x70); db(0x24);
  db(0x7a); db(0x01); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80);
- db(0x66); db(0x0c); db(0x43); db(0xfa); db(0x16); db(0xe3); db(0x70); db(0x00);
+ db(0x66); db(0x0c); db(0x43); db(0xfa); db(0x16); db(0xe7); db(0x70); db(0x00);
  db(0x7a); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x28); db(0x40);
  db(0x4a); db(0xad); db(0x01); db(0x0c); db(0x67); db(0x5a); db(0x20); db(0x3c);
  db(0x00); db(0x00); db(0x02); db(0x2c); db(0x22); db(0x3c); db(0x00); db(0x01);
  db(0x67); db(0x06); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfd); db(0x96);
  db(0x30); db(0x3c); db(0xff); db(0x80); db(0x61); db(0x00); db(0x0a); db(0xea);
  db(0x4e); db(0x90); db(0x20); db(0x49); db(0x20); db(0x01); db(0x67); db(0x0c);
- db(0x22); db(0x04); db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x16); db(0x4f);
- db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x41); db(0xfa); db(0x15); db(0xc6);
+ db(0x22); db(0x04); db(0x74); db(0xfb); db(0x43); db(0xfa); db(0x16); db(0x53);
+ db(0x4e); db(0xae); db(0xfd); db(0x96); db(0x41); db(0xfa); db(0x15); db(0xca);
  db(0x43); db(0xfa); db(0x00); db(0x54); db(0x70); db(0x0a); db(0x61); db(0x00);
  db(0x0b); db(0xa4); db(0x22); db(0x40); db(0x72); db(0x01); db(0x30); db(0x3c);
  db(0xff); db(0x48); db(0x61); db(0x00); db(0x0a); db(0xbc); db(0x4e); db(0x90);
  db(0x4c); db(0xdf); db(0x7f); db(0xff); db(0x4e); db(0x75); db(0x48); db(0xe7);
  db(0x38); db(0x22); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x24); db(0x00);
  db(0x28); db(0x01); db(0x26); db(0x09); db(0x24); db(0x48); db(0x43); db(0xfa);
- db(0x15); db(0xc0); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
+ db(0x15); db(0xc4); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
  db(0x4a); db(0x80); db(0x67); db(0x14); db(0x2c); db(0x40); db(0x22); db(0x0a);
  db(0xe4); db(0x8b); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x22); db(0x4e);
  db(0x2c); db(0x78); db(0x00); db(0x04); db(0x4e); db(0xae); db(0xfe); db(0x62);
  db(0x4c); db(0xdf); db(0x44); db(0x1c); db(0x4e); db(0x75); db(0x2c); db(0x78);
  db(0x00); db(0x04); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d);
- db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x41); db(0xfa); db(0x15); db(0x71);
+ db(0x4e); db(0xae); db(0xfe); db(0xc2); db(0x41); db(0xfa); db(0x15); db(0x75);
  db(0x43); db(0xfa); db(0x00); db(0x16); db(0x70); db(0x0f); db(0x22); db(0x3c);
  db(0x00); db(0x00); db(0x1f); db(0x40); db(0x61); db(0x00); db(0xff); db(0xa8);
  db(0x60); db(0xdc); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x10);
  db(0x48); db(0xe7); db(0xc0); db(0xc0); db(0x61); db(0x00); db(0xfd); db(0x22);
  db(0x70); db(0x1a); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
  db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x22); db(0x40); db(0x41); db(0xfa);
- db(0x14); db(0x45); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa);
+ db(0x14); db(0x49); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa);
  db(0xff); db(0x24); db(0x23); db(0x48); db(0x00); db(0x0e); db(0x41); db(0xfa);
  db(0xff); db(0x1c); db(0x23); db(0x48); db(0x00); db(0x12); db(0x33); db(0x7c);
  db(0x02); db(0x14); db(0x00); db(0x08); db(0x70); db(0x03); db(0x4e); db(0xae);
  db(0x00); db(0x00); db(0x00); db(0x0e); db(0x52); db(0x40); db(0x0c); db(0x40);
  db(0x00); db(0x8c); db(0x66); db(0xf2); db(0x20); db(0x0a); db(0xe4); db(0x88);
  db(0x21); db(0x40); db(0x00); db(0x36); db(0x22); db(0x48); db(0x41); db(0xfa);
- db(0x13); db(0xd5); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x20); db(0x6b);
+ db(0x13); db(0xd9); db(0x23); db(0x48); db(0x00); db(0x0a); db(0x20); db(0x6b);
  db(0x01); db(0x98); db(0x41); db(0xe8); db(0x00); db(0x12); db(0x4e); db(0xae);
  db(0xff); db(0x10); db(0x4c); db(0xdf); db(0x4f); db(0x03); db(0x4e); db(0x75);
  db(0x48); db(0xe7); db(0x7f); db(0x7e); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x60); db(0xf4); db(0x48); db(0xe7); db(0x40); db(0xe2); db(0x2c); db(0x78);
  db(0x00); db(0x04); db(0x41); db(0xee); db(0x01); db(0x50); db(0x20); db(0x50);
  db(0x4a); db(0x90); db(0x67); db(0x1a); db(0x22); db(0x68); db(0x00); db(0x0a);
- db(0x45); db(0xfa); db(0x13); db(0x27); db(0x10); db(0x19); db(0x12); db(0x1a);
+ db(0x45); db(0xfa); db(0x13); db(0x2b); db(0x10); db(0x19); db(0x12); db(0x1a);
  db(0xb0); db(0x01); db(0x66); db(0x06); db(0x4a); db(0x00); db(0x67); db(0x42);
  db(0x60); db(0xf2); db(0x20); db(0x50); db(0x60); db(0xe2); db(0x70); db(0x20);
  db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae);
  db(0xff); db(0x3a); db(0x24); db(0x40); db(0x15); db(0x7c); db(0x00); db(0x08);
- db(0x00); db(0x08); db(0x41); db(0xfa); db(0x12); db(0xfd); db(0x25); db(0x48);
- db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x12); db(0x79); db(0x25); db(0x48);
+ db(0x00); db(0x08); db(0x41); db(0xfa); db(0x13); db(0x01); db(0x25); db(0x48);
+ db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x12); db(0x7d); db(0x25); db(0x48);
  db(0x00); db(0x0e); db(0x41); db(0xea); db(0x00); db(0x12); db(0x20); db(0x88);
  db(0x58); db(0x90); db(0x21); db(0x48); db(0x00); db(0x08); db(0x41); db(0xee);
  db(0x01); db(0x50); db(0x22); db(0x4a); db(0x4e); db(0xae); db(0xff); db(0x0a);
  db(0x67); db(0x3a); db(0x20); db(0x52); db(0x24); db(0x40); db(0x22); db(0x4a);
  db(0x12); db(0xd8); db(0x66); db(0xfc); db(0x13); db(0x7c); db(0x00); db(0x3a);
  db(0xff); db(0xff); db(0x42); db(0x11); db(0x2c); db(0x78); db(0x00); db(0x04);
- db(0x43); db(0xfa); db(0x0d); db(0xf6); db(0x70); db(0x00); db(0x4e); db(0xae);
+ db(0x43); db(0xfa); db(0x0d); db(0xfa); db(0x70); db(0x00); db(0x4e); db(0xae);
  db(0xfd); db(0xd8); db(0x2c); db(0x40); db(0x22); db(0x0a); db(0x4e); db(0xae);
  db(0xff); db(0x52); db(0x22); db(0x4e); db(0x2c); db(0x78); db(0x00); db(0x04);
  db(0x4e); db(0xae); db(0xfe); db(0x62); db(0x22); db(0x4a); db(0x20); db(0x02);
  db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x70); db(0x00); db(0x4e); db(0x75);
  db(0x48); db(0xe7); db(0x3f); db(0x3e); db(0x2c); db(0x01); db(0x7e); db(0x06);
- db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x0d); db(0xf1);
+ db(0x2c); db(0x78); db(0x00); db(0x04); db(0x43); db(0xfa); db(0x0d); db(0xf5);
  db(0x70); db(0x24); db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x4a); db(0x80);
  db(0x66); db(0x0e); db(0x08); db(0x87); db(0x00); db(0x02); db(0x43); db(0xfa);
- db(0x0d); db(0xdf); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
+ db(0x0d); db(0xe3); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
  db(0x28); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00); db(0x02); db(0x2c);
  db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01); db(0x4e); db(0xae);
  db(0xff); db(0x3a); db(0x20); db(0x40); db(0x4a); db(0x80); db(0x67); db(0x2c);
  db(0xfe); db(0x62); db(0x4c); db(0xdf); db(0x7c); db(0xfc); db(0x4e); db(0x75);
  db(0x2c); db(0x78); db(0x00); db(0x04); db(0x93); db(0xc9); db(0x4e); db(0xae);
  db(0xfe); db(0xda); db(0x20); db(0x40); db(0x4b); db(0xe8); db(0x00); db(0x5c);
- db(0x43); db(0xfa); db(0x0d); db(0x46); db(0x70); db(0x00); db(0x4e); db(0xae);
+ db(0x43); db(0xfa); db(0x0d); db(0x4a); db(0x70); db(0x00); db(0x4e); db(0xae);
  db(0xfd); db(0xd8); db(0x24); db(0x40); db(0x20); db(0x3c); db(0x00); db(0x00);
  db(0x00); db(0xb9); db(0x22); db(0x3c); db(0x00); db(0x01); db(0x00); db(0x01);
  db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x26); db(0x40); db(0x7c); db(0x00);
  db(0x26); db(0x86); db(0x27); db(0x46); db(0x00); db(0x04); db(0x27); db(0x46);
  db(0x00); db(0x08); db(0x27); db(0x4a); db(0x00); db(0xa0); db(0x50); db(0xeb);
  db(0x00); db(0x9e); db(0x93); db(0xc9); db(0x4e); db(0xae); db(0xfe); db(0xda);
- db(0x27); db(0x40); db(0x00); db(0xb0); db(0x41); db(0xfa); db(0x0c); db(0x2e);
+ db(0x27); db(0x40); db(0x00); db(0xb0); db(0x41); db(0xfa); db(0x0c); db(0x32);
  db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0x02); db(0x84);
- db(0x27); db(0x40); db(0x00); db(0xa4); db(0x41); db(0xfa); db(0x0c); db(0x2b);
+ db(0x27); db(0x40); db(0x00); db(0xa4); db(0x41); db(0xfa); db(0x0c); db(0x2f);
  db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0x02); db(0x74);
  db(0x27); db(0x40); db(0x00); db(0xa8); db(0x7a); db(0x00); db(0x20); db(0x4d);
  db(0x4e); db(0xae); db(0xfe); db(0x80); db(0x20); db(0x4d); db(0x4e); db(0xae);
  db(0x25); db(0x4b); db(0x00); db(0x36); db(0x22); db(0x4a); db(0x24); db(0x43);
  db(0x97); db(0xcb); db(0x24); db(0x09); db(0x4e); db(0xae); db(0xfe); db(0xe6);
  db(0x20); db(0x02); db(0x4c); db(0xdf); db(0x4c); db(0x1c); db(0x4e); db(0x75);
- db(0x41); db(0xfa); db(0x09); db(0x9a); db(0x43); db(0xfa); db(0x01); db(0x5c);
+ db(0x41); db(0xfa); db(0x09); db(0x9e); db(0x43); db(0xfa); db(0x01); db(0x5c);
  db(0x70); db(0x13); db(0x61); db(0x00); db(0xff); db(0x98); db(0x4e); db(0x75);
  db(0x22); db(0x6d); db(0x02); db(0x0c); db(0x33); db(0x7c); db(0x00); db(0x0a);
  db(0x00); db(0x1c); db(0x13); db(0x7c); db(0x00); db(0x01); db(0x00); db(0x1e);
  db(0x00); db(0x08); db(0x27); db(0x46); db(0x00); db(0x0c); db(0x70); db(0xff);
  db(0x37); db(0x40); db(0x00); db(0x00); db(0x43); db(0xed); db(0x00); db(0x00);
  db(0x13); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x08); db(0x13); db(0x7c);
- db(0x00); db(0x05); db(0x00); db(0x09); db(0x41); db(0xfa); db(0x07); db(0xde);
+ db(0x00); db(0x05); db(0x00); db(0x09); db(0x41); db(0xfa); db(0x07); db(0xe2);
  db(0x23); db(0x48); db(0x00); db(0x0a); db(0x41); db(0xfa); db(0x02); db(0xda);
  db(0x23); db(0x48); db(0x00); db(0x12); db(0x23); db(0x4d); db(0x00); db(0x0e);
  db(0x70); db(0x05); db(0x4e); db(0xae); db(0xff); db(0x58); db(0x20); db(0x06);
  db(0x00); db(0x1c); db(0x6a); db(0x06); db(0x70); db(0x0a); db(0x27); db(0x40);
  db(0x00); db(0x1c); db(0x4a); db(0xab); db(0x00); db(0x14); db(0x66); db(0x16);
  db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0xe0); db(0x43); db(0xfa);
- db(0x07); db(0xfc); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
+ db(0x08); db(0x00); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
  db(0x27); db(0x40); db(0x00); db(0x14); db(0x67); db(0xd0); db(0x4a); db(0xab);
  db(0x00); db(0x18); db(0x66); db(0x18); db(0x4a); db(0xab); db(0x00); db(0x1c);
- db(0x66); db(0xc4); db(0x43); db(0xfa); db(0x07); db(0xf2); db(0x70); db(0x00);
+ db(0x66); db(0xc4); db(0x43); db(0xfa); db(0x07); db(0xf6); db(0x70); db(0x00);
  db(0x4e); db(0xae); db(0xfd); db(0xd8); db(0x27); db(0x40); db(0x00); db(0x18);
  db(0x67); db(0x00); db(0xff); db(0xb4); db(0x4a); db(0xad); db(0x02); db(0x08);
  db(0x66); db(0x38); db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0xa6);
  db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e);
- db(0x43); db(0xfa); db(0x06); db(0xd2); db(0x4e); db(0xae); db(0xfe); db(0xec);
+ db(0x43); db(0xfa); db(0x06); db(0xd6); db(0x4e); db(0xae); db(0xfe); db(0xec);
  db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4a); db(0x82);
- db(0x67); db(0x8c); db(0x41); db(0xfa); db(0x06); db(0xc0); db(0x70); db(0x00);
+ db(0x67); db(0x8c); db(0x41); db(0xfa); db(0x06); db(0xc4); db(0x70); db(0x00);
  db(0x72); db(0x00); db(0x61); db(0x00); db(0xfd); db(0x16); db(0x2b); db(0x40);
  db(0x02); db(0x08); db(0x67); db(0x00); db(0x02); db(0x42); db(0x60); db(0x00);
  db(0xff); db(0x76); db(0x4a); db(0xad); db(0x02); db(0x0c); db(0x66); db(0x48);
  db(0x4a); db(0xab); db(0x00); db(0x1c); db(0x66); db(0x00); db(0xff); db(0x68);
  db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e);
- db(0x43); db(0xfa); db(0x06); db(0x9f); db(0x4e); db(0xae); db(0xfe); db(0xec);
+ db(0x43); db(0xfa); db(0x06); db(0xa3); db(0x4e); db(0xae); db(0xfe); db(0xec);
  db(0x24); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x76); db(0x4a); db(0x82);
- db(0x67); db(0x00); db(0xff); db(0x4c); db(0x41); db(0xfa); db(0x06); db(0x8b);
+ db(0x67); db(0x00); db(0xff); db(0x4c); db(0x41); db(0xfa); db(0x06); db(0x8f);
  db(0x70); db(0x00); db(0x72); db(0x00); db(0x61); db(0x00); db(0xfc); db(0xd4);
  db(0x2b); db(0x40); db(0x02); db(0x0c); db(0x67); db(0x00); db(0x02); db(0x00);
  db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x00); db(0x61); db(0x00);
  db(0x00); db(0x40); db(0x2a); db(0x40); db(0x2b); db(0x4e); db(0x00); db(0x14);
  db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0e); db(0x61); db(0x00);
  db(0xf9); db(0xb0); db(0x20); db(0x0d); db(0x4e); db(0x90); db(0x41); db(0xfa);
- db(0x04); db(0x66); db(0x43); db(0xfa); db(0x01); db(0x14); db(0x70); db(0xf6);
+ db(0x04); db(0x6a); db(0x43); db(0xfa); db(0x01); db(0x14); db(0x70); db(0xf6);
  db(0x22); db(0x3c); db(0x00); db(0x00); db(0x27); db(0x10); db(0x61); db(0x00);
  db(0xee); db(0xe6); db(0x70); db(0x00); db(0x4c); db(0xdf); db(0x60); db(0x00);
  db(0x4e); db(0x75); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0a);
  db(0x20); db(0x3c); db(0x00); db(0x00); db(0x00); db(0x88); db(0x4e); db(0xae);
  db(0xff); db(0x2e); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x48); db(0xe7);
  db(0x38); db(0x3e); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x41); db(0xfa);
- db(0x03); db(0xf4); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00);
+ db(0x03); db(0xf8); db(0x22); db(0x08); db(0x24); db(0x3c); db(0x00); db(0x00);
  db(0x03); db(0xed); db(0x4e); db(0xae); db(0xff); db(0xe2); db(0x28); db(0x00);
  db(0x67); db(0x4c); db(0x45); db(0xed); db(0x00); db(0x68); db(0x42); db(0x92);
  db(0x34); db(0xaa); db(0x00); db(0x02); db(0x24); db(0x0a); db(0x54); db(0x82);
  db(0x61); db(0x00); db(0xf8); db(0xf6); db(0x4e); db(0x90); db(0x22); db(0x04);
  db(0x67); db(0x04); db(0x4e); db(0xae); db(0xff); db(0xdc); db(0x4c); db(0xdf);
  db(0x7c); db(0x1c); db(0x4e); db(0x75); db(0x2c); db(0x6d); db(0x00); db(0x18);
- db(0x41); db(0xfa); db(0x03); db(0x6c); db(0x22); db(0x08); db(0x74); db(0xfe);
+ db(0x41); db(0xfa); db(0x03); db(0x70); db(0x22); db(0x08); db(0x74); db(0xfe);
  db(0x4e); db(0xae); db(0xff); db(0xac); db(0x22); db(0x00); db(0x67); db(0x34);
  db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14);
  db(0x45); db(0xed); db(0x00); db(0x38); db(0x70); db(0xff); db(0x4e); db(0xae);
  db(0xfe); db(0xb6); db(0x15); db(0x40); db(0x00); db(0x14); db(0x41); db(0xfa);
- db(0x03); db(0x5c); db(0x24); db(0x88); db(0x25); db(0x7c); db(0x00); db(0x00);
+ db(0x03); db(0x60); db(0x24); db(0x88); db(0x25); db(0x7c); db(0x00); db(0x00);
  db(0x00); db(0x12); db(0x00); db(0x0c); db(0x25); db(0x6d); db(0x00); db(0x08);
  db(0x00); db(0x10); db(0x2c); db(0x6d); db(0x00); db(0x18); db(0x22); db(0x0a);
  db(0x4e); db(0xae); db(0xfc); db(0x88); db(0x2c); db(0x6d); db(0x00); db(0x14);
  db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0xfc); db(0x2a); db(0x40);
  db(0x2c); db(0x6d); db(0x00); db(0x14); db(0x93); db(0xc9); db(0x4e); db(0xae);
  db(0xfe); db(0xda); db(0x2b); db(0x40); db(0x00); db(0x08); db(0x43); db(0xfa);
- db(0x03); db(0x88); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
+ db(0x03); db(0x8c); db(0x70); db(0x00); db(0x4e); db(0xae); db(0xfd); db(0xd8);
  db(0x2b); db(0x40); db(0x00); db(0x18); db(0x67); db(0x00); db(0xfe); db(0xda);
  db(0x2c); db(0x40); db(0x72); db(0x32); db(0x4e); db(0xae); db(0xff); db(0x3a);
- db(0x41); db(0xfa); db(0x02); db(0xc0); db(0x22); db(0x08); db(0x74); db(0xfe);
+ db(0x41); db(0xfa); db(0x02); db(0xc4); db(0x22); db(0x08); db(0x74); db(0xfe);
  db(0x4e); db(0xae); db(0xff); db(0xac); db(0x4a); db(0x80); db(0x67); db(0xea);
  db(0x22); db(0x00); db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x72); db(0x32);
- db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x02); db(0xaa);
+ db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x41); db(0xfa); db(0x02); db(0xae);
  db(0x22); db(0x08); db(0x74); db(0xfe); db(0x4e); db(0xae); db(0xff); db(0xac);
  db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0xa4); db(0x22); db(0x00);
  db(0x4e); db(0xae); db(0xff); db(0xa6); db(0x2c); db(0x6d); db(0x00); db(0x14);
  db(0x4a); db(0x80); db(0x67); db(0x00); db(0xfe); db(0x84); db(0x70); db(0x00);
  db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xc2);
  db(0x72); db(0x00); db(0x20); db(0x2d); db(0x00); db(0x0c); db(0x41); db(0xfa);
- db(0x02); db(0x83); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x44);
+ db(0x02); db(0x87); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x44);
  db(0x4a); db(0x80); db(0x66); db(0xe2); db(0x20); db(0x6c); db(0x00); db(0x14);
  db(0x0c); db(0x68); db(0x00); db(0x25); db(0x00); db(0x14); db(0x64); db(0x0c);
  db(0x61); db(0x00); db(0xfe); db(0x48); db(0x70); db(0x00); db(0x4e); db(0xae);
  db(0x41); db(0xed); db(0x00); db(0x1c); db(0x29); db(0x48); db(0x00); db(0x28);
  db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x24); db(0x39); db(0x7c);
  db(0x00); db(0x0c); db(0x00); db(0x1c); db(0x2b); db(0x4d); db(0x00); db(0x2c);
- db(0x41); db(0xfa); db(0x01); db(0x5c); db(0x2b); db(0x48); db(0x00); db(0x24);
+ db(0x41); db(0xfa); db(0x01); db(0x60); db(0x2b); db(0x48); db(0x00); db(0x24);
  db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c);
  db(0xff); db(0x38); db(0x72); db(0x0f); db(0x61); db(0x00); db(0xf7); db(0x9a);
  db(0x4e); db(0x90); db(0x4a); db(0xad); db(0x00); db(0x00); db(0x66); db(0x1c);
  db(0x05); db(0xc0); db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae);
  db(0xfe); db(0xc2); db(0x05); db(0x00); db(0x67); db(0x06); db(0x61); db(0x00);
  db(0xfe); db(0x1e); db(0x60); db(0xe4); db(0x20); db(0x2d); db(0x00); db(0x00);
- db(0x67); db(0x00); db(0x00); db(0x72); db(0x72); db(0x01); db(0x4e); db(0xae);
+ db(0x67); db(0x00); db(0x00); db(0x76); db(0x72); db(0x01); db(0x4e); db(0xae);
  db(0xff); db(0x3a); db(0x2b); db(0x40); db(0x00); db(0x04); db(0x30); db(0x3c);
  db(0xff); db(0x38); db(0x72); db(0x0c); db(0x61); db(0x00); db(0xf7); db(0x5a);
- db(0x4e); db(0x90); db(0x4a); db(0xad); db(0x00); db(0x04); db(0x67); db(0x3a);
- db(0x39); db(0x7c); db(0x00); db(0x03); db(0x00); db(0x1c); db(0x42); db(0x2c);
- db(0x00); db(0x1f); db(0x42); db(0xac); db(0x00); db(0x20); db(0x29); db(0x6d);
- db(0x00); db(0x00); db(0x00); db(0x24); db(0x29); db(0x6d); db(0x00); db(0x04);
- db(0x00); db(0x28); db(0x42); db(0xac); db(0x00); db(0x2c); db(0x42); db(0xac);
- db(0x00); db(0x30); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38);
- db(0x2b); db(0x6c); db(0x00); db(0x30); db(0x00); db(0x10); db(0x39); db(0x7c);
- db(0x00); db(0x04); db(0x00); db(0x1c); db(0x22); db(0x4c); db(0x4e); db(0xae);
- db(0xfe); db(0x38); db(0x20); db(0x2d); db(0x00); db(0x00); db(0x42); db(0xad);
- db(0x00); db(0x00); db(0x22); db(0x2d); db(0x00); db(0x04); db(0x67); db(0x00);
- db(0xff); db(0x78); db(0x22); db(0x41); db(0x4e); db(0xae); db(0xff); db(0x2e);
- db(0x60); db(0x00); db(0xff); db(0x6e); db(0x39); db(0x7c); db(0x00); db(0x02);
- db(0x00); db(0x1c); db(0x41); db(0xed); db(0x00); db(0x30); db(0x42); db(0x90);
- db(0x42); db(0xa8); db(0x00); db(0x04); db(0x42); db(0x2c); db(0x00); db(0x1f);
- db(0x42); db(0xac); db(0x00); db(0x2c); db(0x42); db(0xac); db(0x00); db(0x30);
- db(0x29); db(0x48); db(0x00); db(0x28); db(0x70); db(0x08); db(0x29); db(0x40);
+ db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x40); db(0x4a); db(0xad);
+ db(0x00); db(0x04); db(0x67); db(0x3a); db(0x39); db(0x7c); db(0x00); db(0x03);
+ db(0x00); db(0x1c); db(0x42); db(0x2c); db(0x00); db(0x1f); db(0x42); db(0xac);
+ db(0x00); db(0x20); db(0x29); db(0x6d); db(0x00); db(0x00); db(0x00); db(0x24);
+ db(0x29); db(0x6d); db(0x00); db(0x04); db(0x00); db(0x28); db(0x42); db(0xac);
+ db(0x00); db(0x2c); db(0x42); db(0xac); db(0x00); db(0x30); db(0x22); db(0x4c);
+ db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x2b); db(0x6c); db(0x00); db(0x30);
+ db(0x00); db(0x10); db(0x39); db(0x7c); db(0x00); db(0x04); db(0x00); db(0x1c);
+ db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x20); db(0x2d);
+ db(0x00); db(0x00); db(0x42); db(0xad); db(0x00); db(0x00); db(0x22); db(0x2d);
+ db(0x00); db(0x04); db(0x67); db(0x00); db(0xff); db(0x74); db(0x22); db(0x41);
+ db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x60); db(0x00); db(0xff); db(0x6a);
+ db(0x39); db(0x7c); db(0x00); db(0x02); db(0x00); db(0x1c); db(0x41); db(0xed);
+ db(0x00); db(0x30); db(0x42); db(0x90); db(0x42); db(0xa8); db(0x00); db(0x04);
+ db(0x42); db(0x2c); db(0x00); db(0x1f); db(0x42); db(0xac); db(0x00); db(0x2c);
+ db(0x42); db(0xac); db(0x00); db(0x30); db(0x29); db(0x48); db(0x00); db(0x28);
+ db(0x70); db(0x08); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c);
+ db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x0c); db(0xad); db(0x46); db(0x4f);
+ db(0x52); db(0x4d); db(0x00); db(0x30); db(0x66); db(0x52); db(0x20); db(0x2d);
+ db(0x00); db(0x34); db(0x67); db(0x4c); db(0x6b); db(0x4a); db(0x2b); db(0x6c);
+ db(0x00); db(0x30); db(0x00); db(0x10); db(0x50); db(0x80); db(0x24); db(0x00);
+ db(0x72); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x3a); db(0x4a); db(0x80);
+ db(0x67); db(0x36); db(0x24); db(0x40); db(0x20); db(0x4a); db(0x20); db(0xed);
+ db(0x00); db(0x30); db(0x20); db(0xed); db(0x00); db(0x34); db(0x29); db(0x48);
+ db(0x00); db(0x28); db(0x20); db(0x02); db(0x51); db(0x80); db(0x29); db(0x40);
  db(0x00); db(0x24); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38);
- db(0x0c); db(0xad); db(0x46); db(0x4f); db(0x52); db(0x4d); db(0x00); db(0x30);
- db(0x66); db(0x52); db(0x20); db(0x2d); db(0x00); db(0x34); db(0x67); db(0x4c);
- db(0x6b); db(0x4a); db(0x2b); db(0x6c); db(0x00); db(0x30); db(0x00); db(0x10);
- db(0x50); db(0x80); db(0x24); db(0x00); db(0x72); db(0x01); db(0x4e); db(0xae);
- db(0xff); db(0x3a); db(0x4a); db(0x80); db(0x67); db(0x36); db(0x24); db(0x40);
- db(0x20); db(0x4a); db(0x20); db(0xed); db(0x00); db(0x30); db(0x20); db(0xed);
- db(0x00); db(0x34); db(0x29); db(0x48); db(0x00); db(0x28); db(0x20); db(0x02);
- db(0x51); db(0x80); db(0x29); db(0x40); db(0x00); db(0x24); db(0x22); db(0x4c);
- db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x30); db(0x3c); db(0xff); db(0x38);
- db(0x72); db(0x0b); db(0x61); db(0x00); db(0xf6); db(0x84); db(0x20); db(0x2c);
- db(0x00); db(0x20); db(0x4e); db(0x90); db(0x22); db(0x4a); db(0x20); db(0x02);
- db(0x4e); db(0xae); db(0xff); db(0x2e); db(0x4a); db(0xac); db(0x00); db(0x20);
- db(0x67); db(0x00); db(0xfe); db(0xde); db(0x41); db(0xed); db(0x00); db(0x30);
- db(0x29); db(0x48); db(0x00); db(0x28); db(0x70); db(0x01); db(0x29); db(0x40);
- db(0x00); db(0x24); db(0x42); db(0xac); db(0x00); db(0x20); db(0x22); db(0x4c);
- db(0x4e); db(0xae); db(0xfe); db(0x38); db(0x60); db(0xde); db(0x41); db(0xe8);
- db(0xff); db(0xe4); db(0x20); db(0x29); db(0x00); db(0x08); db(0xb0); db(0xa8);
- db(0x00); db(0x10); db(0x67); db(0x1a); db(0x21); db(0x40); db(0x00); db(0x10);
- db(0x2f); db(0x0e); db(0x2c); db(0x68); db(0x00); db(0x14); db(0x22); db(0x68);
- db(0x00); db(0x08); db(0x70); db(0x00); db(0x08); db(0xc0); db(0x00); db(0x0d);
- db(0x4e); db(0xae); db(0xfe); db(0xbc); db(0x2c); db(0x5f); db(0x70); db(0x00);
- db(0x4e); db(0x75); db(0x2c); db(0x78); db(0x00); db(0x04); db(0x74); db(0xff);
- db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x64); db(0x61); db(0x00);
- db(0xf6); db(0x18); db(0x4e); db(0x90); db(0x4a); db(0x80); db(0x67); db(0x38);
- db(0x74); db(0x00); db(0x4e); db(0xae); db(0xff); db(0x7c); db(0x41); db(0xee);
- db(0x01); db(0x5e); db(0x43); db(0xfa); db(0x00); db(0x62); db(0x4e); db(0xae);
- db(0xfe); db(0xec); db(0x4a); db(0x80); db(0x67); db(0x1e); db(0x20); db(0x40);
- db(0x43); db(0xfa); db(0x00); db(0x22); db(0x24); db(0x68); db(0xff); db(0xe4);
- db(0x21); db(0x49); db(0xff); db(0xe4); db(0x22); db(0x48); db(0x30); db(0x3c);
- db(0xff); db(0x38); db(0x72); db(0x65); db(0x61); db(0x00); db(0xf5); db(0xe2);
- db(0x4e); db(0x90); db(0x74); db(0x01); db(0x4e); db(0xae); db(0xff); db(0x76);
- db(0x20); db(0x02); db(0x4e); db(0x75); db(0x59); db(0x8f); db(0x48); db(0xe7);
- db(0xc0); db(0x80); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x66);
- db(0x61); db(0x00); db(0xf5); db(0xc6); db(0x4e); db(0x90); db(0x4c); db(0xdf);
- db(0x01); db(0x03); db(0x4e); db(0x75); db(0x69); db(0x6e); db(0x70); db(0x75);
- db(0x74); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65);
- db(0x00); db(0x74); db(0x69); db(0x6d); db(0x65); db(0x72); db(0x2e); db(0x64);
- db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x63); db(0x6f);
- db(0x6e); db(0x73); db(0x6f); db(0x6c); db(0x65); db(0x2e); db(0x64); db(0x65);
- db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x44); db(0x45); db(0x56);
- db(0x53); db(0x00); db(0x44); db(0x45); db(0x56); db(0x53); db(0x3a); db(0x00);
- db(0x44); db(0x45); db(0x56); db(0x53); db(0x3a); db(0x63); db(0x6c); db(0x69);
- db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); db(0x2e); db(0x64);
- db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x52); db(0x41);
- db(0x4d); db(0x3a); db(0x00); db(0x63); db(0x6c); db(0x69); db(0x70); db(0x62);
- db(0x6f); db(0x61); db(0x72); db(0x64); db(0x2e); db(0x64); db(0x65); db(0x76);
- db(0x69); db(0x63); db(0x65); db(0x00); db(0x52); db(0x41); db(0x4d); db(0x3a);
- db(0x45); db(0x6e); db(0x76); db(0x2f); db(0x53); db(0x79); db(0x73); db(0x2f);
- db(0x50); db(0x6f); db(0x69); db(0x6e); db(0x74); db(0x65); db(0x72); db(0x2e);
- db(0x70); db(0x72); db(0x65); db(0x66); db(0x73); db(0x00); db(0x55); db(0x41);
- db(0x45); db(0x20); db(0x63); db(0x6c); db(0x69); db(0x70); db(0x62); db(0x6f);
- db(0x61); db(0x72); db(0x64); db(0x20); db(0x73); db(0x68); db(0x61); db(0x72);
- db(0x69); db(0x6e); db(0x67); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20);
- db(0x6d); db(0x6f); db(0x75); db(0x73); db(0x65); db(0x20); db(0x64); db(0x72);
- db(0x69); db(0x76); db(0x65); db(0x72); db(0x00); db(0x55); db(0x41); db(0x45);
- db(0x20); db(0x66); db(0x69); db(0x6c); db(0x65); db(0x73); db(0x79); db(0x73);
- db(0x74); db(0x65); db(0x6d); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20);
- db(0x66); db(0x73); db(0x20); db(0x61); db(0x75); db(0x74); db(0x6f); db(0x6d);
- db(0x6f); db(0x75); db(0x6e); db(0x74); db(0x65); db(0x72); db(0x00); db(0x55);
- db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x20); db(0x61); db(0x75);
- db(0x74); db(0x6f); db(0x6d); db(0x6f); db(0x75); db(0x6e); db(0x74); db(0x20);
- db(0x70); db(0x72); db(0x6f); db(0x63); db(0x65); db(0x73); db(0x73); db(0x00);
- db(0x64); db(0x6f); db(0x73); db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72);
- db(0x61); db(0x72); db(0x79); db(0x00); db(0x69); db(0x6e); db(0x74); db(0x75);
- db(0x69); db(0x74); db(0x69); db(0x6f); db(0x6e); db(0x2e); db(0x6c); db(0x69);
- db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x67); db(0x72);
- db(0x61); db(0x70); db(0x68); db(0x69); db(0x63); db(0x73); db(0x2e); db(0x6c);
- db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x65);
- db(0x78); db(0x70); db(0x61); db(0x6e); db(0x73); db(0x69); db(0x6f); db(0x6e);
- db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79);
- db(0x00); db(0x46); db(0x69); db(0x6c); db(0x65); db(0x53); db(0x79); db(0x73);
- db(0x74); db(0x65); db(0x6d); db(0x2e); db(0x72); db(0x65); db(0x73); db(0x6f);
- db(0x75); db(0x72); db(0x63); db(0x65); db(0x00); db(0x6d); db(0x65); db(0x67);
- db(0x61); db(0x63); db(0x68); db(0x69); db(0x70); db(0x20); db(0x6d); db(0x65);
- db(0x6d); db(0x6f); db(0x72); db(0x79); db(0x00); db(0x00); db(0x00); db(0x00);
- db(0x00); db(0x00); db(0x03); db(0xf2);
+ db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x0b); db(0x61); db(0x00);
+ db(0xf6); db(0x80); db(0x20); db(0x2c); db(0x00); db(0x20); db(0x4e); db(0x90);
+ db(0x22); db(0x4a); db(0x20); db(0x02); db(0x4e); db(0xae); db(0xff); db(0x2e);
+ db(0x4a); db(0xac); db(0x00); db(0x20); db(0x67); db(0x00); db(0xfe); db(0xda);
+ db(0x41); db(0xed); db(0x00); db(0x30); db(0x29); db(0x48); db(0x00); db(0x28);
+ db(0x70); db(0x01); db(0x29); db(0x40); db(0x00); db(0x24); db(0x42); db(0xac);
+ db(0x00); db(0x20); db(0x22); db(0x4c); db(0x4e); db(0xae); db(0xfe); db(0x38);
+ db(0x60); db(0xde); db(0x41); db(0xe8); db(0xff); db(0xe4); db(0x20); db(0x29);
+ db(0x00); db(0x08); db(0xb0); db(0xa8); db(0x00); db(0x10); db(0x67); db(0x1a);
+ db(0x21); db(0x40); db(0x00); db(0x10); db(0x2f); db(0x0e); db(0x2c); db(0x68);
+ db(0x00); db(0x14); db(0x22); db(0x68); db(0x00); db(0x08); db(0x70); db(0x00);
+ db(0x08); db(0xc0); db(0x00); db(0x0d); db(0x4e); db(0xae); db(0xfe); db(0xbc);
+ db(0x2c); db(0x5f); db(0x70); db(0x00); db(0x4e); db(0x75); db(0x2c); db(0x78);
+ db(0x00); db(0x04); db(0x74); db(0xff); db(0x30); db(0x3c); db(0xff); db(0x38);
+ db(0x72); db(0x64); db(0x61); db(0x00); db(0xf6); db(0x14); db(0x4e); db(0x90);
+ db(0x4a); db(0x80); db(0x67); db(0x38); db(0x74); db(0x00); db(0x4e); db(0xae);
+ db(0xff); db(0x7c); db(0x41); db(0xee); db(0x01); db(0x5e); db(0x43); db(0xfa);
+ db(0x00); db(0x62); db(0x4e); db(0xae); db(0xfe); db(0xec); db(0x4a); db(0x80);
+ db(0x67); db(0x1e); db(0x20); db(0x40); db(0x43); db(0xfa); db(0x00); db(0x22);
+ db(0x24); db(0x68); db(0xff); db(0xe4); db(0x21); db(0x49); db(0xff); db(0xe4);
+ db(0x22); db(0x48); db(0x30); db(0x3c); db(0xff); db(0x38); db(0x72); db(0x65);
+ db(0x61); db(0x00); db(0xf5); db(0xde); db(0x4e); db(0x90); db(0x74); db(0x01);
+ db(0x4e); db(0xae); db(0xff); db(0x76); db(0x20); db(0x02); db(0x4e); db(0x75);
+ db(0x59); db(0x8f); db(0x48); db(0xe7); db(0xc0); db(0x80); db(0x30); db(0x3c);
+ db(0xff); db(0x38); db(0x72); db(0x66); db(0x61); db(0x00); db(0xf5); db(0xc2);
+ db(0x4e); db(0x90); db(0x4c); db(0xdf); db(0x01); db(0x03); db(0x4e); db(0x75);
+ db(0x69); db(0x6e); db(0x70); db(0x75); db(0x74); db(0x2e); db(0x64); db(0x65);
+ db(0x76); db(0x69); db(0x63); db(0x65); db(0x00); db(0x74); db(0x69); db(0x6d);
+ db(0x65); db(0x72); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63);
+ db(0x65); db(0x00); db(0x63); db(0x6f); db(0x6e); db(0x73); db(0x6f); db(0x6c);
+ db(0x65); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65);
+ db(0x00); db(0x44); db(0x45); db(0x56); db(0x53); db(0x00); db(0x44); db(0x45);
+ db(0x56); db(0x53); db(0x3a); db(0x00); db(0x44); db(0x45); db(0x56); db(0x53);
+ db(0x3a); db(0x63); db(0x6c); db(0x69); db(0x70); db(0x62); db(0x6f); db(0x61);
+ db(0x72); db(0x64); db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63);
+ db(0x65); db(0x00); db(0x52); db(0x41); db(0x4d); db(0x3a); db(0x00); db(0x63);
+ db(0x6c); db(0x69); db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64);
+ db(0x2e); db(0x64); db(0x65); db(0x76); db(0x69); db(0x63); db(0x65); db(0x00);
+ db(0x52); db(0x41); db(0x4d); db(0x3a); db(0x45); db(0x6e); db(0x76); db(0x2f);
+ db(0x53); db(0x79); db(0x73); db(0x2f); db(0x50); db(0x6f); db(0x69); db(0x6e);
+ db(0x74); db(0x65); db(0x72); db(0x2e); db(0x70); db(0x72); db(0x65); db(0x66);
+ db(0x73); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x63); db(0x6c);
+ db(0x69); db(0x70); db(0x62); db(0x6f); db(0x61); db(0x72); db(0x64); db(0x20);
+ db(0x73); db(0x68); db(0x61); db(0x72); db(0x69); db(0x6e); db(0x67); db(0x00);
+ db(0x55); db(0x41); db(0x45); db(0x20); db(0x6d); db(0x6f); db(0x75); db(0x73);
+ db(0x65); db(0x20); db(0x64); db(0x72); db(0x69); db(0x76); db(0x65); db(0x72);
+ db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x66); db(0x69); db(0x6c);
+ db(0x65); db(0x73); db(0x79); db(0x73); db(0x74); db(0x65); db(0x6d); db(0x00);
+ db(0x55); db(0x41); db(0x45); db(0x20); db(0x66); db(0x73); db(0x20); db(0x61);
+ db(0x75); db(0x74); db(0x6f); db(0x6d); db(0x6f); db(0x75); db(0x6e); db(0x74);
+ db(0x65); db(0x72); db(0x00); db(0x55); db(0x41); db(0x45); db(0x20); db(0x66);
+ db(0x73); db(0x20); db(0x61); db(0x75); db(0x74); db(0x6f); db(0x6d); db(0x6f);
+ db(0x75); db(0x6e); db(0x74); db(0x20); db(0x70); db(0x72); db(0x6f); db(0x63);
+ db(0x65); db(0x73); db(0x73); db(0x00); db(0x64); db(0x6f); db(0x73); db(0x2e);
+ db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); db(0x72); db(0x79); db(0x00);
+ db(0x69); db(0x6e); db(0x74); db(0x75); db(0x69); db(0x74); db(0x69); db(0x6f);
+ db(0x6e); db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61); db(0x72);
+ db(0x79); db(0x00); db(0x67); db(0x72); db(0x61); db(0x70); db(0x68); db(0x69);
+ db(0x63); db(0x73); db(0x2e); db(0x6c); db(0x69); db(0x62); db(0x72); db(0x61);
+ db(0x72); db(0x79); db(0x00); db(0x65); db(0x78); db(0x70); db(0x61); db(0x6e);
+ db(0x73); db(0x69); db(0x6f); db(0x6e); db(0x2e); db(0x6c); db(0x69); db(0x62);
+ db(0x72); db(0x61); db(0x72); db(0x79); db(0x00); db(0x46); db(0x69); db(0x6c);
+ db(0x65); db(0x53); db(0x79); db(0x73); db(0x74); db(0x65); db(0x6d); db(0x2e);
+ db(0x72); db(0x65); db(0x73); db(0x6f); db(0x75); db(0x72); db(0x63); db(0x65);
+ db(0x00); db(0x6d); db(0x65); db(0x67); db(0x61); db(0x63); db(0x68); db(0x69);
+ db(0x70); db(0x20); db(0x6d); db(0x65); db(0x6d); db(0x6f); db(0x72); db(0x79);
+ db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x00); db(0x03); db(0xf2);
 
index 55502e44b2eaafa03f2b041e8e7e12fdd06d9db8..93073ffe840963d1dc727e6cac3afee2ac0fd02f 100644 (file)
@@ -2138,9 +2138,10 @@ static void gen_opcode (unsigned long int opcode)
                    printf ("\t\tregs.sr = newsr; MakeFromSR ();\n}\n");
                    pop_braces (old_brace_level);
                    printf ("\tregs.sr = newsr; MakeFromSR ();\n");
-                   printf ("\tif (newpc & 1)\n");
+                   printf ("\tif (newpc & 1) {\n");
                    printf ("\t\texception3 (0x%04X, m68k_getpc (), newpc);\n", opcode);
-                   printf ("\telse\n");
+                       printf ("\t\t goto %s;\n", endlabelstr);
+                       printf ("\t}\n");
                    printf ("\t\tm68k_setpc (newpc);\n");
                        printf ("\tipl_fetch ();\n");
                    need_endlabel = 1;
@@ -2159,14 +2160,16 @@ static void gen_opcode (unsigned long int opcode)
                        genamode (Aipi, "7", sz_long, "pc", 1, 0, 0);
                        genamode (curi->smode, "srcreg", curi->size, "offs", 1, 0, 0);
                        printf ("\tm68k_areg (regs, 7) += offs;\n");
-                       printf ("\tif (pc & 1)\n");
+                       printf ("\tif (pc & 1) {\n");
                        printf ("\t\texception3 (0x%04X, m68k_getpc (), pc);\n", opcode);
-                       printf ("\telse\n");
+                       printf ("\t\tgoto %s;\n", endlabelstr);
+                       printf ("\t}\n");
                        setpc ("pc");
                }
                /* PC is set and prefetch filled. */
                m68k_pc_offset = 0;
                fill_prefetch_full ();
+           need_endlabel = 1;
                break;
        case i_LINK:
                // ce confirmed
@@ -2203,6 +2206,7 @@ static void gen_opcode (unsigned long int opcode)
                }
                break;
        case i_RTS:
+               printf ("\tuaecptr pc = m68k_getpc ();\n");
                if (using_ce020 == 1)
                        printf ("\tm68k_do_rts_ce020 ();\n");
                else if (using_ce020 == 2)
@@ -2215,9 +2219,16 @@ static void gen_opcode (unsigned long int opcode)
                        printf ("\tm68k_do_rts_mmu ();\n");
                else
                        printf ("\tm68k_do_rts ();\n");
+           printf ("\tif (m68k_getpc () & 1) {\n");
+               printf ("\t\tuaecptr faultpc = m68k_getpc ();\n");
+               printf ("\t\tm68k_setpc (pc);\n");
+               printf ("\t\texception3 (0x%04X, pc, faultpc);\n", opcode);
+               printf ("\t\tgoto %s;\n", endlabelstr);
+               printf ("\t}\n");
                count_read += 2;
                m68k_pc_offset = 0;
                fill_prefetch_full ();
+           need_endlabel = 1;
                break;
        case i_TRAPV:
                sync_m68k_pc ();
index 639f5eda69a1eac03be62e8903e858d7cf48ce8d..148bcfe8d920aed474c8d0d02556b84d18bd48c2 100644 (file)
@@ -1,9 +1,9 @@
 
-extern void amiga_clipboard_want_data (void);
+extern int amiga_clipboard_want_data (void);
 extern void amiga_clipboard_got_data (uaecptr data, uae_u32 size, uae_u32 actual);
 extern void amiga_clipboard_die (void);
 extern void amiga_clipboard_init (void);
 extern uaecptr amiga_clipboard_proc_start (void);
 extern void amiga_clipboard_task_start (uaecptr);
-
+extern void clipboard_disable (bool);
 extern void clipboard_vsync (void);
\ No newline at end of file
index a81f8a1b5cae76f06cda8e8823bc403b19b6636e..df31789a38a8b58d1555e80828816ae4602d6ab6 100644 (file)
@@ -237,7 +237,8 @@ STATIC_INLINE void m68k_incpci (int o)
 
 STATIC_INLINE void m68k_do_rts (void)
 {
-       m68k_setpc (get_long (m68k_areg (regs, 7)));
+       uae_u32 newpc = get_long (m68k_areg (regs, 7));
+       m68k_setpc (newpc);
        m68k_areg (regs, 7) += 4;
 }
 STATIC_INLINE void m68k_do_rtsi (void)
index 67013961b1d71c2016ff8455f7ea12baf0402f9b..0523f68198f20b954fd324201614ef93b77fb439 100644 (file)
@@ -29,6 +29,8 @@
 #include <winioctl.h>
 #include <setupapi.h>   // for SetupDiXxx functions.
 #include <stddef.h>
+
+#include "cda_play.h"
 #ifdef RETROPLATFORM
 #include "rp.h"
 #endif
@@ -483,236 +485,182 @@ static void *cdda_play (void *v)
        int num_sectors = CDDA_BUFFERS;
        int bufnum;
        int buffered;
-       uae_u8 *px[2], *p;
        int bufon[2];
        int i;
-       WAVEHDR whdr[2];
-       MMRESULT mmr;
-       int volume[2], volume_main;
        int oldplay;
        int idleframes;
        int readblocksize = 2352 + 96;
 
-       for (i = 0; i < 2; i++) {
-               memset (&whdr[i], 0, sizeof (WAVEHDR));
-               whdr[i].dwFlags = WHDR_DONE;
-       }
-
        while (ciw->cdda_play == 0)
                Sleep (10);
        oldplay = -1;
 
-       p = xmalloc (uae_u8, 2 * num_sectors * readblocksize);
-       px[0] = p;
-       px[1] = p + num_sectors * readblocksize;
        bufon[0] = bufon[1] = 0;
        bufnum = 0;
        buffered = 0;
-       volume[0] = volume[1] = -1;
-       volume_main = -1;
-
-       if (cdda_openwav (ciw)) {
-
-               for (i = 0; i < 2; i++) {
-                       memset (&whdr[i], 0, sizeof (WAVEHDR));
-                       whdr[i].dwBufferLength = 2352 * num_sectors;
-                       whdr[i].lpData = (LPSTR)px[i];
-                       mmr = waveOutPrepareHeader (ciw->cdda_wavehandle, &whdr[i], sizeof (WAVEHDR));
-                       if (mmr != MMSYSERR_NOERROR) {
-                               write_log (L"IOCTL CDDA: waveOutPrepareHeader %d:%d\n", i, mmr);
-                               goto end;
-                       }
-                       whdr[i].dwFlags |= WHDR_DONE;
-               }
 
-               while (ciw->cdda_play > 0) {
-
-                       while (!(whdr[bufnum].dwFlags & WHDR_DONE)) {
+       cda_audio *cda = new cda_audio (num_sectors);
+
+       while (ciw->cdda_play > 0) {
+
+               cda->wait(bufnum);
+               if (ciw->cdda_play <= 0)
+                       goto end;
+               bufon[bufnum] = 0;
+
+               if (oldplay != ciw->cdda_play) {
+                       idleframes = 0;
+                       bool seensub = false;
+                       struct _timeb tb1, tb2;
+                       _ftime (&tb1);
+                       cdda_pos = ciw->cdda_start;
+                       ciw->cd_last_pos = cdda_pos;
+                       oldplay = ciw->cdda_play;
+                       write_log (L"IOCTL%s CDDA: playing from %d to %d\n",
+                               ciw->usesptiread ? L"(SPTI)" : L"", ciw->cdda_start, ciw->cdda_end);
+                       ciw->subcodevalid = false;
+                       idleframes = ciw->cdda_delay_frames;
+                       while (ciw->cdda_paused && ciw->cdda_play > 0) {
                                Sleep (10);
-                               if (ciw->cdda_play <= 0)
-                                       goto end;
+                               idleframes = -1;
                        }
-                       bufon[bufnum] = 0;
-
-                       if (oldplay != ciw->cdda_play) {
-                               idleframes = 0;
-                               bool seensub = false;
-                               struct _timeb tb1, tb2;
-                               _ftime (&tb1);
-                               cdda_pos = ciw->cdda_start;
-                               ciw->cd_last_pos = cdda_pos;
-                               oldplay = ciw->cdda_play;
-                               write_log (L"IOCTL%s CDDA: playing from %d to %d\n",
-                                       ciw->usesptiread ? L"(SPTI)" : L"", ciw->cdda_start, ciw->cdda_end);
-                               ciw->subcodevalid = false;
-                               idleframes = ciw->cdda_delay_frames;
-                               while (ciw->cdda_paused && ciw->cdda_play > 0) {
-                                       Sleep (10);
-                                       idleframes = -1;
-                               }
-                               // force spin up
-                               read_block (ciw, -1, px[bufnum], cdda_pos, num_sectors, readblocksize);
-
-                               if (ciw->cdda_scan == 0) {
-                                       // find possible P-subchannel=1 and fudge starting point so that
-                                       // buggy CD32/CDTV software CD+G handling does not miss any frames
-                                       bool seenindex = false;
-                                       for (int sector = cdda_pos - 200; sector < cdda_pos; sector++) {
-                                               uae_u8 *dst = px[bufnum];
-                                               if (sector >= 0 && read_block (ciw, -1, dst, sector, 1, readblocksize)) {
-                                                       uae_u8 subbuf[SUB_CHANNEL_SIZE];
-                                                       sub_deinterleave (dst + 2352, subbuf);
-                                                       if (seenindex) {
-                                                               for (int i = 2 * SUB_ENTRY_SIZE; i < SUB_CHANNEL_SIZE; i++) {
-                                                                       if (subbuf[i]) { // non-zero R-W subchannels?
-                                                                               int diff = cdda_pos - sector + 2;
-                                                                               write_log (L"-> CD+G start pos fudge -> %d (%d)\n", sector, -diff);
-                                                                               idleframes -= diff;
-                                                                               cdda_pos = sector;
-                                                                               seensub = true;
-                                                                               break;
-                                                                       }
+                       // force spin up
+                       read_block (ciw, -1, cda->buffers[bufnum], cdda_pos, num_sectors, readblocksize);
+
+                       if (ciw->cdda_scan == 0) {
+                               // find possible P-subchannel=1 and fudge starting point so that
+                               // buggy CD32/CDTV software CD+G handling does not miss any frames
+                               bool seenindex = false;
+                               for (int sector = cdda_pos - 200; sector < cdda_pos; sector++) {
+                                       uae_u8 *dst = cda->buffers[bufnum];
+                                       if (sector >= 0 && read_block (ciw, -1, dst, sector, 1, readblocksize)) {
+                                               uae_u8 subbuf[SUB_CHANNEL_SIZE];
+                                               sub_deinterleave (dst + 2352, subbuf);
+                                               if (seenindex) {
+                                                       for (int i = 2 * SUB_ENTRY_SIZE; i < SUB_CHANNEL_SIZE; i++) {
+                                                               if (subbuf[i]) { // non-zero R-W subchannels?
+                                                                       int diff = cdda_pos - sector + 2;
+                                                                       write_log (L"-> CD+G start pos fudge -> %d (%d)\n", sector, -diff);
+                                                                       idleframes -= diff;
+                                                                       cdda_pos = sector;
+                                                                       seensub = true;
+                                                                       break;
                                                                }
-                                                       } else if (subbuf[0] == 0xff) { // P == 1?
-                                                               seenindex = true;
                                                        }
+                                               } else if (subbuf[0] == 0xff) { // P == 1?
+                                                       seenindex = true;
                                                }
                                        }
                                }
-                               cdda_pos -= idleframes;
-
-                               _ftime (&tb2);
-                               int diff = (tb2.time * (uae_s64)1000 + tb2.millitm) - (tb1.time * (uae_s64)1000 + tb1.millitm);
-                               diff -= ciw->cdda_delay;
-                               if (idleframes >= 0 && diff < 0 && ciw->cdda_play > 0)
-                                       Sleep (-diff);
-                               if (diff > 0 && !seensub) {
-                                       int ch = diff / 7 + 25;
-                                       if (ch > idleframes)
-                                               ch = idleframes;
-                                       idleframes -= ch;
-                                       cdda_pos += ch;
-                               }
-
-                               setstate (ciw, AUDIO_STATUS_IN_PROGRESS);
+                       }
+                       cdda_pos -= idleframes;
+
+                       _ftime (&tb2);
+                       int diff = (tb2.time * (uae_s64)1000 + tb2.millitm) - (tb1.time * (uae_s64)1000 + tb1.millitm);
+                       diff -= ciw->cdda_delay;
+                       if (idleframes >= 0 && diff < 0 && ciw->cdda_play > 0)
+                               Sleep (-diff);
+                       if (diff > 0 && !seensub) {
+                               int ch = diff / 7 + 25;
+                               if (ch > idleframes)
+                                       ch = idleframes;
+                               idleframes -= ch;
+                               cdda_pos += ch;
                        }
 
-                       if ((cdda_pos < ciw->cdda_end || ciw->cdda_end == 0xffffffff) && !ciw->cdda_paused && ciw->cdda_play) {
+                       setstate (ciw, AUDIO_STATUS_IN_PROGRESS);
+               }
 
-                               if (idleframes <= 0 && !isaudiotrack (&ciw->di.toc, cdda_pos)) {
-                                       setstate (ciw, AUDIO_STATUS_PLAY_ERROR);
-                                       goto end; // data track?
-                               }
+               if ((cdda_pos < ciw->cdda_end || ciw->cdda_end == 0xffffffff) && !ciw->cdda_paused && ciw->cdda_play) {
 
-                               gui_flicker_led (LED_CD, ciw->di.unitnum - 1, LED_CD_AUDIO);
+                       if (idleframes <= 0 && !isaudiotrack (&ciw->di.toc, cdda_pos)) {
+                               setstate (ciw, AUDIO_STATUS_PLAY_ERROR);
+                               goto end; // data track?
+                       }
 
-                               uae_sem_wait (&ciw->sub_sem);
+                       gui_flicker_led (LED_CD, ciw->di.unitnum - 1, LED_CD_AUDIO);
 
-                               ciw->subcodevalid = false;
-                               memset (ciw->subcode, 0, sizeof ciw->subcode);
-                               memset (px[bufnum], 0, num_sectors * readblocksize);
+                       uae_sem_wait (&ciw->sub_sem);
 
-                               if (cdda_pos >= 0) {
-                                       if (read_block (ciw, -1, px[bufnum], cdda_pos, num_sectors, readblocksize)) {
-                                               for (i = 0; i < num_sectors; i++) {
-                                                       memcpy (ciw->subcode + i * SUB_CHANNEL_SIZE, px[bufnum] + readblocksize * i + 2352, SUB_CHANNEL_SIZE);
-                                               }
-                                               for (i = 1; i < num_sectors; i++) {
-                                                       memmove (px[bufnum] + 2352 * i, px[bufnum] + readblocksize * i, 2352);
-                                               }
-                                               ciw->subcodevalid = true;
+                       ciw->subcodevalid = false;
+                       memset (ciw->subcode, 0, sizeof ciw->subcode);
+                       memset (cda->buffers[bufnum], 0, num_sectors * readblocksize);
+
+                       if (cdda_pos >= 0) {
+                               if (read_block (ciw, -1, cda->buffers[bufnum], cdda_pos, num_sectors, readblocksize)) {
+                                       for (i = 0; i < num_sectors; i++) {
+                                               memcpy (ciw->subcode + i * SUB_CHANNEL_SIZE, cda->buffers[bufnum] + readblocksize * i + 2352, SUB_CHANNEL_SIZE);
+                                       }
+                                       for (i = 1; i < num_sectors; i++) {
+                                               memmove (cda->buffers[bufnum] + 2352 * i, cda->buffers[bufnum] + readblocksize * i, 2352);
                                        }
+                                       ciw->subcodevalid = true;
                                }
+                       }
 
-                               for (i = 0; i < num_sectors; i++) {
-                                       if (idleframes > 0) {
-                                               idleframes--;
-                                               memset (px[bufnum] + 2352 * i, 0, 2352);
-                                               memset (ciw->subcode + i * SUB_CHANNEL_SIZE, 0, SUB_CHANNEL_SIZE);
-                                       } else if (cdda_pos < ciw->cdda_start && ciw->cdda_scan == 0) {
-                                               memset (px[bufnum] + 2352 * i, 0, 2352);
-                                       }
+                       for (i = 0; i < num_sectors; i++) {
+                               if (idleframes > 0) {
+                                       idleframes--;
+                                       memset (cda->buffers[bufnum] + 2352 * i, 0, 2352);
+                                       memset (ciw->subcode + i * SUB_CHANNEL_SIZE, 0, SUB_CHANNEL_SIZE);
+                               } else if (cdda_pos < ciw->cdda_start && ciw->cdda_scan == 0) {
+                                       memset (cda->buffers[bufnum] + 2352 * i, 0, 2352);
                                }
-                               if (idleframes > 0)
-                                       ciw->subcodevalid = false;
+                       }
+                       if (idleframes > 0)
+                               ciw->subcodevalid = false;
 
-                               if (ciw->cdda_subfunc)
-                                       ciw->cdda_subfunc (ciw->subcode, num_sectors); 
+                       if (ciw->cdda_subfunc)
+                               ciw->cdda_subfunc (ciw->subcode, num_sectors); 
 
-                               uae_sem_post (&ciw->sub_sem);
+                       uae_sem_post (&ciw->sub_sem);
 
-                               if (ciw->subcodevalid) {
-                                       uae_sem_wait (&ciw->sub_sem2);
-                                       memcpy (ciw->subcodebuf, ciw->subcode + (num_sectors - 1) * SUB_CHANNEL_SIZE, SUB_CHANNEL_SIZE);
-                                       uae_sem_post (&ciw->sub_sem2);
-                               }
+                       if (ciw->subcodevalid) {
+                               uae_sem_wait (&ciw->sub_sem2);
+                               memcpy (ciw->subcodebuf, ciw->subcode + (num_sectors - 1) * SUB_CHANNEL_SIZE, SUB_CHANNEL_SIZE);
+                               uae_sem_post (&ciw->sub_sem2);
+                       }
 
-                               volume_main = currprefs.sound_volume;
-                               int vol_mult[2];
-                               for (int j = 0; j < 2; j++) {
-                                       volume[j] = ciw->cdda_volume[j];
-                                       vol_mult[j] = (100 - volume_main) * volume[j] / 100;
-                                       if (vol_mult[j])
-                                               vol_mult[j]++;
-                                       if (vol_mult[j] >= 32768)
-                                               vol_mult[j] = 32768;
-                               }
-                               uae_s16 *p = (uae_s16*)(px[bufnum]);
-                               for (i = 0; i < num_sectors * 2352 / 4; i++) {
-                                       p[i * 2 + 0] = p[i * 2 + 0] * vol_mult[0] / 32768;
-                                       p[i * 2 + 1] = p[i * 2 + 1] * vol_mult[1] / 32768;
-                               }
-               
-                               bufon[bufnum] = 1;
-                               mmr = waveOutWrite (ciw->cdda_wavehandle, &whdr[bufnum], sizeof (WAVEHDR));
-                               if (mmr != MMSYSERR_NOERROR) {
-                                       write_log (L"IOCTL CDDA: waveOutWrite %d\n", mmr);
-                                       break;
-                               }
+                       bufon[bufnum] = 1;
+                       cda->setvolume (currprefs.sound_volume, ciw->cdda_volume[0], ciw->cdda_volume[1]);
+                       if (!cda->play(bufnum)) {
+                               setstate (ciw, AUDIO_STATUS_PLAY_ERROR);
+                               goto end; // data track?
+                       }
 
-                               if (ciw->cdda_scan) {
-                                       cdda_pos += ciw->cdda_scan * num_sectors;
-                                       if (cdda_pos < 0)
-                                               cdda_pos = 0;
-                               } else  {
-                                       if (cdda_pos < 0 && cdda_pos + num_sectors >= 0)
-                                               cdda_pos = 0;
-                                       else
-                                               cdda_pos += num_sectors;
-                               }
+                       if (ciw->cdda_scan) {
+                               cdda_pos += ciw->cdda_scan * num_sectors;
+                               if (cdda_pos < 0)
+                                       cdda_pos = 0;
+                       } else  {
+                               if (cdda_pos < 0 && cdda_pos + num_sectors >= 0)
+                                       cdda_pos = 0;
+                               else
+                                       cdda_pos += num_sectors;
+                       }
 
-                               if (idleframes <= 0) {
-                                       if (cdda_pos - num_sectors < ciw->cdda_end && cdda_pos >= ciw->cdda_end) {
-                                               setstate (ciw, AUDIO_STATUS_PLAY_COMPLETE);
-                                               ciw->cdda_play_finished = 1;
-                                               ciw->cdda_play = -1;
-                                               cdda_pos = ciw->cdda_end;
-                                       }
-                                       ciw->cd_last_pos = cdda_pos;
+                       if (idleframes <= 0) {
+                               if (cdda_pos - num_sectors < ciw->cdda_end && cdda_pos >= ciw->cdda_end) {
+                                       setstate (ciw, AUDIO_STATUS_PLAY_COMPLETE);
+                                       ciw->cdda_play_finished = 1;
+                                       ciw->cdda_play = -1;
+                                       cdda_pos = ciw->cdda_end;
                                }
+                               ciw->cd_last_pos = cdda_pos;
                        }
+               }
 
-                       if (bufon[0] == 0 && bufon[1] == 0) {
-                               while (!(whdr[0].dwFlags & WHDR_DONE) || !(whdr[1].dwFlags & WHDR_DONE))
-                                       Sleep (10);
-                               while (ciw->cdda_paused && ciw->cdda_play > 0)
-                                       Sleep (10);
-                       }
+               while (ciw->cdda_paused && ciw->cdda_play > 0)
+                       Sleep (10);
 
-                       bufnum = 1 - bufnum;
+               bufnum = 1 - bufnum;
 
-               }
        }
 
 end:
        ciw->subcodevalid = false;
-       while (!(whdr[0].dwFlags & WHDR_DONE) || !(whdr[1].dwFlags & WHDR_DONE))
-               Sleep (10);
-       for (i = 0; i < 2; i++)
-               waveOutUnprepareHeader  (ciw->cdda_wavehandle, &whdr[i], sizeof (WAVEHDR));
+       delete cda;
 
-       cdda_closewav (ciw);
-       xfree (p);
        ciw->cdda_play = 0;
        write_log (L"IOCTL CDDA: thread killed\n");
        return NULL;
diff --git a/od-win32/cda_play.cpp b/od-win32/cda_play.cpp
new file mode 100644 (file)
index 0000000..67797eb
--- /dev/null
@@ -0,0 +1,241 @@
+
+/*
+* UAE
+*
+* Win32 audio player for CDA emulation
+*
+* Copyright 2010 Toni Wilen
+*
+*/
+
+#define CDADS 0
+
+#include "sysconfig.h"
+#include "sysdeps.h"
+
+#include "options.h"
+#include "dxwrap.h"
+
+#include <dsound.h>
+#include <mmreg.h>
+
+#include "win32.h"
+
+#include "cda_play.h"
+
+cda_audio::~cda_audio()
+{
+       wait (0);
+       wait (1);
+#if CDADS
+       if (dsnotify)
+               dsnotify->Release();
+       if (dsbuf)
+               dsbuf->Release();
+       if (ds)
+               ds->Release();
+       if (notifyevent[0])
+               CloseHandle (notifyevent[0]);
+       if (notifyevent[1])
+               CloseHandle (notifyevent[1]);
+#else
+       if (active) {
+               for (int i = 0; i < 2; i++)
+                       waveOutUnprepareHeader  (wavehandle, &whdr[i], sizeof (WAVEHDR));
+       }
+       if (wavehandle != NULL)
+               waveOutClose (wavehandle);
+#endif
+       for (int i = 0; i < 2; i++) {
+               xfree (buffers[i]);
+               buffers[i] = NULL;
+       }
+}
+
+cda_audio::cda_audio(int num_sectors)
+{
+       active = false;
+       playing = false;
+       volume[0] = volume[1] = 0;
+
+       bufsize = num_sectors * 2352;
+       for (int i = 0; i < 2; i++) {
+               buffers[i] = xcalloc (uae_u8, num_sectors * 4096);
+       }
+
+       WAVEFORMATEX wav;
+       memset (&wav, 0, sizeof (WAVEFORMATEX));
+
+       wav.cbSize = 0;
+       wav.nChannels = 2;
+       wav.nSamplesPerSec = 44100;
+       wav.wBitsPerSample = 16;
+       wav.nBlockAlign = wav.wBitsPerSample / 8 * wav.nChannels;
+       wav.nAvgBytesPerSec = wav.nBlockAlign * wav.nSamplesPerSec;
+       wav.wFormatTag = WAVE_FORMAT_PCM;
+
+#if CDADS
+       LPDIRECTSOUNDBUFFER pdsb;
+       WAVEFORMATEXTENSIBLE wavfmt;
+       DSBUFFERDESC desc;
+       HRESULT hr;
+
+       dsnotify = NULL;
+       dsbuf = NULL;
+       ds = NULL;
+       notifyevent[0] = notifyevent[1] = NULL;
+
+       hr = DirectSoundCreate8 (&sound_devices[currprefs.win32_soundcard].guid, &ds, NULL);
+       if (FAILED (hr))  {
+               write_log (L"CDA: DirectSoundCreate8() failure: %s\n", DXError (hr));
+               return;
+       }
+
+       hr = ds->SetCooperativeLevel (hMainWnd, DSSCL_PRIORITY);
+       if (FAILED (hr)) {
+               write_log (L"CDA: Can't set cooperativelevel: %s\n", DXError (hr));
+               return;
+       }
+
+       wavfmt.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+       wavfmt.Format.nChannels = 2;
+       wavfmt.Format.nSamplesPerSec = 44100;
+       wavfmt.Format.wBitsPerSample = 16;
+       wavfmt.Format.nBlockAlign = wavfmt.Format.wBitsPerSample / 8 * wavfmt.Format.nChannels;
+       wavfmt.Format.nAvgBytesPerSec = wavfmt.Format.nBlockAlign * wavfmt.Format.nSamplesPerSec;
+       wavfmt.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+       wavfmt.Samples.wValidBitsPerSample = 16;
+       wavfmt.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX);
+
+       memset (&desc, 0, sizeof desc);
+       desc.dwSize = sizeof desc;
+       desc.dwBufferBytes = 2 * bufsize;
+       desc.lpwfxFormat = &wavfmt.Format;
+       desc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
+       desc.dwFlags |= DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_CTRLVOLUME;
+       desc.guid3DAlgorithm = GUID_NULL;
+
+       hr = ds->CreateSoundBuffer (&desc, &pdsb, NULL);
+       if (FAILED (hr)) {
+               write_log (L"CDA: IDirectSound_CreateSoundBuffer %s\n", DXError (hr));
+               return;
+       }
+       hr = pdsb->QueryInterface (IID_IDirectSoundBuffer8, (LPVOID*)&dsbuf);
+       IDirectSound_Release (pdsb);
+       if (FAILED (hr))  {
+               write_log (L"CDA: Secondary QueryInterface() failure: %s\n", DXError (hr));
+               return;
+       }
+       hr = dsbuf->QueryInterface (IID_IDirectSoundNotify, (LPVOID*)&dsnotify);
+       if (FAILED (hr))  {
+               write_log (L"CDA: IID_IDirectSoundNotify QueryInterface() failure: %s\n", DXError (hr));
+               return;
+       }
+
+       notifyevent[0] = CreateEvent (NULL, TRUE, FALSE, NULL);
+       notifyevent[1] = CreateEvent (NULL, TRUE, FALSE, NULL);
+       DSBPOSITIONNOTIFY nf[2];
+       nf[0].dwOffset = bufsize / num_sectors;
+       nf[1].dwOffset = bufsize + bufsize / num_sectors;
+       nf[0].hEventNotify = notifyevent[0];
+       nf[1].hEventNotify = notifyevent[1];
+       hr = dsnotify->SetNotificationPositions(2, nf);
+
+       active = true;
+#else
+       MMRESULT mmr;
+       mmr = waveOutOpen (&wavehandle, WAVE_MAPPER, &wav, 0, 0, WAVE_ALLOWSYNC | WAVE_FORMAT_DIRECT);
+       if (mmr != MMSYSERR_NOERROR) {
+               write_log (L"IMAGE CDDA: wave open %d\n", mmr);
+               return;
+       }
+       this->num_sectors = num_sectors;
+       for (int i = 0; i < 2; i++) {
+               memset (&whdr[i], 0, sizeof WAVEHDR);
+               whdr[i].dwBufferLength = 2352 * num_sectors;
+               whdr[i].lpData = (LPSTR)buffers[i];
+               mmr = waveOutPrepareHeader (wavehandle, &whdr[i], sizeof (WAVEHDR));
+               if (mmr != MMSYSERR_NOERROR) {
+                       write_log (L"IMAGE CDDA: waveOutPrepareHeader %d:%d\n", i, mmr);
+                       return;
+               }
+               whdr[i].dwFlags |= WHDR_DONE;
+       }
+       active = true;
+       playing = true;
+#endif
+}
+
+void cda_audio::setvolume(int master, int left, int right)
+{
+       for (int j = 0; j < 2; j++) {
+               volume[j] = j == 0 ? left : right;
+               volume[j] = (100 - master) * volume[j] / 100;
+               if (volume[j])
+                       volume[j]++;
+               if (volume[j] >= 32768)
+                       volume[j] = 32768;
+       }
+#if CDADS
+       LONG vol = DSBVOLUME_MIN;
+       int volume = master * left / 32768;
+       if (volume < 100)
+               vol = (LONG)((DSBVOLUME_MIN / 2) + (-DSBVOLUME_MIN / 2) * log (1 + (2.718281828 - 1) * (1 - volume / 100.0)));
+       HRESULT hr = dsbuf->SetVolume(vol);
+       if (FAILED (hr))
+               write_log (L"CDA: SetVolume(%d) failed: %s\n", vol, DXError (hr));
+#endif
+}
+bool cda_audio::play(int bufnum)
+{
+       if (!active)
+               return false;
+#if CDADS
+       DWORD status;
+       HRESULT hr = dsbuf->GetStatus (&status);
+       if (FAILED (hr)) {
+               write_log (L"CDA: GetStatus() failed: %s\n", DXError (hr));
+               return false;
+       }
+       if (status & DSBSTATUS_BUFFERLOST) {
+               write_log (L"CDA: bufferlost\n");
+               return false;
+       }
+       if ((status & (DSBSTATUS_PLAYING | DSBSTATUS_LOOPING)) != (DSBSTATUS_PLAYING | DSBSTATUS_LOOPING)) {
+               dsbuf->SetCurrentPosition((1 - bufnum) * bufsize);
+               dsbuf->Play(0, 0, DSBPLAY_LOOPING);
+               playing = true;
+       }
+       PVOID ptr;
+       DWORD len;
+       if (SUCCEEDED(dsbuf->Lock(bufnum * bufsize, bufsize, &ptr, &len, NULL, NULL, 0))) {
+               memcpy (ptr, buffers[bufnum], bufsize);
+               dsbuf->Unlock(ptr, len, NULL, NULL);
+       }
+       return true;
+#else
+       uae_s16 *p = (uae_s16*)(buffers[bufnum]);
+       for (int i = 0; i < num_sectors * 2352 / 4; i++) {
+               p[i * 2 + 0] = p[i * 2 + 0] * volume[0] / 32768;
+               p[i * 2 + 1] = p[i * 2 + 1] * volume[1] / 32768;
+       }
+       MMRESULT mmr = waveOutWrite (wavehandle, &whdr[bufnum], sizeof (WAVEHDR));
+       if (mmr != MMSYSERR_NOERROR) {
+               write_log (L"IMAGE CDDA: waveOutWrite %d\n", mmr);
+               return false;
+       }
+       return true;
+#endif
+}
+void cda_audio::wait(int bufnum)
+{
+       if (!active || !playing)
+               return;
+#if CDADS
+       WaitForSingleObject (notifyevent[bufnum], INFINITE);
+       ResetEvent (notifyevent[bufnum]);
+#else
+       while (!(whdr[bufnum].dwFlags & WHDR_DONE))
+               Sleep (10);
+#endif
+}
diff --git a/od-win32/cda_play.h b/od-win32/cda_play.h
new file mode 100644 (file)
index 0000000..87a7ccd
--- /dev/null
@@ -0,0 +1,33 @@
+
+#ifdef _WIN32
+#include <dsound.h>
+#endif
+
+class cda_audio
+{
+private:
+       int bufsize;
+#ifdef _WIN32
+       HWAVEOUT wavehandle;
+       WAVEHDR whdr[2];
+       int num_sectors;
+       int volume[2];
+       LPDIRECTSOUND8 ds;
+       LPDIRECTSOUNDBUFFER8 dsbuf;
+       LPDIRECTSOUNDNOTIFY dsnotify;
+       HANDLE notifyevent[2];
+#endif
+       bool playing;
+       bool active;
+
+public:
+       uae_u8 *buffers[2];
+
+       cda_audio(int num_sectors);
+       ~cda_audio();
+       void setvolume(int master, int left, int right);
+       bool play(int bufnum);
+       void wait(void);
+       void wait(int bufnum);
+};
+
index a739d40b6f170256c379adcdce2ac19d44aa4269..7e5b903531eacede7f5d9b953ec6793c43af467c 100644 (file)
@@ -14,6 +14,8 @@
 #include "memory.h"
 #include "native2amiga_api.h"
 
+#define DEBUG_CLIP 0
+
 int clipboard_debug;
 
 static HWND chwnd;
@@ -27,6 +29,7 @@ static int clipactive;
 static int clipboard_change;
 static void *clipboard_delayed_data;
 static int clipboard_delayed_size;
+static bool clip_disabled;
 
 static void debugwrite (const TCHAR *name, uae_u8 *p, int size)
 {
@@ -63,7 +66,9 @@ static void to_amiga_start (void)
        if (clipboard_debug) {
                debugwrite (L"clipboard_p2a", to_amiga, to_amiga_size);
        }
-       //write_log (L"clipboard: to_amiga %08x\n", clipboard_data);
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: to_amiga %08x %d\n", clipboard_data, to_amiga_size);
+#endif
        put_long (clipboard_data, to_amiga_size);
        uae_Signal (get_long (clipboard_data + 8), 1 << 13);
 }
@@ -249,9 +254,9 @@ static void to_iff_ilbm (HBITMAP hbmp)
                xfree (bmp.bmBits);
                return;
        }
-
+#if DEBUG_CLIP > 0
        write_log (L"BMP2IFF: W=%d H=%d bpp=%d\n", w, h, bpp);
-
+#endif
        iffbpp = bpp > 8 ? 24 : bpp;
        cnt = 0;
        for (y = 0; y < h && cnt < 256; y++) {
@@ -275,7 +280,9 @@ static void to_iff_ilbm (HBITMAP hbmp)
                        i >>= 1;
                        iffbpp++;
                }
+#if DEBUG_CLIP > 0
                write_log (L"BMP2IFF: Colors=%d BPP=%d\n", cnt, iffbpp);
+#endif
        }
 
        bodysize = (((w + 15) & ~15) / 8) * h * iffbpp;
@@ -503,7 +510,9 @@ static void from_iff_ilbm (uaecptr ilbm, uae_u32 len)
                        uae_u8 *caddr = NULL, *dptr;
                        body = 1;
 
+#if DEBUG_CLIP > 0
                        write_log (L"W=%d H=%d planes=%d mask=%d comp=%d CAMG=%08x\n", w, h, planes, masking, compr, camg);
+#endif
 
                        ham = 0; ehb = 0;
                        if ((camg & 0x0800) && planes > 4)
@@ -669,14 +678,29 @@ static void from_iff (uaecptr data, uae_u32 len)
                from_iff_ilbm (data, len);
 }
 
+void clipboard_disable (bool disabled)
+{
+       clip_disabled = disabled;
+}
+
 static void clipboard_read (HWND hwnd)
 {
        HGLOBAL hglb;
        UINT f;
        int text = FALSE, bmp = FALSE;
 
+       if (clip_disabled)
+               return;
+       if (to_amiga) {
+#if DEBUG_CLIP > 0
+               write_log (L"clipboard: read windows clipboard but ignored because previous clip transfer still active\n");
+#endif
+               return;
+       }
        clipboard_change = 0;
-       //write_log (L"clipboard: read windows clipboard\n");
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: read windows clipboard\n");
+#endif
        if (!OpenClipboard (hwnd))
                return;
        f = 0;
@@ -691,7 +715,9 @@ static void clipboard_read (HWND hwnd)
                if (hglb != NULL) { 
                        TCHAR *lptstr = (TCHAR*)GlobalLock (hglb); 
                        if (lptstr != NULL) {
-                               //write_log (L"clipboard: CF_UNICODETEXT '%s'\n", lptstr);
+#if DEBUG_CLIP > 0
+                               write_log (L"clipboard: CF_UNICODETEXT '%s'\n", lptstr);
+#endif
                                to_iff_text (lptstr);
                                GlobalUnlock (hglb);
                        }
@@ -699,7 +725,9 @@ static void clipboard_read (HWND hwnd)
        } else if (bmp) {
                HBITMAP hbmp = (HBITMAP)GetClipboardData (CF_BITMAP);
                if (hbmp != NULL) {
-                       //write_log (L"clipboard: CF_BITMAP\n");
+#if DEBUG_CLIP > 0
+                       write_log (L"clipboard: CF_BITMAP\n");
+#endif
                        to_iff_ilbm (hbmp);
                }
        }
@@ -720,7 +748,9 @@ static void clipboard_free_delayed (void)
 
 void clipboard_changed (HWND hwnd)
 {
-       //write_log (L"clipboard: windows clipboard changed message\n");
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: windows clipboard changed message\n");
+#endif
        if (!clipboard_data || !initialized)
                return;
        if (clipopen)
@@ -744,7 +774,9 @@ static int clipboard_put_bmp_real (HBITMAP hbmp)
        ret = TRUE;
        CloseClipboard ();
        clipopen--;
-       //write_log (L"clipboard: BMP written to windows clipboard\n");
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: BMP written to windows clipboard\n");
+#endif
        return ret;
 }
 
@@ -767,7 +799,9 @@ static int clipboard_put_text_real (const TCHAR *txt)
        }
        CloseClipboard ();
        clipopen--;
-       //write_log (L"clipboard: text written to windows clipboard\n");
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: text written to windows clipboard\n");
+#endif
        return ret;
 }
 
@@ -826,11 +860,13 @@ void amiga_clipboard_got_data (uaecptr data, uae_u32 size, uae_u32 actual)
                return;
        }
        addr = get_real_address (data);
-       //write_log (L"clipboard: <-amiga, %08x, %08x %d %d\n", clipboard_data, data, size, actual);
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: <-amiga, %08x, %08x %d %d\n", clipboard_data, data, size, actual);
+#endif
        from_iff (data, actual);
 }
 
-void amiga_clipboard_want_data (void)
+int amiga_clipboard_want_data (void)
 {
        uae_u32 addr, size;
 
@@ -838,16 +874,25 @@ void amiga_clipboard_want_data (void)
        size = get_long (clipboard_data);
        if (!initialized) {
                write_log (L"clipboard: want_data() before initialized!? (%08x %08x %d)\n", clipboard_data, addr, size);
-               return;
+               to_amiga = NULL;
+               return 0;
+       }
+       if (size != to_amiga_size) {
+               write_log (L"clipboard: size %d <> %d mismatch!?\n", size, to_amiga_size);
+               to_amiga = NULL;
+               return 0;
        }
        if (addr && size) {
                uae_u8 *raddr = get_real_address (addr);
                memcpy (raddr, to_amiga, size);
        }
        xfree (to_amiga);
-       //write_log (L"clipboard: ->amiga, %08x, %08x %d bytes\n", clipboard_data, addr, size);
+#if DEBUG_CLIP > 0
+       write_log (L"clipboard: ->amiga, %08x, %08x %d (%d) bytes\n", clipboard_data, addr, size, to_amiga_size);
+#endif
        to_amiga = NULL;
        to_amiga_size = 0;
+       return 1;
 }
 
 void clipboard_active (HWND hwnd, int active)
@@ -882,7 +927,9 @@ void clipboard_vsync (void)
        task = get_long (clipboard_data + 8);
        if (task && native2amiga_isfree ()) {
                uae_Signal (task, 1 << 13);
-               //      write_log (L"clipboard: signal %08x\n", clipboard_data);
+#if DEBUG_CLIP > 0
+               write_log (L"clipboard: signal %08x\n", clipboard_data);
+#endif
        }
        vdelay = 50;
 }
@@ -898,6 +945,7 @@ void clipboard_reset (void)
        xfree (to_amiga);
        to_amiga = NULL;
        to_amiga_size = 0;
+       clip_disabled = false;
        ReleaseDC (chwnd, hdc);
 }
 
index f92992f2c03d0f82dc051163b7b055ea33e6a66e..aa2e3d60385f933a0adc2cf034e3963f6afb648b 100644 (file)
@@ -34,6 +34,7 @@
 #include "custom.h"
 #include "dxwrap.h"
 #include "akiko.h"
+#include "clipboard.h"
 
 #ifdef WINDDK
 #include <winioctl.h>
@@ -1294,7 +1295,10 @@ static void handle_rawinput_2 (RAWINPUT *raw)
                if (scancode == 0xaa || scancode == 0)
                        return;
 
+
                if (!istest) {
+                       if (scancode == DIK_SYSRQ)
+                               clipboard_disable (!!pressed);
                        if (h == NULL) {
                                // swallow led key fake messages
                                if (currprefs.keyboard_leds[KBLED_NUMLOCKB] > 0 && scancode == DIK_NUMLOCK)
index 3ee4c06a4d7206021e3fa8efd1af42b94d840b36..b237f9fcd40c81391ad55cadc95da72607cf7983 100644 (file)
@@ -63,14 +63,8 @@ static uae_u32 lowmem (void)
        uae_u32 change = 0;
        if (currprefs.z3fastmem_size + currprefs.z3fastmem2_size + currprefs.z3chipmem_size >= 8 * 1024 * 1024) {
                if (currprefs.z3fastmem2_size) {
-                       if (currprefs.z3fastmem2_size <= 128 * 1024 * 1024) {
-                               change = currprefs.z3fastmem2_size;
-                               currprefs.z3fastmem2_size = 0;
-                       } else {
-                               change = currprefs.z3fastmem2_size / 2;
-                               currprefs.z3fastmem2_size /= 2;
-                               changed_prefs.z3fastmem2_size = currprefs.z3fastmem2_size;
-                       }
+                       change = currprefs.z3fastmem2_size;
+                       currprefs.z3fastmem2_size = 0;
                } else if (currprefs.z3chipmem_size) {
                        if (currprefs.z3chipmem_size <= 16 * 1024 * 1024) {
                                change = currprefs.z3chipmem_size;
@@ -535,9 +529,9 @@ void *shmat (int shmid, void *shmaddr, int shmflg)
                                size, size >> 10, GetLastError ());
                } else {
                        shmids[shmid].attached = result;
-                       write_log (L"VirtualAlloc %08X - %08X %x (%dk) ok%s\n",
+                       write_log (L"VirtualAlloc %08X - %08X %x (%dk) ok (%08X)%s\n",
                                (uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size,
-                               size, size >> 10, p96special ? L" P96" : L"");
+                               size, size >> 10, shmaddr, p96special ? L" P96" : L"");
                }
        }
        return result;
index 2756faae9a76d2d719273b9dd1eb340bdf2a69fe..4deaa1fced39bad2b25439f6405b4639bebf2ca8 100644 (file)
@@ -1122,11 +1122,11 @@ static int open_audio_ds (struct sound_data *sd, int index)
        if (pdsb == NULL)
                goto error;
        hr = pdsb->QueryInterface (IID_IDirectSoundBuffer8, (LPVOID*)&s->lpDSBsecondary);
+       IDirectSound_Release (pdsb);
        if (FAILED (hr))  {
                write_log (L"DSSOUND: Secondary QueryInterface() failure: %s\n", DXError (hr));
                goto error;
        }
-       IDirectSound_Release (pdsb);
        clearbuffer (sd);
 
        return 1;
index 0345a736ab9a8ea82bce940003c10b142bcb4700..af7598c740415abd05062043193c65de1ff12a86 100644 (file)
@@ -1462,12 +1462,12 @@ static LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT message, WPARAM wParam,
        case WT_PACKET:
        case WM_WTSSESSION_CHANGE:
                return AmigaWindowProc (hWnd, message, wParam, lParam);
-
+#if 0
        case WM_DISPLAYCHANGE:
                if (isfullscreen() <= 0 && !currprefs.gfx_filter && (wParam + 7) / 8 != DirectDraw_GetBytesPerPixel ())
                        WIN32GFX_DisplayChangeRequested ();
                break;
-
+#endif
        case WM_GETMINMAXINFO:
                {
                        LPMINMAXINFO lpmmi;
index 14ab8a44853157f2aa9f3aa62c2dd0b597967bc4..f037abaf67f4397eb39ffdc6b7d55fd5ed76bcd2 100644 (file)
@@ -18,8 +18,8 @@
 #define WINUAEPUBLICBETA 1
 #define LANG_DLL 1
 
-#define WINUAEBETA L"15"
-#define WINUAEDATE MAKEBD(2010, 9, 5)
+#define WINUAEBETA L"16"
+#define WINUAEDATE MAKEBD(2010, 9, 9)
 #define WINUAEEXTRA L""
 #define WINUAEREV L""
 
index 138746c73014f79f9efd2a9bff83847dcd49400f..750af36c9c7c517a1d48224f9f56b1b05e751d08 100644 (file)
@@ -96,7 +96,7 @@ static GUID *displayGUID;
 
 static struct winuae_currentmode currentmodestruct;
 static int screen_is_initialized;
-int display_change_requested, normal_display_change_starting;
+static int display_change_requested;
 int window_led_drives, window_led_drives_end;
 int window_led_hd, window_led_hd_end;
 int window_led_joys, window_led_joys_end, window_led_joy_start;
@@ -126,11 +126,6 @@ void WIN32GFX_EnablePicasso (void)
        picasso_requested_on = 1;
 }
 
-void WIN32GFX_DisplayChangeRequested (void)
-{
-       display_change_requested = 1;
-}
-
 int isscreen (void)
 {
        return hMainWnd ? 1 : 0;
index dcf47ae1ce4f43ac1dc1eb943d99fa8b6d80641c..b1ac7c5f9e01482ee13dab36f68e567adc9ce531 100644 (file)
@@ -13894,7 +13894,7 @@ static ACCEL EmptyAccel[] = {
 
 struct newresource *getresource (int tmpl)
 {
-       TCHAR rid[10];
+       TCHAR rid[20];
        HRSRC hrsrc;
        HGLOBAL res;
        HINSTANCE inst = hUIDLL ? hUIDLL : hInst;
@@ -13915,9 +13915,15 @@ struct newresource *getresource (int tmpl)
        if (!res)
                return NULL;
        resdata = LockResource (res);
+       if (!resdata)
+               return NULL;
        size = SizeofResource (inst, hrsrc);
+       if (!size)
+               return NULL;
        nr = xcalloc (struct newresource, 1);
        newres = (LPCDLGTEMPLATEW)xmalloc (uae_u8, size);
+       if (!newres)
+               return NULL;
        memcpy ((void*)newres, resdata, size);
        nr->resource = newres;
        nr->size = size;
@@ -13961,7 +13967,7 @@ HWND CustomCreateDialog (int templ, HWND hDlg, DLGPROC proc)
 }
 
 static int init_page (int tmpl, int icon, int title,
-       INT_PTR (CALLBACK FAR *func) (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam), ACCEL *accels, TCHAR *help, int focusid)
+       INT_PTR (CALLBACK FAR *func) (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam), ACCEL *accels, const TCHAR *help, int focusid)
 {
        LPTSTR lpstrTitle;
        static int id = 0;
@@ -13969,8 +13975,10 @@ static int init_page (int tmpl, int icon, int title,
        struct newresource *res;
 
        res = getresource (tmpl);
-       if (!res)
+       if (!res) {
+               write_log (L"init_page(%d) failed\n", tmpl);
                return -1;
+       }
        ppage[id].nres = res;
        ppage[id].icon = MAKEINTRESOURCE (icon);
        if (title >= 0) {
index 6d04a3c7e77edc0f2e917e920d8859d8b2b01827..e4646355531829ea2e40f9ba242cc392a7c76fa4 100644 (file)
       <SubSystem>Windows</SubSystem>
       <StackReserveSize>2621440</StackReserveSize>
       <StackCommitSize>2621440</StackCommitSize>
-      <LargeAddressAware>false</LargeAddressAware>
+      <LargeAddressAware>true</LargeAddressAware>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
       <SubSystem>Windows</SubSystem>
       <StackReserveSize>2621440</StackReserveSize>
       <StackCommitSize>2621440</StackCommitSize>
-      <LargeAddressAware>false</LargeAddressAware>
+      <LargeAddressAware>true</LargeAddressAware>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>
       <SubSystem>Windows</SubSystem>
       <StackReserveSize>2621440</StackReserveSize>
       <StackCommitSize>2621440</StackCommitSize>
-      <LargeAddressAware>false</LargeAddressAware>
+      <LargeAddressAware>true</LargeAddressAware>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
     <ClCompile Include="..\blkdev_win32_spti.cpp" />
     <ClCompile Include="..\bsdsock.cpp" />
     <ClCompile Include="..\caps\caps_win32.cpp" />
+    <ClCompile Include="..\cda_play.cpp" />
     <ClCompile Include="..\clipboard_win32.cpp" />
     <ClCompile Include="..\debug_win32.cpp" />
     <ClCompile Include="..\dinput.cpp" />
index 60909705907c1ae6cfd204afdc3993827bcb39e5..52500e767181ac208ad8c6510f5bd5ec83c7e432 100644 (file)
     <ClCompile Include="..\mp3decoder.cpp">
       <Filter>win32</Filter>
     </ClCompile>
+    <ClCompile Include="..\cda_play.cpp">
+      <Filter>win32</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\resources\35floppy.ico">
index 2bf393bbdb8cf555e4ba2d3beb9f1b95cee625d6..9fd04a23824b9764e91f9f004ac64119bb470e20 100644 (file)
@@ -1,4 +1,23 @@
 
+Beta 16:
+
+- removed old audio hack that was left accidentally, not needed since DMAL was emulated
+  (Murder, Mission Elevator etc.. compatibility hack is finally gone)
+- CD audio OS specific code was duplicated in ioctl and image mounter, moved to common
+  source file
+- LARGEADDRESSAWARE compiler flag was lost sometime ago, ~1.5G RAM is again possible under
+  64-bit Windows versions
+- second Z3 fast ram region was incorrectly mapped if "z3chip" was enabled
+- on some systems winuae stole focus when some other application attempted to open fullscreen
+  mode
+- Windows to Amiga clipboard conversion was not protected from starting new transfer when
+  previous was not yet received by Amiga-side (previous fix only handled Amiga to Windows
+  direction), usually caused crash when pressing printscreen in rawinput mode
+- 680x0 RTS emulation didn't check if new PC was odd (seems to have been missing since the
+  beginning?) This finally solves mysterious JIT crashes (thanks Glen!)
+- Epson printer emulation didn't flush print buffer when form feed command was received
+  (and some other commands that cause new page to be generated)
+
 Beta 15:
 
 - swallow USB keyboard led mode phantom keypresses, do not touch non-enabled keyboard leds,