From: Toni Wilen Date: Thu, 9 Sep 2010 16:25:08 +0000 (+0300) Subject: 2300b16 X-Git-Tag: 2300~5 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=a63fa293263b8cb7860fdd9e5ae147d952aa184f;p=francis%2Fwinuae.git 2300b16 --- diff --git a/audio.cpp b/audio.cpp index dbaecb1f..436a0c75 100644 --- 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; diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 588bf93f..65434c3d 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -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, §or); - 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, §or); + 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, §or); - 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, §or); + 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) { diff --git a/custom.cpp b/custom.cpp index 62714acb..00a9d736 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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; diff --git a/epsonprinter.cpp b/epsonprinter.cpp index c75fd8fd..4f9f2ff5 100644 --- a/epsonprinter.cpp +++ b/epsonprinter.cpp @@ -36,7 +36,7 @@ #include -//#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; diff --git a/expansion.cpp b/expansion.cpp index f36c0e72..87dad465 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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 (); diff --git a/filesys.asm b/filesys.asm index 523b44d2..aaf0acee 100644 --- a/filesys.asm +++ b/filesys.asm @@ -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 diff --git a/filesys.cpp b/filesys.cpp index ca9b96f7..69b0d358 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -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) { diff --git a/filesys_bootrom.cpp b/filesys_bootrom.cpp index 9b150eb3..bdf3d7ea 100644 --- a/filesys_bootrom.cpp +++ b/filesys_bootrom.cpp @@ -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); @@ -21,15 +21,15 @@ 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); @@ -52,21 +52,21 @@ 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); @@ -100,7 +100,7 @@ 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); @@ -114,7 +114,7 @@ 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); @@ -151,13 +151,13 @@ 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); @@ -309,16 +309,16 @@ 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); @@ -331,16 +331,16 @@ 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); @@ -439,7 +439,7 @@ 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); @@ -494,7 +494,7 @@ 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); @@ -502,25 +502,25 @@ 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); @@ -603,7 +603,7 @@ 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); @@ -614,7 +614,7 @@ 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); @@ -628,12 +628,12 @@ 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); @@ -643,13 +643,13 @@ 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); @@ -658,7 +658,7 @@ 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); @@ -666,7 +666,7 @@ 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); @@ -674,100 +674,100 @@ 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); diff --git a/gencpu.cpp b/gencpu.cpp index 55502e44..93073ffe 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -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 (); diff --git a/include/clipboard.h b/include/clipboard.h index 639f5eda..148bcfe8 100644 --- a/include/clipboard.h +++ b/include/clipboard.h @@ -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 diff --git a/include/newcpu.h b/include/newcpu.h index a81f8a1b..df31789a 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -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) diff --git a/od-win32/blkdev_win32_ioctl.cpp b/od-win32/blkdev_win32_ioctl.cpp index 67013961..0523f681 100644 --- a/od-win32/blkdev_win32_ioctl.cpp +++ b/od-win32/blkdev_win32_ioctl.cpp @@ -29,6 +29,8 @@ #include #include // for SetupDiXxx functions. #include + +#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 index 00000000..67797eba --- /dev/null +++ b/od-win32/cda_play.cpp @@ -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 +#include + +#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 index 00000000..87a7ccd8 --- /dev/null +++ b/od-win32/cda_play.h @@ -0,0 +1,33 @@ + +#ifdef _WIN32 +#include +#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); +}; + diff --git a/od-win32/clipboard_win32.cpp b/od-win32/clipboard_win32.cpp index a739d40b..7e5b9035 100644 --- a/od-win32/clipboard_win32.cpp +++ b/od-win32/clipboard_win32.cpp @@ -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); } diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index f92992f2..aa2e3d60 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -34,6 +34,7 @@ #include "custom.h" #include "dxwrap.h" #include "akiko.h" +#include "clipboard.h" #ifdef WINDDK #include @@ -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) diff --git a/od-win32/mman.cpp b/od-win32/mman.cpp index 3ee4c06a..b237f9fc 100644 --- a/od-win32/mman.cpp +++ b/od-win32/mman.cpp @@ -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; diff --git a/od-win32/sounddep/sound.cpp b/od-win32/sounddep/sound.cpp index 2756faae..4deaa1fc 100644 --- a/od-win32/sounddep/sound.cpp +++ b/od-win32/sounddep/sound.cpp @@ -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; diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 0345a736..af7598c7 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -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; diff --git a/od-win32/win32.h b/od-win32/win32.h index 14ab8a44..f037abaf 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -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"" diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 138746c7..750af36c 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -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; diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index dcf47ae1..b1ac7c5f 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -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) { diff --git a/od-win32/winuae_msvc10/winuae_msvc.vcxproj b/od-win32/winuae_msvc10/winuae_msvc.vcxproj index 6d04a3c7..e4646355 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.vcxproj +++ b/od-win32/winuae_msvc10/winuae_msvc.vcxproj @@ -168,7 +168,7 @@ Windows 2621440 2621440 - false + true false @@ -295,7 +295,7 @@ Windows 2621440 2621440 - false + true true true @@ -439,7 +439,7 @@ Windows 2621440 2621440 - false + true true true UseLinkTimeCodeGeneration @@ -559,6 +559,7 @@ + diff --git a/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters b/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters index 60909705..52500e76 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters +++ b/od-win32/winuae_msvc10/winuae_msvc.vcxproj.filters @@ -484,6 +484,9 @@ win32 + + win32 + diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 2bf393bb..9fd04a23 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -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,