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;
break;
case 1:
cdp->evtime = MAX_EV;
+ if (!chan_ena) {
+ zerostate (nr);
+ return;
+ }
if (!cdp->dat_written)
return;
#ifdef TEST_AUDIO
break;
case 5:
cdp->evtime = MAX_EV;
+ if (!chan_ena) {
+ zerostate (nr);
+ return;
+ }
if (!cdp->dat_written)
return;
#ifdef DEBUG_AUDIO
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;
#include "threaddep/thread.h"
#include "scsidev.h"
#include "mp3decoder.h"
+#include "cda_play.h"
#include "memory.h"
#ifdef RETROPLATFORM
#include "rp.h"
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 ++) {
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)
{
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;
#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
static void newPage(int save)
{
+ printCharBuffer ();
if (save)
outputPage ();
if (page == NULL) {
}
return true;
case 0x0c: // Form feed (FF)
+ printCharBuffer ();
if (style & STYLE_DOUBLEWIDTHONELINE)
{
style &= 0xFFFF - STYLE_DOUBLEWIDTHONELINE;
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 ();
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
} 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) {
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);
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;
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
}
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)
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 ();
-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
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)
#include <winioctl.h>
#include <setupapi.h> // for SetupDiXxx functions.
#include <stddef.h>
+
+#include "cda_play.h"
#ifdef RETROPLATFORM
#include "rp.h"
#endif
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;
--- /dev/null
+
+/*
+* 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
+}
--- /dev/null
+
+#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);
+};
+
#include "memory.h"
#include "native2amiga_api.h"
+#define DEBUG_CLIP 0
+
int clipboard_debug;
static HWND chwnd;
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)
{
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);
}
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++) {
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;
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)
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;
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);
}
} 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);
}
}
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)
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;
}
}
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;
}
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;
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)
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;
}
xfree (to_amiga);
to_amiga = NULL;
to_amiga_size = 0;
+ clip_disabled = false;
ReleaseDC (chwnd, hdc);
}
#include "custom.h"
#include "dxwrap.h"
#include "akiko.h"
+#include "clipboard.h"
#ifdef WINDDK
#include <winioctl.h>
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)
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;
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;
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;
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;
#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""
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;
picasso_requested_on = 1;
}
-void WIN32GFX_DisplayChangeRequested (void)
-{
- display_change_requested = 1;
-}
-
int isscreen (void)
{
return hMainWnd ? 1 : 0;
struct newresource *getresource (int tmpl)
{
- TCHAR rid[10];
+ TCHAR rid[20];
HRSRC hrsrc;
HGLOBAL res;
HINSTANCE inst = hUIDLL ? hUIDLL : hInst;
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;
}
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;
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) {
<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" />
<ClCompile Include="..\mp3decoder.cpp">
<Filter>win32</Filter>
</ClCompile>
+ <ClCompile Include="..\cda_play.cpp">
+ <Filter>win32</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\resources\35floppy.ico">
+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,