void a2091_init (void)
{
- struct zfile *z;
int roms[5];
struct romlist *rl;
rombank = 0;
rl = getromlistbyids(roms);
if (rl) {
- write_log ("A590/A2091 BOOT ROM '%s' %d.%d ", rl->path, rl->rd->ver, rl->rd->rev);
- z = zfile_fopen(rl->path, "rb");
+ struct zfile *z = read_rom (rl->rd);
+ write_log ("A590/A2091 BOOT ROM %d.%d\n", rl->rd->ver, rl->rd->rev);
if (z) {
- if (rl->rd->id == 56) {
- int i;
- rom_size = 32768;
+ rom_size = rl->rd->size;
+ rom = xmalloc (rom_size);
+ if (rl->rd->id == 56)
rombankswitcher = 1;
- rom = xmalloc (rom_size * 2);
- for (i = 0; i < rom_size; i++)
- zfile_fread(rom + i * 2, 1, 1, z);
- } else {
- rom_size = 16384;
- rom = xmalloc (rom_size);
- zfile_fread (rom, rom_size, 1, z);
- }
- zfile_fclose(z);
+ zfile_fread (rom, rom_size, 1, z);
+ zfile_fclose (z);
rom_mask = rom_size - 1;
- write_log ("loaded\n");
- } else {
- write_log ("failed to load\n");
}
} else {
romwarning(roms);
return 1;
}
-static int superiv_init(struct romdata *rd, struct zfile *f)
+static int superiv_init (struct romdata *rd, struct zfile *f)
{
uae_u32 chip = currprefs.chipmem_size - 0x10000;
int subtype = rd->id;
if (strlen(currprefs.cartfile) == 0)
return 0;
- rd = getromdatabypath(currprefs.cartfile);
+ rd = getromdatabypath (currprefs.cartfile);
if (rd) {
if (rd->id == 62)
- return superiv_init(rd, NULL);
+ return superiv_init (rd, NULL);
if (rd->type & ROMTYPE_CD32CART)
return 0;
}
- f = zfile_fopen(currprefs.cartfile, "rb");
+ f = read_rom_name (currprefs.cartfile);
if (!f) {
write_log ("failed to load '%s' cartridge ROM\n", currprefs.cartfile);
return 0;
write_log ("Unknown cartridge ROM\n");
} else {
if (rd->type & (ROMTYPE_SUPERIV | ROMTYPE_NORDIC | ROMTYPE_XPOWER)) {
- return superiv_init(rd, f);
+ return superiv_init (rd, f);
}
}
zfile_fseek(f, 0, SEEK_END);
if (!isinternal) {
if (strlen(currprefs.cartfile) == 0)
return 0;
- f = zfile_fopen(currprefs.cartfile,"rb");
+ f = read_rom_name (currprefs.cartfile);
if(!f) {
write_log ("failed to load '%s' cartridge ROM\n", currprefs.cartfile);
return 0;
return src;
}
+
+#define NPSIZE 65536
+
+static unsigned char bswap (unsigned char v,int b7,int b6,int b5,int b4,int b3,int b2,int b1,int b0)
+{
+ unsigned char b = 0;
+
+ b |= ((v >> b7) & 1) << 7;
+ b |= ((v >> b6) & 1) << 6;
+ b |= ((v >> b5) & 1) << 5;
+ b |= ((v >> b4) & 1) << 4;
+ b |= ((v >> b3) & 1) << 3;
+ b |= ((v >> b2) & 1) << 2;
+ b |= ((v >> b1) & 1) << 1;
+ b |= ((v >> b0) & 1) << 0;
+ return b;
+}
+
+static unsigned short wswap (unsigned short v,int b15,int b14,int b13,int b12, int b11, int b10, int b9, int b8, int b7,int b6,int b5,int b4,int b3,int b2,int b1,int b0)
+{
+ unsigned short b = 0;
+
+ b |= ((v >> b15) & 1) << 15;
+ b |= ((v >> b14) & 1) << 14;
+ b |= ((v >> b13) & 1) << 13;
+ b |= ((v >> b12) & 1) << 12;
+ b |= ((v >> b11) & 1) << 11;
+ b |= ((v >> b10) & 1) << 10;
+ b |= ((v >> b9) & 1) << 9;
+ b |= ((v >> b8) & 1) << 8;
+ b |= ((v >> b7) & 1) << 7;
+ b |= ((v >> b6) & 1) << 6;
+ b |= ((v >> b5) & 1) << 5;
+ b |= ((v >> b4) & 1) << 4;
+ b |= ((v >> b3) & 1) << 3;
+ b |= ((v >> b2) & 1) << 2;
+ b |= ((v >> b1) & 1) << 1;
+ b |= ((v >> b0) & 1) << 0;
+ return b;
+}
+
+#define AXOR 0x817f
+
+// middle (even)
+static void descramble1(unsigned char *buf, int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++)
+ buf[i] = bswap(buf[i], 4, 1, 5, 3, 0, 7, 6, 2);
+}
+static void descramble1a(unsigned char *buf, int size)
+{
+ int i;
+ unsigned char tbuf[NPSIZE];
+
+ memcpy(tbuf, buf, size);
+ for (i = 0; i < size; i++) {
+ int a = (i ^ AXOR) & (size - 1);
+ buf[i] = tbuf[wswap(a, 15, 9, 10, 4, 6, 5, 3, 8, 14, 13, 0, 12, 11, 2, 1, 7)];
+ }
+}
+// corner (odd)
+static void descramble2(unsigned char *buf, int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++)
+ buf[i] = bswap(buf[i], 5, 4, 3, 2, 1, 0, 7, 6);
+}
+static void descramble2a(unsigned char *buf, int size)
+{
+ int i;
+ unsigned char tbuf[NPSIZE];
+
+ memcpy(tbuf, buf, size);
+ for (i = 0; i < size; i++) {
+ int a = (i ^ AXOR) & (size - 1);
+ buf[i] = tbuf[wswap(a, 15, 2, 4, 0, 1, 10, 11, 8, 13, 14, 12, 9, 7, 5, 6, 3)];
+ }
+}
+void descramble_nordicpro (uae_u8 *buf, int size, int odd)
+{
+ if (odd) {
+ descramble2 (buf, size);
+ descramble2a (buf, size);
+ } else {
+ descramble1 (buf, size);
+ descramble1a (buf, size);
+ }
+}
audio_activate();
update_audio ();
cdp->dat2 = v;
+ if (cdp->request_word >= 2 && cdp->request_word_skip == 0)
+ audio_handler (nr);
cdp->request_word = -1;
cdp->request_word_skip = 0;
/* cpu >= 68020: another "too fast" memory/CPU hack */
device_func[DF_SCSI] = &devicefunc_win32_aspi;
#ifdef WINDDK
- if (os_winnt) {
- device_func[DF_IOCTL] = &devicefunc_win32_ioctl;
- device_func[DF_SCSI] = &devicefunc_win32_spti;
- installed = 1;
- }
+ device_func[DF_IOCTL] = &devicefunc_win32_ioctl;
+ device_func[DF_SCSI] = &devicefunc_win32_spti;
+ installed = 1;
if (currprefs.win32_uaescsimode == UAESCSI_ADAPTECASPI ||
currprefs.win32_uaescsimode == UAESCSI_NEROASPI ||
currprefs.win32_uaescsimode == UAESCSI_FROGASPI ||
return;
if (!rl)
return;
- write_log ("CD32 FMV ROM '%s' %d.%d\n", rl->path, rl->rd->ver, rl->rd->rev);
- z = zfile_fopen(rl->path, "rb");
+ write_log ("CD32 FMV ROM %d.%d\n", rl->rd->ver, rl->rd->rev);
+ z = read_rom (rl->rd);
if (z) {
rom = mapped_malloc (fmv_size, "fast");
- if (rom) {
- zfile_fread(rom, rom_size, 1, z);
- zfile_fclose (z);
- }
+ if (rom)
+ zfile_fread (rom, rl->rd->size, 1, z);
+ zfile_fclose (z);
}
fmv_mask = fmv_size - 1;
fmv_bank.baseaddr = rom;
gui_data.powerled = led;
led_filter_audio ();
}
- if ((v & 1) != oldovl) {
+ if (currprefs.cs_ciaoverlay && (v & 1) != oldovl) {
oldovl = v & 1;
- if (!oldovl || ersatzkickfile) {
+ if (!oldovl || ersatzkickfile)
map_overlay (1);
- } else if (currprefs.cs_ciaoverlay) {
- /* Gayle does this internally, CIA pin disconnected, CD audio mute on/off on CD32 */
+ else
map_overlay (0);
- }
}
}
#ifdef ACTION_REPLAY
ar_ciaa[addr & 0xf] = val;
#endif
+ if (!currprefs.cs_ciaoverlay && oldovl) {
+ map_overlay (1);
+ oldovl = 0;
+ }
switch (addr & 0xf) {
case 0:
#ifdef DONGLE_DEBUG
kbstate = 0;
ciaasdr_unread = 0;
serbits = 0;
- oldovl = -1;
+ oldovl = 1;
oldled = -1;
resetwarning_phase = resetwarning_timer = 0;
ciaata_passed = ciaatb_passed = ciabta_passed = ciabtb_passed = 0;
}
CIA_calctimers ();
- if (! ersatzkickfile)
+ if (!ersatzkickfile)
map_overlay (0);
+ oldovl = 1;
#ifdef SERIAL_PORT
if (currprefs.use_serial && !savestate_state)
serial_dtr_off (); /* Drop DTR at reset */
+++ /dev/null
-#if USE_OPTIMIZER
-/* Welcome to the magical world of cpp ;-) */
-
-#define USE_REGALLOC optlev>=2
-
-#define opt_op0(dummy) opt_store_op0()
-#define opt_op1(a1) opt_store_op1(OPT_##a1)
-#define opt_op2(a1,a2) opt_store_op2(OPT_##a1,OPT_##a2)
-#define opt_op3(a1,a2,a3) opt_store_op3(OPT_##a1,OPT_##a2,OPT_##a3)
-#define opt_op4(a1,a2,a3,a4) opt_store_op4(OPT_##a1,OPT_##a2,OPT_##a3,OPT_##a4)
-#define opt_op5(a1,a2,a3,a4,a5) opt_store_op5(OPT_##a1,OPT_##a2,OPT_##a3,OPT_##a4,OPT_##a5)
-
-#define direct0(dummy) ()
-#define direct1(a1) (DIR_##a1)
-#define direct2(a1,a2) (DIR_##a1,DIR_##a2)
-#define direct3(a1,a2,a3) (DIR_##a1,DIR_##a2,DIR_##a3)
-#define direct4(a1,a2,a3,a4) (DIR_##a1,DIR_##a2,DIR_##a3,DIR_##a4)
-#define direct5(a1,a2,a3,a4,a5) (DIR_##a1,DIR_##a2,DIR_##a3,DIR_##a4,DIR_##a5)
-
-#define OIMM 0
-#define OMEMR 0
-#define OMEMW 0
-#define OMEMRW 0 /* These are all 32 bit immediates */
-#define OR1 1
-#define OR2 2
-#define OR4 3
-#define OW1 4
-#define OW2 5
-#define OW4 6
-#define ORW1 7
-#define ORW2 8
-#define ORW4 9
-
-#define OFW 10
-#define OFR 11
-#define OFRW 12
-
-#define INST_END 98
-#define FLUSH 99
-
-#define OPT_IMM OIMM,
-#define OPT_MEMR OMEMR,
-#define OPT_MEMW OMEMW,
-#define OPT_MEMRW OMEMRW,
-#define OPT_R1 OR1 ,
-#define OPT_R2 OR2 ,
-#define OPT_R4 OR4 ,
-#define OPT_W1 OW1 ,
-#define OPT_W2 OW2 ,
-#define OPT_W4 OW4 ,
-#define OPT_RW1 ORW1,
-#define OPT_RW2 ORW2,
-#define OPT_RW4 ORW4,
-
-#define OPT_FW OFW ,
-#define OPT_FR OFR ,
-#define OPT_FRW OFRW ,
-
-#define DIR_IMM
-#define DIR_MEMR
-#define DIR_MEMW
-#define DIR_MEMRW
-#define DIR_R1
-#define DIR_R2
-#define DIR_R4
-#define DIR_W1
-#define DIR_W2
-#define DIR_W4
-#define DIR_RW1
-#define DIR_RW2
-#define DIR_RW4
-
-#define DIR_FR
-#define DIR_FW
-#define DIR_FRW
-
-#undef MIDFUNC
-#undef MENDFUNC
-
-#define MIDFUNC(nargs,func,args) \
- __inline__ void do_##func args
-
-#define MENDFUNC(nargs,func,args) \
- void func args \
- { \
- if (reg_alloc_run) { \
- opt_op##nargs##args; \
- } else { \
- do_##func direct##nargs##args; \
- } \
- }
-
-#undef COMPCALL
-#define COMPCALL(func) do_##func
-
-int opt_index=0;
-
-static __inline__ void store_any(uae_u8 type, uae_u32 val)
-{
- ra[opt_index].type=type;
- ra[opt_index].reg=val;
- opt_index++;
- if (opt_index>=MAXREGOPT) {
- printf("Oops! opt_index overflow....\n");
- abort();
- }
-}
-
-static __inline__ void store_arg(uae_u8 type, uae_u32 val)
-{
- if (type<OR1 || type>ORW4)
- return;
- store_any(type,val);
-}
-
-static __inline__ void opt_store_op0(void)
-{
- /* zilch */
-}
-
-static __inline__ void opt_store_op1(uae_u8 t1, uae_u32 a1)
-{
- store_arg(t1,a1);
- opt_store_op0();
-}
-
-static __inline__ void opt_store_op2(uae_u8 t1, uae_u32 a1,
- uae_u8 t2, uae_u32 a2)
-{
- store_arg(t2,a2);
- opt_store_op1(t1,a1);
-}
-
-static __inline__ void opt_store_op3(uae_u8 t1, uae_u32 a1,
- uae_u8 t2, uae_u32 a2,
- uae_u8 t3, uae_u32 a3)
-{
- store_arg(t3,a3);
- opt_store_op2(t1,a1,t2,a2);
-}
-
-static __inline__ void opt_store_op4(uae_u8 t1, uae_u32 a1,
- uae_u8 t2, uae_u32 a2,
- uae_u8 t3, uae_u32 a3,
- uae_u8 t4, uae_u32 a4)
-{
- store_arg(t4,a4);
- opt_store_op3(t1,a1,t2,a2,t3,a3);
-}
-
-static __inline__ void opt_store_op5(uae_u8 t1, uae_u32 a1,
- uae_u8 t2, uae_u32 a2,
- uae_u8 t3, uae_u32 a3,
- uae_u8 t4, uae_u32 a4,
- uae_u8 t5, uae_u32 a5)
-{
- store_arg(t5,a5);
- opt_store_op4(t1,a1,t2,a2,t3,a3,t4,a4);
-}
-
-static void opt_assert_empty(int line)
-{
-}
-
-void empty_optimizer(void)
-{
-}
-
-#else
-static __inline__ void opt_emit_all(void) {}
-static __inline__ void opt_assert_empty(int line) {}
-void empty_optimizer(void) {}
-#define USE_REGALLOC 0
-#endif
" b Step to previous state capture position\n"
" am <channel mask> Enable or disable audio channels\n"
" sm <sprite mask> Enable or disable sprites\n"
+ " sp <addr> [<addr2][<size>] Dump sprite information\n"
" di <mode> [<track>] Break on disk access. R=DMA read,W=write,RW=both,P=PIO\n"
" Also enables level 1 disk logging\n"
" did <log level> Enable disk logging\n"
#endif
static uaecptr nextpc;
-static int instruction_breakpoint (char **c)
+int instruction_breakpoint (char **c)
{
struct breakpoint_node *bpn;
int i;
}
}
-static void disk_debug(char **inptr)
+static void debug_sprite (char **inptr)
+{
+ uaecptr addr, addr2;
+ int xpos, xpos_ecs;
+ int ypos, ypos_ecs;
+ int ypose, ypose_ecs;
+ int attach;
+ uae_u64 w1, w2, ww1, ww2;
+ int size = 1, width;
+ int ecs = 0;
+ int sh10 = 0;
+ int y;
+ char tmp[80];
+
+ addr2 = 0;
+ ignore_ws (inptr);
+ addr = readhex (inptr);
+ ignore_ws (inptr);
+ if (more_params (inptr))
+ size = readhex (inptr);
+ if (size != 1 && size != 2 && size != 4) {
+ addr2 = size;
+ ignore_ws (inptr);
+ if (more_params (inptr))
+ size = readint (inptr);
+ if (size != 1 && size != 2 && size != 4)
+ size = 1;
+ }
+ width = size * 16;
+ w1 = get_word (addr);
+ w2 = get_word (addr + size * 2);
+ ypos = w1 >> 8;
+ xpos = w1 & 255;
+ ypose = w2 >> 8;
+ attach = (w2 & 0x80) ? 1 : 0;
+ if (w2 & 4)
+ ypos |= 256;
+ if (w2 & 2)
+ ypose |= 256;
+ ypos_ecs = ypos;
+ ypose_ecs = ypose;
+ if (w2 & 0x40)
+ ypos_ecs |= 512;
+ if (w2 & 0x20)
+ ypose_ecs |= 512;
+ xpos <<= 1;
+ if (w2 & 0x01)
+ xpos |= 1;
+ xpos_ecs = xpos << 2;
+ if (w2 & 0x10)
+ xpos_ecs |= 2;
+ if (w2 & 0x08)
+ xpos_ecs |= 1;
+ if (w2 & (0x40 | 0x20 | 0x10 | 0x08))
+ ecs = 1;
+ if (w1 & 0x80)
+ sh10 = 1;
+ for (y = ypos; y < ypose; y++) {
+ int x;
+ addr += size * 4;
+ if (addr2)
+ addr2 += size * 4;
+ if (size == 1) {
+ w1 = get_word (addr);
+ w2 = get_word (addr + 2);
+ if (addr2) {
+ ww1 = get_word (addr2);
+ ww2 = get_word (addr2 + 2);
+ }
+ } else if (size == 2) {
+ w1 = get_long (addr);
+ w2 = get_long (addr + 4);
+ if (addr2) {
+ ww1 = get_long (addr2);
+ ww2 = get_long (addr2 + 4);
+ }
+ } else if (size == 4) {
+ w1 = get_long (addr) << 16;
+ w2 = get_long (addr + 4) << 16;
+ w1 <<= 16;
+ w2 <<= 16;
+ w1 |= get_long (addr);
+ w2 |= get_long (addr2 + 4);
+ if (addr2) {
+ ww1 = get_long (addr2) << 16;
+ ww2 = get_long (addr2 + 4) << 16;
+ ww1 <<= 16;
+ ww2 <<= 16;
+ ww1 |= get_long (addr2);
+ ww2 |= get_long (addr2 + 4);
+ }
+ }
+ width = size * 16;
+ for (x = 0; x < width; x++) {
+ int v1 = (w1 >> (width - x)) & 1;
+ int v2 = (w2 >> (width - x)) & 1;
+ int v = v1 * 2 + v2;
+ if (addr2) {
+ int vv1 = (ww1 >> (width - x)) & 1;
+ int vv2 = (ww2 >> (width - x)) & 1;
+ int vv = vv1 * 2 + vv2;
+ v *= 4;
+ v += vv;
+ tmp[x] = v >= 10 ? 'A' + v - 10 : v + '0';
+ } else {
+ tmp[x] = v + '0';
+ }
+ }
+ tmp[width] = 0;
+ console_out ("%3d: %s\n", y, tmp);
+ }
+
+ console_out ("Sprite address %08X, width = %d\n", addr, size * 16);
+ console_out ("OCS: StartX=%d StartY=%d EndY=%d\n", xpos, ypos, ypose);
+ console_out ("ECS: StartX=%d (%d.%d) StartY=%d EndY=%d%s\n", xpos_ecs, xpos_ecs / 4, xpos_ecs & 3, ypos_ecs, ypose_ecs, ecs ? " (*)" : "");
+ console_out ("Attach: %d. AGA SSCAN/SH10 bit: %d\n", attach, sh10);
+}
+
+static void disk_debug (char **inptr)
{
char parm[10];
int i;
case 's':
if (*inptr == 'c') {
screenshot (1, 1);
+ } else if (*inptr == 'p') {
+ inptr++;
+ debug_sprite (&inptr);
} else if (*inptr == 'm') {
if (*(inptr + 1) == 'c') {
next_char (&inptr);
--- /dev/null
+[ViewState]
+Mode=
+Vid=
+FolderType=NotSpecified
#include "crc32.h"
#include "inputdevice.h"
#include "amax.h"
+#ifdef RETROPLATFORM
+#include "rp.h"
+#endif
#undef CATWEASEL
#else
#define DDHDMULT 1
#endif
+#define MAX_SECTORS (DDHDMULT * 11)
#undef DEBUG_DRIVE_ID
static int side, direction;
static uae_u8 selected = 15, disabled;
-static uae_u8 writebuffer[544 * 11 * DDHDMULT];
+static uae_u8 writebuffer[544 * MAX_SECTORS];
#define DISK_INDEXSYNC 1
#define DISK_WORDSYNC 2
trackid *tid;
int num_tracks, size;
+#ifdef RETROPLATFORM
+ rp_disk_change (dnum, fname);
+#endif
drive_image_free (drv);
drv->diskfile = DISK_validate_filename (fname, 1, &drv->wrprot, &drv->crc32);
drv->ddhd = 1;
crc16 = get_crc16 (secbuf + 56, 3 + 1 + 512);
secbuf[60 + 512] = crc16 >> 8;
secbuf[61 + 512] = crc16 & 0xff;
- memset(secbuf + 512 + 62, 0x4e, (tracklen / 2 - 96) / drv->num_secs - 574);
+ memset(secbuf + 512 + 62, 0x4e, (tracklen / 2 - 96) / drv->num_secs - 574 / drv->ddhd);
dstmfmbuf = mfmcoder (secbuf, mfm2, 60 + 512 + 2 + 76 / drv->ddhd);
mfm2[12] = 0x4489;
mfm2[13] = 0x4489;
return ((getmfmword (mbuf, shift) << 16) | getmfmword (mbuf + 1, shift)) & MFMMASK;
}
-static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int filetype, int *drvsecp, int checkmode)
+static int decode_buffer (uae_u16 *mbuf, int cyl, int drvsec, int ddhd, int filetype, int *drvsecp, int *sectable, int checkmode)
{
int i, secwritten = 0;
int fwlen = FLOPPY_WRITE_LEN * ddhd;
uae_u8 *secdata;
uae_u8 secbuf[544];
uae_u16 *mend = mbuf + length;
- char sectable[22];
int shift = 0;
- memset (sectable, 0, sizeof (sectable));
+ memset (sectable, 0, MAX_SECTORS * sizeof (int));
memcpy (mbuf + fwlen, mbuf, fwlen * sizeof (uae_u16));
mend -= (4 + 16 + 8 + 512);
while (secwritten < drvsec) {
uae_u16 *mbuf = drv->bigmfmbuf;
uae_u16 *mend = mbuf + length;
int secwritten = 0, shift = 0, sector = -1;
- char sectable[18];
+ int sectable[18];
uae_u8 secbuf[3 + 1 + 512];
uae_u8 mark;
uae_u16 crc;
static int drive_write_adf_amigados (drive *drv)
{
int drvsec, i;
+ int sectable[MAX_SECTORS];
- if (decode_buffer (drv->bigmfmbuf, drv->cyl, drv->num_secs, drv->ddhd, drv->filetype, &drvsec, 0))
+ if (decode_buffer (drv->bigmfmbuf, drv->cyl, drv->num_secs, drv->ddhd, drv->filetype, &drvsec, sectable, 0))
return 2;
if (!drvsec)
return 2;
{
#ifdef DRIVESOUND
driveclick_insert (drv - floppy, 1);
+#endif
+#ifdef RETROPLATFORM
+ rp_disk_change (drv - floppy, NULL);
#endif
drive_image_free (drv);
drv->dskchange = 1;
drive *drv = &floppy[num];
uae_u32 dos, crc, crc2;
int wasdelayed = drv->dskchange_time;
+ int sectable[MAX_SECTORS];
ret = 0;
drv->cyl = 0;
if (!drv->diskfile)
return 1;
*crc32 = zfile_crc32 (drv->diskfile);
- if (decode_buffer (drv->bigmfmbuf, drv->cyl, 11, drv->ddhd, drv->filetype, &drvsec, 1)) {
+ decode_buffer (drv->bigmfmbuf, drv->cyl, 11, drv->ddhd, drv->filetype, &drvsec, sectable, 1);
+ if (sectable[0] == 0 || sectable[1] == 0) {
ret = 2;
goto end;
}
#include "picasso96.h"
#include "drawing.h"
#ifdef JIT
-#include "compemu.h"
+#include "jit/compemu.h"
#endif
#include "savestate.h"
if (doublescan)
visible_left_border = (max_diwlastword - 48) / 2 - gfxvidinfo.width;
}
- if (currprefs.gfx_xcenter_pos >= 0)
- visible_left_border = currprefs.gfx_xcenter_pos + (DIW_DDF_OFFSET << currprefs.gfx_resolution) - (DISPLAY_LEFT_SHIFT * 2 - (DISPLAY_LEFT_SHIFT << currprefs.gfx_resolution));
+ if (currprefs.gfx_xcenter_pos >= 0) {
+ int val = currprefs.gfx_xcenter_pos < 56 ? 56 : currprefs.gfx_xcenter_pos;
+ visible_left_border = val + (DIW_DDF_OFFSET << currprefs.gfx_resolution) - (DISPLAY_LEFT_SHIFT * 2 - (DISPLAY_LEFT_SHIFT << currprefs.gfx_resolution));
+ }
if (visible_left_border > max_diwlastword - 32)
visible_left_border = max_diwlastword - 32;
*/
uaecptr p96ram_start;
-int p96mode = 0;
+int p96mode = 1;
static void expamem_map_gfxcard (void)
{
}
z3fastmem_start = currprefs.z3fastmem_start;
- if (!p96mode)
+ if (!p96mode || !canbang)
p96memstart();
(*card_init[0]) ();
}
if (nr < 0)
return 0;
uci = &p->mountconfig[nr];
- if (uci->configoffset >= 0)
+ hardfile_do_disk_change (uci, 0);
+ if (uci->configoffset >= 0 && uci->controller == 0)
filesys_media_change (uci->rootdir, 0, uci);
while (nr < MOUNT_CONFIG_SIZE) {
memmove (&p->mountconfig[nr], &p->mountconfig[nr + 1], sizeof (struct uaedev_config_info));
/* write_comm_pipe_int (unit->ui.unit_pipe, -1, 1);*/
- write_log ("FS: %s (flags=%08.8X) starting..\n", unit->ui.volname, unit->volflags);
+ write_log ("FS: %s (flags=%08X) starting..\n", unit->ui.volname, unit->volflags);
/* fill in our process in the device node */
devnode = get_long (pkt + dp_Arg3) << 2;
static void
action_inhibit (Unit *unit, dpacket packet)
{
- TRACE(("ACTION_INHIBIT()\n"));
PUT_PCK_RES1 (packet, DOS_TRUE);
flush_cache(unit, 0);
unit->inhibited = GET_PCK_ARG1 (packet);
- write_log("ACTION_INHIBIT %d:%d\n", unit->unit, unit->inhibited);
+ TRACE(("ACTION_INHIBIT(%d:%d)\n", unit->unit, unit->inhibited));
}
static void
db(0x67); db(0x20); db(0x24); db(0x40); db(0x74); db(0x30); db(0x20); db(0x02);
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(0x11); db(0x7c); db(0x00); db(0x0a);
- db(0x00); db(0x08); db(0x21); db(0x42); db(0x00); db(0x12); db(0x21); db(0x4a);
+ db(0x00); db(0x08); db(0x31); db(0x42); db(0x00); db(0x12); db(0x21); db(0x4a);
db(0x00); db(0x0e); db(0x4a); db(0x80); db(0x4c); db(0xdf); db(0x44); db(0x04);
db(0x4e); db(0x75); db(0x48); db(0xe7); db(0x00); db(0x22); db(0x2c); db(0x78);
db(0x00); db(0x04); db(0x61); db(0x00); db(0xff); db(0x70); db(0x61); db(0x00);
return -1;
}
- fsp->fsu_blocks = (1 << 31) - 1;
- fsp->fsu_bavail = (1 << 31) - 1;
+ fsp->fsu_blocks = 0x7fffffff;
+ fsp->fsu_bavail = 0x7fffffff;
if (TotalNumberOfBytes.QuadPart / 1024 < (1 << 31))
- fsp->fsu_blocks = TotalNumberOfBytes.QuadPart / 1024;
+ fsp->fsu_blocks = (unsigned long)(TotalNumberOfBytes.QuadPart / 1024);
if (FreeBytesAvailable.QuadPart / 1024 < (1 << 31))
- fsp->fsu_bavail = FreeBytesAvailable.QuadPart / 1024;
+ fsp->fsu_bavail = (unsigned long)(FreeBytesAvailable.QuadPart / 1024);
return 0;
}
#include "gayle.h"
#include "filesys.h"
#include "savestate.h"
+#include "uae.h"
#include "gui.h"
#include "a2091.h"
#include "ncr_scsi.h"
/* PCMCIA stuff */
-#define GAYLE_RAM (0x600000+zTwoBase)
-#define GAYLE_RAMSIZE (0x400000)
-#define GAYLE_ATTRIBUTE (0xa00000+zTwoBase)
-#define GAYLE_ATTRIBUTESIZE (0x020000)
-#define GAYLE_IO (0xa20000+zTwoBase) /* 16bit and even 8bit registers */
-#define GAYLE_IOSIZE (0x010000)
-#define GAYLE_IO_8BITODD (0xa30000+zTwoBase) /* odd 8bit registers */
-/* offset for accessing odd IO registers */
-#define GAYLE_ODD (GAYLE_IO_8BITODD-GAYLE_IO-1)
-
-#define GAYLE_ADDRESS (0xda8000) /* gayle main registers base address */
-#define GAYLE_RESET (0xa40000) /* write 0x00 to start reset,
- read 1 byte to stop reset */
-/* GAYLE_CONFIG bit def
- (bit 0-1 for program voltage, bit 2-3 for access speed */
-#define GAYLE_CFG_0V 0x00
-#define GAYLE_CFG_5V 0x01
-#define GAYLE_CFG_12V 0x02
-
-#define GAYLE_CFG_100NS 0x08
-#define GAYLE_CFG_150NS 0x04
-#define GAYLE_CFG_250NS 0x00
-#define GAYLE_CFG_720NS 0x0c
+#define GAYLE_RAM 0x600000
+#define GAYLE_RAMSIZE 0x400000
+#define GAYLE_ATTRIBUTE 0xa00000
+#define GAYLE_ATTRIBUTESIZE 0x020000
+#define GAYLE_IO 0xa20000 /* 16bit and even 8bit registers */
+#define GAYLE_IOSIZE 0x010000
+#define GAYLE_IO_8BITODD 0xa30000 /* odd 8bit registers */
+#define GAYLE_ADDRESS 0xda8000 /* gayle main registers base address */
+#define GAYLE_RESET 0xa40000 /* write 0x00 to start reset,
+ read 1 byte to stop reset */
/* IDE stuff */
/* Bases of the IDE interfaces */
#define GAYLE_INT_1200 0xA000
#define GAYLE_CFG_1200 0xB000
+/* DA8000 */
+#define GAYLE_CS_IDE 0x80 /* IDE int status */
#define GAYLE_CS_CCDET 0x40 /* credit card detect */
#define GAYLE_CS_BVD1 0x20 /* battery voltage detect 1 */
#define GAYLE_CS_SC 0x20 /* credit card status change */
#define GAYLE_CS_WR 0x08 /* write enable (1 == enabled) */
#define GAYLE_CS_BSY 0x04 /* credit card busy */
#define GAYLE_CS_IRQ 0x04 /* interrupt request */
+#define GAYLE_CS_DAEN 0x02 /* enable digital audio */
+#define GAYLE_CS_DIS 0x01 /* disable PCMCIA slot */
+
+/* DA9000 */
+#define GAYLE_IRQ_IDE 0x80
+#define GAYLE_IRQ_CCDET 0x40 /* credit card detect */
+#define GAYLE_IRQ_BVD1 0x20 /* battery voltage detect 1 */
+#define GAYLE_IRQ_SC 0x20 /* credit card status change */
+#define GAYLE_IRQ_BVD2 0x10 /* battery voltage detect 2 */
+#define GAYLE_IRQ_DA 0x10 /* digital audio */
+#define GAYLE_IRQ_WR 0x08 /* write enable (1 == enabled) */
+#define GAYLE_IRQ_BSY 0x04 /* credit card busy */
+#define GAYLE_IRQ_IRQ 0x04 /* interrupt request */
+#define GAYLE_IRQ_RESET 0x02 /* reset machine after CCDET change */
+#define GAYLE_IRQ_BERR 0x01 /* generate bus error after CCDET change */
+
+/* DAA000 */
+#define GAYLE_INT_IDE 0x80 /* IDE interrupt enable */
+#define GAYLE_INT_CCDET 0x40 /* credit card detect change enable */
+#define GAYLE_INT_BVD1 0x20 /* battery voltage detect 1 change enable */
+#define GAYLE_INT_SC 0x20 /* credit card status change enable */
+#define GAYLE_INT_BVD2 0x10 /* battery voltage detect 2 change enable */
+#define GAYLE_INT_DA 0x10 /* digital audio change enable */
+#define GAYLE_INT_WR 0x08 /* write enable change enabled */
+#define GAYLE_INT_BSY 0x04 /* credit card busy */
+#define GAYLE_INT_IRQ 0x04 /* credit card interrupt request */
+#define GAYLE_INT_BVD_LEV 0x02 /* BVD int level, 0=lev2,1=lev6 */
+#define GAYLE_INT_BSY_LEV 0x01 /* BSY int level, 0=lev2,1=lev6 */
+
+/* 0xDAB000 GAYLE_CONFIG */
+#define GAYLE_CFG_0V 0x00
+#define GAYLE_CFG_5V 0x01
+#define GAYLE_CFG_12V 0x02
+#define GAYLE_CFG_100NS 0x08
+#define GAYLE_CFG_150NS 0x04
+#define GAYLE_CFG_250NS 0x00
+#define GAYLE_CFG_720NS 0x0c
-/* GAYLE_IRQ bit def */
-#define GAYLE_IRQ_IDE 0x80
-#define GAYLE_IRQ_CCDET 0x40 /* credit card detect */
-#define GAYLE_IRQ_BVD1 0x20 /* battery voltage detect 1 */
-#define GAYLE_IRQ_SC 0x20 /* credit card status change */
-#define GAYLE_IRQ_BVD2 0x10 /* battery voltage detect 2 */
-#define GAYLE_IRQ_DA 0x10 /* digital audio */
-#define GAYLE_IRQ_WR 0x08 /* write enable (1 == enabled) */
-#define GAYLE_IRQ_BSY 0x04 /* credit card busy */
-#define GAYLE_IRQ_IRQ 0x04 /* interrupt request */
-#define GAYLE_IRQ_IDEACK1 0x02
-#define GAYLE_IRQ_IDEACK0 0x01
struct ide_hdf
{
uae_u8 multiple_mode;
uae_u8 status;
int irq_delay;
+ int irq;
int num;
};
static struct ide_hdf *idedrive[4];
-static struct hd_hardfiledata *pcmcia_sram;
+struct hd_hardfiledata *pcmcia_sram;
+static int pcmcia_card;
+static int pcmcia_readonly;
static int gayle_id_cnt;
-static uae_u8 gayle_irq, gayle_intena, gayle_cs, gayle_cfg;
+static uae_u8 gayle_irq, gayle_int, gayle_cs, gayle_cs_mask, gayle_cfg;
static uae_u8 ide_select, ide_nsector, ide_sector, ide_lcyl, ide_hcyl, ide_devcon, ide_error, ide_feat;
static uae_u8 ide_nsector2, ide_sector2, ide_lcyl2, ide_hcyl2, ide_feat2;
static int ide_drv, ide2, ide_splitter;
}
}
+static int isideirq (void)
+{
+ if (!idedrive)
+ return 0;
+ if (ide_devcon & 2)
+ return 0;
+ if (idedrive[ide_drv]->irq || idedrive[ide_drv + 2]->irq) {
+ /* IDE killer feature. Do not eat interrupt to make booting faster. */
+ if (idedrive[ide_drv]->irq && idedrive[ide_drv]->hdhfd.size == 0)
+ idedrive[ide_drv]->irq = 0;
+ return 1;
+ }
+ return 0;
+}
+
void rethink_gayle (void)
{
- if (currprefs.cs_ide != 1)
+ int lev2 = 0;
+ int lev6 = 0;
+ uae_u8 mask;
+
+ if (currprefs.cs_ide == 2) {
+ if (isideirq ())
+ gayle_irq |= GAYLE_IRQ_IDE;
+ if ((gayle_irq & GAYLE_IRQ_IDE) && !(intreq & 0x0008))
+ INTREQ_0 (0x8000 | 0x0008);
+ }
+
+ if (currprefs.cs_ide != 1 && !currprefs.cs_pcmcia)
return;
- if (gayle_intena & gayle_irq & (GAYLE_IRQ_IDE | GAYLE_IRQ_IRQ)) {
- if (!(intreq & 8))
- INTREQ_0 (0x8000 | 0x0008);
+ if (isideirq ())
+ gayle_irq |= GAYLE_IRQ_IDE;
+ mask = gayle_int & gayle_irq;
+ if (mask & (GAYLE_IRQ_IDE | GAYLE_IRQ_WR))
+ lev2 = 1;
+ if (mask & GAYLE_IRQ_CCDET)
+ lev6 = 1;
+ if (mask & (GAYLE_IRQ_BVD1 | GAYLE_IRQ_BVD2)) {
+ if (gayle_int & GAYLE_INT_BVD_LEV)
+ lev6 = 1;
+ else
+ lev2 = 1;
}
+ if (mask & GAYLE_IRQ_BSY) {
+ if (gayle_int & GAYLE_INT_BSY_LEV)
+ lev6 = 1;
+ else
+ lev2 = 1;
+ }
+ if (lev2 && !(intreq & 0x0008))
+ INTREQ_0 (0x8000 | 0x0008);
+ if (lev6 && !(intreq & 0x2000))
+ INTREQ_0 (0x8000 | 0x2000);
+}
+
+static void gayle_cs_change (uae_u8 mask, int onoff)
+{
+ int changed = 0;
+ if ((gayle_cs & mask) && !onoff) {
+ gayle_cs &= ~mask;
+ changed = 1;
+ } else if (!(gayle_cs & mask) && onoff) {
+ gayle_cs |= mask;
+ changed = 1;
+ }
+ if (changed) {
+ gayle_irq |= mask;
+ rethink_gayle ();
+ if (mask & GAYLE_CS_CCDET) {
+ if (gayle_irq & GAYLE_IRQ_RESET)
+ uae_reset (0);
+ if (gayle_irq & GAYLE_IRQ_BERR)
+ Exception (2, ®s, 0);
+ }
+ }
+}
+
+static void card_trigger (int insert)
+{
+ if (insert) {
+ if (pcmcia_card) {
+ gayle_cs_change (GAYLE_CS_CCDET, 1);
+ gayle_cfg = GAYLE_CFG_100NS;
+ if (!pcmcia_readonly)
+ gayle_cs_change (GAYLE_CS_WR, 1);
+ }
+ } else {
+ gayle_cfg = 0;
+ gayle_cs_change (GAYLE_CS_CCDET, 0);
+ gayle_cs_change (GAYLE_CS_BVD2, 0);
+ gayle_cs_change (GAYLE_CS_BVD1, 0);
+ gayle_cs_change (GAYLE_CS_WR, 0);
+ gayle_cs_change (GAYLE_CS_BSY, 0);
+ }
+ rethink_gayle ();
}
+static void write_gayle_cfg (uae_u8 val)
+{
+ gayle_cfg = val;
+}
+static uae_u8 read_gayle_cfg (void)
+{
+ return gayle_cfg & 0x0f;
+}
+static void write_gayle_irq (uae_u8 val)
+{
+ gayle_irq = (gayle_irq & val) | (val & 3);
+}
+static uae_u8 read_gayle_irq (void)
+{
+ return gayle_irq;
+}
+static void write_gayle_int (uae_u8 val)
+{
+ gayle_int = val;
+}
+static uae_u8 read_gayle_int (void)
+{
+ return gayle_int;
+}
+static void write_gayle_cs (uae_u8 val)
+{
+ int ov = gayle_cs;
+
+ gayle_cs_mask = val & ~3;
+ gayle_cs &= ~3;
+ gayle_cs |= val & 3;
+ if ((ov & 1) != (gayle_cs & 1)) {
+ gayle_map_pcmcia ();
+ /* PCMCIA disable -> enable */
+ card_trigger (!(gayle_cs & GAYLE_CS_DIS) ? 1 : 0);
+ if (PCMCIA_LOG)
+ write_log ("PCMCIA slot: %s PC=%08X\n", !(gayle_cs & 1) ? "enabled" : "disabled", M68K_GETPC);
+ }
+}
+static uae_u8 read_gayle_cs (void)
+{
+ uae_u8 v;
+
+ v = gayle_cs_mask | gayle_cs;
+ if (isideirq ())
+ v |= GAYLE_CS_IDE;
+ return v;
+}
+
+
static void ide_interrupt (void)
{
ide->status |= IDE_STATUS_BSY;
ide->irq_delay = 2;
}
+
static void ide_interrupt_do (struct ide_hdf *ide)
{
ide->status &= ~IDE_STATUS_BSY;
- if (gayle_intena & GAYLE_IRQ_IDE) {
- gayle_irq |= GAYLE_IRQ_IDE;
- INTREQ_f (0x8000 | 0x0008);
- }
+ ide->irq_delay = 0;
+ ide->irq = 1;
+ rethink_gayle ();
}
static void ide_fail (void)
if (addr >= 0x4000) {
if (addr == GAYLE_IRQ_1200) {
if (currprefs.cs_ide == 1)
- return gayle_irq;
+ return read_gayle_irq ();
return 0;
} else if (addr == GAYLE_INT_1200) {
if (currprefs.cs_ide == 1)
- return gayle_intena;
+ return read_gayle_int ();
return 0;
}
return 0;
v = ide_devcon;
break;
case IDE_STATUS:
+ ide->irq = 0;
if (ide->hdhfd.size == 0) {
v = 0;
if (ide_error)
return;
if (currprefs.cs_ide == 1) {
if (addr == GAYLE_IRQ_1200) {
- gayle_irq &= val;
+ write_gayle_irq (val);
return;
}
if (addr == GAYLE_INT_1200) {
- gayle_intena = val;
+ write_gayle_int (val);
return;
}
}
ide_drv = (val & 0x10) ? 1 : 0;
break;
case IDE_STATUS:
+ ide->irq = 0;
ide_do_command (val);
break;
}
if (currprefs.cs_pcmcia) {
if (currprefs.cs_ide != 1) {
if (addr == GAYLE_IRQ_1200) {
- v = gayle_irq;
+ v = read_gayle_irq ();
got = 1;
} else if (addr == GAYLE_INT_1200) {
- v = gayle_intena;
+ v = read_gayle_int ();
got = 1;
}
}
if (addr == GAYLE_CS_1200) {
- v = gayle_cs;
+ v = read_gayle_cs ();
got = 1;
+ if (PCMCIA_LOG)
+ write_log ("PCMCIA STATUS READ %08X=%02X PC=%08X\n", oaddr, (uae_u32)v & 0xff, M68K_GETPC);
} else if (addr == GAYLE_CFG_1200) {
- v = gayle_cfg;
+ v = read_gayle_cfg ();
got = 1;
+ if (PCMCIA_LOG)
+ write_log ("PCMCIA CONFIG READ %08X=%02X PC=%08X\n", oaddr, (uae_u32)v & 0xff, M68K_GETPC);
}
}
if (!got)
v = ide_read (addr);
if (GAYLE_LOG)
- write_log ("GAYLE_READ %08.8X=%02.2X PC=%08.8X\n", oaddr, (uae_u32)v & 0xff, M68K_GETPC);
+ write_log ("GAYLE_READ %08X=%02X PC=%08X\n", oaddr, (uae_u32)v & 0xff, M68K_GETPC);
return v;
}
static void gayle_write (uaecptr addr, int val)
{
+ uaecptr oaddr = addr;
int got = 0;
#ifdef JIT
special_mem |= S_WRITE;
if (currprefs.cs_pcmcia) {
if (currprefs.cs_ide != 1) {
if (addr == GAYLE_IRQ_1200) {
- gayle_irq &= val;
+ write_gayle_irq (val);
got = 1;
} else if (addr == GAYLE_INT_1200) {
- gayle_intena = val;
+ write_gayle_int (val);
got = 1;
}
}
if (addr == GAYLE_CS_1200) {
+ write_gayle_cs (val);
got = 1;
+ if (PCMCIA_LOG > 1)
+ write_log ("PCMCIA STATUS WRITE %08X=%02X PC=%08X\n", oaddr, (uae_u32)val & 0xff, M68K_GETPC);
} else if (addr == GAYLE_CFG_1200) {
- gayle_cfg = val;
+ write_gayle_cfg (val);
got = 1;
+ if (PCMCIA_LOG > 1)
+ write_log ("PCMCIA CONFIG WRITE %08X=%02X PC=%08X\n", oaddr, (uae_u32)val & 0xff, M68K_GETPC);
}
}
if (GAYLE_LOG)
- write_log ("GAYLE_WRITE %08.8X=%02.2X PC=%08.8X\n", addr, (uae_u32)val & 0xff, M68K_GETPC);
+ write_log ("GAYLE_WRITE %08X=%02X PC=%08X\n", addr, (uae_u32)val & 0xff, M68K_GETPC);
if (!got)
ide_write (addr, val);
}
static int pcmcia_common_mask;
static uae_u8 *pcmcia_common;
static uae_u8 *pcmcia_attrs;
-static int pcmcia_card;
static int pcmcia_write_min, pcmcia_write_max;
-static int pcmcia_readonly;
static uae_u32 gayle_attr_read (uaecptr addr)
{
if (addr >= 0x40000) {
if (PCMCIA_LOG > 0)
write_log ("GAYLE: Reset disabled\n");
- if (pcmcia_card) {
- gayle_irq |= GAYLE_IRQ_CCDET | GAYLE_IRQ_IRQ;
- if (gayle_intena & GAYLE_IRQ_IRQ)
- INTREQ_f (0x8000 | 0x0008);
- }
return v;
}
if (addr >= pcmcia_attrs_size)
uae_u8 *rp;
uae_u8 *p = pcmcia_attrs;
int sm, su, code, units;
+ struct hardfiledata *hfd = &pcmcia_sram->hfd;
+ int real = hfd->flags & HFD_FLAGS_REALDRIVE;
code = 0;
su = 512;
*p++ = (units << 3) | code; /* memory card size in weird units */
*p++ = 0xff;
- /* CISTPL_FUNCID */
- *p++ = 0x21;
- *p++ = 2;
- *p++ = 1; /* Memory Card */
+ /* CISTPL_DEVICEGEO */
+ *p++ = 0x1e;
+ *p++ = 7;
+ *p++ = 2; /* 16-bit PCMCIA */
*p++ = 0;
+ *p++ = 1;
+ *p++ = 1;
+ *p++ = 1;
+ *p++ = 1;
+ *p++ = 0xff;
/* CISTPL_VERS_1 */
*p++= 0x15;
rp = p++;
*p++= 4; /* PCMCIA 2.1 */
*p++= 1;
- strcpy (p, "UAE"); /* manafacturer */
+ if (real) {
+ strcpy (p, hfd->product_id);
+ p += strlen (p) + 1;
+ strcpy (p, hfd->product_rev);
+ } else {
+ strcpy (p, "UAE");
+ p += strlen (p) + 1;
+ strcpy (p, "68000");
+ }
p += strlen (p) + 1;
- strcpy (p, "PCMCIA SRAM"); /* product */
+ sprintf (p, "Generic Emulated %dKB PCMCIA SRAM Card", size >> 10);
p += strlen (p) + 1;
+ *p++= 0;
*p++= 0xff;
*rp = p - rp;
+ /* CISTPL_FUNCID */
+ *p++ = 0x21;
+ *p++ = 2;
+ *p++ = 1; /* Memory Card */
+ *p++ = 0;
+
/* CISTPL_MANFID */
*p++ = 0x20;
*p++ = 4;
*p++ = 1;
*p++ = 1;
- /* CISTPL_NO_LINK */
- *p++ = 0x14;
- *p++ = 0;
-
/* CISTPL_END */
*p++ = 0xff;
}
if (len > 0) {
hdf_write (&pcmcia_sram->hfd, pcmcia_common + start, start, len);
pcmcia_write_min = -1;
+ pcmcia_write_max = -1;
}
}
}
pcmcia_write_max = addr;
}
-static void pcmcia_free (void)
+static int freepcmcia (int reset)
{
if (pcmcia_sram) {
checkflush (-1);
- hdf_hd_close (pcmcia_sram);
+ if (reset) {
+ hdf_hd_close (pcmcia_sram);
+ xfree (pcmcia_sram);
+ pcmcia_sram = NULL;
+ } else {
+ pcmcia_sram->hfd.drive_empty = 1;
+ }
}
- xfree (pcmcia_sram);
- pcmcia_sram = NULL;
+ if (pcmcia_card)
+ gayle_cs_change (GAYLE_CS_CCDET, 0);
+ pcmcia_card = 0;
xfree (pcmcia_common);
xfree (pcmcia_attrs);
pcmcia_attrs = NULL;
pcmcia_common_size = 0;
pcmcia_attrs_size = 0;
- pcmcia_card = 0;
-
+
gayle_cfg = 0;
gayle_cs = 0;
+ return 1;
}
-static int initpcmcia (char *path, int readonly)
+static int initpcmcia (const char *path, int readonly, int reset)
{
if (currprefs.cs_pcmcia == 0)
return 0;
- if (path) {
+ freepcmcia (reset);
+ if (reset) {
pcmcia_sram = xcalloc (sizeof (struct hd_hardfiledata), 1);
- if (hdf_hd_open (pcmcia_sram, path, 512, readonly, NULL, 0, 0, 0, 0, NULL)) {
- pcmcia_common_size = pcmcia_sram->size;
- if (pcmcia_sram->size > 4 * 1024 * 1024) {
- write_log ("PCMCIA SRAM: too large device, %d bytes\n", pcmcia_sram->size);
- pcmcia_common_size = 4 * 1024 * 1024;
- }
- pcmcia_common = xcalloc (pcmcia_common_size, 1);
- write_log ("PCMCIA SRAM: '%s' open, size=%d\n", path, pcmcia_common_size);
- hdf_read (&pcmcia_sram->hfd, pcmcia_common, 0, pcmcia_common_size);
- pcmcia_card = 1;
- gayle_cs = GAYLE_CS_CCDET;
- if (!readonly)
- gayle_cs |= GAYLE_CS_WR;
- }
+ if (path)
+ hdf_hd_open (pcmcia_sram, path, 512, readonly, NULL, 0, 0, 0, 0, NULL);
+ } else {
+ pcmcia_sram->hfd.drive_empty = 0;
}
+ if (pcmcia_sram->hfd.readonly)
+ readonly = 1;
+ pcmcia_common_size = 0;
+ pcmcia_readonly = readonly;
pcmcia_attrs_size = 256;
pcmcia_attrs = xcalloc (pcmcia_attrs_size, 1);
- initsramattr (pcmcia_common_size, readonly);
+ if (!pcmcia_sram->hfd.drive_empty) {
+ pcmcia_common_size = pcmcia_sram->hfd.size;
+ if (pcmcia_sram->hfd.size > 4 * 1024 * 1024) {
+ write_log ("PCMCIA SRAM: too large device, %d bytes\n", pcmcia_sram->hfd.size);
+ pcmcia_common_size = 4 * 1024 * 1024;
+ }
+ pcmcia_common = xcalloc (pcmcia_common_size, 1);
+ write_log ("PCMCIA SRAM: '%s' open, size=%d\n", path, pcmcia_common_size);
+ hdf_read (&pcmcia_sram->hfd, pcmcia_common, 0, pcmcia_common_size);
+ pcmcia_card = 1;
+ initsramattr (pcmcia_common_size, readonly);
+ if (!(gayle_cs & GAYLE_CS_DIS)) {
+ gayle_map_pcmcia ();
+ card_trigger (1);
+ }
+ }
pcmcia_write_min = -1;
pcmcia_write_max = -1;
- pcmcia_readonly = readonly;
return 1;
}
static void REGPARAM3 gayle_common_wput (uaecptr, uae_u32) REGPARAM;
static void REGPARAM3 gayle_common_bput (uaecptr, uae_u32) REGPARAM;
-addrbank gayle_common_bank = {
+static addrbank gayle_common_bank = {
gayle_common_lget, gayle_common_wget, gayle_common_bget,
gayle_common_lput, gayle_common_wput, gayle_common_bput,
default_xlate, default_check, NULL, "Gayle PCMCIA Common",
gayle_common_write (addr, value);
}
+void gayle_map_pcmcia (void)
+{
+ if (currprefs.cs_pcmcia == 0)
+ return;
+ if (pcmcia_card == 0 || (gayle_cs & GAYLE_CS_DIS)) {
+ map_banks (&dummy_bank, 0xa0, 8, 0);
+ if (currprefs.chipmem_size <= 4 * 1024 * 1024 && currprefs.fastmem_size <= 4 * 1024 * 1024)
+ map_banks (&dummy_bank, PCMCIA_COMMON_START >> 16, PCMCIA_COMMON_SIZE >> 16, 0);
+ } else {
+ map_banks (&gayle_attr_bank, 0xA0, 8, 0);
+ if (currprefs.chipmem_size <= 4 * 1024 * 1024 && currprefs.fastmem_size <= 4 * 1024 * 1024)
+ map_banks (&gayle_common_bank, PCMCIA_COMMON_START >> 16, PCMCIA_COMMON_SIZE >> 16, 0);
+ }
+}
static int rl (uae_u8 *p)
{
memset (ide, 0, sizeof (struct ide_hdf));
}
}
- pcmcia_free ();
+ freepcmcia (1);
}
static void alloc_ide_mem (void)
return 1;
}
-int gayle_add_pcmcia_sram_unit (char *path, int readonly)
+int gayle_add_pcmcia_sram_unit (const char *path, int readonly)
{
- return initpcmcia (path, readonly);
+ return initpcmcia (path, readonly, 1);
+}
+
+int gayle_modify_pcmcia_sram_unit (const char *path, int readonly, int insert)
+{
+ if (insert)
+ return initpcmcia (path, readonly, 0);
+ else
+ return freepcmcia (0);
}
static void initide (void)
}
for (i = 0; i < 4; i++)
idedrive[i]->num = i;
- gayle_irq = gayle_intena = 0;
- if (currprefs.cs_ide == 2)
- gayle_intena = 0xff;
-
+ gayle_irq = gayle_int = 0;
}
void gayle_reset (int hardreset)
uae_u8 *restore_gayle (uae_u8 *src)
{
changed_prefs.cs_ide = restore_u8 ();
- gayle_intena = restore_u8 ();
+ gayle_int = restore_u8 ();
gayle_irq = restore_u8 ();
+ gayle_cs = restore_u8 ();
+ gayle_cs_mask = restore_u8 ();
+ gayle_cfg = restore_u8 ();
ide_error = 0;
return src;
}
return NULL;
dstbak = dst = (uae_u8*)malloc (1000);
save_u8 (currprefs.cs_ide);
- save_u8 (gayle_intena);
+ save_u8 (gayle_int);
save_u8 (gayle_irq);
+ save_u8 (gayle_cs);
+ save_u8 (gayle_cs_mask);
+ save_u8 (gayle_cfg);
*len = dst - dstbak;
return dstbak;
}
if (!isreg (curi->smode))
addcycles (2);
fill_prefetch_next ();
- printf ("\tsrc |= 0x80;\n");
- genastore ("src", curi->smode, "srcreg", curi->size, "src");
+ if (1 || cpu_level >= 2 || curi->smode == Dreg) {
+ printf ("\tsrc |= 0x80;\n");
+ if (next_cpu_level < 2)
+ next_cpu_level = 2 - 1;
+ genastore ("src", curi->smode, "srcreg", curi->size, "src");
+ } else {
+ /* not exactly like this either.. */
+ printf ("\tif (src >= 0x200000 || (src >= 0xc00000 && src < 0xe00000)) {\n");
+ printf ("\t src |= 0x80; \n");
+ genastore ("src", curi->smode, "srcreg", curi->size, "src");
+ printf ("\t}\n");
+ }
break;
case i_FPP:
fpulimit();
#include "gui.h"
#include "uae.h"
#include "scsi.h"
-
-#define CMD_INVALID 0
-#define CMD_RESET 1
-#define CMD_READ 2
-#define CMD_WRITE 3
-#define CMD_UPDATE 4
-#define CMD_CLEAR 5
-#define CMD_STOP 6
-#define CMD_START 7
-#define CMD_FLUSH 8
-#define CMD_MOTOR 9
-#define CMD_SEEK 10
-#define CMD_FORMAT 11
-#define CMD_REMOVE 12
-#define CMD_CHANGENUM 13
-#define CMD_CHANGESTATE 14
-#define CMD_PROTSTATUS 15
-#define CMD_GETDRIVETYPE 18
-#define CMD_GETNUMTRACKS 19
-#define CMD_ADDCHANGEINT 20
-#define CMD_REMCHANGEINT 21
-#define CMD_GETGEOMETRY 22
-#define HD_SCSICMD 28
-
-/* Trackdisk64 support */
-#define TD_READ64 24
-#define TD_WRITE64 25
-#define TD_SEEK64 26
-#define TD_FORMAT64 27
-
-/* New Style Devices (NSD) support */
-#define DRIVE_NEWSTYLE 0x4E535459L /* 'NSTY' */
-#define NSCMD_DEVICEQUERY 0x4000
-#define NSCMD_TD_READ64 0xc000
-#define NSCMD_TD_WRITE64 0xc001
-#define NSCMD_TD_SEEK64 0xc002
-#define NSCMD_TD_FORMAT64 0xc003
+#include "gayle.h"
+#include "execio.h"
#undef DEBUGME
#define hf_log
pl (p, 2, sum);
}
-static void create_virtual_rdb(struct hardfiledata *hfd, uae_u32 dostype, int bootpri, char *filesys)
+static void create_virtual_rdb (struct hardfiledata *hfd, uae_u32 dostype, int bootpri, const char *filesys)
{
uae_u8 *rdb, *part, *denv;
int cyl = hfd->heads * hfd->secspertrack;
xfree(hfd->path);
}
-int hdf_hd_open(struct hd_hardfiledata *hfd, char *path, int blocksize, int readonly,
- char *devname, int sectors, int surfaces, int reserved,
- int bootpri, char *filesys)
+int hdf_hd_open (struct hd_hardfiledata *hfd, const char *path, int blocksize, int readonly,
+ const char *devname, int sectors, int surfaces, int reserved,
+ int bootpri, const char *filesys)
{
memset(hfd, 0, sizeof (struct hd_hardfiledata));
hfd->bootpri = bootpri;
hfd->hfd.blocksize = blocksize;
- if (!hdf_open(&hfd->hfd, path))
+ if (!hdf_open (&hfd->hfd, path))
return 0;
hfd->path = my_strdup(path);
hfd->hfd.heads = surfaces;
hfd->hfd.secspertrack = sectors;
if (devname)
strcpy (hfd->hfd.device_name, devname);
- getchshd(&hfd->hfd, &hfd->cyls, &hfd->heads, &hfd->secspertrack);
+ getchshd (&hfd->hfd, &hfd->cyls, &hfd->heads, &hfd->secspertrack);
hfd->cyls_def = hfd->cyls;
hfd->secspertrack_def = hfd->secspertrack;
hfd->heads_def = hfd->heads;
hdf_read(&hfd->hfd, buf, 0, 512);
if (buf[0] != 0 && memcmp(buf, "RDSK", 4)) {
hfd->hfd.nrcyls = (hfd->hfd.size / blocksize) / (sectors * surfaces);
- create_virtual_rdb(&hfd->hfd, rl (buf), hfd->bootpri, filesys);
+ create_virtual_rdb (&hfd->hfd, rl (buf), hfd->bootpri, filesys);
while (hfd->hfd.nrcyls * surfaces * sectors > hfd->cyls_def * hfd->secspertrack_def * hfd->heads_def) {
hfd->cyls_def++;
}
return ret;
}
-void hardfile_do_disk_change (int fsid, int insert)
+void hardfile_do_disk_change (struct uaedev_config_info *uci, int insert)
{
+ int fsid = uci->configoffset;
int j;
int newstate = insert ? 0 : 1;
struct hardfiledata *hfd;
+ if (uci->controller == HD_CONTROLLER_PCMCIA_SRAM) {
+ gayle_modify_pcmcia_sram_unit (uci->rootdir, uci->readonly, insert);
+ return;
+ }
+
hfd = get_hardfile_data (fsid);
if (!hfd)
return;
static uae_u32 REGPARAM2 hardfile_open (TrapContext *context)
{
- uaecptr tmp1 = m68k_areg (&context->regs, 1); /* IOReq */
+ uaecptr ioreq = m68k_areg (&context->regs, 1); /* IOReq */
int unit = mangleunit (m68k_dreg (&context->regs, 0));
struct hardfileprivdata *hfpd = &hardfpd[unit];
- int err = -1;
-
- /* Check unit number */
- if (unit >= 0) {
- struct hardfiledata *hfd = get_hardfile_data (unit);
- if (hfd && hfd->handle_valid && start_thread (context, unit)) {
- put_word (hfpd->base + 32, get_word (hfpd->base + 32) + 1);
- put_long (tmp1 + 24, unit); /* io_Unit */
- put_byte (tmp1 + 31, 0); /* io_Error */
- put_byte (tmp1 + 8, 7); /* ln_type = NT_REPLYMSG */
- hf_log ("hardfile_open, unit %d (%d), OK\n", unit, m68k_dreg (&context->regs, 0));
- return 0;
+ int err = IOERR_OPENFAIL;
+ int size = get_word (ioreq + 0x12);
+
+ if (size >= IOSTDREQ_SIZE || size == 0) { /* boot device port size == 0!? */
+ /* Check unit number */
+ if (unit >= 0) {
+ struct hardfiledata *hfd = get_hardfile_data (unit);
+ if (hfd && hfd->handle_valid && start_thread (context, unit)) {
+ put_word (hfpd->base + 32, get_word (hfpd->base + 32) + 1);
+ put_long (ioreq + 24, unit); /* io_Unit */
+ put_byte (ioreq + 31, 0); /* io_Error */
+ put_byte (ioreq + 8, 7); /* ln_type = NT_REPLYMSG */
+ hf_log ("hardfile_open, unit %d (%d), OK\n", unit, m68k_dreg (&context->regs, 0));
+ return 0;
+ }
}
+ if (unit < 1000 || is_hardfile(unit) == FILESYS_VIRTUAL)
+ err = 50; /* HFERR_NoBoard */
+ } else {
+ err = IOERR_BADLENGTH;
}
- if (unit < 1000 || is_hardfile(unit) == FILESYS_VIRTUAL)
- err = 50; /* HFERR_NoBoard */
hf_log ("hardfile_open, unit %d (%d), ERR=%d\n", unit, m68k_dreg (&context->regs, 0), err);
- put_long (tmp1 + 20, (uae_u32)err);
- put_byte (tmp1 + 31, (uae_u8)err);
+ put_long (ioreq + 20, (uae_u32)err);
+ put_byte (ioreq + 31, (uae_u8)err);
return (uae_u32)err;
}
break;
bad_command:
- error = -5; /* IOERR_BADADDRESS */
+ error = IOERR_BADADDRESS; /* IOERR_BADADDRESS */
break;
no_disk:
error = 29; /* no disk */
break;
case NSCMD_DEVICEQUERY:
+ put_long (dataptr + 0, 0);
put_long (dataptr + 4, 16); /* size */
- put_word (dataptr + 8, 5); /* NSDEVTYPE_TRACKDISK */
+ put_word (dataptr + 8, NSDEVTYPE_TRACKDISK);
put_word (dataptr + 10, 0);
put_long (dataptr + 12, nscmd_cmd);
actual = 16;
if (hfd->nrcyls == 0) {
error = handle_scsi (request, hfd);
} else { /* we don't want users trashing their "partition" hardfiles with hdtoolbox */
- error = -3; /* IOERR_NOCMD */
+ error = IOERR_NOCMD;
write_log ("UAEHF: HD_SCSICMD tried on regular HDF, unit %d", unit);
}
break;
default:
/* Command not understood. */
- error = -3; /* IOERR_NOCMD */
+ error = IOERR_NOCMD;
break;
}
put_long (request + 32, actual);
extern void action_replay_version(void);
+extern void descramble_nordicpro (uae_u8*, int, int);
extern int hrtmon_flag;
extern void debug_help (void);
extern uaecptr dumpmem2 (uaecptr addr, char *out, int osize);
extern void update_debug_info (void);
+extern int instruction_breakpoint (char **c);
#define BREAKPOINT_TOTAL 8
struct breakpoint_node {
--- /dev/null
+
+#define IOERR_OPENFAIL -1
+#define IOERR_ABORTED -2
+#define IOERR_NOCMD -3
+#define IOERR_BADLENGTH -4
+#define IOERR_BADADDRESS -5
+#define IOERR_UNITBUSY -6
+#define IOERR_SELFTEST -7
+
+#define CMD_INVALID 0
+#define CMD_RESET 1
+#define CMD_READ 2
+#define CMD_WRITE 3
+#define CMD_UPDATE 4
+#define CMD_CLEAR 5
+#define CMD_STOP 6
+#define CMD_START 7
+#define CMD_FLUSH 8
+#define CMD_NONSTD 9
+
+#define IOB_QUICK 0
+#define IOF_QUICK (1<<0)
+
+#define IOSTDREQ_SIZE 48
+
+#define DRIVE_NEWSTYLE 0x4E535459L /* 'NSTY' */
+#define NSCMD_DEVICEQUERY 0x4000
+
+#define TAG_DONE 0
+#define TAG_IGNORE 1
+#define TAG_MORE 2
+#define TAG_SKIP 3
+#define TAG_USER (1 << 31)
+
+#define NSDEVTYPE_UNKNOWN 0
+#define NSDEVTYPE_GAMEPORT 1
+#define NSDEVTYPE_TIMER 2
+#define NSDEVTYPE_KEYBOARD 3
+#define NSDEVTYPE_INPUT 4
+#define NSDEVTYPE_TRACKDISK 5
+#define NSDEVTYPE_CONSOLE 6
+#define NSDEVTYPE_SANA2 7
+#define NSDEVTYPE_AUDIO 8
+#define NSDEVTYPE_CLIPBOARD 9
+#define NSDEVTYPE_PRINTER 10
+#define NSDEVTYPE_SERIAL 11
+#define NSDEVTYPE_PARALLEL 12
+
+#define CMD_MOTOR 9
+#define CMD_SEEK 10
+#define CMD_FORMAT 11
+#define CMD_REMOVE 12
+#define CMD_CHANGENUM 13
+#define CMD_CHANGESTATE 14
+#define CMD_PROTSTATUS 15
+#define CMD_GETDRIVETYPE 18
+#define CMD_GETNUMTRACKS 19
+#define CMD_ADDCHANGEINT 20
+#define CMD_REMCHANGEINT 21
+#define CMD_GETGEOMETRY 22
+#define CMD_GETDRIVETYPE 18
+#define CMD_GETNUMTRACKS 19
+#define CMD_ADDCHANGEINT 20
+#define CMD_REMCHANGEINT 21
+#define CMD_GETGEOMETRY 22
+#define HD_SCSICMD 28
+
+/* Trackdisk64 support */
+#define TD_READ64 24
+#define TD_WRITE64 25
+#define TD_SEEK64 26
+#define TD_FORMAT64 27
+
+/* New Style Devices (NSD) support */
+#define NSCMD_TD_READ64 0xc000
+#define NSCMD_TD_WRITE64 0xc001
+#define NSCMD_TD_SEEK64 0xc002
+#define NSCMD_TD_FORMAT64 0xc003
extern int hdf_init (void);
extern int isspecialdrive(const char *name);
extern int get_native_path(uae_u32 lock, char *out);
-extern void hardfile_do_disk_change (int fsid, int insert);
+extern void hardfile_do_disk_change (struct uaedev_config_info *uci, int insert);
void hdf_hd_close(struct hd_hardfiledata *hfd);
-int hdf_hd_open(struct hd_hardfiledata *hfd, char *path, int blocksize, int readonly,
- char *devname, int sectors, int surfaces, int reserved,
- int bootpri, char *filesys);
+int hdf_hd_open(struct hd_hardfiledata *hfd, const char *path, int blocksize, int readonly,
+ const char *devname, int sectors, int surfaces, int reserved,
+ int bootpri, const char *filesys);
extern int gayle_add_ide_unit(int ch, char *path, int blocksize, int readonly,
char *devname, int sectors, int surfaces, int reserved,
int bootpri, char *filesys);
-extern int gayle_add_pcmcia_sram_unit(char *path, int readonly);
+extern int gayle_modify_pcmcia_sram_unit(const char *path, int readonly, int insert);
+extern int gayle_add_pcmcia_sram_unit(const char *path, int readonly);
extern void gayle_free_units(void);
extern void rethink_gayle (void);
+extern void gayle_map_pcmcia (void);
#define PCMCIA_COMMON_START 0x600000
#define PCMCIA_COMMON_SIZE 0x400000
extern addrbank gfxmem_bank, gfxmem_bankx;
extern addrbank gayle_bank;
extern addrbank gayle2_bank;
-extern addrbank gayle_attr_bank;
-extern addrbank gayle_common_bank;
extern addrbank mbres_bank;
extern addrbank akiko_bank;
extern addrbank cardmem_bank;
#define ROMTYPE_NORDIC 4096
#define ROMTYPE_XPOWER 8192
#define ROMTYPE_CD32CART 16384
+#define ROMTYPE_MASK 131071
#define ROMTYPE_EVEN 131072
#define ROMTYPE_ODD 262144
-#define ROMTYPE_BYTESWAP 524288
-#define ROMTYPE_SCRAMBLED 1048576
+#define ROMTYPE_8BIT 524288
+#define ROMTYPE_BYTESWAP 1048576
+#define ROMTYPE_SCRAMBLED 2097152
struct romheader {
char *name;
extern struct romdata *getromdatabycrc (uae_u32 crc32);
extern struct romdata *getromdatabydata (uae_u8 *rom, int size);
extern struct romdata *getromdatabyid (int id);
+extern struct romdata *getromdatabyidgroup (int id, int group, int subitem);
extern struct romdata *getromdatabyzfile (struct zfile *f);
extern struct romlist **getarcadiaroms (void);
extern struct romdata *getarcadiarombyname (char *name);
extern void romlist_add (char *path, struct romdata *rd);
extern char *romlist_get (struct romdata *rd);
extern void romlist_clear (void);
+extern struct zfile *read_rom (struct romdata *rd);
+extern struct zfile *read_rom_name (const char *filename);
extern int load_keyring (struct uae_prefs *p, char *path);
extern uae_u8 *target_load_keyfile (struct uae_prefs *p, char *path, int *size, char *name);
} regs, lastint_regs, mmu_backup_regs;
-typedef struct {
- uae_u16* location;
- uae_u8 cycles;
- uae_u8 specmem;
- uae_u8 dummy2;
- uae_u8 dummy3;
-} cpu_history;
-
-struct blockinfo_t;
-
-typedef union {
- cpuop_func* handler;
- struct blockinfo_t* bi;
-} cacheline;
-
-extern signed long pissoff;
-
STATIC_INLINE uae_u32 munge24 (uae_u32 x)
{
return x & regs.address_space_mask;
extern cpuop_func *cpufunctbl[65536] ASM_SYM_FOR_FUNC ("cpufunctbl");
-
-/* Flags for Bernie during development/debugging. Should go away eventually */
-#define DISTRUST_CONSISTENT_MEM 0
-#define TAGMASK 0x000fffff
-#define TAGSIZE (TAGMASK+1)
-#define MAXRUN 1024
-
-extern uae_u8* start_pc_p;
-extern uae_u32 start_pc;
-
-#define cacheline(x) (((uae_u32)x)&TAGMASK)
-
void newcpu_showstate(void);
#ifdef JIT
*/
#define UAEMAJOR 1
-#define UAEMINOR 4
-#define UAESUBREV 6
+#define UAEMINOR 5
+#define UAESUBREV 0
typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
--- /dev/null
+/*
+ * compiler/codegen_x86.cpp - IA-32 code generator
+ *
+ * Original 68040 JIT compiler for UAE, copyright 2000-2002 Bernd Meyer
+ *
+ * Adaptation for Basilisk II and improvements, copyright 2000-2005
+ * Gwenole Beauchesne
+ *
+ * Basilisk II (C) 1997-2008 Christian Bauer
+ *
+ * Portions related to CPU detection come from linux/arch/i386/kernel/setup.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* This should eventually end up in machdep/, but for now, x86 is the
+ only target, and it's easier this way... */
+
+#include "flags_x86.h"
+
+/*************************************************************************
+ * Some basic information about the the target CPU *
+ *************************************************************************/
+
+#define EAX_INDEX 0
+#define ECX_INDEX 1
+#define EDX_INDEX 2
+#define EBX_INDEX 3
+#define ESP_INDEX 4
+#define EBP_INDEX 5
+#define ESI_INDEX 6
+#define EDI_INDEX 7
+#if defined(__x86_64__)
+#define R8_INDEX 8
+#define R9_INDEX 9
+#define R10_INDEX 10
+#define R11_INDEX 11
+#define R12_INDEX 12
+#define R13_INDEX 13
+#define R14_INDEX 14
+#define R15_INDEX 15
+#endif
+/* XXX this has to match X86_Reg8H_Base + 4 */
+#define AH_INDEX (0x10+4+EAX_INDEX)
+#define CH_INDEX (0x10+4+ECX_INDEX)
+#define DH_INDEX (0x10+4+EDX_INDEX)
+#define BH_INDEX (0x10+4+EBX_INDEX)
+
+/* The register in which subroutines return an integer return value */
+#define REG_RESULT EAX_INDEX
+
+/* The registers subroutines take their first and second argument in */
+#if defined( _MSC_VER ) && !defined( USE_NORMAL_CALLING_CONVENTION )
+/* Handle the _fastcall parameters of ECX and EDX */
+#define REG_PAR1 ECX_INDEX
+#define REG_PAR2 EDX_INDEX
+#elif defined(__x86_64__)
+#define REG_PAR1 EDI_INDEX
+#define REG_PAR2 ESI_INDEX
+#else
+#define REG_PAR1 EAX_INDEX
+#define REG_PAR2 EDX_INDEX
+#endif
+
+#define REG_PC_PRE EAX_INDEX /* The register we use for preloading regs.pc_p */
+#if defined( _MSC_VER ) && !defined( USE_NORMAL_CALLING_CONVENTION )
+#define REG_PC_TMP EAX_INDEX
+#else
+#define REG_PC_TMP ECX_INDEX /* Another register that is not the above */
+#endif
+
+#define SHIFTCOUNT_NREG ECX_INDEX /* Register that can be used for shiftcount.
+ -1 if any reg will do */
+#define MUL_NREG1 EAX_INDEX /* %eax will hold the low 32 bits after a 32x32 mul */
+#define MUL_NREG2 EDX_INDEX /* %edx will hold the high 32 bits */
+
+#define STACK_ALIGN 16
+#define STACK_OFFSET sizeof(void *)
+
+uae_s8 always_used[]={4,-1};
+#if defined(__x86_64__)
+uae_s8 can_byte[]={0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,-1};
+uae_s8 can_word[]={0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,-1};
+#else
+uae_s8 can_byte[]={0,1,2,3,-1};
+uae_s8 can_word[]={0,1,2,3,5,6,7,-1};
+#endif
+
+#if USE_OPTIMIZED_CALLS
+/* Make sure interpretive core does not use cpuopti */
+uae_u8 call_saved[]={0,0,0,1,1,1,1,1};
+#error FIXME: code not ready
+#else
+/* cpuopti mutate instruction handlers to assume registers are saved
+ by the caller */
+uae_u8 call_saved[]={0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0};
+#endif
+
+/* This *should* be the same as call_saved. But:
+ - We might not really know which registers are saved, and which aren't,
+ so we need to preserve some, but don't want to rely on everyone else
+ also saving those registers
+ - Special registers (such like the stack pointer) should not be "preserved"
+ by pushing, even though they are "saved" across function calls
+*/
+#if defined(__x86_64__)
+/* callee-saved registers as defined by Linux AMD64 ABI: rbx, rbp, rsp, r12 - r15 */
+/* preserve r11 because it's generally used to hold pointers to functions */
+static const uae_u8 need_to_preserve[]={0,0,0,1,0,1,0,0,0,0,0,1,1,1,1,1};
+#else
+/* callee-saved registers as defined by System V IA-32 ABI: edi, esi, ebx, ebp */
+static const uae_u8 need_to_preserve[]={0,0,0,1,0,1,1,1};
+#endif
+
+/* Whether classes of instructions do or don't clobber the native flags */
+#define CLOBBER_MOV
+#define CLOBBER_LEA
+#define CLOBBER_CMOV
+#define CLOBBER_POP
+#define CLOBBER_PUSH
+#define CLOBBER_SUB clobber_flags()
+#define CLOBBER_SBB clobber_flags()
+#define CLOBBER_CMP clobber_flags()
+#define CLOBBER_ADD clobber_flags()
+#define CLOBBER_ADC clobber_flags()
+#define CLOBBER_AND clobber_flags()
+#define CLOBBER_OR clobber_flags()
+#define CLOBBER_XOR clobber_flags()
+
+#define CLOBBER_ROL clobber_flags()
+#define CLOBBER_ROR clobber_flags()
+#define CLOBBER_SHLL clobber_flags()
+#define CLOBBER_SHRL clobber_flags()
+#define CLOBBER_SHRA clobber_flags()
+#define CLOBBER_TEST clobber_flags()
+#define CLOBBER_CL16
+#define CLOBBER_CL8
+#define CLOBBER_SE32
+#define CLOBBER_SE16
+#define CLOBBER_SE8
+#define CLOBBER_ZE32
+#define CLOBBER_ZE16
+#define CLOBBER_ZE8
+#define CLOBBER_SW16 clobber_flags()
+#define CLOBBER_SW32
+#define CLOBBER_SETCC
+#define CLOBBER_MUL clobber_flags()
+#define CLOBBER_BT clobber_flags()
+#define CLOBBER_BSF clobber_flags()
+
+/* The older code generator is now deprecated. */
+#define USE_NEW_RTASM 1
+
+#if USE_NEW_RTASM
+
+#if defined(__x86_64__)
+#define X86_TARGET_64BIT 1
+/* The address override prefix causes a 5 cycles penalty on Intel Core
+ processors. Another solution would be to decompose the load in an LEA,
+ MOV (to zero-extend), MOV (from memory): is it better? */
+#define ADDR32 x86_emit_byte(0x67),
+#else
+#define ADDR32 /**/
+#endif
+#define X86_FLAT_REGISTERS 0
+#define X86_OPTIMIZE_ALU 1
+#define X86_OPTIMIZE_ROTSHI 1
+#include "codegen_x86.h"
+
+#define x86_emit_byte(B) emit_byte(B)
+#define x86_emit_word(W) emit_word(W)
+#define x86_emit_long(L) emit_long(L)
+#define x86_emit_quad(Q) emit_quad(Q)
+#define x86_get_target() get_target()
+#define x86_emit_failure(MSG) jit_fail(MSG, __FILE__, __LINE__, __FUNCTION__)
+
+static void jit_fail(const char *msg, const char *file, int line, const char *function)
+{
+ fprintf(stderr, "JIT failure in function %s from file %s at line %d: %s\n",
+ function, file, line, msg);
+ abort();
+}
+
+LOWFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r))
+{
+#if defined(__x86_64__)
+ PUSHQr(r);
+#else
+ PUSHLr(r);
+#endif
+}
+LENDFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r))
+
+LOWFUNC(NONE,READ,1,raw_pop_l_r,(R4 r))
+{
+#if defined(__x86_64__)
+ POPQr(r);
+#else
+ POPLr(r);
+#endif
+}
+LENDFUNC(NONE,READ,1,raw_pop_l_r,(R4 r))
+
+LOWFUNC(NONE,READ,1,raw_pop_l_m,(MEMW d))
+{
+#if defined(__x86_64__)
+ POPQm(d, X86_NOREG, X86_NOREG, 1);
+#else
+ POPLm(d, X86_NOREG, X86_NOREG, 1);
+#endif
+}
+LENDFUNC(NONE,READ,1,raw_pop_l_m,(MEMW d))
+
+LOWFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i))
+{
+ BTLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b))
+{
+ BTLrr(b, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i))
+{
+ BTCLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b))
+{
+ BTCLrr(b, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i))
+{
+ BTRLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b))
+{
+ BTRLrr(b, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i))
+{
+ BTSLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b))
+{
+ BTSLrr(b, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i))
+{
+ SUBWir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i))
+
+LOWFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s))
+{
+ MOVLmr(s, X86_NOREG, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s))
+{
+ MOVLim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s))
+{
+ MOVWim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s))
+{
+ MOVBim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i))
+{
+ ROLBim(i, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i))
+{
+ ROLBir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i))
+{
+ ROLWir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i))
+{
+ ROLLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r))
+{
+ ROLLrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r))
+{
+ ROLWrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r))
+{
+ ROLBrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r))
+{
+ SHLLrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r))
+{
+ SHLWrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r))
+{
+ SHLBrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i))
+{
+ RORBir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i))
+{
+ RORWir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,READ,2,raw_or_l_rm,(RW4 d, MEMR s))
+{
+ ORLmr(s, X86_NOREG, X86_NOREG, 1, d);
+}
+LENDFUNC(WRITE,READ,2,raw_or_l_rm,(RW4 d, MEMR s))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i))
+{
+ RORLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r))
+{
+ RORLrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r))
+{
+ RORWrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r))
+{
+ RORBrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r))
+{
+ SHRLrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r))
+{
+ SHRWrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r))
+{
+ SHRBrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r))
+{
+ SARLrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r))
+{
+ SARWrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r))
+{
+ SARBrr(r, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i))
+{
+ SHLLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i))
+{
+ SHLWir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i))
+{
+ SHLBir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i))
+{
+ SHRLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i))
+{
+ SHRWir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i))
+{
+ SHRBir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i))
+{
+ SARLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i))
+{
+ SARWir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i))
+{
+ SARBir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah))
+{
+ SAHF();
+}
+LENDFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah))
+
+LOWFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax))
+{
+ CPUID();
+}
+LENDFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax))
+
+LOWFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah))
+{
+ LAHF();
+}
+LENDFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah))
+
+LOWFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc))
+{
+ SETCCir(cc, d);
+}
+LENDFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc))
+
+LOWFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc))
+{
+ SETCCim(cc, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc))
+
+LOWFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc))
+{
+ /* replacement using branch and mov */
+ int8 *target_p = (int8 *)x86_get_target() + 1;
+ JCCSii(cc^1, 0);
+ MOVBrr(s, d);
+ *target_p = (uintptr)x86_get_target() - ((uintptr)target_p + 1);
+}
+LENDFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc))
+
+LOWFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc))
+{
+ if (have_cmov)
+ CMOVWrr(cc, s, d);
+ else { /* replacement using branch and mov */
+ int8 *target_p = (int8 *)x86_get_target() + 1;
+ JCCSii(cc^1, 0);
+ MOVWrr(s, d);
+ *target_p = (uintptr)x86_get_target() - ((uintptr)target_p + 1);
+ }
+}
+LENDFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc))
+
+LOWFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc))
+{
+ if (have_cmov)
+ CMOVLrr(cc, s, d);
+ else { /* replacement using branch and mov */
+ int8 *target_p = (int8 *)x86_get_target() + 1;
+ JCCSii(cc^1, 0);
+ MOVLrr(s, d);
+ *target_p = (uintptr)x86_get_target() - ((uintptr)target_p + 1);
+ }
+}
+LENDFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc))
+
+LOWFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s))
+{
+ BSFLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_sign_extend_32_rr,(W4 d, R4 s))
+{
+ MOVSLQrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_sign_extend_32_rr,(W4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s))
+{
+ MOVSWLrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s))
+
+LOWFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s))
+{
+ MOVSBLrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s))
+
+LOWFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s))
+{
+ MOVZWLrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s))
+
+LOWFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s))
+{
+ MOVZBLrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s))
+
+LOWFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s))
+{
+ IMULLrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s))
+{
+ if (d!=MUL_NREG1 || s!=MUL_NREG2) {
+ write_log("Bad register in IMUL: d=%d, s=%d\n",d,s);
+ abort();
+ }
+ IMULLr(s);
+}
+LENDFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s))
+
+LOWFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s))
+{
+ if (d!=MUL_NREG1 || s!=MUL_NREG2) {
+ write_log("Bad register in MUL: d=%d, s=%d\n",d,s);
+ abort();
+ }
+ MULLr(s);
+}
+LENDFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s))
+
+LOWFUNC(NONE,NONE,2,raw_mul_32_32,(RW4 d, R4 s))
+{
+ abort(); /* %^$&%^$%#^ x86! */
+}
+LENDFUNC(NONE,NONE,2,raw_mul_32_32,(RW4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s))
+{
+ MOVBrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s))
+{
+ MOVWrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s))
+
+LOWFUNC(NONE,READ,4,raw_mov_l_rrm_indexed,(W4 d,R4 baser, R4 index, IMM factor))
+{
+ ADDR32 MOVLmr(0, baser, index, factor, d);
+}
+LENDFUNC(NONE,READ,4,raw_mov_l_rrm_indexed,(W4 d,R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,4,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index, IMM factor))
+{
+ ADDR32 MOVWmr(0, baser, index, factor, d);
+}
+LENDFUNC(NONE,READ,4,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,4,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index, IMM factor))
+{
+ ADDR32 MOVBmr(0, baser, index, factor, d);
+}
+LENDFUNC(NONE,READ,4,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,WRITE,4,raw_mov_l_mrr_indexed,(R4 baser, R4 index, IMM factor, R4 s))
+{
+ ADDR32 MOVLrm(s, 0, baser, index, factor);
+}
+LENDFUNC(NONE,WRITE,4,raw_mov_l_mrr_indexed,(R4 baser, R4 index, IMM factor, R4 s))
+
+LOWFUNC(NONE,WRITE,4,raw_mov_w_mrr_indexed,(R4 baser, R4 index, IMM factor, R2 s))
+{
+ ADDR32 MOVWrm(s, 0, baser, index, factor);
+}
+LENDFUNC(NONE,WRITE,4,raw_mov_w_mrr_indexed,(R4 baser, R4 index, IMM factor, R2 s))
+
+LOWFUNC(NONE,WRITE,4,raw_mov_b_mrr_indexed,(R4 baser, R4 index, IMM factor, R1 s))
+{
+ ADDR32 MOVBrm(s, 0, baser, index, factor);
+}
+LENDFUNC(NONE,WRITE,4,raw_mov_b_mrr_indexed,(R4 baser, R4 index, IMM factor, R1 s))
+
+LOWFUNC(NONE,WRITE,5,raw_mov_l_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R4 s))
+{
+ ADDR32 MOVLrm(s, base, baser, index, factor);
+}
+LENDFUNC(NONE,WRITE,5,raw_mov_l_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R4 s))
+
+LOWFUNC(NONE,WRITE,5,raw_mov_w_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R2 s))
+{
+ ADDR32 MOVWrm(s, base, baser, index, factor);
+}
+LENDFUNC(NONE,WRITE,5,raw_mov_w_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R2 s))
+
+LOWFUNC(NONE,WRITE,5,raw_mov_b_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R1 s))
+{
+ ADDR32 MOVBrm(s, base, baser, index, factor);
+}
+LENDFUNC(NONE,WRITE,5,raw_mov_b_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R1 s))
+
+LOWFUNC(NONE,READ,5,raw_mov_l_brrm_indexed,(W4 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ ADDR32 MOVLmr(base, baser, index, factor, d);
+}
+LENDFUNC(NONE,READ,5,raw_mov_l_brrm_indexed,(W4 d, IMM base, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,5,raw_mov_w_brrm_indexed,(W2 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ ADDR32 MOVWmr(base, baser, index, factor, d);
+}
+LENDFUNC(NONE,READ,5,raw_mov_w_brrm_indexed,(W2 d, IMM base, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,5,raw_mov_b_brrm_indexed,(W1 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ ADDR32 MOVBmr(base, baser, index, factor, d);
+}
+LENDFUNC(NONE,READ,5,raw_mov_b_brrm_indexed,(W1 d, IMM base, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,4,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor))
+{
+ ADDR32 MOVLmr(base, X86_NOREG, index, factor, d);
+}
+LENDFUNC(NONE,READ,4,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,5,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor, IMM cond))
+{
+ if (have_cmov)
+ ADDR32 CMOVLmr(cond, base, X86_NOREG, index, factor, d);
+ else { /* replacement using branch and mov */
+ int8 *target_p = (int8 *)x86_get_target() + 1;
+ JCCSii(cond^1, 0);
+ ADDR32 MOVLmr(base, X86_NOREG, index, factor, d);
+ *target_p = (uintptr)x86_get_target() - ((uintptr)target_p + 1);
+ }
+}
+LENDFUNC(NONE,READ,5,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor, IMM cond))
+
+LOWFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond))
+{
+ if (have_cmov)
+ CMOVLmr(cond, mem, X86_NOREG, X86_NOREG, 1, d);
+ else { /* replacement using branch and mov */
+ int8 *target_p = (int8 *)x86_get_target() + 1;
+ JCCSii(cond^1, 0);
+ MOVLmr(mem, X86_NOREG, X86_NOREG, 1, d);
+ *target_p = (uintptr)x86_get_target() - ((uintptr)target_p + 1);
+ }
+}
+LENDFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond))
+
+LOWFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset))
+{
+ ADDR32 MOVLmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset))
+{
+ ADDR32 MOVWmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset))
+{
+ ADDR32 MOVBmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset))
+{
+ ADDR32 MOVLmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset))
+{
+ ADDR32 MOVWmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset))
+{
+ ADDR32 MOVBmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset))
+{
+ ADDR32 MOVLim(i, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset))
+{
+ ADDR32 MOVWim(i, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset))
+{
+ ADDR32 MOVBim(i, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset))
+{
+ ADDR32 MOVLrm(s, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset))
+{
+ ADDR32 MOVWrm(s, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset))
+{
+ ADDR32 MOVBrm(s, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset))
+
+LOWFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset))
+{
+ LEALmr(offset, s, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset))
+{
+ LEALmr(offset, s, index, factor, d);
+}
+LENDFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset))
+
+LOWFUNC(NONE,NONE,4,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index, IMM factor))
+{
+ LEALmr(0, s, index, factor, d);
+}
+LENDFUNC(NONE,NONE,4,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index, IMM factor))
+
+LOWFUNC(NONE,NONE,4,raw_lea_l_r_scaled,(W4 d, R4 index, IMM factor))
+{
+ LEALmr(0, X86_NOREG, index, factor, d);
+}
+LENDFUNC(NONE,NONE,4,raw_lea_l_r_scaled,(W4 d, R4 index, IMM factor))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset))
+{
+ ADDR32 MOVLrm(s, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset))
+{
+ ADDR32 MOVWrm(s, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset))
+{
+ ADDR32 MOVBrm(s, offset, d, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset))
+
+LOWFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r))
+{
+ BSWAPLr(r);
+}
+LENDFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r))
+
+LOWFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r))
+{
+ ROLWir(8, r);
+}
+LENDFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r))
+
+LOWFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s))
+{
+ MOVLrr(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s))
+{
+ MOVLrm(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s))
+{
+ MOVWrm(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s))
+
+LOWFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s))
+{
+ MOVWmr(s, X86_NOREG, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s))
+{
+ MOVBrm(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s))
+
+LOWFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s))
+{
+ MOVBmr(s, X86_NOREG, X86_NOREG, 1, d);
+}
+LENDFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s))
+{
+ MOVLir(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s))
+{
+ MOVWir(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s))
+{
+ MOVBir(s, d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s))
+
+LOWFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s))
+{
+ ADCLim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s))
+{
+ ADDLim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s))
+{
+ ADDWim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s))
+{
+ ADDBim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s))
+
+LOWFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
+{
+ TESTLir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s))
+{
+ TESTLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s))
+{
+ TESTWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s))
+{
+ TESTBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_l_ri,(RW4 d, IMM i))
+{
+ XORLir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i))
+{
+ ANDLir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
+{
+ ANDWir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s))
+{
+ ANDLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s))
+{
+ ANDWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s))
+{
+ ANDBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i))
+{
+ ORLir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s))
+{
+ ORLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s))
+{
+ ORWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s))
+{
+ ORBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s))
+
+LOWFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s))
+{
+ ADCLrr(s, d);
+}
+LENDFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s))
+
+LOWFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s))
+{
+ ADCWrr(s, d);
+}
+LENDFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s))
+
+LOWFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s))
+{
+ ADCBrr(s, d);
+}
+LENDFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s))
+{
+ ADDLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s))
+{
+ ADDWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s))
+{
+ ADDBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i))
+{
+ SUBLir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
+{
+ SUBBir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i))
+{
+ ADDLir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
+{
+ ADDWir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
+{
+ ADDBir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
+
+LOWFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s))
+{
+ SBBLrr(s, d);
+}
+LENDFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s))
+
+LOWFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s))
+{
+ SBBWrr(s, d);
+}
+LENDFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s))
+
+LOWFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s))
+{
+ SBBBrr(s, d);
+}
+LENDFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s))
+{
+ SUBLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s))
+{
+ SUBWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s))
+{
+ SUBBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s))
+{
+ CMPLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i))
+{
+ CMPLir(i, r);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s))
+{
+ CMPWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s))
+
+LOWFUNC(WRITE,READ,2,raw_cmp_b_mi,(MEMR d, IMM s))
+{
+ CMPBim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
+{
+ CMPBir(i, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s))
+{
+ CMPBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s))
+
+LOWFUNC(WRITE,READ,4,raw_cmp_l_rm_indexed,(R4 d, IMM offset, R4 index, IMM factor))
+{
+ ADDR32 CMPLmr(offset, X86_NOREG, index, factor, d);
+}
+LENDFUNC(WRITE,READ,4,raw_cmp_l_rm_indexed,(R4 d, IMM offset, R4 index, IMM factor))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s))
+{
+ XORLrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s))
+{
+ XORWrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s))
+{
+ XORBrr(s, d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s))
+{
+ SUBLim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s))
+
+LOWFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s))
+{
+ CMPLim(s, d, X86_NOREG, X86_NOREG, 1);
+}
+LENDFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2))
+{
+ XCHGLrr(r2, r1);
+}
+LENDFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2))
+
+LOWFUNC(NONE,NONE,2,raw_xchg_b_rr,(RW4 r1, RW4 r2))
+{
+ XCHGBrr(r2, r1);
+}
+LENDFUNC(NONE,NONE,2,raw_xchg_b_rr,(RW4 r1, RW4 r2))
+
+LOWFUNC(READ,WRITE,0,raw_pushfl,(void))
+{
+ PUSHF();
+}
+LENDFUNC(READ,WRITE,0,raw_pushfl,(void))
+
+LOWFUNC(WRITE,READ,0,raw_popfl,(void))
+{
+ POPF();
+}
+LENDFUNC(WRITE,READ,0,raw_popfl,(void))
+
+/* Generate floating-point instructions */
+static inline void x86_fadd_m(MEMR s)
+{
+ FADDLm(s,X86_NOREG,X86_NOREG,1);
+}
+
+#else
+
+const bool optimize_accum = true;
+const bool optimize_imm8 = true;
+const bool optimize_shift_once = true;
+
+/*************************************************************************
+ * Actual encoding of the instructions on the target CPU *
+ *************************************************************************/
+
+static __inline__ int isaccum(int r)
+{
+ return (r == EAX_INDEX);
+}
+
+static __inline__ int isbyte(uae_s32 x)
+{
+ return (x>=-128 && x<=127);
+}
+
+static __inline__ int isword(uae_s32 x)
+{
+ return (x>=-32768 && x<=32767);
+}
+
+LOWFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r))
+{
+ emit_byte(0x50+r);
+}
+LENDFUNC(NONE,WRITE,1,raw_push_l_r,(R4 r))
+
+LOWFUNC(NONE,READ,1,raw_pop_l_r,(R4 r))
+{
+ emit_byte(0x58+r);
+}
+LENDFUNC(NONE,READ,1,raw_pop_l_r,(R4 r))
+
+LOWFUNC(NONE,READ,1,raw_pop_l_m,(MEMW d))
+{
+ emit_byte(0x8f);
+ emit_byte(0x05);
+ emit_long(d);
+}
+LENDFUNC(NONE,READ,1,raw_pop_l_m,(MEMW d))
+
+LOWFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i))
+{
+ emit_byte(0x0f);
+ emit_byte(0xba);
+ emit_byte(0xe0+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_bt_l_ri,(R4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b))
+{
+ emit_byte(0x0f);
+ emit_byte(0xa3);
+ emit_byte(0xc0+8*b+r);
+}
+LENDFUNC(WRITE,NONE,2,raw_bt_l_rr,(R4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i))
+{
+ emit_byte(0x0f);
+ emit_byte(0xba);
+ emit_byte(0xf8+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_btc_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b))
+{
+ emit_byte(0x0f);
+ emit_byte(0xbb);
+ emit_byte(0xc0+8*b+r);
+}
+LENDFUNC(WRITE,NONE,2,raw_btc_l_rr,(RW4 r, R4 b))
+
+
+LOWFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i))
+{
+ emit_byte(0x0f);
+ emit_byte(0xba);
+ emit_byte(0xf0+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_btr_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b))
+{
+ emit_byte(0x0f);
+ emit_byte(0xb3);
+ emit_byte(0xc0+8*b+r);
+}
+LENDFUNC(WRITE,NONE,2,raw_btr_l_rr,(RW4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i))
+{
+ emit_byte(0x0f);
+ emit_byte(0xba);
+ emit_byte(0xe8+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_bts_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b))
+{
+ emit_byte(0x0f);
+ emit_byte(0xab);
+ emit_byte(0xc0+8*b+r);
+}
+LENDFUNC(WRITE,NONE,2,raw_bts_l_rr,(RW4 r, R4 b))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i))
+{
+ emit_byte(0x66);
+ if (isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xe8+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x2d);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xe8+d);
+ }
+ emit_word(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i))
+
+
+LOWFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s))
+{
+ emit_byte(0x8b);
+ emit_byte(0x05+8*d);
+ emit_long(s);
+}
+LENDFUNC(NONE,READ,2,raw_mov_l_rm,(W4 d, MEMR s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s))
+{
+ emit_byte(0xc7);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_long(s);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_l_mi,(MEMW d, IMM s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s))
+{
+ emit_byte(0x66);
+ emit_byte(0xc7);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_word(s);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_w_mi,(MEMW d, IMM s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s))
+{
+ emit_byte(0xc6);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_byte(s);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_b_mi,(MEMW d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd0);
+ emit_byte(0x05);
+ emit_long(d);
+ }
+ else {
+ emit_byte(0xc0);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,RMW,2,raw_rol_b_mi,(MEMRW d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd0);
+ emit_byte(0xc0+r);
+ }
+ else {
+ emit_byte(0xc0);
+ emit_byte(0xc0+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i))
+{
+ emit_byte(0x66);
+ emit_byte(0xc1);
+ emit_byte(0xc0+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd1);
+ emit_byte(0xc0+r);
+ }
+ else {
+ emit_byte(0xc1);
+ emit_byte(0xc0+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r))
+{
+ emit_byte(0xd3);
+ emit_byte(0xc0+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r))
+{
+ emit_byte(0x66);
+ emit_byte(0xd3);
+ emit_byte(0xc0+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r))
+{
+ emit_byte(0xd2);
+ emit_byte(0xc0+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_rol_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r))
+{
+ emit_byte(0xd3);
+ emit_byte(0xe0+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r))
+{
+ emit_byte(0x66);
+ emit_byte(0xd3);
+ emit_byte(0xe0+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r))
+{
+ emit_byte(0xd2);
+ emit_byte(0xe0+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd0);
+ emit_byte(0xc8+r);
+ }
+ else {
+ emit_byte(0xc0);
+ emit_byte(0xc8+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i))
+{
+ emit_byte(0x66);
+ emit_byte(0xc1);
+ emit_byte(0xc8+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_w_ri,(RW2 r, IMM i))
+
+// gb-- used for making an fpcr value in compemu_fpp.cpp
+LOWFUNC(WRITE,READ,2,raw_or_l_rm,(RW4 d, MEMR s))
+{
+ emit_byte(0x0b);
+ emit_byte(0x05+8*d);
+ emit_long(s);
+}
+LENDFUNC(WRITE,READ,2,raw_or_l_rm,(RW4 d, MEMR s))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd1);
+ emit_byte(0xc8+r);
+ }
+ else {
+ emit_byte(0xc1);
+ emit_byte(0xc8+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r))
+{
+ emit_byte(0xd3);
+ emit_byte(0xc8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r))
+{
+ emit_byte(0x66);
+ emit_byte(0xd3);
+ emit_byte(0xc8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r))
+{
+ emit_byte(0xd2);
+ emit_byte(0xc8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_ror_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r))
+{
+ emit_byte(0xd3);
+ emit_byte(0xe8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r))
+{
+ emit_byte(0x66);
+ emit_byte(0xd3);
+ emit_byte(0xe8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r))
+{
+ emit_byte(0xd2);
+ emit_byte(0xe8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r))
+{
+ emit_byte(0xd3);
+ emit_byte(0xf8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_l_rr,(RW4 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r))
+{
+ emit_byte(0x66);
+ emit_byte(0xd3);
+ emit_byte(0xf8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_w_rr,(RW2 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r))
+{
+ emit_byte(0xd2);
+ emit_byte(0xf8+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_b_rr,(RW1 d, R1 r))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd1);
+ emit_byte(0xe0+r);
+ }
+ else {
+ emit_byte(0xc1);
+ emit_byte(0xe0+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i))
+{
+ emit_byte(0x66);
+ emit_byte(0xc1);
+ emit_byte(0xe0+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd0);
+ emit_byte(0xe0+r);
+ }
+ else {
+ emit_byte(0xc0);
+ emit_byte(0xe0+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_shll_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd1);
+ emit_byte(0xe8+r);
+ }
+ else {
+ emit_byte(0xc1);
+ emit_byte(0xe8+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i))
+{
+ emit_byte(0x66);
+ emit_byte(0xc1);
+ emit_byte(0xe8+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd0);
+ emit_byte(0xe8+r);
+ }
+ else {
+ emit_byte(0xc0);
+ emit_byte(0xe8+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_shrl_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd1);
+ emit_byte(0xf8+r);
+ }
+ else {
+ emit_byte(0xc1);
+ emit_byte(0xf8+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_l_ri,(RW4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i))
+{
+ emit_byte(0x66);
+ emit_byte(0xc1);
+ emit_byte(0xf8+r);
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_w_ri,(RW2 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i))
+{
+ if (optimize_shift_once && (i == 1)) {
+ emit_byte(0xd0);
+ emit_byte(0xf8+r);
+ }
+ else {
+ emit_byte(0xc0);
+ emit_byte(0xf8+r);
+ emit_byte(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_shra_b_ri,(RW1 r, IMM i))
+
+LOWFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah))
+{
+ emit_byte(0x9e);
+}
+LENDFUNC(WRITE,NONE,1,raw_sahf,(R2 dummy_ah))
+
+LOWFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax))
+{
+ emit_byte(0x0f);
+ emit_byte(0xa2);
+}
+LENDFUNC(NONE,NONE,1,raw_cpuid,(R4 dummy_eax))
+
+LOWFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah))
+{
+ emit_byte(0x9f);
+}
+LENDFUNC(READ,NONE,1,raw_lahf,(W2 dummy_ah))
+
+LOWFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc))
+{
+ emit_byte(0x0f);
+ emit_byte(0x90+cc);
+ emit_byte(0xc0+d);
+}
+LENDFUNC(READ,NONE,2,raw_setcc,(W1 d, IMM cc))
+
+LOWFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc))
+{
+ emit_byte(0x0f);
+ emit_byte(0x90+cc);
+ emit_byte(0x05);
+ emit_long(d);
+}
+LENDFUNC(READ,WRITE,2,raw_setcc_m,(MEMW d, IMM cc))
+
+LOWFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc))
+{
+ /* replacement using branch and mov */
+ int uncc=(cc^1);
+ emit_byte(0x70+uncc);
+ emit_byte(3); /* skip next 2 bytes if not cc=true */
+ emit_byte(0x88);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(READ,NONE,3,raw_cmov_b_rr,(RW1 d, R1 s, IMM cc))
+
+LOWFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc))
+{
+ if (have_cmov) {
+ emit_byte(0x66);
+ emit_byte(0x0f);
+ emit_byte(0x40+cc);
+ emit_byte(0xc0+8*d+s);
+ }
+ else { /* replacement using branch and mov */
+ int uncc=(cc^1);
+ emit_byte(0x70+uncc);
+ emit_byte(3); /* skip next 3 bytes if not cc=true */
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0xc0+8*s+d);
+ }
+}
+LENDFUNC(READ,NONE,3,raw_cmov_w_rr,(RW2 d, R2 s, IMM cc))
+
+LOWFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc))
+{
+ if (have_cmov) {
+ emit_byte(0x0f);
+ emit_byte(0x40+cc);
+ emit_byte(0xc0+8*d+s);
+ }
+ else { /* replacement using branch and mov */
+ int uncc=(cc^1);
+ emit_byte(0x70+uncc);
+ emit_byte(2); /* skip next 2 bytes if not cc=true */
+ emit_byte(0x89);
+ emit_byte(0xc0+8*s+d);
+ }
+}
+LENDFUNC(READ,NONE,3,raw_cmov_l_rr,(RW4 d, R4 s, IMM cc))
+
+LOWFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s))
+{
+ emit_byte(0x0f);
+ emit_byte(0xbc);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(WRITE,NONE,2,raw_bsf_l_rr,(W4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s))
+{
+ emit_byte(0x0f);
+ emit_byte(0xbf);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(NONE,NONE,2,raw_sign_extend_16_rr,(W4 d, R2 s))
+
+LOWFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s))
+{
+ emit_byte(0x0f);
+ emit_byte(0xbe);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(NONE,NONE,2,raw_sign_extend_8_rr,(W4 d, R1 s))
+
+LOWFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s))
+{
+ emit_byte(0x0f);
+ emit_byte(0xb7);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(NONE,NONE,2,raw_zero_extend_16_rr,(W4 d, R2 s))
+
+LOWFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s))
+{
+ emit_byte(0x0f);
+ emit_byte(0xb6);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(NONE,NONE,2,raw_zero_extend_8_rr,(W4 d, R1 s))
+
+LOWFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s))
+{
+ emit_byte(0x0f);
+ emit_byte(0xaf);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(NONE,NONE,2,raw_imul_32_32,(RW4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s))
+{
+ if (d!=MUL_NREG1 || s!=MUL_NREG2)
+ abort();
+ emit_byte(0xf7);
+ emit_byte(0xea);
+}
+LENDFUNC(NONE,NONE,2,raw_imul_64_32,(RW4 d, RW4 s))
+
+LOWFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s))
+{
+ if (d!=MUL_NREG1 || s!=MUL_NREG2) {
+ printf("Bad register in MUL: d=%d, s=%d\n",d,s);
+ abort();
+ }
+ emit_byte(0xf7);
+ emit_byte(0xe2);
+}
+LENDFUNC(NONE,NONE,2,raw_mul_64_32,(RW4 d, RW4 s))
+
+LOWFUNC(NONE,NONE,2,raw_mul_32_32,(RW4 d, R4 s))
+{
+ abort(); /* %^$&%^$%#^ x86! */
+ emit_byte(0x0f);
+ emit_byte(0xaf);
+ emit_byte(0xc0+8*d+s);
+}
+LENDFUNC(NONE,NONE,2,raw_mul_32_32,(RW4 d, R4 s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s))
+{
+ emit_byte(0x88);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_b_rr,(W1 d, R1 s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_w_rr,(W2 d, R2 s))
+
+LOWFUNC(NONE,READ,4,raw_mov_l_rrm_indexed,(W4 d,R4 baser, R4 index, IMM factor))
+{
+ int isebp=(baser==5)?0x40:0;
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+
+ emit_byte(0x8b);
+ emit_byte(0x04+8*d+isebp);
+ emit_byte(baser+8*index+0x40*fi);
+ if (isebp)
+ emit_byte(0x00);
+}
+LENDFUNC(NONE,READ,4,raw_mov_l_rrm_indexed,(W4 d,R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,4,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index, IMM factor))
+{
+ int fi;
+ int isebp;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+ isebp=(baser==5)?0x40:0;
+
+ emit_byte(0x66);
+ emit_byte(0x8b);
+ emit_byte(0x04+8*d+isebp);
+ emit_byte(baser+8*index+0x40*fi);
+ if (isebp)
+ emit_byte(0x00);
+}
+LENDFUNC(NONE,READ,4,raw_mov_w_rrm_indexed,(W2 d, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,4,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index, IMM factor))
+{
+ int fi;
+ int isebp;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+ isebp=(baser==5)?0x40:0;
+
+ emit_byte(0x8a);
+ emit_byte(0x04+8*d+isebp);
+ emit_byte(baser+8*index+0x40*fi);
+ if (isebp)
+ emit_byte(0x00);
+}
+LENDFUNC(NONE,READ,4,raw_mov_b_rrm_indexed,(W1 d, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,WRITE,4,raw_mov_l_mrr_indexed,(R4 baser, R4 index, IMM factor, R4 s))
+{
+ int fi;
+ int isebp;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+
+ isebp=(baser==5)?0x40:0;
+
+ emit_byte(0x89);
+ emit_byte(0x04+8*s+isebp);
+ emit_byte(baser+8*index+0x40*fi);
+ if (isebp)
+ emit_byte(0x00);
+}
+LENDFUNC(NONE,WRITE,4,raw_mov_l_mrr_indexed,(R4 baser, R4 index, IMM factor, R4 s))
+
+LOWFUNC(NONE,WRITE,4,raw_mov_w_mrr_indexed,(R4 baser, R4 index, IMM factor, R2 s))
+{
+ int fi;
+ int isebp;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+ isebp=(baser==5)?0x40:0;
+
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0x04+8*s+isebp);
+ emit_byte(baser+8*index+0x40*fi);
+ if (isebp)
+ emit_byte(0x00);
+}
+LENDFUNC(NONE,WRITE,4,raw_mov_w_mrr_indexed,(R4 baser, R4 index, IMM factor, R2 s))
+
+LOWFUNC(NONE,WRITE,4,raw_mov_b_mrr_indexed,(R4 baser, R4 index, IMM factor, R1 s))
+{
+ int fi;
+ int isebp;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+ isebp=(baser==5)?0x40:0;
+
+ emit_byte(0x88);
+ emit_byte(0x04+8*s+isebp);
+ emit_byte(baser+8*index+0x40*fi);
+ if (isebp)
+ emit_byte(0x00);
+}
+LENDFUNC(NONE,WRITE,4,raw_mov_b_mrr_indexed,(R4 baser, R4 index, IMM factor, R1 s))
+
+LOWFUNC(NONE,WRITE,5,raw_mov_l_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R4 s))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x89);
+ emit_byte(0x84+8*s);
+ emit_byte(baser+8*index+0x40*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,WRITE,5,raw_mov_l_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R4 s))
+
+LOWFUNC(NONE,WRITE,5,raw_mov_w_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R2 s))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0x84+8*s);
+ emit_byte(baser+8*index+0x40*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,WRITE,5,raw_mov_w_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R2 s))
+
+LOWFUNC(NONE,WRITE,5,raw_mov_b_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R1 s))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x88);
+ emit_byte(0x84+8*s);
+ emit_byte(baser+8*index+0x40*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,WRITE,5,raw_mov_b_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R1 s))
+
+LOWFUNC(NONE,READ,5,raw_mov_l_brrm_indexed,(W4 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x8b);
+ emit_byte(0x84+8*d);
+ emit_byte(baser+8*index+0x40*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,READ,5,raw_mov_l_brrm_indexed,(W4 d, IMM base, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,5,raw_mov_w_brrm_indexed,(W2 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x66);
+ emit_byte(0x8b);
+ emit_byte(0x84+8*d);
+ emit_byte(baser+8*index+0x40*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,READ,5,raw_mov_w_brrm_indexed,(W2 d, IMM base, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,5,raw_mov_b_brrm_indexed,(W1 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x8a);
+ emit_byte(0x84+8*d);
+ emit_byte(baser+8*index+0x40*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,READ,5,raw_mov_b_brrm_indexed,(W1 d, IMM base, R4 baser, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,4,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor))
+{
+ int fi;
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default:
+ fprintf(stderr,"Bad factor %d in mov_l_rm_indexed!\n",factor);
+ abort();
+ }
+ emit_byte(0x8b);
+ emit_byte(0x04+8*d);
+ emit_byte(0x05+8*index+64*fi);
+ emit_long(base);
+}
+LENDFUNC(NONE,READ,4,raw_mov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor))
+
+LOWFUNC(NONE,READ,5,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor, IMM cond))
+{
+ int fi;
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default:
+ fprintf(stderr,"Bad factor %d in mov_l_rm_indexed!\n",factor);
+ abort();
+ }
+ if (have_cmov) {
+ emit_byte(0x0f);
+ emit_byte(0x40+cond);
+ emit_byte(0x04+8*d);
+ emit_byte(0x05+8*index+64*fi);
+ emit_long(base);
+ }
+ else { /* replacement using branch and mov */
+ int uncc=(cond^1);
+ emit_byte(0x70+uncc);
+ emit_byte(7); /* skip next 7 bytes if not cc=true */
+ emit_byte(0x8b);
+ emit_byte(0x04+8*d);
+ emit_byte(0x05+8*index+64*fi);
+ emit_long(base);
+ }
+}
+LENDFUNC(NONE,READ,5,raw_cmov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor, IMM cond))
+
+LOWFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond))
+{
+ if (have_cmov) {
+ emit_byte(0x0f);
+ emit_byte(0x40+cond);
+ emit_byte(0x05+8*d);
+ emit_long(mem);
+ }
+ else { /* replacement using branch and mov */
+ int uncc=(cond^1);
+ emit_byte(0x70+uncc);
+ emit_byte(6); /* skip next 6 bytes if not cc=true */
+ emit_byte(0x8b);
+ emit_byte(0x05+8*d);
+ emit_long(mem);
+ }
+}
+LENDFUNC(NONE,READ,3,raw_cmov_l_rm,(W4 d, IMM mem, IMM cond))
+
+LOWFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x8b);
+ emit_byte(0x40+8*d+s);
+ emit_byte(offset);
+}
+LENDFUNC(NONE,READ,3,raw_mov_l_rR,(W4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x66);
+ emit_byte(0x8b);
+ emit_byte(0x40+8*d+s);
+ emit_byte(offset);
+}
+LENDFUNC(NONE,READ,3,raw_mov_w_rR,(W2 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x8a);
+ emit_byte(0x40+8*d+s);
+ emit_byte(offset);
+}
+LENDFUNC(NONE,READ,3,raw_mov_b_rR,(W1 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset))
+{
+ emit_byte(0x8b);
+ emit_byte(0x80+8*d+s);
+ emit_long(offset);
+}
+LENDFUNC(NONE,READ,3,raw_mov_l_brR,(W4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset))
+{
+ emit_byte(0x66);
+ emit_byte(0x8b);
+ emit_byte(0x80+8*d+s);
+ emit_long(offset);
+}
+LENDFUNC(NONE,READ,3,raw_mov_w_brR,(W2 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset))
+{
+ emit_byte(0x8a);
+ emit_byte(0x80+8*d+s);
+ emit_long(offset);
+}
+LENDFUNC(NONE,READ,3,raw_mov_b_brR,(W1 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0xc7);
+ emit_byte(0x40+d);
+ emit_byte(offset);
+ emit_long(i);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_l_Ri,(R4 d, IMM i, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x66);
+ emit_byte(0xc7);
+ emit_byte(0x40+d);
+ emit_byte(offset);
+ emit_word(i);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_w_Ri,(R4 d, IMM i, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0xc6);
+ emit_byte(0x40+d);
+ emit_byte(offset);
+ emit_byte(i);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_b_Ri,(R4 d, IMM i, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x89);
+ emit_byte(0x40+8*s+d);
+ emit_byte(offset);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_l_Rr,(R4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0x40+8*s+d);
+ emit_byte(offset);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_w_Rr,(R4 d, R2 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset))
+{
+ Dif(!isbyte(offset)) abort();
+ emit_byte(0x88);
+ emit_byte(0x40+8*s+d);
+ emit_byte(offset);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_b_Rr,(R4 d, R1 s, IMM offset))
+
+LOWFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset))
+{
+ if (optimize_imm8 && isbyte(offset)) {
+ emit_byte(0x8d);
+ emit_byte(0x40+8*d+s);
+ emit_byte(offset);
+ }
+ else {
+ emit_byte(0x8d);
+ emit_byte(0x80+8*d+s);
+ emit_long(offset);
+ }
+}
+LENDFUNC(NONE,NONE,3,raw_lea_l_brr,(W4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ if (optimize_imm8 && isbyte(offset)) {
+ emit_byte(0x8d);
+ emit_byte(0x44+8*d);
+ emit_byte(0x40*fi+8*index+s);
+ emit_byte(offset);
+ }
+ else {
+ emit_byte(0x8d);
+ emit_byte(0x84+8*d);
+ emit_byte(0x40*fi+8*index+s);
+ emit_long(offset);
+ }
+}
+LENDFUNC(NONE,NONE,5,raw_lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset))
+
+LOWFUNC(NONE,NONE,4,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index, IMM factor))
+{
+ int isebp=(s==5)?0x40:0;
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+
+ emit_byte(0x8d);
+ emit_byte(0x04+8*d+isebp);
+ emit_byte(0x40*fi+8*index+s);
+ if (isebp)
+ emit_byte(0);
+}
+LENDFUNC(NONE,NONE,4,raw_lea_l_rr_indexed,(W4 d, R4 s, R4 index, IMM factor))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset))
+{
+ if (optimize_imm8 && isbyte(offset)) {
+ emit_byte(0x89);
+ emit_byte(0x40+8*s+d);
+ emit_byte(offset);
+ }
+ else {
+ emit_byte(0x89);
+ emit_byte(0x80+8*s+d);
+ emit_long(offset);
+ }
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_l_bRr,(R4 d, R4 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset))
+{
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0x80+8*s+d);
+ emit_long(offset);
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_w_bRr,(R4 d, R2 s, IMM offset))
+
+LOWFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset))
+{
+ if (optimize_imm8 && isbyte(offset)) {
+ emit_byte(0x88);
+ emit_byte(0x40+8*s+d);
+ emit_byte(offset);
+ }
+ else {
+ emit_byte(0x88);
+ emit_byte(0x80+8*s+d);
+ emit_long(offset);
+ }
+}
+LENDFUNC(NONE,WRITE,3,raw_mov_b_bRr,(R4 d, R1 s, IMM offset))
+
+LOWFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r))
+{
+ emit_byte(0x0f);
+ emit_byte(0xc8+r);
+}
+LENDFUNC(NONE,NONE,1,raw_bswap_32,(RW4 r))
+
+LOWFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r))
+{
+ emit_byte(0x66);
+ emit_byte(0xc1);
+ emit_byte(0xc0+r);
+ emit_byte(0x08);
+}
+LENDFUNC(WRITE,NONE,1,raw_bswap_16,(RW2 r))
+
+LOWFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s))
+{
+ emit_byte(0x89);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_l_rr,(W4 d, R4 s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s))
+{
+ emit_byte(0x89);
+ emit_byte(0x05+8*s);
+ emit_long(d);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_l_mr,(IMM d, R4 s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x89);
+ emit_byte(0x05+8*s);
+ emit_long(d);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_w_mr,(IMM d, R2 s))
+
+LOWFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s))
+{
+ emit_byte(0x66);
+ emit_byte(0x8b);
+ emit_byte(0x05+8*d);
+ emit_long(s);
+}
+LENDFUNC(NONE,READ,2,raw_mov_w_rm,(W2 d, IMM s))
+
+LOWFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s))
+{
+ emit_byte(0x88);
+ emit_byte(0x05+8*(s&0xf)); /* XXX this handles %ah case (defined as 0x10+4) and others */
+ emit_long(d);
+}
+LENDFUNC(NONE,WRITE,2,raw_mov_b_mr,(IMM d, R1 s))
+
+LOWFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s))
+{
+ emit_byte(0x8a);
+ emit_byte(0x05+8*d);
+ emit_long(s);
+}
+LENDFUNC(NONE,READ,2,raw_mov_b_rm,(W1 d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s))
+{
+ emit_byte(0xb8+d);
+ emit_long(s);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_l_ri,(W4 d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s))
+{
+ emit_byte(0x66);
+ emit_byte(0xb8+d);
+ emit_word(s);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_w_ri,(W2 d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s))
+{
+ emit_byte(0xb0+d);
+ emit_byte(s);
+}
+LENDFUNC(NONE,NONE,2,raw_mov_b_ri,(W1 d, IMM s))
+
+LOWFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s))
+{
+ emit_byte(0x81);
+ emit_byte(0x15);
+ emit_long(d);
+ emit_long(s);
+}
+LENDFUNC(RMW,RMW,2,raw_adc_l_mi,(MEMRW d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s))
+{
+ if (optimize_imm8 && isbyte(s)) {
+ emit_byte(0x83);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_byte(s);
+ }
+ else {
+ emit_byte(0x81);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_long(s);
+ }
+}
+LENDFUNC(WRITE,RMW,2,raw_add_l_mi,(IMM d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s))
+{
+ emit_byte(0x66);
+ emit_byte(0x81);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_word(s);
+}
+LENDFUNC(WRITE,RMW,2,raw_add_w_mi,(IMM d, IMM s))
+
+LOWFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s))
+{
+ emit_byte(0x80);
+ emit_byte(0x05);
+ emit_long(d);
+ emit_byte(s);
+}
+LENDFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s))
+
+LOWFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
+{
+ if (optimize_accum && isaccum(d))
+ emit_byte(0xa9);
+ else {
+ emit_byte(0xf7);
+ emit_byte(0xc0+d);
+ }
+ emit_long(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s))
+{
+ emit_byte(0x85);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_l_rr,(R4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x85);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_w_rr,(R2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s))
+{
+ emit_byte(0x84);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_test_b_rr,(R1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_l_ri,(RW4 d, IMM i))
+{
+ emit_byte(0x81);
+ emit_byte(0xf0+d);
+ emit_long(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i))
+{
+ if (optimize_imm8 && isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xe0+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x25);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xe0+d);
+ }
+ emit_long(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
+{
+ emit_byte(0x66);
+ if (optimize_imm8 && isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xe0+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x25);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xe0+d);
+ }
+ emit_word(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s))
+{
+ emit_byte(0x21);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x21);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s))
+{
+ emit_byte(0x20);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_and_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i))
+{
+ if (optimize_imm8 && isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xc8+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x0d);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xc8+d);
+ }
+ emit_long(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s))
+{
+ emit_byte(0x09);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x09);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s))
+{
+ emit_byte(0x08);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_or_b,(RW1 d, R1 s))
+
+LOWFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s))
+{
+ emit_byte(0x11);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(RMW,NONE,2,raw_adc_l,(RW4 d, R4 s))
+
+LOWFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x11);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(RMW,NONE,2,raw_adc_w,(RW2 d, R2 s))
+
+LOWFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s))
+{
+ emit_byte(0x10);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(RMW,NONE,2,raw_adc_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s))
+{
+ emit_byte(0x01);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x01);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s))
+{
+ emit_byte(0x00);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i))
+{
+ if (isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xe8+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x2d);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xe8+d);
+ }
+ emit_long(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
+{
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x2c);
+ else {
+ emit_byte(0x80);
+ emit_byte(0xe8+d);
+ }
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i))
+{
+ if (isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xc0+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x05);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xc0+d);
+ }
+ emit_long(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
+{
+ emit_byte(0x66);
+ if (isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xc0+d);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x05);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xc0+d);
+ }
+ emit_word(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
+{
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x04);
+ else {
+ emit_byte(0x80);
+ emit_byte(0xc0+d);
+ }
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
+
+LOWFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s))
+{
+ emit_byte(0x19);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(RMW,NONE,2,raw_sbb_l,(RW4 d, R4 s))
+
+LOWFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x19);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(RMW,NONE,2,raw_sbb_w,(RW2 d, R2 s))
+
+LOWFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s))
+{
+ emit_byte(0x18);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(RMW,NONE,2,raw_sbb_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s))
+{
+ emit_byte(0x29);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x29);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s))
+{
+ emit_byte(0x28);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_sub_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s))
+{
+ emit_byte(0x39);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_l,(R4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i))
+{
+ if (optimize_imm8 && isbyte(i)) {
+ emit_byte(0x83);
+ emit_byte(0xf8+r);
+ emit_byte(i);
+ }
+ else {
+ if (optimize_accum && isaccum(r))
+ emit_byte(0x3d);
+ else {
+ emit_byte(0x81);
+ emit_byte(0xf8+r);
+ }
+ emit_long(i);
+ }
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x39);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s))
+
+LOWFUNC(WRITE,READ,2,raw_cmp_b_mi,(MEMR d, IMM s))
+{
+ emit_byte(0x80);
+ emit_byte(0x3d);
+ emit_long(d);
+ emit_byte(s);
+}
+LENDFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
+{
+ if (optimize_accum && isaccum(d))
+ emit_byte(0x3c);
+ else {
+ emit_byte(0x80);
+ emit_byte(0xf8+d);
+ }
+ emit_byte(i);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
+
+LOWFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s))
+{
+ emit_byte(0x38);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_cmp_b,(R1 d, R1 s))
+
+LOWFUNC(WRITE,READ,4,raw_cmp_l_rm_indexed,(R4 d, IMM offset, R4 index, IMM factor))
+{
+ int fi;
+
+ switch(factor) {
+ case 1: fi=0; break;
+ case 2: fi=1; break;
+ case 4: fi=2; break;
+ case 8: fi=3; break;
+ default: abort();
+ }
+ emit_byte(0x39);
+ emit_byte(0x04+8*d);
+ emit_byte(5+8*index+0x40*fi);
+ emit_long(offset);
+}
+LENDFUNC(WRITE,READ,4,raw_cmp_l_rm_indexed,(R4 d, IMM offset, R4 index, IMM factor))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s))
+{
+ emit_byte(0x31);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_l,(RW4 d, R4 s))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s))
+{
+ emit_byte(0x66);
+ emit_byte(0x31);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_w,(RW2 d, R2 s))
+
+LOWFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s))
+{
+ emit_byte(0x30);
+ emit_byte(0xc0+8*s+d);
+}
+LENDFUNC(WRITE,NONE,2,raw_xor_b,(RW1 d, R1 s))
+
+LOWFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s))
+{
+ if (optimize_imm8 && isbyte(s)) {
+ emit_byte(0x83);
+ emit_byte(0x2d);
+ emit_long(d);
+ emit_byte(s);
+ }
+ else {
+ emit_byte(0x81);
+ emit_byte(0x2d);
+ emit_long(d);
+ emit_long(s);
+ }
+}
+LENDFUNC(WRITE,RMW,2,raw_sub_l_mi,(MEMRW d, IMM s))
+
+LOWFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s))
+{
+ if (optimize_imm8 && isbyte(s)) {
+ emit_byte(0x83);
+ emit_byte(0x3d);
+ emit_long(d);
+ emit_byte(s);
+ }
+ else {
+ emit_byte(0x81);
+ emit_byte(0x3d);
+ emit_long(d);
+ emit_long(s);
+ }
+}
+LENDFUNC(WRITE,READ,2,raw_cmp_l_mi,(MEMR d, IMM s))
+
+LOWFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2))
+{
+ emit_byte(0x87);
+ emit_byte(0xc0+8*r1+r2);
+}
+LENDFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2))
+
+LOWFUNC(NONE,NONE,2,raw_xchg_b_rr,(RW4 r1, RW4 r2))
+{
+ emit_byte(0x86);
+ emit_byte(0xc0+8*(r1&0xf)+(r2&0xf)); /* XXX this handles upper-halves registers (e.g. %ah defined as 0x10+4) */
+}
+LENDFUNC(NONE,NONE,2,raw_xchg_l_rr,(RW4 r1, RW4 r2))
+
+/*************************************************************************
+ * FIXME: mem access modes probably wrong *
+ *************************************************************************/
+
+LOWFUNC(READ,WRITE,0,raw_pushfl,(void))
+{
+ emit_byte(0x9c);
+}
+LENDFUNC(READ,WRITE,0,raw_pushfl,(void))
+
+LOWFUNC(WRITE,READ,0,raw_popfl,(void))
+{
+ emit_byte(0x9d);
+}
+LENDFUNC(WRITE,READ,0,raw_popfl,(void))
+
+/* Generate floating-point instructions */
+static inline void x86_fadd_m(MEMR s)
+{
+ emit_byte(0xdc);
+ emit_byte(0x05);
+ emit_long(s);
+}
+
+#endif
+
+/*************************************************************************
+ * Unoptimizable stuff --- jump *
+ *************************************************************************/
+
+static __inline__ void raw_call_r(R4 r)
+{
+#if USE_NEW_RTASM
+ CALLsr(r);
+#else
+ emit_byte(0xff);
+ emit_byte(0xd0+r);
+#endif
+}
+
+static __inline__ void raw_call_m_indexed(uae_u32 base, uae_u32 r, uae_u32 m)
+{
+#if USE_NEW_RTASM
+ CALLsm(base, X86_NOREG, r, m);
+#else
+ int mu;
+ switch(m) {
+ case 1: mu=0; break;
+ case 2: mu=1; break;
+ case 4: mu=2; break;
+ case 8: mu=3; break;
+ default: abort();
+ }
+ emit_byte(0xff);
+ emit_byte(0x14);
+ emit_byte(0x05+8*r+0x40*mu);
+ emit_long(base);
+#endif
+}
+
+static __inline__ void raw_jmp_r(R4 r)
+{
+#if USE_NEW_RTASM
+ JMPsr(r);
+#else
+ emit_byte(0xff);
+ emit_byte(0xe0+r);
+#endif
+}
+
+static __inline__ void raw_jmp_m_indexed(uae_u32 base, uae_u32 r, uae_u32 m)
+{
+#if USE_NEW_RTASM
+ JMPsm(base, X86_NOREG, r, m);
+#else
+ int mu;
+ switch(m) {
+ case 1: mu=0; break;
+ case 2: mu=1; break;
+ case 4: mu=2; break;
+ case 8: mu=3; break;
+ default: abort();
+ }
+ emit_byte(0xff);
+ emit_byte(0x24);
+ emit_byte(0x05+8*r+0x40*mu);
+ emit_long(base);
+#endif
+}
+
+static __inline__ void raw_jmp_m(uae_u32 base)
+{
+ emit_byte(0xff);
+ emit_byte(0x25);
+ emit_long(base);
+}
+
+
+static __inline__ void raw_call(uae_u32 t)
+{
+#if USE_NEW_RTASM
+ CALLm(t);
+#else
+ emit_byte(0xe8);
+ emit_long(t-(uae_u32)target-4);
+#endif
+}
+
+static __inline__ void raw_jmp(uae_u32 t)
+{
+#if USE_NEW_RTASM
+ JMPm(t);
+#else
+ emit_byte(0xe9);
+ emit_long(t-(uae_u32)target-4);
+#endif
+}
+
+static __inline__ void raw_jl(uae_u32 t)
+{
+ emit_byte(0x0f);
+ emit_byte(0x8c);
+ emit_long(t-(uintptr)target-4);
+}
+
+static __inline__ void raw_jz(uae_u32 t)
+{
+ emit_byte(0x0f);
+ emit_byte(0x84);
+ emit_long(t-(uintptr)target-4);
+}
+
+static __inline__ void raw_jnz(uae_u32 t)
+{
+ emit_byte(0x0f);
+ emit_byte(0x85);
+ emit_long(t-(uintptr)target-4);
+}
+
+static __inline__ void raw_jnz_l_oponly(void)
+{
+ emit_byte(0x0f);
+ emit_byte(0x85);
+}
+
+static __inline__ void raw_jcc_l_oponly(int cc)
+{
+ emit_byte(0x0f);
+ emit_byte(0x80+cc);
+}
+
+static __inline__ void raw_jnz_b_oponly(void)
+{
+ emit_byte(0x75);
+}
+
+static __inline__ void raw_jz_b_oponly(void)
+{
+ emit_byte(0x74);
+}
+
+static __inline__ void raw_jcc_b_oponly(int cc)
+{
+ emit_byte(0x70+cc);
+}
+
+static __inline__ void raw_jmp_l_oponly(void)
+{
+ emit_byte(0xe9);
+}
+
+static __inline__ void raw_jmp_b_oponly(void)
+{
+ emit_byte(0xeb);
+}
+
+static __inline__ void raw_ret(void)
+{
+ emit_byte(0xc3);
+}
+
+static __inline__ void raw_nop(void)
+{
+ emit_byte(0x90);
+}
+
+static __inline__ void raw_emit_nop_filler(int nbytes)
+{
+ /* Source: GNU Binutils 2.12.90.0.15 */
+ /* Various efficient no-op patterns for aligning code labels.
+ Note: Don't try to assemble the instructions in the comments.
+ 0L and 0w are not legal. */
+ static const uae_u8 f32_1[] =
+ {0x90}; /* nop */
+ static const uae_u8 f32_2[] =
+ {0x89,0xf6}; /* movl %esi,%esi */
+ static const uae_u8 f32_3[] =
+ {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
+ static const uae_u8 f32_4[] =
+ {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
+ static const uae_u8 f32_5[] =
+ {0x90, /* nop */
+ 0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
+ static const uae_u8 f32_6[] =
+ {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
+ static const uae_u8 f32_7[] =
+ {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
+ static const uae_u8 f32_8[] =
+ {0x90, /* nop */
+ 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
+ static const uae_u8 f32_9[] =
+ {0x89,0xf6, /* movl %esi,%esi */
+ 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
+ static const uae_u8 f32_10[] =
+ {0x8d,0x76,0x00, /* leal 0(%esi),%esi */
+ 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
+ static const uae_u8 f32_11[] =
+ {0x8d,0x74,0x26,0x00, /* leal 0(%esi,1),%esi */
+ 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
+ static const uae_u8 f32_12[] =
+ {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
+ 0x8d,0xbf,0x00,0x00,0x00,0x00}; /* leal 0L(%edi),%edi */
+ static const uae_u8 f32_13[] =
+ {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
+ 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
+ static const uae_u8 f32_14[] =
+ {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00, /* leal 0L(%esi,1),%esi */
+ 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
+ static const uae_u8 f32_15[] =
+ {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90, /* jmp .+15; lotsa nops */
+ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
+ static const uae_u8 f32_16[] =
+ {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90, /* jmp .+15; lotsa nops */
+ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
+ static const uae_u8 *const f32_patt[] = {
+ f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
+ f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
+ };
+ static const uae_u8 prefixes[4] = { 0x66, 0x66, 0x66, 0x66 };
+
+#if defined(__x86_64__)
+ /* The recommended way to pad 64bit code is to use NOPs preceded by
+ maximally four 0x66 prefixes. Balance the size of nops. */
+ if (nbytes == 0)
+ return;
+
+ int i;
+ int nnops = (nbytes + 3) / 4;
+ int len = nbytes / nnops;
+ int remains = nbytes - nnops * len;
+
+ for (i = 0; i < remains; i++) {
+ emit_block(prefixes, len);
+ raw_nop();
+ }
+ for (; i < nnops; i++) {
+ emit_block(prefixes, len - 1);
+ raw_nop();
+ }
+#else
+ int nloops = nbytes / 16;
+ while (nloops-- > 0)
+ emit_block(f32_16, sizeof(f32_16));
+
+ nbytes %= 16;
+ if (nbytes)
+ emit_block(f32_patt[nbytes - 1], nbytes);
+#endif
+}
+
+
+/*************************************************************************
+ * Flag handling, to and fro UAE flag register *
+ *************************************************************************/
+
+static __inline__ void raw_flags_evicted(int r)
+{
+ //live.state[FLAGTMP].status=CLEAN;
+ live.state[FLAGTMP].status=INMEM;
+ live.state[FLAGTMP].realreg=-1;
+ /* We just "evicted" FLAGTMP. */
+ if (live.nat[r].nholds!=1) {
+ /* Huh? */
+ abort();
+ }
+ live.nat[r].nholds=0;
+}
+
+#define FLAG_NREG1_FLAGREG 0 /* Set to -1 if any register will do */
+static __inline__ void raw_flags_to_reg_FLAGREG(int r)
+{
+ raw_lahf(0); /* Most flags in AH */
+ //raw_setcc(r,0); /* V flag in AL */
+ raw_setcc_m((uintptr)live.state[FLAGTMP].mem,0);
+
+#if 1 /* Let's avoid those nasty partial register stalls */
+ //raw_mov_b_mr((uintptr)live.state[FLAGTMP].mem,r);
+ raw_mov_b_mr(((uintptr)live.state[FLAGTMP].mem)+1,AH_INDEX);
+ raw_flags_evicted(r);
+#endif
+}
+
+#define FLAG_NREG2_FLAGREG 0 /* Set to -1 if any register will do */
+static __inline__ void raw_reg_to_flags_FLAGREG(int r)
+{
+ raw_cmp_b_ri(r,-127); /* set V */
+ raw_sahf(0);
+}
+
+#define FLAG_NREG3_FLAGREG 0 /* Set to -1 if any register will do */
+static __inline__ void raw_flags_set_zero_FLAGREG(int s, int tmp)
+{
+ raw_mov_l_rr(tmp,s);
+ raw_lahf(s); /* flags into ah */
+ raw_and_l_ri(s,0xffffbfff);
+ raw_and_l_ri(tmp,0x00004000);
+ raw_xor_l_ri(tmp,0x00004000);
+ raw_or_l(s,tmp);
+ raw_sahf(s);
+}
+
+static __inline__ void raw_flags_init_FLAGREG(void) { }
+
+#define FLAG_NREG1_FLAGSTK -1 /* Set to -1 if any register will do */
+static __inline__ void raw_flags_to_reg_FLAGSTK(int r)
+{
+ raw_pushfl();
+ raw_pop_l_r(r);
+ raw_mov_l_mr((uintptr)live.state[FLAGTMP].mem,r);
+ raw_flags_evicted(r);
+}
+
+#define FLAG_NREG2_FLAGSTK -1 /* Set to -1 if any register will do */
+static __inline__ void raw_reg_to_flags_FLAGSTK(int r)
+{
+ raw_push_l_r(r);
+ raw_popfl();
+}
+
+#define FLAG_NREG3_FLAGSTK -1 /* Set to -1 if any register will do */
+static __inline__ void raw_flags_set_zero_FLAGSTK(int s, int tmp)
+{
+ raw_mov_l_rr(tmp,s);
+ raw_pushfl();
+ raw_pop_l_r(s);
+ raw_and_l_ri(s,0xffffffbf);
+ raw_and_l_ri(tmp,0x00000040);
+ raw_xor_l_ri(tmp,0x00000040);
+ raw_or_l(s,tmp);
+ raw_push_l_r(s);
+ raw_popfl();
+}
+
+static __inline__ void raw_flags_init_FLAGSTK(void) { }
+
+#if defined(__x86_64__)
+/* Try to use the LAHF/SETO method on x86_64 since it is faster.
+ This can't be the default because some older CPUs don't support
+ LAHF/SAHF in long mode. */
+static int FLAG_NREG1_FLAGGEN = 0;
+static __inline__ void raw_flags_to_reg_FLAGGEN(int r)
+{
+ if (have_lahf_lm) {
+ // NOTE: the interpreter uses the normal EFLAGS layout
+ // pushf/popf CF(0) ZF( 6) SF( 7) OF(11)
+ // sahf/lahf CF(8) ZF(14) SF(15) OF( 0)
+ assert(r == 0);
+ raw_setcc(r,0); /* V flag in AL */
+ raw_lea_l_r_scaled(0,0,8); /* move it to its EFLAGS location */
+ raw_mov_b_mr(((uintptr)live.state[FLAGTMP].mem)+1,0);
+ raw_lahf(0); /* most flags in AH */
+ raw_mov_b_mr((uintptr)live.state[FLAGTMP].mem,AH_INDEX);
+ raw_flags_evicted(r);
+ }
+ else
+ raw_flags_to_reg_FLAGSTK(r);
+}
+
+static int FLAG_NREG2_FLAGGEN = 0;
+static __inline__ void raw_reg_to_flags_FLAGGEN(int r)
+{
+ if (have_lahf_lm) {
+ raw_xchg_b_rr(0,AH_INDEX);
+ raw_cmp_b_ri(r,-120); /* set V */
+ raw_sahf(0);
+ }
+ else
+ raw_reg_to_flags_FLAGSTK(r);
+}
+
+static int FLAG_NREG3_FLAGGEN = 0;
+static __inline__ void raw_flags_set_zero_FLAGGEN(int s, int tmp)
+{
+ if (have_lahf_lm)
+ raw_flags_set_zero_FLAGREG(s, tmp);
+ else
+ raw_flags_set_zero_FLAGSTK(s, tmp);
+}
+
+static __inline__ void raw_flags_init_FLAGGEN(void)
+{
+ if (have_lahf_lm) {
+ FLAG_NREG1_FLAGGEN = FLAG_NREG1_FLAGREG;
+ FLAG_NREG2_FLAGGEN = FLAG_NREG2_FLAGREG;
+ FLAG_NREG1_FLAGGEN = FLAG_NREG3_FLAGREG;
+ }
+ else {
+ FLAG_NREG1_FLAGGEN = FLAG_NREG1_FLAGSTK;
+ FLAG_NREG2_FLAGGEN = FLAG_NREG2_FLAGSTK;
+ FLAG_NREG1_FLAGGEN = FLAG_NREG3_FLAGSTK;
+ }
+}
+#endif
+
+#ifdef SAHF_SETO_PROFITABLE
+#define FLAG_SUFFIX FLAGREG
+#elif defined __x86_64__
+#define FLAG_SUFFIX FLAGGEN
+#else
+#define FLAG_SUFFIX FLAGSTK
+#endif
+
+#define FLAG_GLUE_2(x, y) x ## _ ## y
+#define FLAG_GLUE_1(x, y) FLAG_GLUE_2(x, y)
+#define FLAG_GLUE(x) FLAG_GLUE_1(x, FLAG_SUFFIX)
+
+#define raw_flags_init FLAG_GLUE(raw_flags_init)
+#define FLAG_NREG1 FLAG_GLUE(FLAG_NREG1)
+#define raw_flags_to_reg FLAG_GLUE(raw_flags_to_reg)
+#define FLAG_NREG2 FLAG_GLUE(FLAG_NREG2)
+#define raw_reg_to_flags FLAG_GLUE(raw_reg_to_flags)
+#define FLAG_NREG3 FLAG_GLUE(FLAG_NREG3)
+#define raw_flags_set_zero FLAG_GLUE(raw_flags_set_zero)
+
+/* Apparently, there are enough instructions between flag store and
+ flag reload to avoid the partial memory stall */
+static __inline__ void raw_load_flagreg(uae_u32 target, uae_u32 r)
+{
+#if 1
+ raw_mov_l_rm(target,(uintptr)live.state[r].mem);
+#else
+ raw_mov_b_rm(target,(uintptr)live.state[r].mem);
+ raw_mov_b_rm(target+4,((uintptr)live.state[r].mem)+1);
+#endif
+}
+
+/* FLAGX is byte sized, and we *do* write it at that size */
+static __inline__ void raw_load_flagx(uae_u32 target, uae_u32 r)
+{
+ if (live.nat[target].canbyte)
+ raw_mov_b_rm(target,(uintptr)live.state[r].mem);
+ else if (live.nat[target].canword)
+ raw_mov_w_rm(target,(uintptr)live.state[r].mem);
+ else
+ raw_mov_l_rm(target,(uintptr)live.state[r].mem);
+}
+
+static __inline__ void raw_dec_sp(int off)
+{
+ if (off) raw_sub_l_ri(ESP_INDEX,off);
+}
+
+static __inline__ void raw_inc_sp(int off)
+{
+ if (off) raw_add_l_ri(ESP_INDEX,off);
+}
+
+/*************************************************************************
+ * Handling mistaken direct memory access *
+ *************************************************************************/
+
+// gb-- I don't need that part for JIT Basilisk II
+#if defined(NATMEM_OFFSET) && 0
+#include <asm/sigcontext.h>
+#include <signal.h>
+
+#define SIG_READ 1
+#define SIG_WRITE 2
+
+static int in_handler=0;
+static uae_u8 veccode[256];
+
+static void vec(int x, struct sigcontext sc)
+{
+ uae_u8* i=(uae_u8*)sc.eip;
+ uae_u32 addr=sc.cr2;
+ int r=-1;
+ int size=4;
+ int dir=-1;
+ int len=0;
+ int j;
+
+ write_log("fault address is %08x at %08x\n",sc.cr2,sc.eip);
+ if (!canbang)
+ write_log("Not happy! Canbang is 0 in SIGSEGV handler!\n");
+ if (in_handler)
+ write_log("Argh --- Am already in a handler. Shouldn't happen!\n");
+
+ if (canbang && i>=compiled_code && i<=current_compile_p) {
+ if (*i==0x66) {
+ i++;
+ size=2;
+ len++;
+ }
+
+ switch(i[0]) {
+ case 0x8a:
+ if ((i[1]&0xc0)==0x80) {
+ r=(i[1]>>3)&7;
+ dir=SIG_READ;
+ size=1;
+ len+=6;
+ break;
+ }
+ break;
+ case 0x88:
+ if ((i[1]&0xc0)==0x80) {
+ r=(i[1]>>3)&7;
+ dir=SIG_WRITE;
+ size=1;
+ len+=6;
+ break;
+ }
+ break;
+ case 0x8b:
+ if ((i[1]&0xc0)==0x80) {
+ r=(i[1]>>3)&7;
+ dir=SIG_READ;
+ len+=6;
+ break;
+ }
+ if ((i[1]&0xc0)==0x40) {
+ r=(i[1]>>3)&7;
+ dir=SIG_READ;
+ len+=3;
+ break;
+ }
+ break;
+ case 0x89:
+ if ((i[1]&0xc0)==0x80) {
+ r=(i[1]>>3)&7;
+ dir=SIG_WRITE;
+ len+=6;
+ break;
+ }
+ if ((i[1]&0xc0)==0x40) {
+ r=(i[1]>>3)&7;
+ dir=SIG_WRITE;
+ len+=3;
+ break;
+ }
+ break;
+ }
+ }
+
+ if (r!=-1) {
+ void* pr=NULL;
+ write_log("register was %d, direction was %d, size was %d\n",r,dir,size);
+
+ switch(r) {
+ case 0: pr=&(sc.eax); break;
+ case 1: pr=&(sc.ecx); break;
+ case 2: pr=&(sc.edx); break;
+ case 3: pr=&(sc.ebx); break;
+ case 4: pr=(size>1)?NULL:(((uae_u8*)&(sc.eax))+1); break;
+ case 5: pr=(size>1)?
+ (void*)(&(sc.ebp)):
+ (void*)(((uae_u8*)&(sc.ecx))+1); break;
+ case 6: pr=(size>1)?
+ (void*)(&(sc.esi)):
+ (void*)(((uae_u8*)&(sc.edx))+1); break;
+ case 7: pr=(size>1)?
+ (void*)(&(sc.edi)):
+ (void*)(((uae_u8*)&(sc.ebx))+1); break;
+ default: abort();
+ }
+ if (pr) {
+ blockinfo* bi;
+
+ if (currprefs.comp_oldsegv) {
+ addr-=NATMEM_OFFSET;
+
+ if ((addr>=0x10000000 && addr<0x40000000) ||
+ (addr>=0x50000000)) {
+ write_log("Suspicious address in %x SEGV handler.\n",addr);
+ }
+ if (dir==SIG_READ) {
+ switch(size) {
+ case 1: *((uae_u8*)pr)=get_byte(addr); break;
+ case 2: *((uae_u16*)pr)=get_word(addr); break;
+ case 4: *((uae_u32*)pr)=get_long(addr); break;
+ default: abort();
+ }
+ }
+ else { /* write */
+ switch(size) {
+ case 1: put_byte(addr,*((uae_u8*)pr)); break;
+ case 2: put_word(addr,*((uae_u16*)pr)); break;
+ case 4: put_long(addr,*((uae_u32*)pr)); break;
+ default: abort();
+ }
+ }
+ write_log("Handled one access!\n");
+ fflush(stdout);
+ segvcount++;
+ sc.eip+=len;
+ }
+ else {
+ void* tmp=target;
+ int i;
+ uae_u8 vecbuf[5];
+
+ addr-=NATMEM_OFFSET;
+
+ if ((addr>=0x10000000 && addr<0x40000000) ||
+ (addr>=0x50000000)) {
+ write_log("Suspicious address in %x SEGV handler.\n",addr);
+ }
+
+ target=(uae_u8*)sc.eip;
+ for (i=0;i<5;i++)
+ vecbuf[i]=target[i];
+ emit_byte(0xe9);
+ emit_long((uintptr)veccode-(uintptr)target-4);
+ write_log("Create jump to %p\n",veccode);
+
+ write_log("Handled one access!\n");
+ fflush(stdout);
+ segvcount++;
+
+ target=veccode;
+
+ if (dir==SIG_READ) {
+ switch(size) {
+ case 1: raw_mov_b_ri(r,get_byte(addr)); break;
+ case 2: raw_mov_w_ri(r,get_byte(addr)); break;
+ case 4: raw_mov_l_ri(r,get_byte(addr)); break;
+ default: abort();
+ }
+ }
+ else { /* write */
+ switch(size) {
+ case 1: put_byte(addr,*((uae_u8*)pr)); break;
+ case 2: put_word(addr,*((uae_u16*)pr)); break;
+ case 4: put_long(addr,*((uae_u32*)pr)); break;
+ default: abort();
+ }
+ }
+ for (i=0;i<5;i++)
+ raw_mov_b_mi(sc.eip+i,vecbuf[i]);
+ raw_mov_l_mi((uintptr)&in_handler,0);
+ emit_byte(0xe9);
+ emit_long(sc.eip+len-(uintptr)target-4);
+ in_handler=1;
+ target=tmp;
+ }
+ bi=active;
+ while (bi) {
+ if (bi->handler &&
+ (uae_u8*)bi->direct_handler<=i &&
+ (uae_u8*)bi->nexthandler>i) {
+ write_log("deleted trigger (%p<%p<%p) %p\n",
+ bi->handler,
+ i,
+ bi->nexthandler,
+ bi->pc_p);
+ invalidate_block(bi);
+ raise_in_cl_list(bi);
+ set_special(0);
+ return;
+ }
+ bi=bi->next;
+ }
+ /* Not found in the active list. Might be a rom routine that
+ is in the dormant list */
+ bi=dormant;
+ while (bi) {
+ if (bi->handler &&
+ (uae_u8*)bi->direct_handler<=i &&
+ (uae_u8*)bi->nexthandler>i) {
+ write_log("deleted trigger (%p<%p<%p) %p\n",
+ bi->handler,
+ i,
+ bi->nexthandler,
+ bi->pc_p);
+ invalidate_block(bi);
+ raise_in_cl_list(bi);
+ set_special(0);
+ return;
+ }
+ bi=bi->next;
+ }
+ write_log("Huh? Could not find trigger!\n");
+ return;
+ }
+ }
+ write_log("Can't handle access!\n");
+ for (j=0;j<10;j++) {
+ write_log("instruction byte %2d is %02x\n",j,i[j]);
+ }
+ write_log("Please send the above info (starting at \"fault address\") to\n"
+ "bmeyer@csse.monash.edu.au\n"
+ "This shouldn't happen ;-)\n");
+ fflush(stdout);
+ signal(SIGSEGV,SIG_DFL); /* returning here will cause a "real" SEGV */
+}
+#endif
+
+
+/*************************************************************************
+ * Checking for CPU features *
+ *************************************************************************/
+
+struct cpuinfo_x86 {
+ uae_u8 x86; // CPU family
+ uae_u8 x86_vendor; // CPU vendor
+ uae_u8 x86_processor; // CPU canonical processor type
+ uae_u8 x86_brand_id; // CPU BrandID if supported, yield 0 otherwise
+ uae_u32 x86_hwcap;
+ uae_u8 x86_model;
+ uae_u8 x86_mask;
+ int cpuid_level; // Maximum supported CPUID level, -1=no CPUID
+ char x86_vendor_id[16];
+};
+struct cpuinfo_x86 cpuinfo;
+
+enum {
+ X86_VENDOR_INTEL = 0,
+ X86_VENDOR_CYRIX = 1,
+ X86_VENDOR_AMD = 2,
+ X86_VENDOR_UMC = 3,
+ X86_VENDOR_NEXGEN = 4,
+ X86_VENDOR_CENTAUR = 5,
+ X86_VENDOR_RISE = 6,
+ X86_VENDOR_TRANSMETA = 7,
+ X86_VENDOR_NSC = 8,
+ X86_VENDOR_UNKNOWN = 0xff
+};
+
+enum {
+ X86_PROCESSOR_I386, /* 80386 */
+ X86_PROCESSOR_I486, /* 80486DX, 80486SX, 80486DX[24] */
+ X86_PROCESSOR_PENTIUM,
+ X86_PROCESSOR_PENTIUMPRO,
+ X86_PROCESSOR_K6,
+ X86_PROCESSOR_ATHLON,
+ X86_PROCESSOR_PENTIUM4,
+ X86_PROCESSOR_X86_64,
+ X86_PROCESSOR_max
+};
+
+static const char * x86_processor_string_table[X86_PROCESSOR_max] = {
+ "80386",
+ "80486",
+ "Pentium",
+ "PentiumPro",
+ "K6",
+ "Athlon",
+ "Pentium4",
+ "x86-64"
+};
+
+static struct ptt {
+ const int align_loop;
+ const int align_loop_max_skip;
+ const int align_jump;
+ const int align_jump_max_skip;
+ const int align_func;
+}
+x86_alignments[X86_PROCESSOR_max] = {
+ { 4, 3, 4, 3, 4 },
+ { 16, 15, 16, 15, 16 },
+ { 16, 7, 16, 7, 16 },
+ { 16, 15, 16, 7, 16 },
+ { 32, 7, 32, 7, 32 },
+ { 16, 7, 16, 7, 16 },
+ { 0, 0, 0, 0, 0 },
+ { 16, 7, 16, 7, 16 }
+};
+
+static void
+x86_get_cpu_vendor(struct cpuinfo_x86 *c)
+{
+ char *v = c->x86_vendor_id;
+
+ if (!strcmp(v, "GenuineIntel"))
+ c->x86_vendor = X86_VENDOR_INTEL;
+ else if (!strcmp(v, "AuthenticAMD"))
+ c->x86_vendor = X86_VENDOR_AMD;
+ else if (!strcmp(v, "CyrixInstead"))
+ c->x86_vendor = X86_VENDOR_CYRIX;
+ else if (!strcmp(v, "Geode by NSC"))
+ c->x86_vendor = X86_VENDOR_NSC;
+ else if (!strcmp(v, "UMC UMC UMC "))
+ c->x86_vendor = X86_VENDOR_UMC;
+ else if (!strcmp(v, "CentaurHauls"))
+ c->x86_vendor = X86_VENDOR_CENTAUR;
+ else if (!strcmp(v, "NexGenDriven"))
+ c->x86_vendor = X86_VENDOR_NEXGEN;
+ else if (!strcmp(v, "RiseRiseRise"))
+ c->x86_vendor = X86_VENDOR_RISE;
+ else if (!strcmp(v, "GenuineTMx86") ||
+ !strcmp(v, "TransmetaCPU"))
+ c->x86_vendor = X86_VENDOR_TRANSMETA;
+ else
+ c->x86_vendor = X86_VENDOR_UNKNOWN;
+}
+
+static void
+cpuid(uae_u32 op, uae_u32 *eax, uae_u32 *ebx, uae_u32 *ecx, uae_u32 *edx)
+{
+ const int CPUID_SPACE = 4096;
+ uae_u8* cpuid_space = (uae_u8 *)vm_acquire(CPUID_SPACE);
+ if (cpuid_space == VM_MAP_FAILED)
+ abort();
+ vm_protect(cpuid_space, CPUID_SPACE, VM_PAGE_READ | VM_PAGE_WRITE | VM_PAGE_EXECUTE);
+
+ static uae_u32 s_op, s_eax, s_ebx, s_ecx, s_edx;
+ uae_u8* tmp=get_target();
+
+ s_op = op;
+ set_target(cpuid_space);
+ raw_push_l_r(0); /* eax */
+ raw_push_l_r(1); /* ecx */
+ raw_push_l_r(2); /* edx */
+ raw_push_l_r(3); /* ebx */
+ raw_mov_l_rm(0,(uintptr)&s_op);
+ raw_cpuid(0);
+ raw_mov_l_mr((uintptr)&s_eax,0);
+ raw_mov_l_mr((uintptr)&s_ebx,3);
+ raw_mov_l_mr((uintptr)&s_ecx,1);
+ raw_mov_l_mr((uintptr)&s_edx,2);
+ raw_pop_l_r(3);
+ raw_pop_l_r(2);
+ raw_pop_l_r(1);
+ raw_pop_l_r(0);
+ raw_ret();
+ set_target(tmp);
+
+ ((cpuop_func*)cpuid_space)(0);
+ if (eax != NULL) *eax = s_eax;
+ if (ebx != NULL) *ebx = s_ebx;
+ if (ecx != NULL) *ecx = s_ecx;
+ if (edx != NULL) *edx = s_edx;
+
+ vm_release(cpuid_space, CPUID_SPACE);
+}
+
+static void
+raw_init_cpu(void)
+{
+ struct cpuinfo_x86 *c = &cpuinfo;
+
+ /* Defaults */
+ c->x86_processor = X86_PROCESSOR_max;
+ c->x86_vendor = X86_VENDOR_UNKNOWN;
+ c->cpuid_level = -1; /* CPUID not detected */
+ c->x86_model = c->x86_mask = 0; /* So far unknown... */
+ c->x86_vendor_id[0] = '\0'; /* Unset */
+ c->x86_hwcap = 0;
+
+ /* Get vendor name */
+ c->x86_vendor_id[12] = '\0';
+ cpuid(0x00000000,
+ (uae_u32 *)&c->cpuid_level,
+ (uae_u32 *)&c->x86_vendor_id[0],
+ (uae_u32 *)&c->x86_vendor_id[8],
+ (uae_u32 *)&c->x86_vendor_id[4]);
+ x86_get_cpu_vendor(c);
+
+ /* Intel-defined flags: level 0x00000001 */
+ c->x86_brand_id = 0;
+ if ( c->cpuid_level >= 0x00000001 ) {
+ uae_u32 tfms, brand_id;
+ cpuid(0x00000001, &tfms, &brand_id, NULL, &c->x86_hwcap);
+ c->x86 = (tfms >> 8) & 15;
+ if (c->x86 == 0xf)
+ c->x86 += (tfms >> 20) & 0xff; /* extended family */
+ c->x86_model = (tfms >> 4) & 15;
+ if (c->x86_model == 0xf)
+ c->x86_model |= (tfms >> 12) & 0xf0; /* extended model */
+ c->x86_brand_id = brand_id & 0xff;
+ c->x86_mask = tfms & 15;
+ } else {
+ /* Have CPUID level 0 only - unheard of */
+ c->x86 = 4;
+ }
+
+ /* AMD-defined flags: level 0x80000001 */
+ uae_u32 xlvl;
+ cpuid(0x80000000, &xlvl, NULL, NULL, NULL);
+ if ( (xlvl & 0xffff0000) == 0x80000000 ) {
+ if ( xlvl >= 0x80000001 ) {
+ uae_u32 features, extra_features;
+ cpuid(0x80000001, NULL, NULL, &extra_features, &features);
+ if (features & (1 << 29)) {
+ /* Assume x86-64 if long mode is supported */
+ c->x86_processor = X86_PROCESSOR_X86_64;
+ }
+ if (extra_features & (1 << 0))
+ have_lahf_lm = true;
+ }
+ }
+
+ /* Canonicalize processor ID */
+ switch (c->x86) {
+ case 3:
+ c->x86_processor = X86_PROCESSOR_I386;
+ break;
+ case 4:
+ c->x86_processor = X86_PROCESSOR_I486;
+ break;
+ case 5:
+ if (c->x86_vendor == X86_VENDOR_AMD)
+ c->x86_processor = X86_PROCESSOR_K6;
+ else
+ c->x86_processor = X86_PROCESSOR_PENTIUM;
+ break;
+ case 6:
+ if (c->x86_vendor == X86_VENDOR_AMD)
+ c->x86_processor = X86_PROCESSOR_ATHLON;
+ else
+ c->x86_processor = X86_PROCESSOR_PENTIUMPRO;
+ break;
+ case 15:
+ if (c->x86_processor == X86_PROCESSOR_max) {
+ switch (c->x86_vendor) {
+ case X86_VENDOR_INTEL:
+ c->x86_processor = X86_PROCESSOR_PENTIUM4;
+ break;
+ case X86_VENDOR_AMD:
+ /* Assume a 32-bit Athlon processor if not in long mode */
+ c->x86_processor = X86_PROCESSOR_ATHLON;
+ break;
+ }
+ }
+ break;
+ }
+ if (c->x86_processor == X86_PROCESSOR_max) {
+ c->x86_processor = X86_PROCESSOR_I386;
+ fprintf(stderr, "Error: unknown processor type, assuming i386\n");
+ fprintf(stderr, " Family : %d\n", c->x86);
+ fprintf(stderr, " Model : %d\n", c->x86_model);
+ fprintf(stderr, " Mask : %d\n", c->x86_mask);
+ fprintf(stderr, " Vendor : %s [%d]\n", c->x86_vendor_id, c->x86_vendor);
+ if (c->x86_brand_id)
+ fprintf(stderr, " BrandID : %02x\n", c->x86_brand_id);
+ }
+
+ /* Have CMOV support? */
+ have_cmov = c->x86_hwcap & (1 << 15);
+#if defined(__x86_64__)
+ if (!have_cmov) {
+ write_log("x86-64 implementations are bound to have CMOV!\n");
+ abort();
+ }
+#endif
+
+ /* Can the host CPU suffer from partial register stalls? */
+ have_rat_stall = (c->x86_vendor == X86_VENDOR_INTEL);
+#if 1
+ /* It appears that partial register writes are a bad idea even on
+ AMD K7 cores, even though they are not supposed to have the
+ dreaded rat stall. Why? Anyway, that's why we lie about it ;-) */
+ if (c->x86_processor == X86_PROCESSOR_ATHLON)
+ have_rat_stall = true;
+#endif
+
+ /* Alignments */
+ if (tune_alignment) {
+ align_loops = x86_alignments[c->x86_processor].align_loop;
+ align_jumps = x86_alignments[c->x86_processor].align_jump;
+ }
+
+ write_log("Max CPUID level=%d Processor is %s [%s]\n",
+ c->cpuid_level, c->x86_vendor_id,
+ x86_processor_string_table[c->x86_processor]);
+
+ raw_flags_init();
+}
+
+static bool target_check_bsf(void)
+{
+ bool mismatch = false;
+ for (int g_ZF = 0; g_ZF <= 1; g_ZF++) {
+ for (int g_CF = 0; g_CF <= 1; g_CF++) {
+ for (int g_OF = 0; g_OF <= 1; g_OF++) {
+ for (int g_SF = 0; g_SF <= 1; g_SF++) {
+ for (int value = -1; value <= 1; value++) {
+ unsigned long flags = (g_SF << 7) | (g_OF << 11) | (g_ZF << 6) | g_CF;
+ unsigned long tmp = value;
+ __asm__ __volatile__ ("push %0; popf; bsf %1,%1; pushf; pop %0"
+ : "+r" (flags), "+r" (tmp) : : "cc");
+ int OF = (flags >> 11) & 1;
+ int SF = (flags >> 7) & 1;
+ int ZF = (flags >> 6) & 1;
+ int CF = flags & 1;
+ tmp = (value == 0);
+ if (ZF != tmp || SF != g_SF || OF != g_OF || CF != g_CF)
+ mismatch = true;
+ }
+ }}}}
+ if (mismatch)
+ write_log("Target CPU defines all flags on BSF instruction\n");
+ return !mismatch;
+}
+
+
+/*************************************************************************
+ * FPU stuff *
+ *************************************************************************/
+
+
+static __inline__ void raw_fp_init(void)
+{
+ int i;
+
+ for (i=0;i<N_FREGS;i++)
+ live.spos[i]=-2;
+ live.tos=-1; /* Stack is empty */
+}
+
+static __inline__ void raw_fp_cleanup_drop(void)
+{
+#if 0
+ /* using FINIT instead of popping all the entries.
+ Seems to have side effects --- there is display corruption in
+ Quake when this is used */
+ if (live.tos>1) {
+ emit_byte(0x9b);
+ emit_byte(0xdb);
+ emit_byte(0xe3);
+ live.tos=-1;
+ }
+#endif
+ while (live.tos>=1) {
+ emit_byte(0xde);
+ emit_byte(0xd9);
+ live.tos-=2;
+ }
+ while (live.tos>=0) {
+ emit_byte(0xdd);
+ emit_byte(0xd8);
+ live.tos--;
+ }
+ raw_fp_init();
+}
+
+static __inline__ void make_tos(int r)
+{
+ int p,q;
+
+ if (live.spos[r]<0) { /* Register not yet on stack */
+ emit_byte(0xd9);
+ emit_byte(0xe8); /* Push '1' on the stack, just to grow it */
+ live.tos++;
+ live.spos[r]=live.tos;
+ live.onstack[live.tos]=r;
+ return;
+ }
+ /* Register is on stack */
+ if (live.tos==live.spos[r])
+ return;
+ p=live.spos[r];
+ q=live.onstack[live.tos];
+
+ emit_byte(0xd9);
+ emit_byte(0xc8+live.tos-live.spos[r]); /* exchange it with top of stack */
+ live.onstack[live.tos]=r;
+ live.spos[r]=live.tos;
+ live.onstack[p]=q;
+ live.spos[q]=p;
+}
+
+static __inline__ void make_tos2(int r, int r2)
+{
+ int q;
+
+ make_tos(r2); /* Put the reg that's supposed to end up in position2
+ on top */
+
+ if (live.spos[r]<0) { /* Register not yet on stack */
+ make_tos(r); /* This will extend the stack */
+ return;
+ }
+ /* Register is on stack */
+ emit_byte(0xd9);
+ emit_byte(0xc9); /* Move r2 into position 2 */
+
+ q=live.onstack[live.tos-1];
+ live.onstack[live.tos]=q;
+ live.spos[q]=live.tos;
+ live.onstack[live.tos-1]=r2;
+ live.spos[r2]=live.tos-1;
+
+ make_tos(r); /* And r into 1 */
+}
+
+static __inline__ int stackpos(int r)
+{
+ if (live.spos[r]<0)
+ abort();
+ if (live.tos<live.spos[r]) {
+ printf("Looking for spos for fnreg %d\n",r);
+ abort();
+ }
+ return live.tos-live.spos[r];
+}
+
+static __inline__ void usereg(int r)
+{
+ if (live.spos[r]<0)
+ make_tos(r);
+}
+
+/* This is called with one FP value in a reg *above* tos, which it will
+ pop off the stack if necessary */
+static __inline__ void tos_make(int r)
+{
+ if (live.spos[r]<0) {
+ live.tos++;
+ live.spos[r]=live.tos;
+ live.onstack[live.tos]=r;
+ return;
+ }
+ emit_byte(0xdd);
+ emit_byte(0xd8+(live.tos+1)-live.spos[r]); /* store top of stack in reg,
+ and pop it*/
+}
+
+/* FP helper functions */
+#if USE_NEW_RTASM
+#define DEFINE_OP(NAME, GEN) \
+static inline void raw_##NAME(uint32 m) \
+{ \
+ GEN(m, X86_NOREG, X86_NOREG, 1); \
+}
+DEFINE_OP(fstl, FSTLm);
+DEFINE_OP(fstpl, FSTPLm);
+DEFINE_OP(fldl, FLDLm);
+DEFINE_OP(fildl, FILDLm);
+DEFINE_OP(fistl, FISTLm);
+DEFINE_OP(flds, FLDSm);
+DEFINE_OP(fsts, FSTSm);
+DEFINE_OP(fstpt, FSTPTm);
+DEFINE_OP(fldt, FLDTm);
+#else
+#define DEFINE_OP(NAME, OP1, OP2) \
+static inline void raw_##NAME(uint32 m) \
+{ \
+ emit_byte(OP1); \
+ emit_byte(OP2); \
+ emit_long(m); \
+}
+DEFINE_OP(fstl, 0xdd, 0x15);
+DEFINE_OP(fstpl, 0xdd, 0x1d);
+DEFINE_OP(fldl, 0xdd, 0x05);
+DEFINE_OP(fildl, 0xdb, 0x05);
+DEFINE_OP(fistl, 0xdb, 0x15);
+DEFINE_OP(flds, 0xd9, 0x05);
+DEFINE_OP(fsts, 0xd9, 0x15);
+DEFINE_OP(fstpt, 0xdb, 0x3d);
+DEFINE_OP(fldt, 0xdb, 0x2d);
+#endif
+#undef DEFINE_OP
+
+LOWFUNC(NONE,WRITE,2,raw_fmov_mr,(MEMW m, FR r))
+{
+ make_tos(r);
+ raw_fstl(m);
+}
+LENDFUNC(NONE,WRITE,2,raw_fmov_mr,(MEMW m, FR r))
+
+LOWFUNC(NONE,WRITE,2,raw_fmov_mr_drop,(MEMW m, FR r))
+{
+ make_tos(r);
+ raw_fstpl(m);
+ live.onstack[live.tos]=-1;
+ live.tos--;
+ live.spos[r]=-2;
+}
+LENDFUNC(NONE,WRITE,2,raw_fmov_mr,(MEMW m, FR r))
+
+LOWFUNC(NONE,READ,2,raw_fmov_rm,(FW r, MEMR m))
+{
+ raw_fldl(m);
+ tos_make(r);
+}
+LENDFUNC(NONE,READ,2,raw_fmov_rm,(FW r, MEMR m))
+
+LOWFUNC(NONE,READ,2,raw_fmovi_rm,(FW r, MEMR m))
+{
+ raw_fildl(m);
+ tos_make(r);
+}
+LENDFUNC(NONE,READ,2,raw_fmovi_rm,(FW r, MEMR m))
+
+LOWFUNC(NONE,WRITE,2,raw_fmovi_mr,(MEMW m, FR r))
+{
+ make_tos(r);
+ raw_fistl(m);
+}
+LENDFUNC(NONE,WRITE,2,raw_fmovi_mr,(MEMW m, FR r))
+
+LOWFUNC(NONE,READ,2,raw_fmovs_rm,(FW r, MEMR m))
+{
+ raw_flds(m);
+ tos_make(r);
+}
+LENDFUNC(NONE,READ,2,raw_fmovs_rm,(FW r, MEMR m))
+
+LOWFUNC(NONE,WRITE,2,raw_fmovs_mr,(MEMW m, FR r))
+{
+ make_tos(r);
+ raw_fsts(m);
+}
+LENDFUNC(NONE,WRITE,2,raw_fmovs_mr,(MEMW m, FR r))
+
+LOWFUNC(NONE,WRITE,2,raw_fmov_ext_mr,(MEMW m, FR r))
+{
+ int rs;
+
+ /* Stupid x87 can't write a long double to mem without popping the
+ stack! */
+ usereg(r);
+ rs=stackpos(r);
+ emit_byte(0xd9); /* Get a copy to the top of stack */
+ emit_byte(0xc0+rs);
+
+ raw_fstpt(m); /* store and pop it */
+}
+LENDFUNC(NONE,WRITE,2,raw_fmov_ext_mr,(MEMW m, FR r))
+
+LOWFUNC(NONE,WRITE,2,raw_fmov_ext_mr_drop,(MEMW m, FR r))
+{
+ int rs;
+
+ make_tos(r);
+ raw_fstpt(m); /* store and pop it */
+ live.onstack[live.tos]=-1;
+ live.tos--;
+ live.spos[r]=-2;
+}
+LENDFUNC(NONE,WRITE,2,raw_fmov_ext_mr,(MEMW m, FR r))
+
+LOWFUNC(NONE,READ,2,raw_fmov_ext_rm,(FW r, MEMR m))
+{
+ raw_fldt(m);
+ tos_make(r);
+}
+LENDFUNC(NONE,READ,2,raw_fmov_ext_rm,(FW r, MEMR m))
+
+LOWFUNC(NONE,NONE,1,raw_fmov_pi,(FW r))
+{
+ emit_byte(0xd9);
+ emit_byte(0xeb);
+ tos_make(r);
+}
+LENDFUNC(NONE,NONE,1,raw_fmov_pi,(FW r))
+
+LOWFUNC(NONE,NONE,1,raw_fmov_log10_2,(FW r))
+{
+ emit_byte(0xd9);
+ emit_byte(0xec);
+ tos_make(r);
+}
+LENDFUNC(NONE,NONE,1,raw_fmov_log10_2,(FW r))
+
+LOWFUNC(NONE,NONE,1,raw_fmov_log2_e,(FW r))
+{
+ emit_byte(0xd9);
+ emit_byte(0xea);
+ tos_make(r);
+}
+LENDFUNC(NONE,NONE,1,raw_fmov_log2_e,(FW r))
+
+LOWFUNC(NONE,NONE,1,raw_fmov_loge_2,(FW r))
+{
+ emit_byte(0xd9);
+ emit_byte(0xed);
+ tos_make(r);
+}
+LENDFUNC(NONE,NONE,1,raw_fmov_loge_2,(FW r))
+
+LOWFUNC(NONE,NONE,1,raw_fmov_1,(FW r))
+{
+ emit_byte(0xd9);
+ emit_byte(0xe8);
+ tos_make(r);
+}
+LENDFUNC(NONE,NONE,1,raw_fmov_1,(FW r))
+
+LOWFUNC(NONE,NONE,1,raw_fmov_0,(FW r))
+{
+ emit_byte(0xd9);
+ emit_byte(0xee);
+ tos_make(r);
+}
+LENDFUNC(NONE,NONE,1,raw_fmov_0,(FW r))
+
+LOWFUNC(NONE,NONE,2,raw_fmov_rr,(FW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ ds=stackpos(s);
+ if (ds==0 && live.spos[d]>=0) {
+ /* source is on top of stack, and we already have the dest */
+ int dd=stackpos(d);
+ emit_byte(0xdd);
+ emit_byte(0xd0+dd);
+ }
+ else {
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source on tos */
+ tos_make(d); /* store to destination, pop if necessary */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fmov_rr,(FW d, FR s))
+
+LOWFUNC(NONE,READ,4,raw_fldcw_m_indexed,(R4 index, IMM base))
+{
+ emit_byte(0xd9);
+ emit_byte(0xa8+index);
+ emit_long(base);
+}
+LENDFUNC(NONE,READ,4,raw_fldcw_m_indexed,(R4 index, IMM base))
+
+
+LOWFUNC(NONE,NONE,2,raw_fsqrt_rr,(FW d, FR s))
+{
+ int ds;
+
+ if (d!=s) {
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xfa); /* take square root */
+ tos_make(d); /* store to destination */
+ }
+ else {
+ make_tos(d);
+ emit_byte(0xd9);
+ emit_byte(0xfa); /* take square root */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fsqrt_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fabs_rr,(FW d, FR s))
+{
+ int ds;
+
+ if (d!=s) {
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xe1); /* take fabs */
+ tos_make(d); /* store to destination */
+ }
+ else {
+ make_tos(d);
+ emit_byte(0xd9);
+ emit_byte(0xe1); /* take fabs */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fabs_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_frndint_rr,(FW d, FR s))
+{
+ int ds;
+
+ if (d!=s) {
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xfc); /* take frndint */
+ tos_make(d); /* store to destination */
+ }
+ else {
+ make_tos(d);
+ emit_byte(0xd9);
+ emit_byte(0xfc); /* take frndint */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_frndint_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fcos_rr,(FW d, FR s))
+{
+ int ds;
+
+ if (d!=s) {
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xff); /* take cos */
+ tos_make(d); /* store to destination */
+ }
+ else {
+ make_tos(d);
+ emit_byte(0xd9);
+ emit_byte(0xff); /* take cos */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fcos_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fsin_rr,(FW d, FR s))
+{
+ int ds;
+
+ if (d!=s) {
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xfe); /* take sin */
+ tos_make(d); /* store to destination */
+ }
+ else {
+ make_tos(d);
+ emit_byte(0xd9);
+ emit_byte(0xfe); /* take sin */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fsin_rr,(FW d, FR s))
+
+static const double one=1;
+LOWFUNC(NONE,NONE,2,raw_ftwotox_rr,(FW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+
+ emit_byte(0xd9);
+ emit_byte(0xc0); /* duplicate top of stack. Now up to 8 high */
+ emit_byte(0xd9);
+ emit_byte(0xfc); /* rndint */
+ emit_byte(0xd9);
+ emit_byte(0xc9); /* swap top two elements */
+ emit_byte(0xd8);
+ emit_byte(0xe1); /* subtract rounded from original */
+ emit_byte(0xd9);
+ emit_byte(0xf0); /* f2xm1 */
+ x86_fadd_m((uintptr)&one); /* Add '1' without using extra stack space */
+ emit_byte(0xd9);
+ emit_byte(0xfd); /* and scale it */
+ emit_byte(0xdd);
+ emit_byte(0xd9); /* take he rounded value off */
+ tos_make(d); /* store to destination */
+}
+LENDFUNC(NONE,NONE,2,raw_ftwotox_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fetox_rr,(FW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xea); /* fldl2e */
+ emit_byte(0xde);
+ emit_byte(0xc9); /* fmulp --- multiply source by log2(e) */
+
+ emit_byte(0xd9);
+ emit_byte(0xc0); /* duplicate top of stack. Now up to 8 high */
+ emit_byte(0xd9);
+ emit_byte(0xfc); /* rndint */
+ emit_byte(0xd9);
+ emit_byte(0xc9); /* swap top two elements */
+ emit_byte(0xd8);
+ emit_byte(0xe1); /* subtract rounded from original */
+ emit_byte(0xd9);
+ emit_byte(0xf0); /* f2xm1 */
+ x86_fadd_m((uintptr)&one); /* Add '1' without using extra stack space */
+ emit_byte(0xd9);
+ emit_byte(0xfd); /* and scale it */
+ emit_byte(0xdd);
+ emit_byte(0xd9); /* take he rounded value off */
+ tos_make(d); /* store to destination */
+}
+LENDFUNC(NONE,NONE,2,raw_fetox_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_flog2_rr,(FW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xe8); /* push '1' */
+ emit_byte(0xd9);
+ emit_byte(0xc9); /* swap top two */
+ emit_byte(0xd9);
+ emit_byte(0xf1); /* take 1*log2(x) */
+ tos_make(d); /* store to destination */
+}
+LENDFUNC(NONE,NONE,2,raw_flog2_rr,(FW d, FR s))
+
+
+LOWFUNC(NONE,NONE,2,raw_fneg_rr,(FW d, FR s))
+{
+ int ds;
+
+ if (d!=s) {
+ usereg(s);
+ ds=stackpos(s);
+ emit_byte(0xd9);
+ emit_byte(0xc0+ds); /* duplicate source */
+ emit_byte(0xd9);
+ emit_byte(0xe0); /* take fchs */
+ tos_make(d); /* store to destination */
+ }
+ else {
+ make_tos(d);
+ emit_byte(0xd9);
+ emit_byte(0xe0); /* take fchs */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fneg_rr,(FW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fadd_rr,(FRW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ if (live.spos[s]==live.tos) {
+ /* Source is on top of stack */
+ ds=stackpos(d);
+ emit_byte(0xdc);
+ emit_byte(0xc0+ds); /* add source to dest*/
+ }
+ else {
+ make_tos(d);
+ ds=stackpos(s);
+
+ emit_byte(0xd8);
+ emit_byte(0xc0+ds); /* add source to dest*/
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fadd_rr,(FRW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fsub_rr,(FRW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ if (live.spos[s]==live.tos) {
+ /* Source is on top of stack */
+ ds=stackpos(d);
+ emit_byte(0xdc);
+ emit_byte(0xe8+ds); /* sub source from dest*/
+ }
+ else {
+ make_tos(d);
+ ds=stackpos(s);
+
+ emit_byte(0xd8);
+ emit_byte(0xe0+ds); /* sub src from dest */
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fsub_rr,(FRW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fcmp_rr,(FR d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ make_tos(d);
+ ds=stackpos(s);
+
+ emit_byte(0xdd);
+ emit_byte(0xe0+ds); /* cmp dest with source*/
+}
+LENDFUNC(NONE,NONE,2,raw_fcmp_rr,(FR d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fmul_rr,(FRW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ if (live.spos[s]==live.tos) {
+ /* Source is on top of stack */
+ ds=stackpos(d);
+ emit_byte(0xdc);
+ emit_byte(0xc8+ds); /* mul dest by source*/
+ }
+ else {
+ make_tos(d);
+ ds=stackpos(s);
+
+ emit_byte(0xd8);
+ emit_byte(0xc8+ds); /* mul dest by source*/
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fmul_rr,(FRW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_fdiv_rr,(FRW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ if (live.spos[s]==live.tos) {
+ /* Source is on top of stack */
+ ds=stackpos(d);
+ emit_byte(0xdc);
+ emit_byte(0xf8+ds); /* div dest by source */
+ }
+ else {
+ make_tos(d);
+ ds=stackpos(s);
+
+ emit_byte(0xd8);
+ emit_byte(0xf0+ds); /* div dest by source*/
+ }
+}
+LENDFUNC(NONE,NONE,2,raw_fdiv_rr,(FRW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_frem_rr,(FRW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ make_tos2(d,s);
+ ds=stackpos(s);
+
+ if (ds!=1) {
+ printf("Failed horribly in raw_frem_rr! ds is %d\n",ds);
+ abort();
+ }
+ emit_byte(0xd9);
+ emit_byte(0xf8); /* take rem from dest by source */
+}
+LENDFUNC(NONE,NONE,2,raw_frem_rr,(FRW d, FR s))
+
+LOWFUNC(NONE,NONE,2,raw_frem1_rr,(FRW d, FR s))
+{
+ int ds;
+
+ usereg(s);
+ usereg(d);
+
+ make_tos2(d,s);
+ ds=stackpos(s);
+
+ if (ds!=1) {
+ printf("Failed horribly in raw_frem1_rr! ds is %d\n",ds);
+ abort();
+ }
+ emit_byte(0xd9);
+ emit_byte(0xf5); /* take rem1 from dest by source */
+}
+LENDFUNC(NONE,NONE,2,raw_frem1_rr,(FRW d, FR s))
+
+
+LOWFUNC(NONE,NONE,1,raw_ftst_r,(FR r))
+{
+ make_tos(r);
+ emit_byte(0xd9); /* ftst */
+ emit_byte(0xe4);
+}
+LENDFUNC(NONE,NONE,1,raw_ftst_r,(FR r))
+
+/* %eax register is clobbered if target processor doesn't support fucomi */
+#define FFLAG_NREG_CLOBBER_CONDITION !have_cmov
+#define FFLAG_NREG EAX_INDEX
+
+static __inline__ void raw_fflags_into_flags(int r)
+{
+ int p;
+
+ usereg(r);
+ p=stackpos(r);
+
+ emit_byte(0xd9);
+ emit_byte(0xee); /* Push 0 */
+ emit_byte(0xd9);
+ emit_byte(0xc9+p); /* swap top two around */
+ if (have_cmov) {
+ // gb-- fucomi is for P6 cores only, not K6-2 then...
+ emit_byte(0xdb);
+ emit_byte(0xe9+p); /* fucomi them */
+ }
+ else {
+ emit_byte(0xdd);
+ emit_byte(0xe1+p); /* fucom them */
+ emit_byte(0x9b);
+ emit_byte(0xdf);
+ emit_byte(0xe0); /* fstsw ax */
+ raw_sahf(0); /* sahf */
+ }
+ emit_byte(0xdd);
+ emit_byte(0xd9+p); /* store value back, and get rid of 0 */
+}
--- /dev/null
+/******************** -*- mode: C; tab-width: 8 -*- ********************
+ *
+ * Run-time assembler for IA-32 and AMD64
+ *
+ ***********************************************************************/
+
+
+/***********************************************************************
+ *
+ * This file is derived from CCG.
+ *
+ * Copyright 1999, 2000, 2001, 2002, 2003 Ian Piumarta
+ *
+ * Adaptations and enhancements for AMD64 support, Copyright 2003-2008
+ * Gwenole Beauchesne
+ *
+ * Basilisk II (C) 1997-2008 Christian Bauer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ***********************************************************************/
+
+#ifndef X86_RTASM_H
+#define X86_RTASM_H
+
+/* NOTES
+ *
+ * o Best viewed on a 1024x768 screen with fixed-6x10 font ;-)
+ *
+ * TODO
+ *
+ * o Fix FIXMEs
+ * o i387 FPU instructions
+ * o SSE instructions
+ * o Optimize for cases where register numbers are not integral constants
+ */
+
+/* --- Configuration ------------------------------------------------------- */
+
+/* Define to settle a "flat" register set, i.e. different regno for
+ each size variant. */
+#ifndef X86_FLAT_REGISTERS
+#define X86_FLAT_REGISTERS 1
+#endif
+
+/* Define to generate x86-64 code. */
+#ifndef X86_TARGET_64BIT
+#define X86_TARGET_64BIT 0
+#endif
+
+/* Define to optimize ALU instructions. */
+#ifndef X86_OPTIMIZE_ALU
+#define X86_OPTIMIZE_ALU 1
+#endif
+
+/* Define to optimize rotate/shift instructions. */
+#ifndef X86_OPTIMIZE_ROTSHI
+#define X86_OPTIMIZE_ROTSHI 1
+#endif
+
+/* Define to optimize absolute addresses for RIP relative addressing. */
+#ifndef X86_RIP_RELATIVE_ADDR
+#define X86_RIP_RELATIVE_ADDR 1
+#endif
+
+
+/* --- Macros -------------------------------------------------------------- */
+
+/* Functions used to emit code.
+ *
+ * x86_emit_byte(B)
+ * x86_emit_word(W)
+ * x86_emit_long(L)
+ */
+
+/* Get pointer to current code
+ *
+ * x86_get_target()
+ */
+
+/* Abort assembler, fatal failure.
+ *
+ * x86_emit_failure(MSG)
+ */
+
+#define x86_emit_failure0(MSG) (x86_emit_failure(MSG),0)
+
+
+/* --- Register set -------------------------------------------------------- */
+
+enum {
+ X86_RIP = -2,
+#if X86_FLAT_REGISTERS
+ X86_NOREG = 0,
+ X86_Reg8L_Base = 0x10,
+ X86_Reg8H_Base = 0x20,
+ X86_Reg16_Base = 0x30,
+ X86_Reg32_Base = 0x40,
+ X86_Reg64_Base = 0x50,
+ X86_RegMMX_Base = 0x60,
+ X86_RegXMM_Base = 0x70,
+#else
+ X86_NOREG = -1,
+ X86_Reg8L_Base = 0,
+ X86_Reg8H_Base = 16,
+ X86_Reg16_Base = 0,
+ X86_Reg32_Base = 0,
+ X86_Reg64_Base = 0,
+ X86_RegMMX_Base = 0,
+ X86_RegXMM_Base = 0,
+#endif
+};
+
+enum {
+ X86_AL = X86_Reg8L_Base,
+ X86_CL, X86_DL, X86_BL,
+ X86_SPL, X86_BPL, X86_SIL, X86_DIL,
+ X86_R8B, X86_R9B, X86_R10B, X86_R11B,
+ X86_R12B, X86_R13B, X86_R14B, X86_R15B,
+ X86_AH = X86_Reg8H_Base + 4,
+ X86_CH, X86_DH, X86_BH
+};
+
+enum {
+ X86_AX = X86_Reg16_Base,
+ X86_CX, X86_DX, X86_BX,
+ X86_SP, X86_BP, X86_SI, X86_DI,
+ X86_R8W, X86_R9W, X86_R10W, X86_R11W,
+ X86_R12W, X86_R13W, X86_R14W, X86_R15W
+};
+
+enum {
+ X86_EAX = X86_Reg32_Base,
+ X86_ECX, X86_EDX, X86_EBX,
+ X86_ESP, X86_EBP, X86_ESI, X86_EDI,
+ X86_R8D, X86_R9D, X86_R10D, X86_R11D,
+ X86_R12D, X86_R13D, X86_R14D, X86_R15D
+};
+
+enum {
+ X86_RAX = X86_Reg64_Base,
+ X86_RCX, X86_RDX, X86_RBX,
+ X86_RSP, X86_RBP, X86_RSI, X86_RDI,
+ X86_R8, X86_R9, X86_R10, X86_R11,
+ X86_R12, X86_R13, X86_R14, X86_R15
+};
+
+enum {
+ X86_MM0 = X86_RegMMX_Base,
+ X86_MM1, X86_MM2, X86_MM3,
+ X86_MM4, X86_MM5, X86_MM6, X86_MM7,
+};
+
+enum {
+ X86_XMM0 = X86_RegXMM_Base,
+ X86_XMM1, X86_XMM2, X86_XMM3,
+ X86_XMM4, X86_XMM5, X86_XMM6, X86_XMM7,
+ X86_XMM8, X86_XMM9, X86_XMM10, X86_XMM11,
+ X86_XMM12, X86_XMM13, X86_XMM14, X86_XMM15
+};
+
+/* Register control and access
+ *
+ * _r0P(R) Null register?
+ * _rIP(R) RIP register?
+ * _rXP(R) Extended register?
+ *
+ * _rC(R) Class of register (only valid if X86_FLAT_REGISTERS)
+ * _rR(R) Full register number
+ * _rN(R) Short register number for encoding
+ *
+ * _r1(R) 8-bit register ID
+ * _r2(R) 16-bit register ID
+ * _r4(R) 32-bit register ID
+ * _r8(R) 64-bit register ID
+ * _rM(R) MMX register ID
+ * _rX(R) XMM register ID
+ * _rA(R) Address register ID used for EA calculation
+ */
+
+#define _r0P(R) ((int)(R) == (int)X86_NOREG)
+#define _rIP(R) (X86_TARGET_64BIT ? ((int)(R) == (int)X86_RIP) : 0)
+
+#if X86_FLAT_REGISTERS
+#define _rC(R) ((R) & 0xf0)
+#define _rR(R) ((R) & 0x0f)
+#define _rN(R) ((R) & 0x07)
+#define _rXP(R) ((R) > 0 && _rR(R) > 7)
+#else
+#define _rN(R) ((R) & 0x07)
+#define _rR(R) (int(R))
+#define _rXP(R) (_rR(R) > 7 && _rR(R) < 16)
+#endif
+
+#if !defined(_ASM_SAFETY) || ! X86_FLAT_REGISTERS
+#define _r1(R) _rN(R)
+#define _r2(R) _rN(R)
+#define _r4(R) _rN(R)
+#define _r8(R) _rN(R)
+#define _rA(R) _rN(R)
+#define _rM(R) _rN(R)
+#define _rX(R) _rN(R)
+#else
+#define _r1(R) ( ((_rC(R) & (X86_Reg8L_Base | X86_Reg8H_Base)) != 0) ? _rN(R) : x86_emit_failure0( "8-bit register required"))
+#define _r2(R) ( (_rC(R) == X86_Reg16_Base) ? _rN(R) : x86_emit_failure0("16-bit register required"))
+#define _r4(R) ( (_rC(R) == X86_Reg32_Base) ? _rN(R) : x86_emit_failure0("32-bit register required"))
+#define _r8(R) ( (_rC(R) == X86_Reg64_Base) ? _rN(R) : x86_emit_failure0("64-bit register required"))
+#define _rA(R) ( X86_TARGET_64BIT ? \
+ ( (_rC(R) == X86_Reg64_Base) ? _rN(R) : x86_emit_failure0("not a valid 64-bit base/index expression")) : \
+ ( (_rC(R) == X86_Reg32_Base) ? _rN(R) : x86_emit_failure0("not a valid 32-bit base/index expression")) )
+#define _rM(R) ( (_rC(R) == X86_RegMMX_Base) ? _rN(R) : x86_emit_failure0("MMX register required"))
+#define _rX(R) ( (_rC(R) == X86_RegXMM_Base) ? _rN(R) : x86_emit_failure0("SSE register required"))
+#endif
+
+#define _rSP() (X86_TARGET_64BIT ? (int)X86_RSP : (int)X86_ESP)
+#define _r1e8lP(R) (int(R) >= X86_SPL && int(R) <= X86_DIL)
+#define _rbpP(R) (_rR(R) == _rR(X86_RBP))
+#define _rspP(R) (_rR(R) == _rR(X86_RSP))
+#define _rbp13P(R) (_rN(R) == _rN(X86_RBP))
+#define _rsp12P(R) (_rN(R) == _rN(X86_RSP))
+
+
+/* ========================================================================= */
+/* --- UTILITY ------------------------------------------------------------- */
+/* ========================================================================= */
+
+typedef signed char _sc;
+typedef unsigned char _uc;
+typedef signed short _ss;
+typedef unsigned short _us;
+typedef signed int _sl;
+typedef unsigned int _ul;
+
+#define _UC(X) ((_uc )(unsigned long)(X))
+#define _US(X) ((_us )(unsigned long)(X))
+#define _SL(X) ((_sl )(unsigned long)(X))
+#define _UL(X) ((_ul )(unsigned long)(X))
+
+#define _PUC(X) ((_uc *)(X))
+#define _PUS(X) ((_us *)(X))
+#define _PSL(X) ((_sl *)(X))
+#define _PUL(X) ((_ul *)(X))
+
+#define _B(B) x86_emit_byte((B))
+#define _W(W) x86_emit_word((W))
+#define _L(L) x86_emit_long((L))
+#define _Q(Q) x86_emit_quad((Q))
+
+#define _MASK(N) ((unsigned)((1<<(N)))-1)
+#define _siP(N,I) (!((((unsigned)(I))^(((unsigned)(I))<<1))&~_MASK(N)))
+#define _uiP(N,I) (!(((unsigned)(I))&~_MASK(N)))
+#define _suiP(N,I) (_siP(N,I) | _uiP(N,I))
+
+#ifndef _ASM_SAFETY
+#define _ck_s(W,I) (_UL(I) & _MASK(W))
+#define _ck_u(W,I) (_UL(I) & _MASK(W))
+#define _ck_su(W,I) (_UL(I) & _MASK(W))
+#define _ck_d(W,I) (_UL(I) & _MASK(W))
+#else
+#define _ck_s(W,I) (_siP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0( "signed integer `"#I"' too large for "#W"-bit field"))
+#define _ck_u(W,I) (_uiP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0("unsigned integer `"#I"' too large for "#W"-bit field"))
+#define _ck_su(W,I) (_suiP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0( "integer `"#I"' too large for "#W"-bit field"))
+#define _ck_d(W,I) (_siP(W,I) ? (_UL(I) & _MASK(W)) : x86_emit_failure0( "displacement `"#I"' too large for "#W"-bit field"))
+#endif
+
+#define _s0P(I) ((I)==0)
+#define _s8P(I) _siP(8,I)
+#define _s16P(I) _siP(16,I)
+#define _u8P(I) _uiP(8,I)
+#define _u16P(I) _uiP(16,I)
+
+#define _su8(I) _ck_su(8,I)
+#define _su16(I) _ck_su(16,I)
+
+#define _s1(I) _ck_s( 1,I)
+#define _s2(I) _ck_s( 2,I)
+#define _s3(I) _ck_s( 3,I)
+#define _s4(I) _ck_s( 4,I)
+#define _s5(I) _ck_s( 5,I)
+#define _s6(I) _ck_s( 6,I)
+#define _s7(I) _ck_s( 7,I)
+#define _s8(I) _ck_s( 8,I)
+#define _s9(I) _ck_s( 9,I)
+#define _s10(I) _ck_s(10,I)
+#define _s11(I) _ck_s(11,I)
+#define _s12(I) _ck_s(12,I)
+#define _s13(I) _ck_s(13,I)
+#define _s14(I) _ck_s(14,I)
+#define _s15(I) _ck_s(15,I)
+#define _s16(I) _ck_s(16,I)
+#define _s17(I) _ck_s(17,I)
+#define _s18(I) _ck_s(18,I)
+#define _s19(I) _ck_s(19,I)
+#define _s20(I) _ck_s(20,I)
+#define _s21(I) _ck_s(21,I)
+#define _s22(I) _ck_s(22,I)
+#define _s23(I) _ck_s(23,I)
+#define _s24(I) _ck_s(24,I)
+#define _s25(I) _ck_s(25,I)
+#define _s26(I) _ck_s(26,I)
+#define _s27(I) _ck_s(27,I)
+#define _s28(I) _ck_s(28,I)
+#define _s29(I) _ck_s(29,I)
+#define _s30(I) _ck_s(30,I)
+#define _s31(I) _ck_s(31,I)
+#define _u1(I) _ck_u( 1,I)
+#define _u2(I) _ck_u( 2,I)
+#define _u3(I) _ck_u( 3,I)
+#define _u4(I) _ck_u( 4,I)
+#define _u5(I) _ck_u( 5,I)
+#define _u6(I) _ck_u( 6,I)
+#define _u7(I) _ck_u( 7,I)
+#define _u8(I) _ck_u( 8,I)
+#define _u9(I) _ck_u( 9,I)
+#define _u10(I) _ck_u(10,I)
+#define _u11(I) _ck_u(11,I)
+#define _u12(I) _ck_u(12,I)
+#define _u13(I) _ck_u(13,I)
+#define _u14(I) _ck_u(14,I)
+#define _u15(I) _ck_u(15,I)
+#define _u16(I) _ck_u(16,I)
+#define _u17(I) _ck_u(17,I)
+#define _u18(I) _ck_u(18,I)
+#define _u19(I) _ck_u(19,I)
+#define _u20(I) _ck_u(20,I)
+#define _u21(I) _ck_u(21,I)
+#define _u22(I) _ck_u(22,I)
+#define _u23(I) _ck_u(23,I)
+#define _u24(I) _ck_u(24,I)
+#define _u25(I) _ck_u(25,I)
+#define _u26(I) _ck_u(26,I)
+#define _u27(I) _ck_u(27,I)
+#define _u28(I) _ck_u(28,I)
+#define _u29(I) _ck_u(29,I)
+#define _u30(I) _ck_u(30,I)
+#define _u31(I) _ck_u(31,I)
+
+/* ========================================================================= */
+/* --- ASSEMBLER ----------------------------------------------------------- */
+/* ========================================================================= */
+
+#define _b00 0
+#define _b01 1
+#define _b10 2
+#define _b11 3
+
+#define _b000 0
+#define _b001 1
+#define _b010 2
+#define _b011 3
+#define _b100 4
+#define _b101 5
+#define _b110 6
+#define _b111 7
+
+#define _OFF4(D) (_UL(D) - _UL(x86_get_target()))
+#define _CKD8(D) _ck_d(8, ((_uc) _OFF4(D)) )
+
+#define _D8(D) (_B(0), ((*(_PUC(x86_get_target())-1))= _CKD8(D)))
+#define _D32(D) (_L(0), ((*(_PUL(x86_get_target())-1))= _OFF4(D)))
+
+#ifndef _ASM_SAFETY
+# define _M(M) (M)
+# define _r(R) (R)
+# define _m(M) (M)
+# define _s(S) (S)
+# define _i(I) (I)
+# define _b(B) (B)
+#else
+# define _M(M) (((M)>3) ? x86_emit_failure0("internal error: mod = " #M) : (M))
+# define _r(R) (((R)>7) ? x86_emit_failure0("internal error: reg = " #R) : (R))
+# define _m(M) (((M)>7) ? x86_emit_failure0("internal error: r/m = " #M) : (M))
+# define _s(S) (((S)>3) ? x86_emit_failure0("internal error: memory scale = " #S) : (S))
+# define _i(I) (((I)>7) ? x86_emit_failure0("internal error: memory index = " #I) : (I))
+# define _b(B) (((B)>7) ? x86_emit_failure0("internal error: memory base = " #B) : (B))
+#endif
+
+#define _Mrm(Md,R,M) _B((_M(Md)<<6)|(_r(R)<<3)|_m(M))
+#define _SIB(Sc,I, B) _B((_s(Sc)<<6)|(_i(I)<<3)|_b(B))
+
+#define _SCL(S) ((((S)==1) ? _b00 : \
+ (((S)==2) ? _b01 : \
+ (((S)==4) ? _b10 : \
+ (((S)==8) ? _b11 : x86_emit_failure0("illegal scale: " #S))))))
+
+
+/* --- Memory subformats - urgh! ------------------------------------------- */
+
+/* _r_D() is RIP addressing mode if X86_TARGET_64BIT, use _r_DSIB() instead */
+#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_L((_sl)(D)))
+#define _r_DSIB(R, D ) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(1),_b100 ,_b101 ),_L((_sl)(D)))
+#define _r_0B( R, B ) (_Mrm(_b00,_rN(R),_rA(B)) )
+#define _r_0BIS(R, B,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)) )
+#define _r_1B( R, D,B ) (_Mrm(_b01,_rN(R),_rA(B)) ,_B((_sc)(D)))
+#define _r_1BIS(R, D,B,I,S) (_Mrm(_b01,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_B((_sc)(D)))
+#define _r_4B( R, D,B ) (_Mrm(_b10,_rN(R),_rA(B)) ,_L((_sl)(D)))
+#define _r_4IS( R, D,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_b101 ),_L((_sl)(D)))
+#define _r_4BIS(R, D,B,I,S) (_Mrm(_b10,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_L((_sl)(D)))
+
+#define _r_DB( R, D,B ) ((_s0P(D) && (!_rbp13P(B)) ? _r_0B (R, B ) : (_s8P(D) ? _r_1B( R,D,B ) : _r_4B( R,D,B ))))
+#define _r_DBIS(R, D,B,I,S) ((_s0P(D) && (!_rbp13P(B)) ? _r_0BIS(R, B,I,S) : (_s8P(D) ? _r_1BIS(R,D,B,I,S) : _r_4BIS(R,D,B,I,S))))
+
+/* Use RIP-addressing in 64-bit mode, if possible */
+#define _x86_RIP_addressing_possible(D,O) (X86_RIP_RELATIVE_ADDR && \
+ ((uintptr)x86_get_target() + 4 + (O) - (D) <= 0xffffffff))
+
+#define _r_X( R, D,B,I,S,O) (_r0P(I) ? (_r0P(B) ? (!X86_TARGET_64BIT ? _r_D(R,D) : \
+ (_x86_RIP_addressing_possible(D, O) ? \
+ _r_D(R, (D) - ((uintptr)x86_get_target() + 4 + (O))) : \
+ _r_DSIB(R,D))) : \
+ (_rIP(B) ? _r_D (R,D ) : \
+ (_rsp12P(B) ? _r_DBIS(R,D,_rSP(),_rSP(),1) : \
+ _r_DB (R,D, B )))) : \
+ (_r0P(B) ? _r_4IS (R,D, I,S) : \
+ (!_rspP(I) ? _r_DBIS(R,D, B, I,S) : \
+ x86_emit_failure("illegal index register: %esp"))))
+
+
+/* --- Instruction formats ------------------------------------------------- */
+
+#define _m32only(X) (! X86_TARGET_64BIT ? X : x86_emit_failure("invalid instruction in 64-bit mode"))
+#define _m64only(X) ( X86_TARGET_64BIT ? X : x86_emit_failure("invalid instruction in 32-bit mode"))
+#define _m64(X) ( X86_TARGET_64BIT ? X : ((void)0) )
+
+/* _format Opcd ModR/M dN(rB,rI,Sc) imm... */
+
+#define _d16() ( _B(0x66 ) )
+#define _O( OP ) ( _B( OP ) )
+#define _Or( OP,R ) ( _B( (OP)|_r(R)) )
+#define _OO( OP ) ( _B((OP)>>8), _B(( (OP) )&0xff) )
+#define _OOr( OP,R ) ( _B((OP)>>8), _B(( (OP)|_r(R))&0xff) )
+#define _Os( OP,B ) ( _s8P(B) ? _B(((OP)|_b10)) : _B(OP) )
+#define _sW( W ) ( _s8P(W) ? _B(W):_W(W) )
+#define _sL( L ) ( _s8P(L) ? _B(L):_L(L) )
+#define _sWO( W ) ( _s8P(W) ? 1 : 2 )
+#define _sLO( L ) ( _s8P(L) ? 1 : 4 )
+#define _O_B( OP ,B ) ( _O ( OP ) ,_B(B) )
+#define _O_W( OP ,W ) ( _O ( OP ) ,_W(W) )
+#define _O_L( OP ,L ) ( _O ( OP ) ,_L(L) )
+#define _OO_L( OP ,L ) ( _OO ( OP ) ,_L(L) )
+#define _O_D8( OP ,D ) ( _O ( OP ) ,_D8(D) )
+#define _O_D32( OP ,D ) ( _O ( OP ) ,_D32(D) )
+#define _OO_D32( OP ,D ) ( _OO ( OP ) ,_D32(D) )
+#define _Os_sW( OP ,W ) ( _Os ( OP,W) ,_sW(W) )
+#define _Os_sL( OP ,L ) ( _Os ( OP,L) ,_sL(L) )
+#define _O_W_B( OP ,W,B) ( _O ( OP ) ,_W(W),_B(B))
+#define _Or_B( OP,R ,B ) ( _Or ( OP,R) ,_B(B) )
+#define _Or_W( OP,R ,W ) ( _Or ( OP,R) ,_W(W) )
+#define _Or_L( OP,R ,L ) ( _Or ( OP,R) ,_L(L) )
+#define _Or_Q( OP,R ,Q ) ( _Or ( OP,R) ,_Q(Q) )
+#define _O_Mrm( OP ,MO,R,M ) ( _O ( OP ),_Mrm(MO,R,M ) )
+#define _OO_Mrm( OP ,MO,R,M ) ( _OO ( OP ),_Mrm(MO,R,M ) )
+#define _O_Mrm_B( OP ,MO,R,M ,B ) ( _O ( OP ),_Mrm(MO,R,M ) ,_B(B) )
+#define _O_Mrm_W( OP ,MO,R,M ,W ) ( _O ( OP ),_Mrm(MO,R,M ) ,_W(W) )
+#define _O_Mrm_L( OP ,MO,R,M ,L ) ( _O ( OP ),_Mrm(MO,R,M ) ,_L(L) )
+#define _OO_Mrm_B( OP ,MO,R,M ,B ) ( _OO ( OP ),_Mrm(MO,R,M ) ,_B(B) )
+#define _Os_Mrm_sW(OP ,MO,R,M ,W ) ( _Os ( OP,W),_Mrm(MO,R,M ),_sW(W) )
+#define _Os_Mrm_sL(OP ,MO,R,M ,L ) ( _Os ( OP,L),_Mrm(MO,R,M ),_sL(L) )
+#define _O_r_X( OP ,R ,MD,MB,MI,MS ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS,0) )
+#define _OO_r_X( OP ,R ,MD,MB,MI,MS ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS,0) )
+#define _O_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS,1) ,_B(B) )
+#define _O_r_X_W( OP ,R ,MD,MB,MI,MS,W ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS,2) ,_W(W) )
+#define _O_r_X_L( OP ,R ,MD,MB,MI,MS,L ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS,4) ,_L(L) )
+#define _OO_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS,1) ,_B(B) )
+#define _Os_r_X_sW(OP ,R ,MD,MB,MI,MS,W ) ( _Os ( OP,W),_r_X( R ,MD,MB,MI,MS,_sWO(W)),_sW(W))
+#define _Os_r_X_sL(OP ,R ,MD,MB,MI,MS,L ) ( _Os ( OP,L),_r_X( R ,MD,MB,MI,MS,_sLO(L)),_sL(L))
+#define _O_X_B( OP ,MD,MB,MI,MS,B ) ( _O_r_X_B( OP ,0 ,MD,MB,MI,MS ,B) )
+#define _O_X_W( OP ,MD,MB,MI,MS,W ) ( _O_r_X_W( OP ,0 ,MD,MB,MI,MS ,W) )
+#define _O_X_L( OP ,MD,MB,MI,MS,L ) ( _O_r_X_L( OP ,0 ,MD,MB,MI,MS ,L) )
+
+
+/* --- REX prefixes -------------------------------------------------------- */
+
+#define _VOID() ((void)0)
+#define _BIT(X) (!!(X))
+#define _d64(W,R,X,B) (_B(0x40|(W)<<3|(R)<<2|(X)<<1|(B)))
+
+#define __REXwrxb(L,W,R,X,B) ((W|R|X|B) || (L) ? _d64(W,R,X,B) : _VOID())
+#define __REXwrx_(L,W,R,X,MR) (__REXwrxb(L,W,R,X,_BIT(_rIP(MR)?0:_rXP(MR))))
+#define __REXw_x_(L,W,R,X,MR) (__REXwrx_(L,W,_BIT(_rXP(R)),X,MR))
+#define __REX_reg(RR) (__REXwrxb(0,0,0,00,_BIT(_rXP(RR))))
+#define __REX_mem(MB,MI) (__REXwrxb(0,0,0,_BIT(_rXP(MI)),_BIT(_rXP(MB))))
+
+// FIXME: can't mix new (SPL,BPL,SIL,DIL) with (AH,BH,CH,DH)
+#define _REXBrr(RR,MR) _m64(__REXw_x_(_r1e8lP(RR)||_r1e8lP(MR),0,RR,0,MR))
+#define _REXBmr(MB,MI,RD) _m64(__REXw_x_(_r1e8lP(RD)||_r1e8lP(MB),0,RD,_BIT(_rXP(MI)),MB))
+#define _REXBrm(RS,MB,MI) _REXBmr(MB,MI,RS)
+
+#define _REXBLrr(RR,MR) _m64(__REXw_x_(_r1e8lP(MR),0,RR,0,MR))
+#define _REXLrr(RR,MR) _m64(__REXw_x_(0,0,RR,0,MR))
+#define _REXLmr(MB,MI,RD) _m64(__REXw_x_(0,0,RD,_BIT(_rXP(MI)),MB))
+#define _REXLrm(RS,MB,MI) _REXLmr(MB,MI,RS)
+#define _REXLr(RR) _m64(__REX_reg(RR))
+#define _REXLm(MB,MI) _m64(__REX_mem(MB,MI))
+
+#define _REXQrr(RR,MR) _m64only(__REXw_x_(0,1,RR,0,MR))
+#define _REXQmr(MB,MI,RD) _m64only(__REXw_x_(0,1,RD,_BIT(_rXP(MI)),MB))
+#define _REXQrm(RS,MB,MI) _REXQmr(MB,MI,RS)
+#define _REXQr(RR) _m64only(__REX_reg(RR))
+#define _REXQm(MB,MI) _m64only(__REX_mem(MB,MI))
+
+
+/* ========================================================================= */
+/* --- Fully-qualified intrinsic instructions ------------------------------ */
+/* ========================================================================= */
+
+/* OPCODE + i = immediate operand
+ * + r = register operand
+ * + m = memory operand (disp,base,index,scale)
+ * + sr/sm = a star preceding a register or memory
+ * + 0 = top of stack register (for FPU instructions)
+ *
+ * NOTE in x86-64 mode: a memory operand with only a valid
+ * displacement value will lead to the expect absolute mode. If
+ * RIP addressing is necessary, X86_RIP shall be used as the base
+ * register argument.
+ */
+
+/* --- ALU instructions ---------------------------------------------------- */
+
+enum {
+ X86_ADD = 0,
+ X86_OR = 1,
+ X86_ADC = 2,
+ X86_SBB = 3,
+ X86_AND = 4,
+ X86_SUB = 5,
+ X86_XOR = 6,
+ X86_CMP = 7,
+};
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define _ALUBrr(OP,RS, RD) (_REXBrr(RS, RD), _O_Mrm (((OP) << 3) ,_b11,_r1(RS),_r1(RD) ))
+#define _ALUBmr(OP, MD, MB, MI, MS, RD) (_REXBmr(MB, MI, RD), _O_r_X (((OP) << 3) + 2 ,_r1(RD) ,MD,MB,MI,MS ))
+#define _ALUBrm(OP, RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (((OP) << 3) ,_r1(RS) ,MD,MB,MI,MS ))
+#define _ALUBir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AL) ? \
+ (_REXBrr(0, RD), _O_B (((OP) << 3) + 4 ,_su8(IM))) : \
+ (_REXBrr(0, RD), _O_Mrm_B (0x80 ,_b11,OP ,_r1(RD) ,_su8(IM))) )
+#define _ALUBim(OP, IM, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X_B (0x80 ,OP ,MD,MB,MI,MS ,_su8(IM)))
+
+#define _ALUWrr(OP, RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (((OP) << 3) + 1,_b11,_r2(RS),_r2(RD) ))
+#define _ALUWmr(OP, MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _O_r_X (((OP) << 3) + 3 ,_r2(RD) ,MD,MB,MI,MS ))
+#define _ALUWrm(OP, RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (((OP) << 3) + 1 ,_r2(RS) ,MD,MB,MI,MS ))
+#define _ALUWir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AX) ? \
+ (_d16(), _REXLrr(0, RD), _O_W (((OP) << 3) + 5 ,_su16(IM))) : \
+ (_d16(), _REXLrr(0, RD), _Os_Mrm_sW (0x81 ,_b11,OP ,_r2(RD) ,_su16(IM))) )
+#define _ALUWim(OP, IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _Os_r_X_sW (0x81 ,OP ,MD,MB,MI,MS ,_su16(IM)))
+
+#define _ALULrr(OP, RS, RD) (_REXLrr(RS, RD), _O_Mrm (((OP) << 3) + 1,_b11,_r4(RS),_r4(RD) ))
+#define _ALULmr(OP, MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _O_r_X (((OP) << 3) + 3 ,_r4(RD) ,MD,MB,MI,MS ))
+#define _ALULrm(OP, RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (((OP) << 3) + 1 ,_r4(RS) ,MD,MB,MI,MS ))
+#define _ALULir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_EAX) ? \
+ (_REXLrr(0, RD), _O_L (((OP) << 3) + 5 ,IM )) : \
+ (_REXLrr(0, RD), _Os_Mrm_sL (0x81 ,_b11,OP ,_r4(RD) ,IM )) )
+#define _ALULim(OP, IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _Os_r_X_sL (0x81 ,OP ,MD,MB,MI,MS ,IM ))
+
+#define _ALUQrr(OP, RS, RD) (_REXQrr(RS, RD), _O_Mrm (((OP) << 3) + 1,_b11,_r8(RS),_r8(RD) ))
+#define _ALUQmr(OP, MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _O_r_X (((OP) << 3) + 3 ,_r8(RD) ,MD,MB,MI,MS ))
+#define _ALUQrm(OP, RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (((OP) << 3) + 1 ,_r8(RS) ,MD,MB,MI,MS ))
+#define _ALUQir(OP, IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_RAX) ? \
+ (_REXQrr(0, RD), _O_L (((OP) << 3) + 5 ,IM )) : \
+ (_REXQrr(0, RD), _Os_Mrm_sL (0x81 ,_b11,OP ,_r8(RD) ,IM )) )
+#define _ALUQim(OP, IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _Os_r_X_sL (0x81 ,OP ,MD,MB,MI,MS ,IM ))
+
+#define ADCBrr(RS, RD) _ALUBrr(X86_ADC, RS, RD)
+#define ADCBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_ADC, MD, MB, MI, MS, RD)
+#define ADCBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_ADC, RS, MD, MB, MI, MS)
+#define ADCBir(IM, RD) _ALUBir(X86_ADC, IM, RD)
+#define ADCBim(IM, MD, MB, MI, MS) _ALUBim(X86_ADC, IM, MD, MB, MI, MS)
+
+#define ADCWrr(RS, RD) _ALUWrr(X86_ADC, RS, RD)
+#define ADCWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_ADC, MD, MB, MI, MS, RD)
+#define ADCWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_ADC, RS, MD, MB, MI, MS)
+#define ADCWir(IM, RD) _ALUWir(X86_ADC, IM, RD)
+#define ADCWim(IM, MD, MB, MI, MS) _ALUWim(X86_ADC, IM, MD, MB, MI, MS)
+
+#define ADCLrr(RS, RD) _ALULrr(X86_ADC, RS, RD)
+#define ADCLmr(MD, MB, MI, MS, RD) _ALULmr(X86_ADC, MD, MB, MI, MS, RD)
+#define ADCLrm(RS, MD, MB, MI, MS) _ALULrm(X86_ADC, RS, MD, MB, MI, MS)
+#define ADCLir(IM, RD) _ALULir(X86_ADC, IM, RD)
+#define ADCLim(IM, MD, MB, MI, MS) _ALULim(X86_ADC, IM, MD, MB, MI, MS)
+
+#define ADCQrr(RS, RD) _ALUQrr(X86_ADC, RS, RD)
+#define ADCQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_ADC, MD, MB, MI, MS, RD)
+#define ADCQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_ADC, RS, MD, MB, MI, MS)
+#define ADCQir(IM, RD) _ALUQir(X86_ADC, IM, RD)
+#define ADCQim(IM, MD, MB, MI, MS) _ALUQim(X86_ADC, IM, MD, MB, MI, MS)
+
+#define ADDBrr(RS, RD) _ALUBrr(X86_ADD, RS, RD)
+#define ADDBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_ADD, MD, MB, MI, MS, RD)
+#define ADDBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_ADD, RS, MD, MB, MI, MS)
+#define ADDBir(IM, RD) _ALUBir(X86_ADD, IM, RD)
+#define ADDBim(IM, MD, MB, MI, MS) _ALUBim(X86_ADD, IM, MD, MB, MI, MS)
+
+#define ADDWrr(RS, RD) _ALUWrr(X86_ADD, RS, RD)
+#define ADDWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_ADD, MD, MB, MI, MS, RD)
+#define ADDWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_ADD, RS, MD, MB, MI, MS)
+#define ADDWir(IM, RD) _ALUWir(X86_ADD, IM, RD)
+#define ADDWim(IM, MD, MB, MI, MS) _ALUWim(X86_ADD, IM, MD, MB, MI, MS)
+
+#define ADDLrr(RS, RD) _ALULrr(X86_ADD, RS, RD)
+#define ADDLmr(MD, MB, MI, MS, RD) _ALULmr(X86_ADD, MD, MB, MI, MS, RD)
+#define ADDLrm(RS, MD, MB, MI, MS) _ALULrm(X86_ADD, RS, MD, MB, MI, MS)
+#define ADDLir(IM, RD) _ALULir(X86_ADD, IM, RD)
+#define ADDLim(IM, MD, MB, MI, MS) _ALULim(X86_ADD, IM, MD, MB, MI, MS)
+
+#define ADDQrr(RS, RD) _ALUQrr(X86_ADD, RS, RD)
+#define ADDQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_ADD, MD, MB, MI, MS, RD)
+#define ADDQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_ADD, RS, MD, MB, MI, MS)
+#define ADDQir(IM, RD) _ALUQir(X86_ADD, IM, RD)
+#define ADDQim(IM, MD, MB, MI, MS) _ALUQim(X86_ADD, IM, MD, MB, MI, MS)
+
+#define ANDBrr(RS, RD) _ALUBrr(X86_AND, RS, RD)
+#define ANDBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_AND, MD, MB, MI, MS, RD)
+#define ANDBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_AND, RS, MD, MB, MI, MS)
+#define ANDBir(IM, RD) _ALUBir(X86_AND, IM, RD)
+#define ANDBim(IM, MD, MB, MI, MS) _ALUBim(X86_AND, IM, MD, MB, MI, MS)
+
+#define ANDWrr(RS, RD) _ALUWrr(X86_AND, RS, RD)
+#define ANDWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_AND, MD, MB, MI, MS, RD)
+#define ANDWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_AND, RS, MD, MB, MI, MS)
+#define ANDWir(IM, RD) _ALUWir(X86_AND, IM, RD)
+#define ANDWim(IM, MD, MB, MI, MS) _ALUWim(X86_AND, IM, MD, MB, MI, MS)
+
+#define ANDLrr(RS, RD) _ALULrr(X86_AND, RS, RD)
+#define ANDLmr(MD, MB, MI, MS, RD) _ALULmr(X86_AND, MD, MB, MI, MS, RD)
+#define ANDLrm(RS, MD, MB, MI, MS) _ALULrm(X86_AND, RS, MD, MB, MI, MS)
+#define ANDLir(IM, RD) _ALULir(X86_AND, IM, RD)
+#define ANDLim(IM, MD, MB, MI, MS) _ALULim(X86_AND, IM, MD, MB, MI, MS)
+
+#define ANDQrr(RS, RD) _ALUQrr(X86_AND, RS, RD)
+#define ANDQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_AND, MD, MB, MI, MS, RD)
+#define ANDQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_AND, RS, MD, MB, MI, MS)
+#define ANDQir(IM, RD) _ALUQir(X86_AND, IM, RD)
+#define ANDQim(IM, MD, MB, MI, MS) _ALUQim(X86_AND, IM, MD, MB, MI, MS)
+
+#define CMPBrr(RS, RD) _ALUBrr(X86_CMP, RS, RD)
+#define CMPBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_CMP, MD, MB, MI, MS, RD)
+#define CMPBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_CMP, RS, MD, MB, MI, MS)
+#define CMPBir(IM, RD) _ALUBir(X86_CMP, IM, RD)
+#define CMPBim(IM, MD, MB, MI, MS) _ALUBim(X86_CMP, IM, MD, MB, MI, MS)
+
+#define CMPWrr(RS, RD) _ALUWrr(X86_CMP, RS, RD)
+#define CMPWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_CMP, MD, MB, MI, MS, RD)
+#define CMPWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_CMP, RS, MD, MB, MI, MS)
+#define CMPWir(IM, RD) _ALUWir(X86_CMP, IM, RD)
+#define CMPWim(IM, MD, MB, MI, MS) _ALUWim(X86_CMP, IM, MD, MB, MI, MS)
+
+#define CMPLrr(RS, RD) _ALULrr(X86_CMP, RS, RD)
+#define CMPLmr(MD, MB, MI, MS, RD) _ALULmr(X86_CMP, MD, MB, MI, MS, RD)
+#define CMPLrm(RS, MD, MB, MI, MS) _ALULrm(X86_CMP, RS, MD, MB, MI, MS)
+#define CMPLir(IM, RD) _ALULir(X86_CMP, IM, RD)
+#define CMPLim(IM, MD, MB, MI, MS) _ALULim(X86_CMP, IM, MD, MB, MI, MS)
+
+#define CMPQrr(RS, RD) _ALUQrr(X86_CMP, RS, RD)
+#define CMPQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_CMP, MD, MB, MI, MS, RD)
+#define CMPQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_CMP, RS, MD, MB, MI, MS)
+#define CMPQir(IM, RD) _ALUQir(X86_CMP, IM, RD)
+#define CMPQim(IM, MD, MB, MI, MS) _ALUQim(X86_CMP, IM, MD, MB, MI, MS)
+
+#define ORBrr(RS, RD) _ALUBrr(X86_OR, RS, RD)
+#define ORBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_OR, MD, MB, MI, MS, RD)
+#define ORBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_OR, RS, MD, MB, MI, MS)
+#define ORBir(IM, RD) _ALUBir(X86_OR, IM, RD)
+#define ORBim(IM, MD, MB, MI, MS) _ALUBim(X86_OR, IM, MD, MB, MI, MS)
+
+#define ORWrr(RS, RD) _ALUWrr(X86_OR, RS, RD)
+#define ORWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_OR, MD, MB, MI, MS, RD)
+#define ORWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_OR, RS, MD, MB, MI, MS)
+#define ORWir(IM, RD) _ALUWir(X86_OR, IM, RD)
+#define ORWim(IM, MD, MB, MI, MS) _ALUWim(X86_OR, IM, MD, MB, MI, MS)
+
+#define ORLrr(RS, RD) _ALULrr(X86_OR, RS, RD)
+#define ORLmr(MD, MB, MI, MS, RD) _ALULmr(X86_OR, MD, MB, MI, MS, RD)
+#define ORLrm(RS, MD, MB, MI, MS) _ALULrm(X86_OR, RS, MD, MB, MI, MS)
+#define ORLir(IM, RD) _ALULir(X86_OR, IM, RD)
+#define ORLim(IM, MD, MB, MI, MS) _ALULim(X86_OR, IM, MD, MB, MI, MS)
+
+#define ORQrr(RS, RD) _ALUQrr(X86_OR, RS, RD)
+#define ORQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_OR, MD, MB, MI, MS, RD)
+#define ORQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_OR, RS, MD, MB, MI, MS)
+#define ORQir(IM, RD) _ALUQir(X86_OR, IM, RD)
+#define ORQim(IM, MD, MB, MI, MS) _ALUQim(X86_OR, IM, MD, MB, MI, MS)
+
+#define SBBBrr(RS, RD) _ALUBrr(X86_SBB, RS, RD)
+#define SBBBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_SBB, MD, MB, MI, MS, RD)
+#define SBBBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_SBB, RS, MD, MB, MI, MS)
+#define SBBBir(IM, RD) _ALUBir(X86_SBB, IM, RD)
+#define SBBBim(IM, MD, MB, MI, MS) _ALUBim(X86_SBB, IM, MD, MB, MI, MS)
+
+#define SBBWrr(RS, RD) _ALUWrr(X86_SBB, RS, RD)
+#define SBBWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_SBB, MD, MB, MI, MS, RD)
+#define SBBWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_SBB, RS, MD, MB, MI, MS)
+#define SBBWir(IM, RD) _ALUWir(X86_SBB, IM, RD)
+#define SBBWim(IM, MD, MB, MI, MS) _ALUWim(X86_SBB, IM, MD, MB, MI, MS)
+
+#define SBBLrr(RS, RD) _ALULrr(X86_SBB, RS, RD)
+#define SBBLmr(MD, MB, MI, MS, RD) _ALULmr(X86_SBB, MD, MB, MI, MS, RD)
+#define SBBLrm(RS, MD, MB, MI, MS) _ALULrm(X86_SBB, RS, MD, MB, MI, MS)
+#define SBBLir(IM, RD) _ALULir(X86_SBB, IM, RD)
+#define SBBLim(IM, MD, MB, MI, MS) _ALULim(X86_SBB, IM, MD, MB, MI, MS)
+
+#define SBBQrr(RS, RD) _ALUQrr(X86_SBB, RS, RD)
+#define SBBQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_SBB, MD, MB, MI, MS, RD)
+#define SBBQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_SBB, RS, MD, MB, MI, MS)
+#define SBBQir(IM, RD) _ALUQir(X86_SBB, IM, RD)
+#define SBBQim(IM, MD, MB, MI, MS) _ALUQim(X86_SBB, IM, MD, MB, MI, MS)
+
+#define SUBBrr(RS, RD) _ALUBrr(X86_SUB, RS, RD)
+#define SUBBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_SUB, MD, MB, MI, MS, RD)
+#define SUBBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_SUB, RS, MD, MB, MI, MS)
+#define SUBBir(IM, RD) _ALUBir(X86_SUB, IM, RD)
+#define SUBBim(IM, MD, MB, MI, MS) _ALUBim(X86_SUB, IM, MD, MB, MI, MS)
+
+#define SUBWrr(RS, RD) _ALUWrr(X86_SUB, RS, RD)
+#define SUBWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_SUB, MD, MB, MI, MS, RD)
+#define SUBWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_SUB, RS, MD, MB, MI, MS)
+#define SUBWir(IM, RD) _ALUWir(X86_SUB, IM, RD)
+#define SUBWim(IM, MD, MB, MI, MS) _ALUWim(X86_SUB, IM, MD, MB, MI, MS)
+
+#define SUBLrr(RS, RD) _ALULrr(X86_SUB, RS, RD)
+#define SUBLmr(MD, MB, MI, MS, RD) _ALULmr(X86_SUB, MD, MB, MI, MS, RD)
+#define SUBLrm(RS, MD, MB, MI, MS) _ALULrm(X86_SUB, RS, MD, MB, MI, MS)
+#define SUBLir(IM, RD) _ALULir(X86_SUB, IM, RD)
+#define SUBLim(IM, MD, MB, MI, MS) _ALULim(X86_SUB, IM, MD, MB, MI, MS)
+
+#define SUBQrr(RS, RD) _ALUQrr(X86_SUB, RS, RD)
+#define SUBQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_SUB, MD, MB, MI, MS, RD)
+#define SUBQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_SUB, RS, MD, MB, MI, MS)
+#define SUBQir(IM, RD) _ALUQir(X86_SUB, IM, RD)
+#define SUBQim(IM, MD, MB, MI, MS) _ALUQim(X86_SUB, IM, MD, MB, MI, MS)
+
+#define XORBrr(RS, RD) _ALUBrr(X86_XOR, RS, RD)
+#define XORBmr(MD, MB, MI, MS, RD) _ALUBmr(X86_XOR, MD, MB, MI, MS, RD)
+#define XORBrm(RS, MD, MB, MI, MS) _ALUBrm(X86_XOR, RS, MD, MB, MI, MS)
+#define XORBir(IM, RD) _ALUBir(X86_XOR, IM, RD)
+#define XORBim(IM, MD, MB, MI, MS) _ALUBim(X86_XOR, IM, MD, MB, MI, MS)
+
+#define XORWrr(RS, RD) _ALUWrr(X86_XOR, RS, RD)
+#define XORWmr(MD, MB, MI, MS, RD) _ALUWmr(X86_XOR, MD, MB, MI, MS, RD)
+#define XORWrm(RS, MD, MB, MI, MS) _ALUWrm(X86_XOR, RS, MD, MB, MI, MS)
+#define XORWir(IM, RD) _ALUWir(X86_XOR, IM, RD)
+#define XORWim(IM, MD, MB, MI, MS) _ALUWim(X86_XOR, IM, MD, MB, MI, MS)
+
+#define XORLrr(RS, RD) _ALULrr(X86_XOR, RS, RD)
+#define XORLmr(MD, MB, MI, MS, RD) _ALULmr(X86_XOR, MD, MB, MI, MS, RD)
+#define XORLrm(RS, MD, MB, MI, MS) _ALULrm(X86_XOR, RS, MD, MB, MI, MS)
+#define XORLir(IM, RD) _ALULir(X86_XOR, IM, RD)
+#define XORLim(IM, MD, MB, MI, MS) _ALULim(X86_XOR, IM, MD, MB, MI, MS)
+
+#define XORQrr(RS, RD) _ALUQrr(X86_XOR, RS, RD)
+#define XORQmr(MD, MB, MI, MS, RD) _ALUQmr(X86_XOR, MD, MB, MI, MS, RD)
+#define XORQrm(RS, MD, MB, MI, MS) _ALUQrm(X86_XOR, RS, MD, MB, MI, MS)
+#define XORQir(IM, RD) _ALUQir(X86_XOR, IM, RD)
+#define XORQim(IM, MD, MB, MI, MS) _ALUQim(X86_XOR, IM, MD, MB, MI, MS)
+
+
+/* --- Shift/Rotate instructions ------------------------------------------- */
+
+enum {
+ X86_ROL = 0,
+ X86_ROR = 1,
+ X86_RCL = 2,
+ X86_RCR = 3,
+ X86_SHL = 4,
+ X86_SHR = 5,
+ X86_SAR = 7,
+};
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define _ROTSHIBir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_REXBrr(0, RD), _O_Mrm (0xd0 ,_b11,OP,_r1(RD) )) : \
+ (_REXBrr(0, RD), _O_Mrm_B (0xc0 ,_b11,OP,_r1(RD) ,_u8(IM))) )
+#define _ROTSHIBim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_REXBrm(0, MB, MI), _O_r_X (0xd0 ,OP ,MD,MB,MI,MS )) : \
+ (_REXBrm(0, MB, MI), _O_r_X_B (0xc0 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
+#define _ROTSHIBrr(OP,RS,RD) (((RS) == X86_CL) ? \
+ (_REXBrr(RS, RD), _O_Mrm (0xd2 ,_b11,OP,_r1(RD) )) : \
+ x86_emit_failure("source register must be CL" ) )
+#define _ROTSHIBrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
+ (_REXBrm(RS, MB, MI), _O_r_X (0xd2 ,OP ,MD,MB,MI,MS )) : \
+ x86_emit_failure("source register must be CL" ) )
+
+#define _ROTSHIWir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_d16(), _REXLrr(0, RD), _O_Mrm (0xd1 ,_b11,OP,_r2(RD) )) : \
+ (_d16(), _REXLrr(0, RD), _O_Mrm_B (0xc1 ,_b11,OP,_r2(RD) ,_u8(IM))) )
+#define _ROTSHIWim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_d16(), _REXLrm(0, MB, MI), _O_r_X (0xd1 ,OP ,MD,MB,MI,MS )) : \
+ (_d16(), _REXLrm(0, MB, MI), _O_r_X_B (0xc1 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
+#define _ROTSHIWrr(OP,RS,RD) (((RS) == X86_CL) ? \
+ (_d16(), _REXLrr(RS, RD), _O_Mrm (0xd3 ,_b11,OP,_r2(RD) )) : \
+ x86_emit_failure("source register must be CL" ) )
+#define _ROTSHIWrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
+ (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0xd3 ,OP ,MD,MB,MI,MS )) : \
+ x86_emit_failure("source register must be CL" ) )
+
+#define _ROTSHILir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_REXLrr(0, RD), _O_Mrm (0xd1 ,_b11,OP,_r4(RD) )) : \
+ (_REXLrr(0, RD), _O_Mrm_B (0xc1 ,_b11,OP,_r4(RD) ,_u8(IM))) )
+#define _ROTSHILim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_REXLrm(0, MB, MI), _O_r_X (0xd1 ,OP ,MD,MB,MI,MS )) : \
+ (_REXLrm(0, MB, MI), _O_r_X_B (0xc1 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
+#define _ROTSHILrr(OP,RS,RD) (((RS) == X86_CL) ? \
+ (_REXLrr(RS, RD), _O_Mrm (0xd3 ,_b11,OP,_r4(RD) )) : \
+ x86_emit_failure("source register must be CL" ) )
+#define _ROTSHILrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
+ (_REXLrm(RS, MB, MI), _O_r_X (0xd3 ,OP ,MD,MB,MI,MS )) : \
+ x86_emit_failure("source register must be CL" ) )
+
+#define _ROTSHIQir(OP,IM,RD) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_REXQrr(0, RD), _O_Mrm (0xd1 ,_b11,OP,_r8(RD) )) : \
+ (_REXQrr(0, RD), _O_Mrm_B (0xc1 ,_b11,OP,_r8(RD) ,_u8(IM))) )
+#define _ROTSHIQim(OP,IM,MD,MB,MI,MS) (X86_OPTIMIZE_ROTSHI && ((IM) == 1) ? \
+ (_REXQrm(0, MB, MI), _O_r_X (0xd1 ,OP ,MD,MB,MI,MS )) : \
+ (_REXQrm(0, MB, MI), _O_r_X_B (0xc1 ,OP ,MD,MB,MI,MS ,_u8(IM))) )
+#define _ROTSHIQrr(OP,RS,RD) (((RS) == X86_CL) ? \
+ (_REXQrr(RS, RD), _O_Mrm (0xd3 ,_b11,OP,_r8(RD) )) : \
+ x86_emit_failure("source register must be CL" ) )
+#define _ROTSHIQrm(OP,RS,MD,MB,MI,MS) (((RS) == X86_CL) ? \
+ (_REXQrm(RS, MB, MI), _O_r_X (0xd3 ,OP ,MD,MB,MI,MS )) : \
+ x86_emit_failure("source register must be CL" ) )
+
+#define ROLBir(IM, RD) _ROTSHIBir(X86_ROL, IM, RD)
+#define ROLBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_ROL, IM, MD, MB, MI, MS)
+#define ROLBrr(RS, RD) _ROTSHIBrr(X86_ROL, RS, RD)
+#define ROLBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_ROL, RS, MD, MB, MI, MS)
+
+#define ROLWir(IM, RD) _ROTSHIWir(X86_ROL, IM, RD)
+#define ROLWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_ROL, IM, MD, MB, MI, MS)
+#define ROLWrr(RS, RD) _ROTSHIWrr(X86_ROL, RS, RD)
+#define ROLWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_ROL, RS, MD, MB, MI, MS)
+
+#define ROLLir(IM, RD) _ROTSHILir(X86_ROL, IM, RD)
+#define ROLLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_ROL, IM, MD, MB, MI, MS)
+#define ROLLrr(RS, RD) _ROTSHILrr(X86_ROL, RS, RD)
+#define ROLLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_ROL, RS, MD, MB, MI, MS)
+
+#define ROLQir(IM, RD) _ROTSHIQir(X86_ROL, IM, RD)
+#define ROLQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_ROL, IM, MD, MB, MI, MS)
+#define ROLQrr(RS, RD) _ROTSHIQrr(X86_ROL, RS, RD)
+#define ROLQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_ROL, RS, MD, MB, MI, MS)
+
+#define RORBir(IM, RD) _ROTSHIBir(X86_ROR, IM, RD)
+#define RORBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_ROR, IM, MD, MB, MI, MS)
+#define RORBrr(RS, RD) _ROTSHIBrr(X86_ROR, RS, RD)
+#define RORBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_ROR, RS, MD, MB, MI, MS)
+
+#define RORWir(IM, RD) _ROTSHIWir(X86_ROR, IM, RD)
+#define RORWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_ROR, IM, MD, MB, MI, MS)
+#define RORWrr(RS, RD) _ROTSHIWrr(X86_ROR, RS, RD)
+#define RORWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_ROR, RS, MD, MB, MI, MS)
+
+#define RORLir(IM, RD) _ROTSHILir(X86_ROR, IM, RD)
+#define RORLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_ROR, IM, MD, MB, MI, MS)
+#define RORLrr(RS, RD) _ROTSHILrr(X86_ROR, RS, RD)
+#define RORLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_ROR, RS, MD, MB, MI, MS)
+
+#define RORQir(IM, RD) _ROTSHIQir(X86_ROR, IM, RD)
+#define RORQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_ROR, IM, MD, MB, MI, MS)
+#define RORQrr(RS, RD) _ROTSHIQrr(X86_ROR, RS, RD)
+#define RORQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_ROR, RS, MD, MB, MI, MS)
+
+#define RCLBir(IM, RD) _ROTSHIBir(X86_RCL, IM, RD)
+#define RCLBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_RCL, IM, MD, MB, MI, MS)
+#define RCLBrr(RS, RD) _ROTSHIBrr(X86_RCL, RS, RD)
+#define RCLBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_RCL, RS, MD, MB, MI, MS)
+
+#define RCLWir(IM, RD) _ROTSHIWir(X86_RCL, IM, RD)
+#define RCLWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_RCL, IM, MD, MB, MI, MS)
+#define RCLWrr(RS, RD) _ROTSHIWrr(X86_RCL, RS, RD)
+#define RCLWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_RCL, RS, MD, MB, MI, MS)
+
+#define RCLLir(IM, RD) _ROTSHILir(X86_RCL, IM, RD)
+#define RCLLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_RCL, IM, MD, MB, MI, MS)
+#define RCLLrr(RS, RD) _ROTSHILrr(X86_RCL, RS, RD)
+#define RCLLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_RCL, RS, MD, MB, MI, MS)
+
+#define RCLQir(IM, RD) _ROTSHIQir(X86_RCL, IM, RD)
+#define RCLQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_RCL, IM, MD, MB, MI, MS)
+#define RCLQrr(RS, RD) _ROTSHIQrr(X86_RCL, RS, RD)
+#define RCLQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_RCL, RS, MD, MB, MI, MS)
+
+#define RCRBir(IM, RD) _ROTSHIBir(X86_RCR, IM, RD)
+#define RCRBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_RCR, IM, MD, MB, MI, MS)
+#define RCRBrr(RS, RD) _ROTSHIBrr(X86_RCR, RS, RD)
+#define RCRBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_RCR, RS, MD, MB, MI, MS)
+
+#define RCRWir(IM, RD) _ROTSHIWir(X86_RCR, IM, RD)
+#define RCRWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_RCR, IM, MD, MB, MI, MS)
+#define RCRWrr(RS, RD) _ROTSHIWrr(X86_RCR, RS, RD)
+#define RCRWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_RCR, RS, MD, MB, MI, MS)
+
+#define RCRLir(IM, RD) _ROTSHILir(X86_RCR, IM, RD)
+#define RCRLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_RCR, IM, MD, MB, MI, MS)
+#define RCRLrr(RS, RD) _ROTSHILrr(X86_RCR, RS, RD)
+#define RCRLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_RCR, RS, MD, MB, MI, MS)
+
+#define RCRQir(IM, RD) _ROTSHIQir(X86_RCR, IM, RD)
+#define RCRQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_RCR, IM, MD, MB, MI, MS)
+#define RCRQrr(RS, RD) _ROTSHIQrr(X86_RCR, RS, RD)
+#define RCRQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_RCR, RS, MD, MB, MI, MS)
+
+#define SHLBir(IM, RD) _ROTSHIBir(X86_SHL, IM, RD)
+#define SHLBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_SHL, IM, MD, MB, MI, MS)
+#define SHLBrr(RS, RD) _ROTSHIBrr(X86_SHL, RS, RD)
+#define SHLBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_SHL, RS, MD, MB, MI, MS)
+
+#define SHLWir(IM, RD) _ROTSHIWir(X86_SHL, IM, RD)
+#define SHLWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_SHL, IM, MD, MB, MI, MS)
+#define SHLWrr(RS, RD) _ROTSHIWrr(X86_SHL, RS, RD)
+#define SHLWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_SHL, RS, MD, MB, MI, MS)
+
+#define SHLLir(IM, RD) _ROTSHILir(X86_SHL, IM, RD)
+#define SHLLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_SHL, IM, MD, MB, MI, MS)
+#define SHLLrr(RS, RD) _ROTSHILrr(X86_SHL, RS, RD)
+#define SHLLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_SHL, RS, MD, MB, MI, MS)
+
+#define SHLQir(IM, RD) _ROTSHIQir(X86_SHL, IM, RD)
+#define SHLQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_SHL, IM, MD, MB, MI, MS)
+#define SHLQrr(RS, RD) _ROTSHIQrr(X86_SHL, RS, RD)
+#define SHLQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_SHL, RS, MD, MB, MI, MS)
+
+#define SHRBir(IM, RD) _ROTSHIBir(X86_SHR, IM, RD)
+#define SHRBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_SHR, IM, MD, MB, MI, MS)
+#define SHRBrr(RS, RD) _ROTSHIBrr(X86_SHR, RS, RD)
+#define SHRBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_SHR, RS, MD, MB, MI, MS)
+
+#define SHRWir(IM, RD) _ROTSHIWir(X86_SHR, IM, RD)
+#define SHRWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_SHR, IM, MD, MB, MI, MS)
+#define SHRWrr(RS, RD) _ROTSHIWrr(X86_SHR, RS, RD)
+#define SHRWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_SHR, RS, MD, MB, MI, MS)
+
+#define SHRLir(IM, RD) _ROTSHILir(X86_SHR, IM, RD)
+#define SHRLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_SHR, IM, MD, MB, MI, MS)
+#define SHRLrr(RS, RD) _ROTSHILrr(X86_SHR, RS, RD)
+#define SHRLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_SHR, RS, MD, MB, MI, MS)
+
+#define SHRQir(IM, RD) _ROTSHIQir(X86_SHR, IM, RD)
+#define SHRQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_SHR, IM, MD, MB, MI, MS)
+#define SHRQrr(RS, RD) _ROTSHIQrr(X86_SHR, RS, RD)
+#define SHRQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_SHR, RS, MD, MB, MI, MS)
+
+#define SALBir SHLBir
+#define SALBim SHLBim
+#define SALBrr SHLBrr
+#define SALBrm SHLBrm
+
+#define SALWir SHLWir
+#define SALWim SHLWim
+#define SALWrr SHLWrr
+#define SALWrm SHLWrm
+
+#define SALLir SHLLir
+#define SALLim SHLLim
+#define SALLrr SHLLrr
+#define SALLrm SHLLrm
+
+#define SALQir SHLQir
+#define SALQim SHLQim
+#define SALQrr SHLQrr
+#define SALQrm SHLQrm
+
+#define SARBir(IM, RD) _ROTSHIBir(X86_SAR, IM, RD)
+#define SARBim(IM, MD, MB, MI, MS) _ROTSHIBim(X86_SAR, IM, MD, MB, MI, MS)
+#define SARBrr(RS, RD) _ROTSHIBrr(X86_SAR, RS, RD)
+#define SARBrm(RS, MD, MB, MI, MS) _ROTSHIBrm(X86_SAR, RS, MD, MB, MI, MS)
+
+#define SARWir(IM, RD) _ROTSHIWir(X86_SAR, IM, RD)
+#define SARWim(IM, MD, MB, MI, MS) _ROTSHIWim(X86_SAR, IM, MD, MB, MI, MS)
+#define SARWrr(RS, RD) _ROTSHIWrr(X86_SAR, RS, RD)
+#define SARWrm(RS, MD, MB, MI, MS) _ROTSHIWrm(X86_SAR, RS, MD, MB, MI, MS)
+
+#define SARLir(IM, RD) _ROTSHILir(X86_SAR, IM, RD)
+#define SARLim(IM, MD, MB, MI, MS) _ROTSHILim(X86_SAR, IM, MD, MB, MI, MS)
+#define SARLrr(RS, RD) _ROTSHILrr(X86_SAR, RS, RD)
+#define SARLrm(RS, MD, MB, MI, MS) _ROTSHILrm(X86_SAR, RS, MD, MB, MI, MS)
+
+#define SARQir(IM, RD) _ROTSHIQir(X86_SAR, IM, RD)
+#define SARQim(IM, MD, MB, MI, MS) _ROTSHIQim(X86_SAR, IM, MD, MB, MI, MS)
+#define SARQrr(RS, RD) _ROTSHIQrr(X86_SAR, RS, RD)
+#define SARQrm(RS, MD, MB, MI, MS) _ROTSHIQrm(X86_SAR, RS, MD, MB, MI, MS)
+
+
+/* --- Bit test instructions ----------------------------------------------- */
+
+enum {
+ X86_BT = 4,
+ X86_BTS = 5,
+ X86_BTR = 6,
+ X86_BTC = 7,
+};
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define _BTWir(OP, IM, RD) (_d16(), _REXLrr(0, RD), _OO_Mrm_B (0x0fba ,_b11,OP ,_r2(RD) ,_u8(IM)))
+#define _BTWim(OP, IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _OO_r_X_B (0x0fba ,OP ,MD,MB,MI,MS ,_u8(IM)))
+#define _BTWrr(OP, RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0f83|((OP)<<3),_b11,_r2(RS),_r2(RD) ))
+#define _BTWrm(OP, RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _OO_r_X (0x0f83|((OP)<<3) ,_r2(RS) ,MD,MB,MI,MS ))
+
+#define _BTLir(OP, IM, RD) (_REXLrr(0, RD), _OO_Mrm_B (0x0fba ,_b11,OP ,_r4(RD) ,_u8(IM)))
+#define _BTLim(OP, IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _OO_r_X_B (0x0fba ,OP ,MD,MB,MI,MS ,_u8(IM)))
+#define _BTLrr(OP, RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0f83|((OP)<<3),_b11,_r4(RS),_r4(RD) ))
+#define _BTLrm(OP, RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0f83|((OP)<<3) ,_r4(RS) ,MD,MB,MI,MS ))
+
+#define _BTQir(OP, IM, RD) (_REXQrr(0, RD), _OO_Mrm_B (0x0fba ,_b11,OP ,_r8(RD) ,_u8(IM)))
+#define _BTQim(OP, IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _OO_r_X_B (0x0fba ,OP ,MD,MB,MI,MS ,_u8(IM)))
+#define _BTQrr(OP, RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0f83|((OP)<<3),_b11,_r8(RS),_r8(RD) ))
+#define _BTQrm(OP, RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0f83|((OP)<<3) ,_r8(RS) ,MD,MB,MI,MS ))
+
+#define BTWir(IM, RD) _BTWir(X86_BT, IM, RD)
+#define BTWim(IM, MD, MB, MI, MS) _BTWim(X86_BT, IM, MD, MB, MI, MS)
+#define BTWrr(RS, RD) _BTWrr(X86_BT, RS, RD)
+#define BTWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BT, RS, MD, MB, MI, MS)
+
+#define BTLir(IM, RD) _BTLir(X86_BT, IM, RD)
+#define BTLim(IM, MD, MB, MI, MS) _BTLim(X86_BT, IM, MD, MB, MI, MS)
+#define BTLrr(RS, RD) _BTLrr(X86_BT, RS, RD)
+#define BTLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BT, RS, MD, MB, MI, MS)
+
+#define BTQir(IM, RD) _BTQir(X86_BT, IM, RD)
+#define BTQim(IM, MD, MB, MI, MS) _BTQim(X86_BT, IM, MD, MB, MI, MS)
+#define BTQrr(RS, RD) _BTQrr(X86_BT, RS, RD)
+#define BTQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BT, RS, MD, MB, MI, MS)
+
+#define BTCWir(IM, RD) _BTWir(X86_BTC, IM, RD)
+#define BTCWim(IM, MD, MB, MI, MS) _BTWim(X86_BTC, IM, MD, MB, MI, MS)
+#define BTCWrr(RS, RD) _BTWrr(X86_BTC, RS, RD)
+#define BTCWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BTC, RS, MD, MB, MI, MS)
+
+#define BTCLir(IM, RD) _BTLir(X86_BTC, IM, RD)
+#define BTCLim(IM, MD, MB, MI, MS) _BTLim(X86_BTC, IM, MD, MB, MI, MS)
+#define BTCLrr(RS, RD) _BTLrr(X86_BTC, RS, RD)
+#define BTCLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BTC, RS, MD, MB, MI, MS)
+
+#define BTCQir(IM, RD) _BTQir(X86_BTC, IM, RD)
+#define BTCQim(IM, MD, MB, MI, MS) _BTQim(X86_BTC, IM, MD, MB, MI, MS)
+#define BTCQrr(RS, RD) _BTQrr(X86_BTC, RS, RD)
+#define BTCQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BTC, RS, MD, MB, MI, MS)
+
+#define BTRWir(IM, RD) _BTWir(X86_BTR, IM, RD)
+#define BTRWim(IM, MD, MB, MI, MS) _BTWim(X86_BTR, IM, MD, MB, MI, MS)
+#define BTRWrr(RS, RD) _BTWrr(X86_BTR, RS, RD)
+#define BTRWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BTR, RS, MD, MB, MI, MS)
+
+#define BTRLir(IM, RD) _BTLir(X86_BTR, IM, RD)
+#define BTRLim(IM, MD, MB, MI, MS) _BTLim(X86_BTR, IM, MD, MB, MI, MS)
+#define BTRLrr(RS, RD) _BTLrr(X86_BTR, RS, RD)
+#define BTRLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BTR, RS, MD, MB, MI, MS)
+
+#define BTRQir(IM, RD) _BTQir(X86_BTR, IM, RD)
+#define BTRQim(IM, MD, MB, MI, MS) _BTQim(X86_BTR, IM, MD, MB, MI, MS)
+#define BTRQrr(RS, RD) _BTQrr(X86_BTR, RS, RD)
+#define BTRQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BTR, RS, MD, MB, MI, MS)
+
+#define BTSWir(IM, RD) _BTWir(X86_BTS, IM, RD)
+#define BTSWim(IM, MD, MB, MI, MS) _BTWim(X86_BTS, IM, MD, MB, MI, MS)
+#define BTSWrr(RS, RD) _BTWrr(X86_BTS, RS, RD)
+#define BTSWrm(RS, MD, MB, MI, MS) _BTWrm(X86_BTS, RS, MD, MB, MI, MS)
+
+#define BTSLir(IM, RD) _BTLir(X86_BTS, IM, RD)
+#define BTSLim(IM, MD, MB, MI, MS) _BTLim(X86_BTS, IM, MD, MB, MI, MS)
+#define BTSLrr(RS, RD) _BTLrr(X86_BTS, RS, RD)
+#define BTSLrm(RS, MD, MB, MI, MS) _BTLrm(X86_BTS, RS, MD, MB, MI, MS)
+
+#define BTSQir(IM, RD) _BTQir(X86_BTS, IM, RD)
+#define BTSQim(IM, MD, MB, MI, MS) _BTQim(X86_BTS, IM, MD, MB, MI, MS)
+#define BTSQrr(RS, RD) _BTQrr(X86_BTS, RS, RD)
+#define BTSQrm(RS, MD, MB, MI, MS) _BTQrm(X86_BTS, RS, MD, MB, MI, MS)
+
+
+/* --- Move instructions --------------------------------------------------- */
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define MOVBrr(RS, RD) (_REXBrr(RS, RD), _O_Mrm (0x88 ,_b11,_r1(RS),_r1(RD) ))
+#define MOVBmr(MD, MB, MI, MS, RD) (_REXBmr(MB, MI, RD), _O_r_X (0x8a ,_r1(RD) ,MD,MB,MI,MS ))
+#define MOVBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (0x88 ,_r1(RS) ,MD,MB,MI,MS ))
+#define MOVBir(IM, R) (_REXBrr(0, R), _Or_B (0xb0,_r1(R) ,_su8(IM)))
+#define MOVBim(IM, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_X_B (0xc6 ,MD,MB,MI,MS ,_su8(IM)))
+
+#define MOVWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (0x89 ,_b11,_r2(RS),_r2(RD) ))
+#define MOVWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _O_r_X (0x8b ,_r2(RD) ,MD,MB,MI,MS ))
+#define MOVWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0x89 ,_r2(RS) ,MD,MB,MI,MS ))
+#define MOVWir(IM, R) (_d16(), _REXLrr(0, R), _Or_W (0xb8,_r2(R) ,_su16(IM)))
+#define MOVWim(IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_X_W (0xc7 ,MD,MB,MI,MS ,_su16(IM)))
+
+#define MOVLrr(RS, RD) (_REXLrr(RS, RD), _O_Mrm (0x89 ,_b11,_r4(RS),_r4(RD) ))
+#define MOVLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _O_r_X (0x8b ,_r4(RD) ,MD,MB,MI,MS ))
+#define MOVLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (0x89 ,_r4(RS) ,MD,MB,MI,MS ))
+#define MOVLir(IM, R) (_REXLrr(0, R), _Or_L (0xb8,_r4(R) ,IM ))
+#define MOVLim(IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_X_L (0xc7 ,MD,MB,MI,MS ,IM ))
+
+#define MOVQrr(RS, RD) (_REXQrr(RS, RD), _O_Mrm (0x89 ,_b11,_r8(RS),_r8(RD) ))
+#define MOVQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _O_r_X (0x8b ,_r8(RD) ,MD,MB,MI,MS ))
+#define MOVQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (0x89 ,_r8(RS) ,MD,MB,MI,MS ))
+#define MOVQir(IM, R) (_REXQrr(0, R), _Or_Q (0xb8,_r8(R) ,IM ))
+#define MOVQim(IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_X_L (0xc7 ,MD,MB,MI,MS ,IM ))
+
+
+/* --- Unary and Multiply/Divide instructions ------------------------------ */
+
+enum {
+ X86_NOT = 2,
+ X86_NEG = 3,
+ X86_MUL = 4,
+ X86_IMUL = 5,
+ X86_DIV = 6,
+ X86_IDIV = 7,
+};
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define _UNARYBr(OP, RS) (_REXBrr(0, RS), _O_Mrm (0xf6 ,_b11,OP ,_r1(RS) ))
+#define _UNARYBm(OP, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X (0xf6 ,OP ,MD,MB,MI,MS ))
+#define _UNARYWr(OP, RS) (_d16(), _REXLrr(0, RS), _O_Mrm (0xf7 ,_b11,OP ,_r2(RS) ))
+#define _UNARYWm(OP, MD, MB, MI, MS) (_d16(), _REXLmr(MB, MI, 0), _O_r_X (0xf7 ,OP ,MD,MB,MI,MS ))
+#define _UNARYLr(OP, RS) (_REXLrr(0, RS), _O_Mrm (0xf7 ,_b11,OP ,_r4(RS) ))
+#define _UNARYLm(OP, MD, MB, MI, MS) (_REXLmr(MB, MI, 0), _O_r_X (0xf7 ,OP ,MD,MB,MI,MS ))
+#define _UNARYQr(OP, RS) (_REXQrr(0, RS), _O_Mrm (0xf7 ,_b11,OP ,_r8(RS) ))
+#define _UNARYQm(OP, MD, MB, MI, MS) (_REXQmr(MB, MI, 0), _O_r_X (0xf7 ,OP ,MD,MB,MI,MS ))
+
+#define NOTBr(RS) _UNARYBr(X86_NOT, RS)
+#define NOTBm(MD, MB, MI, MS) _UNARYBm(X86_NOT, MD, MB, MI, MS)
+#define NOTWr(RS) _UNARYWr(X86_NOT, RS)
+#define NOTWm(MD, MB, MI, MS) _UNARYWm(X86_NOT, MD, MB, MI, MS)
+#define NOTLr(RS) _UNARYLr(X86_NOT, RS)
+#define NOTLm(MD, MB, MI, MS) _UNARYLm(X86_NOT, MD, MB, MI, MS)
+#define NOTQr(RS) _UNARYQr(X86_NOT, RS)
+#define NOTQm(MD, MB, MI, MS) _UNARYQm(X86_NOT, MD, MB, MI, MS)
+
+#define NEGBr(RS) _UNARYBr(X86_NEG, RS)
+#define NEGBm(MD, MB, MI, MS) _UNARYBm(X86_NEG, MD, MB, MI, MS)
+#define NEGWr(RS) _UNARYWr(X86_NEG, RS)
+#define NEGWm(MD, MB, MI, MS) _UNARYWm(X86_NEG, MD, MB, MI, MS)
+#define NEGLr(RS) _UNARYLr(X86_NEG, RS)
+#define NEGLm(MD, MB, MI, MS) _UNARYLm(X86_NEG, MD, MB, MI, MS)
+#define NEGQr(RS) _UNARYQr(X86_NEG, RS)
+#define NEGQm(MD, MB, MI, MS) _UNARYQm(X86_NEG, MD, MB, MI, MS)
+
+#define MULBr(RS) _UNARYBr(X86_MUL, RS)
+#define MULBm(MD, MB, MI, MS) _UNARYBm(X86_MUL, MD, MB, MI, MS)
+#define MULWr(RS) _UNARYWr(X86_MUL, RS)
+#define MULWm(MD, MB, MI, MS) _UNARYWm(X86_MUL, MD, MB, MI, MS)
+#define MULLr(RS) _UNARYLr(X86_MUL, RS)
+#define MULLm(MD, MB, MI, MS) _UNARYLm(X86_MUL, MD, MB, MI, MS)
+#define MULQr(RS) _UNARYQr(X86_MUL, RS)
+#define MULQm(MD, MB, MI, MS) _UNARYQm(X86_MUL, MD, MB, MI, MS)
+
+#define IMULBr(RS) _UNARYBr(X86_IMUL, RS)
+#define IMULBm(MD, MB, MI, MS) _UNARYBm(X86_IMUL, MD, MB, MI, MS)
+#define IMULWr(RS) _UNARYWr(X86_IMUL, RS)
+#define IMULWm(MD, MB, MI, MS) _UNARYWm(X86_IMUL, MD, MB, MI, MS)
+#define IMULLr(RS) _UNARYLr(X86_IMUL, RS)
+#define IMULLm(MD, MB, MI, MS) _UNARYLm(X86_IMUL, MD, MB, MI, MS)
+#define IMULQr(RS) _UNARYQr(X86_IMUL, RS)
+#define IMULQm(MD, MB, MI, MS) _UNARYQm(X86_IMUL, MD, MB, MI, MS)
+
+#define DIVBr(RS) _UNARYBr(X86_DIV, RS)
+#define DIVBm(MD, MB, MI, MS) _UNARYBm(X86_DIV, MD, MB, MI, MS)
+#define DIVWr(RS) _UNARYWr(X86_DIV, RS)
+#define DIVWm(MD, MB, MI, MS) _UNARYWm(X86_DIV, MD, MB, MI, MS)
+#define DIVLr(RS) _UNARYLr(X86_DIV, RS)
+#define DIVLm(MD, MB, MI, MS) _UNARYLm(X86_DIV, MD, MB, MI, MS)
+#define DIVQr(RS) _UNARYQr(X86_DIV, RS)
+#define DIVQm(MD, MB, MI, MS) _UNARYQm(X86_DIV, MD, MB, MI, MS)
+
+#define IDIVBr(RS) _UNARYBr(X86_IDIV, RS)
+#define IDIVBm(MD, MB, MI, MS) _UNARYBm(X86_IDIV, MD, MB, MI, MS)
+#define IDIVWr(RS) _UNARYWr(X86_IDIV, RS)
+#define IDIVWm(MD, MB, MI, MS) _UNARYWm(X86_IDIV, MD, MB, MI, MS)
+#define IDIVLr(RS) _UNARYLr(X86_IDIV, RS)
+#define IDIVLm(MD, MB, MI, MS) _UNARYLm(X86_IDIV, MD, MB, MI, MS)
+#define IDIVQr(RS) _UNARYQr(X86_IDIV, RS)
+#define IDIVQm(MD, MB, MI, MS) _UNARYQm(X86_IDIV, MD, MB, MI, MS)
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define IMULWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0faf ,_b11,_r2(RD),_r2(RS) ))
+#define IMULWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0faf ,_r2(RD) ,MD,MB,MI,MS ))
+
+#define IMULWirr(IM,RS,RD) (_d16(), _REXLrr(RS, RD), _Os_Mrm_sW (0x69 ,_b11,_r2(RS),_r2(RD) ,_su16(IM) ))
+#define IMULWimr(IM,MD,MB,MI,MS,RD) (_d16(), _REXLmr(MB, MI, RD), _Os_r_X_sW (0x69 ,_r2(RD) ,MD,MB,MI,MS ,_su16(IM) ))
+
+#define IMULLir(IM, RD) (_REXLrr(0, RD), _Os_Mrm_sL (0x69 ,_b11,_r4(RD),_r4(RD) ,IM ))
+#define IMULLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0faf ,_b11,_r4(RD),_r4(RS) ))
+#define IMULLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0faf ,_r4(RD) ,MD,MB,MI,MS ))
+
+#define IMULQir(IM, RD) (_REXQrr(0, RD), _Os_Mrm_sL (0x69 ,_b11,_r8(RD),_r8(RD) ,IM ))
+#define IMULQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0faf ,_b11,_r8(RD),_r8(RS) ))
+#define IMULQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0faf ,_r8(RD) ,MD,MB,MI,MS ))
+
+#define IMULLirr(IM,RS,RD) (_REXLrr(RS, RD), _Os_Mrm_sL (0x69 ,_b11,_r4(RS),_r4(RD) ,IM ))
+#define IMULLimr(IM,MD,MB,MI,MS,RD) (_REXLmr(MB, MI, RD), _Os_r_X_sL (0x69 ,_r4(RD) ,MD,MB,MI,MS ,IM ))
+
+#define IMULQirr(IM,RS,RD) (_REXQrr(RS, RD), _Os_Mrm_sL (0x69 ,_b11,_r8(RS),_r8(RD) ,IM ))
+#define IMULQimr(IM,MD,MB,MI,MS,RD) (_REXQmr(MB, MI, RD), _Os_r_X_sL (0x69 ,_r8(RD) ,MD,MB,MI,MS ,IM ))
+
+
+/* --- Control Flow related instructions ----------------------------------- */
+
+enum {
+ X86_CC_O = 0x0,
+ X86_CC_NO = 0x1,
+ X86_CC_NAE = 0x2,
+ X86_CC_B = 0x2,
+ X86_CC_C = 0x2,
+ X86_CC_AE = 0x3,
+ X86_CC_NB = 0x3,
+ X86_CC_NC = 0x3,
+ X86_CC_E = 0x4,
+ X86_CC_Z = 0x4,
+ X86_CC_NE = 0x5,
+ X86_CC_NZ = 0x5,
+ X86_CC_BE = 0x6,
+ X86_CC_NA = 0x6,
+ X86_CC_A = 0x7,
+ X86_CC_NBE = 0x7,
+ X86_CC_S = 0x8,
+ X86_CC_NS = 0x9,
+ X86_CC_P = 0xa,
+ X86_CC_PE = 0xa,
+ X86_CC_NP = 0xb,
+ X86_CC_PO = 0xb,
+ X86_CC_L = 0xc,
+ X86_CC_NGE = 0xc,
+ X86_CC_GE = 0xd,
+ X86_CC_NL = 0xd,
+ X86_CC_LE = 0xe,
+ X86_CC_NG = 0xe,
+ X86_CC_G = 0xf,
+ X86_CC_NLE = 0xf,
+};
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+// FIXME: no prefix is availble to encode a 32-bit operand size in 64-bit mode
+#define CALLm(M) _O_D32 (0xe8 ,(int)(M) )
+#define _CALLLsr(R) (_REXLrr(0, R), _O_Mrm (0xff ,_b11,_b010,_r4(R) ))
+#define _CALLQsr(R) (_REXLrr(0, R), _O_Mrm (0xff ,_b11,_b010,_r8(R) ))
+#define CALLsr(R) ( X86_TARGET_64BIT ? _CALLQsr(R) : _CALLLsr(R))
+#define CALLsm(D,B,I,S) (_REXLrm(0, B, I), _O_r_X (0xff ,_b010 ,(int)(D),B,I,S ))
+
+// FIXME: no prefix is availble to encode a 32-bit operand size in 64-bit mode
+#define JMPSm(M) _O_D8 (0xeb ,(int)(M) )
+#define JMPm(M) _O_D32 (0xe9 ,(int)(M) )
+#define _JMPLsr(R) (_REXLrr(0, R), _O_Mrm (0xff ,_b11,_b100,_r4(R) ))
+#define _JMPQsr(R) (_REXLrr(0, R), _O_Mrm (0xff ,_b11,_b100,_r8(R) ))
+#define JMPsr(R) ( X86_TARGET_64BIT ? _JMPQsr(R) : _JMPLsr(R))
+#define JMPsm(D,B,I,S) (_REXLrm(0, B, I), _O_r_X (0xff ,_b100 ,(int)(D),B,I,S ))
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+#define JCCSii(CC, D) _O_B (0x70|(CC) ,(_sc)(int)(D) )
+#define JCCSim(CC, D) _O_D8 (0x70|(CC) ,(int)(D) )
+#define JOSm(D) JCCSim(X86_CC_O, D)
+#define JNOSm(D) JCCSim(X86_CC_NO, D)
+#define JBSm(D) JCCSim(X86_CC_B, D)
+#define JNAESm(D) JCCSim(X86_CC_NAE, D)
+#define JNBSm(D) JCCSim(X86_CC_NB, D)
+#define JAESm(D) JCCSim(X86_CC_AE, D)
+#define JESm(D) JCCSim(X86_CC_E, D)
+#define JZSm(D) JCCSim(X86_CC_Z, D)
+#define JNESm(D) JCCSim(X86_CC_NE, D)
+#define JNZSm(D) JCCSim(X86_CC_NZ, D)
+#define JBESm(D) JCCSim(X86_CC_BE, D)
+#define JNASm(D) JCCSim(X86_CC_NA, D)
+#define JNBESm(D) JCCSim(X86_CC_NBE, D)
+#define JASm(D) JCCSim(X86_CC_A, D)
+#define JSSm(D) JCCSim(X86_CC_S, D)
+#define JNSSm(D) JCCSim(X86_CC_NS, D)
+#define JPSm(D) JCCSim(X86_CC_P, D)
+#define JPESm(D) JCCSim(X86_CC_PE, D)
+#define JNPSm(D) JCCSim(X86_CC_NP, D)
+#define JPOSm(D) JCCSim(X86_CC_PO, D)
+#define JLSm(D) JCCSim(X86_CC_L, D)
+#define JNGESm(D) JCCSim(X86_CC_NGE, D)
+#define JNLSm(D) JCCSim(X86_CC_NL, D)
+#define JGESm(D) JCCSim(X86_CC_GE, D)
+#define JLESm(D) JCCSim(X86_CC_LE, D)
+#define JNGSm(D) JCCSim(X86_CC_NG, D)
+#define JNLESm(D) JCCSim(X86_CC_NLE, D)
+#define JGSm(D) JCCSim(X86_CC_G, D)
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+#define JCCii(CC, D) _OO_L (0x0f80|(CC) ,(int)(D) )
+#define JCCim(CC, D) _OO_D32 (0x0f80|(CC) ,(int)(D) )
+#define JOm(D) JCCim(X86_CC_O, D)
+#define JNOm(D) JCCim(X86_CC_NO, D)
+#define JBm(D) JCCim(X86_CC_B, D)
+#define JNAEm(D) JCCim(X86_CC_NAE, D)
+#define JNBm(D) JCCim(X86_CC_NB, D)
+#define JAEm(D) JCCim(X86_CC_AE, D)
+#define JEm(D) JCCim(X86_CC_E, D)
+#define JZm(D) JCCim(X86_CC_Z, D)
+#define JNEm(D) JCCim(X86_CC_NE, D)
+#define JNZm(D) JCCim(X86_CC_NZ, D)
+#define JBEm(D) JCCim(X86_CC_BE, D)
+#define JNAm(D) JCCim(X86_CC_NA, D)
+#define JNBEm(D) JCCim(X86_CC_NBE, D)
+#define JAm(D) JCCim(X86_CC_A, D)
+#define JSm(D) JCCim(X86_CC_S, D)
+#define JNSm(D) JCCim(X86_CC_NS, D)
+#define JPm(D) JCCim(X86_CC_P, D)
+#define JPEm(D) JCCim(X86_CC_PE, D)
+#define JNPm(D) JCCim(X86_CC_NP, D)
+#define JPOm(D) JCCim(X86_CC_PO, D)
+#define JLm(D) JCCim(X86_CC_L, D)
+#define JNGEm(D) JCCim(X86_CC_NGE, D)
+#define JNLm(D) JCCim(X86_CC_NL, D)
+#define JGEm(D) JCCim(X86_CC_GE, D)
+#define JLEm(D) JCCim(X86_CC_LE, D)
+#define JNGm(D) JCCim(X86_CC_NG, D)
+#define JNLEm(D) JCCim(X86_CC_NLE, D)
+#define JGm(D) JCCim(X86_CC_G, D)
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+#define SETCCir(CC, RD) (_REXBrr(0, RD), _OO_Mrm (0x0f90|(CC) ,_b11,_b000,_r1(RD) ))
+#define SETOr(RD) SETCCir(X86_CC_O, RD)
+#define SETNOr(RD) SETCCir(X86_CC_NO, RD)
+#define SETBr(RD) SETCCir(X86_CC_B, RD)
+#define SETNAEr(RD) SETCCir(X86_CC_NAE, RD)
+#define SETNBr(RD) SETCCir(X86_CC_NB, RD)
+#define SETAEr(RD) SETCCir(X86_CC_AE, RD)
+#define SETEr(RD) SETCCir(X86_CC_E, RD)
+#define SETZr(RD) SETCCir(X86_CC_Z, RD)
+#define SETNEr(RD) SETCCir(X86_CC_NE, RD)
+#define SETNZr(RD) SETCCir(X86_CC_NZ, RD)
+#define SETBEr(RD) SETCCir(X86_CC_BE, RD)
+#define SETNAr(RD) SETCCir(X86_CC_NA, RD)
+#define SETNBEr(RD) SETCCir(X86_CC_NBE, RD)
+#define SETAr(RD) SETCCir(X86_CC_A, RD)
+#define SETSr(RD) SETCCir(X86_CC_S, RD)
+#define SETNSr(RD) SETCCir(X86_CC_NS, RD)
+#define SETPr(RD) SETCCir(X86_CC_P, RD)
+#define SETPEr(RD) SETCCir(X86_CC_PE, RD)
+#define SETNPr(RD) SETCCir(X86_CC_NP, RD)
+#define SETPOr(RD) SETCCir(X86_CC_PO, RD)
+#define SETLr(RD) SETCCir(X86_CC_L, RD)
+#define SETNGEr(RD) SETCCir(X86_CC_NGE, RD)
+#define SETNLr(RD) SETCCir(X86_CC_NL, RD)
+#define SETGEr(RD) SETCCir(X86_CC_GE, RD)
+#define SETLEr(RD) SETCCir(X86_CC_LE, RD)
+#define SETNGr(RD) SETCCir(X86_CC_NG, RD)
+#define SETNLEr(RD) SETCCir(X86_CC_NLE, RD)
+#define SETGr(RD) SETCCir(X86_CC_G, RD)
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+#define SETCCim(CC,MD,MB,MI,MS) (_REXBrm(0, MB, MI), _OO_r_X (0x0f90|(CC) ,_b000 ,MD,MB,MI,MS ))
+#define SETOm(D, B, I, S) SETCCim(X86_CC_O, D, B, I, S)
+#define SETNOm(D, B, I, S) SETCCim(X86_CC_NO, D, B, I, S)
+#define SETBm(D, B, I, S) SETCCim(X86_CC_B, D, B, I, S)
+#define SETNAEm(D, B, I, S) SETCCim(X86_CC_NAE, D, B, I, S)
+#define SETNBm(D, B, I, S) SETCCim(X86_CC_NB, D, B, I, S)
+#define SETAEm(D, B, I, S) SETCCim(X86_CC_AE, D, B, I, S)
+#define SETEm(D, B, I, S) SETCCim(X86_CC_E, D, B, I, S)
+#define SETZm(D, B, I, S) SETCCim(X86_CC_Z, D, B, I, S)
+#define SETNEm(D, B, I, S) SETCCim(X86_CC_NE, D, B, I, S)
+#define SETNZm(D, B, I, S) SETCCim(X86_CC_NZ, D, B, I, S)
+#define SETBEm(D, B, I, S) SETCCim(X86_CC_BE, D, B, I, S)
+#define SETNAm(D, B, I, S) SETCCim(X86_CC_NA, D, B, I, S)
+#define SETNBEm(D, B, I, S) SETCCim(X86_CC_NBE, D, B, I, S)
+#define SETAm(D, B, I, S) SETCCim(X86_CC_A, D, B, I, S)
+#define SETSm(D, B, I, S) SETCCim(X86_CC_S, D, B, I, S)
+#define SETNSm(D, B, I, S) SETCCim(X86_CC_NS, D, B, I, S)
+#define SETPm(D, B, I, S) SETCCim(X86_CC_P, D, B, I, S)
+#define SETPEm(D, B, I, S) SETCCim(X86_CC_PE, D, B, I, S)
+#define SETNPm(D, B, I, S) SETCCim(X86_CC_NP, D, B, I, S)
+#define SETPOm(D, B, I, S) SETCCim(X86_CC_PO, D, B, I, S)
+#define SETLm(D, B, I, S) SETCCim(X86_CC_L, D, B, I, S)
+#define SETNGEm(D, B, I, S) SETCCim(X86_CC_NGE, D, B, I, S)
+#define SETNLm(D, B, I, S) SETCCim(X86_CC_NL, D, B, I, S)
+#define SETGEm(D, B, I, S) SETCCim(X86_CC_GE, D, B, I, S)
+#define SETLEm(D, B, I, S) SETCCim(X86_CC_LE, D, B, I, S)
+#define SETNGm(D, B, I, S) SETCCim(X86_CC_NG, D, B, I, S)
+#define SETNLEm(D, B, I, S) SETCCim(X86_CC_NLE, D, B, I, S)
+#define SETGm(D, B, I, S) SETCCim(X86_CC_G, D, B, I, S)
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+#define CMOVWrr(CC,RS,RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0f40|(CC) ,_b11,_r2(RD),_r2(RS) ))
+#define CMOVWmr(CC,MD,MB,MI,MS,RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0f40|(CC) ,_r2(RD) ,MD,MB,MI,MS ))
+#define CMOVLrr(CC,RS,RD) (_REXLrr(RD, RS), _OO_Mrm (0x0f40|(CC) ,_b11,_r4(RD),_r4(RS) ))
+#define CMOVLmr(CC,MD,MB,MI,MS,RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0f40|(CC) ,_r4(RD) ,MD,MB,MI,MS ))
+#define CMOVQrr(CC,RS,RD) (_REXQrr(RD, RS), _OO_Mrm (0x0f40|(CC) ,_b11,_r8(RD),_r8(RS) ))
+#define CMOVQmr(CC,MD,MB,MI,MS,RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0f40|(CC) ,_r8(RD) ,MD,MB,MI,MS ))
+
+
+/* --- Push/Pop instructions ----------------------------------------------- */
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define POPWr(RD) _m32only((_d16(), _Or (0x58,_r2(RD) )))
+#define POPWm(MD, MB, MI, MS) _m32only((_d16(), _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS )))
+
+#define POPLr(RD) _m32only( _Or (0x58,_r4(RD) ))
+#define POPLm(MD, MB, MI, MS) _m32only( _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS ))
+
+#define POPQr(RD) _m64only((_REXQr(RD), _Or (0x58,_r8(RD) )))
+#define POPQm(MD, MB, MI, MS) _m64only((_REXQm(MB, MI), _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS )))
+
+#define PUSHWr(RS) _m32only((_d16(), _Or (0x50,_r2(RS) )))
+#define PUSHWm(MD, MB, MI, MS) _m32only((_d16(), _O_r_X (0xff, ,_b110 ,MD,MB,MI,MS )))
+#define PUSHWi(IM) _m32only((_d16(), _Os_sW (0x68 ,IM )))
+
+#define PUSHLr(RS) _m32only( _Or (0x50,_r4(RS) ))
+#define PUSHLm(MD, MB, MI, MS) _m32only( _O_r_X (0xff ,_b110 ,MD,MB,MI,MS ))
+#define PUSHLi(IM) _m32only( _Os_sL (0x68 ,IM ))
+
+#define PUSHQr(RS) _m64only((_REXQr(RS), _Or (0x50,_r8(RS) )))
+#define PUSHQm(MD, MB, MI, MS) _m64only((_REXQm(MB, MI), _O_r_X (0xff ,_b110 ,MD,MB,MI,MS )))
+#define PUSHQi(IM) _m64only( _Os_sL (0x68 ,IM ))
+
+#define POPA() (_d16(), _O (0x61 ))
+#define POPAD() _O (0x61 )
+
+#define PUSHA() (_d16(), _O (0x60 ))
+#define PUSHAD() _O (0x60 )
+
+#define POPF() _O (0x9d )
+#define PUSHF() _O (0x9c )
+
+
+/* --- Test instructions --------------------------------------------------- */
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define TESTBrr(RS, RD) (_REXBrr(RS, RD), _O_Mrm (0x84 ,_b11,_r1(RS),_r1(RD) ))
+#define TESTBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (0x84 ,_r1(RS) ,MD,MB,MI,MS ))
+#define TESTBir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AL) ? \
+ (_REXBrr(0, RD), _O_B (0xa8 ,_u8(IM))) : \
+ (_REXBrr(0, RD), _O_Mrm_B (0xf6 ,_b11,_b000 ,_r1(RD) ,_u8(IM))) )
+#define TESTBim(IM, MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X_B (0xf6 ,_b000 ,MD,MB,MI,MS ,_u8(IM)))
+
+#define TESTWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (0x85 ,_b11,_r2(RS),_r2(RD) ))
+#define TESTWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0x85 ,_r2(RS) ,MD,MB,MI,MS ))
+#define TESTWir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_AX) ? \
+ (_d16(), _REXLrr(0, RD), _O_W (0xa9 ,_u16(IM))) : \
+ (_d16(), _REXLrr(0, RD), _O_Mrm_W (0xf7 ,_b11,_b000 ,_r2(RD) ,_u16(IM))) )
+#define TESTWim(IM, MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_r_X_W (0xf7 ,_b000 ,MD,MB,MI,MS ,_u16(IM)))
+
+#define TESTLrr(RS, RD) (_REXLrr(RS, RD), _O_Mrm (0x85 ,_b11,_r4(RS),_r4(RD) ))
+#define TESTLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (0x85 ,_r4(RS) ,MD,MB,MI,MS ))
+#define TESTLir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_EAX) ? \
+ (_REXLrr(0, RD), _O_L (0xa9 ,IM )) : \
+ (_REXLrr(0, RD), _O_Mrm_L (0xf7 ,_b11,_b000 ,_r4(RD) ,IM )) )
+#define TESTLim(IM, MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_r_X_L (0xf7 ,_b000 ,MD,MB,MI,MS ,IM ))
+
+#define TESTQrr(RS, RD) (_REXQrr(RS, RD), _O_Mrm (0x85 ,_b11,_r8(RS),_r8(RD) ))
+#define TESTQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (0x85 ,_r8(RS) ,MD,MB,MI,MS ))
+#define TESTQir(IM, RD) (X86_OPTIMIZE_ALU && ((RD) == X86_RAX) ? \
+ (_REXQrr(0, RD), _O_L (0xa9 ,IM )) : \
+ (_REXQrr(0, RD), _O_Mrm_L (0xf7 ,_b11,_b000 ,_r8(RD) ,IM )) )
+#define TESTQim(IM, MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_r_X_L (0xf7 ,_b000 ,MD,MB,MI,MS ,IM ))
+
+
+/* --- Exchange instructions ----------------------------------------------- */
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define CMPXCHGBrr(RS, RD) (_REXBrr(RS, RD), _OO_Mrm (0x0fb0 ,_b11,_r1(RS),_r1(RD) ))
+#define CMPXCHGBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _OO_r_X (0x0fb0 ,_r1(RS) ,MD,MB,MI,MS ))
+
+#define CMPXCHGWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0fb1 ,_b11,_r2(RS),_r2(RD) ))
+#define CMPXCHGWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _OO_r_X (0x0fb1 ,_r2(RS) ,MD,MB,MI,MS ))
+
+#define CMPXCHGLrr(RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0fb1 ,_b11,_r4(RS),_r4(RD) ))
+#define CMPXCHGLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0fb1 ,_r4(RS) ,MD,MB,MI,MS ))
+
+#define CMPXCHGQrr(RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0fb1 ,_b11,_r8(RS),_r8(RD) ))
+#define CMPXCHGQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0fb1 ,_r8(RS) ,MD,MB,MI,MS ))
+
+#define XADDBrr(RS, RD) (_REXBrr(RS, RD), _OO_Mrm (0x0fc0 ,_b11,_r1(RS),_r1(RD) ))
+#define XADDBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _OO_r_X (0x0fc0 ,_r1(RS) ,MD,MB,MI,MS ))
+
+#define XADDWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _OO_Mrm (0x0fc1 ,_b11,_r2(RS),_r2(RD) ))
+#define XADDWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _OO_r_X (0x0fc1 ,_r2(RS) ,MD,MB,MI,MS ))
+
+#define XADDLrr(RS, RD) (_REXLrr(RS, RD), _OO_Mrm (0x0fc1 ,_b11,_r4(RS),_r4(RD) ))
+#define XADDLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0fc1 ,_r4(RS) ,MD,MB,MI,MS ))
+
+#define XADDQrr(RS, RD) (_REXQrr(RS, RD), _OO_Mrm (0x0fc1 ,_b11,_r8(RS),_r8(RD) ))
+#define XADDQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0fc1 ,_r8(RS) ,MD,MB,MI,MS ))
+
+#define XCHGBrr(RS, RD) (_REXBrr(RS, RD), _O_Mrm (0x86 ,_b11,_r1(RS),_r1(RD) ))
+#define XCHGBrm(RS, MD, MB, MI, MS) (_REXBrm(RS, MB, MI), _O_r_X (0x86 ,_r1(RS) ,MD,MB,MI,MS ))
+
+#define XCHGWrr(RS, RD) (_d16(), _REXLrr(RS, RD), _O_Mrm (0x87 ,_b11,_r2(RS),_r2(RD) ))
+#define XCHGWrm(RS, MD, MB, MI, MS) (_d16(), _REXLrm(RS, MB, MI), _O_r_X (0x87 ,_r2(RS) ,MD,MB,MI,MS ))
+
+#define XCHGLrr(RS, RD) (_REXLrr(RS, RD), _O_Mrm (0x87 ,_b11,_r4(RS),_r4(RD) ))
+#define XCHGLrm(RS, MD, MB, MI, MS) (_REXLrm(RS, MB, MI), _O_r_X (0x87 ,_r4(RS) ,MD,MB,MI,MS ))
+
+#define XCHGQrr(RS, RD) (_REXQrr(RS, RD), _O_Mrm (0x87 ,_b11,_r8(RS),_r8(RD) ))
+#define XCHGQrm(RS, MD, MB, MI, MS) (_REXQrm(RS, MB, MI), _O_r_X (0x87 ,_r8(RS) ,MD,MB,MI,MS ))
+
+
+/* --- Increment/Decrement instructions ------------------------------------ */
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define DECBm(MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X (0xfe ,_b001 ,MD,MB,MI,MS ))
+#define DECBr(RD) (_REXBrr(0, RD), _O_Mrm (0xfe ,_b11,_b001 ,_r1(RD) ))
+
+#define DECWm(MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ))
+#define DECWr(RD) (! X86_TARGET_64BIT ? (_d16(), _Or (0x48,_r2(RD) )) : \
+ (_d16(), _REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r2(RD) )))
+
+#define DECLm(MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ))
+#define DECLr(RD) (! X86_TARGET_64BIT ? _Or (0x48,_r4(RD) ) : \
+ (_REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r4(RD) )))
+
+#define DECQm(MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ))
+#define DECQr(RD) (_REXQrr(0, RD), _O_Mrm (0xff ,_b11,_b001 ,_r8(RD) ))
+
+#define INCBm(MD, MB, MI, MS) (_REXBrm(0, MB, MI), _O_r_X (0xfe ,_b000 ,MD,MB,MI,MS ))
+#define INCBr(RD) (_REXBrr(0, RD), _O_Mrm (0xfe ,_b11,_b000 ,_r1(RD) ))
+
+#define INCWm(MD, MB, MI, MS) (_d16(), _REXLrm(0, MB, MI), _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ))
+#define INCWr(RD) (! X86_TARGET_64BIT ? (_d16(), _Or (0x40,_r2(RD) )) : \
+ (_d16(), _REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b000 ,_r2(RD) )) )
+
+#define INCLm(MD, MB, MI, MS) (_REXLrm(0, MB, MI), _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ))
+#define INCLr(RD) (! X86_TARGET_64BIT ? _Or (0x40,_r4(RD) ) : \
+ (_REXLrr(0, RD), _O_Mrm (0xff ,_b11,_b000 ,_r4(RD) )))
+
+#define INCQm(MD, MB, MI, MS) (_REXQrm(0, MB, MI), _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ))
+#define INCQr(RD) (_REXQrr(0, RD), _O_Mrm (0xff ,_b11,_b000 ,_r8(RD) ))
+
+
+/* --- Misc instructions --------------------------------------------------- */
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define BSFWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0fbc ,_b11,_r2(RD),_r2(RS) ))
+#define BSFWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fbc ,_r2(RD) ,MD,MB,MI,MS ))
+#define BSRWrr(RS, RD) (_d16(), _REXLrr(RD, RS), _OO_Mrm (0x0fbd ,_b11,_r2(RD),_r2(RS) ))
+#define BSRWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fbd ,_r2(RD) ,MD,MB,MI,MS ))
+
+#define BSFLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fbc ,_b11,_r4(RD),_r4(RS) ))
+#define BSFLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbc ,_r4(RD) ,MD,MB,MI,MS ))
+#define BSRLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fbd ,_b11,_r4(RD),_r4(RS) ))
+#define BSRLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbd ,_r4(RD) ,MD,MB,MI,MS ))
+
+#define BSFQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbc ,_b11,_r8(RD),_r8(RS) ))
+#define BSFQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbc ,_r8(RD) ,MD,MB,MI,MS ))
+#define BSRQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbd ,_b11,_r8(RD),_r8(RS) ))
+#define BSRQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbd ,_r8(RD) ,MD,MB,MI,MS ))
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define MOVSBWrr(RS, RD) (_d16(), _REXBLrr(RD, RS), _OO_Mrm (0x0fbe ,_b11,_r2(RD),_r1(RS) ))
+#define MOVSBWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fbe ,_r2(RD) ,MD,MB,MI,MS ))
+#define MOVZBWrr(RS, RD) (_d16(), _REXBLrr(RD, RS), _OO_Mrm (0x0fb6 ,_b11,_r2(RD),_r1(RS) ))
+#define MOVZBWmr(MD, MB, MI, MS, RD) (_d16(), _REXLmr(MB, MI, RD), _OO_r_X (0x0fb6 ,_r2(RD) ,MD,MB,MI,MS ))
+
+#define MOVSBLrr(RS, RD) (_REXBLrr(RD, RS), _OO_Mrm (0x0fbe ,_b11,_r4(RD),_r1(RS) ))
+#define MOVSBLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbe ,_r4(RD) ,MD,MB,MI,MS ))
+#define MOVZBLrr(RS, RD) (_REXBLrr(RD, RS), _OO_Mrm (0x0fb6 ,_b11,_r4(RD),_r1(RS) ))
+#define MOVZBLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fb6 ,_r4(RD) ,MD,MB,MI,MS ))
+
+#define MOVSBQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fbe ,_b11,_r8(RD),_r1(RS) ))
+#define MOVSBQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fbe ,_r8(RD) ,MD,MB,MI,MS ))
+#define MOVZBQrr(RS, RD) (_REXQrr(RD, RS), _OO_Mrm (0x0fb6 ,_b11,_r8(RD),_r1(RS) ))
+#define MOVZBQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _OO_r_X (0x0fb6 ,_r8(RD) ,MD,MB,MI,MS ))
+
+#define MOVSWLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fbf ,_b11,_r4(RD),_r2(RS) ))
+#define MOVSWLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fbf ,_r4(RD) ,MD,MB,MI,MS ))
+#define MOVZWLrr(RS, RD) (_REXLrr(RD, RS), _OO_Mrm (0x0fb7 ,_b11,_r4(RD),_r2(RS) ))
+#define MOVZWLmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _OO_r_X (0x0fb7 ,_r4(RD) ,MD,MB,MI,MS ))
+
+#define MOVSWQrr(RS, RD) _m64only((_REXQrr(RD, RS), _OO_Mrm (0x0fbf ,_b11,_r8(RD),_r2(RS) )))
+#define MOVSWQmr(MD, MB, MI, MS, RD) _m64only((_REXQmr(MB, MI, RD), _OO_r_X (0x0fbf ,_r8(RD) ,MD,MB,MI,MS )))
+#define MOVZWQrr(RS, RD) _m64only((_REXQrr(RD, RS), _OO_Mrm (0x0fb7 ,_b11,_r8(RD),_r2(RS) )))
+#define MOVZWQmr(MD, MB, MI, MS, RD) _m64only((_REXQmr(MB, MI, RD), _OO_r_X (0x0fb7 ,_r8(RD) ,MD,MB,MI,MS )))
+
+#define MOVSLQrr(RS, RD) _m64only((_REXQrr(RD, RS), _O_Mrm (0x63 ,_b11,_r8(RD),_r4(RS) )))
+#define MOVSLQmr(MD, MB, MI, MS, RD) _m64only((_REXQmr(MB, MI, RD), _O_r_X (0x63 ,_r8(RD) ,MD,MB,MI,MS )))
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define LEALmr(MD, MB, MI, MS, RD) (_REXLmr(MB, MI, RD), _O_r_X (0x8d ,_r4(RD) ,MD,MB,MI,MS ))
+#define LEAQmr(MD, MB, MI, MS, RD) (_REXQmr(MB, MI, RD), _O_r_X (0x8d ,_r4(RD) ,MD,MB,MI,MS ))
+
+#define BSWAPLr(R) (_REXLrr(0, R), _OOr (0x0fc8,_r4(R) ))
+#define BSWAPQr(R) (_REXQrr(0, R), _OOr (0x0fc8,_r8(R) ))
+
+#define CLC() _O (0xf8 )
+#define STC() _O (0xf9 )
+#define CMC() _O (0xf5 )
+
+#define CLD() _O (0xfc )
+#define STD() _O (0xfd )
+
+#define CBTW() (_d16(), _O (0x98 ))
+#define CWTL() _O (0x98 )
+#define CLTQ() _m64only(_REXQrr(0, 0), _O (0x98 ))
+
+#define CBW CBTW
+#define CWDE CWTL
+#define CDQE CLTQ
+
+#define CWTD() (_d16(), _O (0x99 ))
+#define CLTD() _O (0x99 )
+#define CQTO() _m64only(_REXQrr(0, 0), _O (0x99 ))
+
+#define CWD CWTD
+#define CDQ CLTD
+#define CQO CQTO
+
+#define LAHF() _O (0x9f )
+#define SAHF() _O (0x9e )
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define CPUID() _OO (0x0fa2 )
+#define RDTSC() _OO (0xff31 )
+
+#define ENTERii(W, B) _O_W_B (0xc8 ,_su16(W),_su8(B))
+
+#define LEAVE() _O (0xc9 )
+#define RET() _O (0xc3 )
+#define RETi(IM) _O_W (0xc2 ,_su16(IM))
+
+#define NOP() _O (0x90 )
+
+
+/* --- Media 64-bit instructions ------------------------------------------- */
+
+enum {
+ X86_MMX_PABSB = 0x1c, // 2P
+ X86_MMX_PABSW = 0x1d, // 2P
+ X86_MMX_PABSD = 0x1e, // 2P
+ X86_MMX_PACKSSWB = 0x63,
+ X86_MMX_PACKSSDW = 0x6b,
+ X86_MMX_PACKUSWB = 0x67,
+ X86_MMX_PADDB = 0xfc,
+ X86_MMX_PADDW = 0xfd,
+ X86_MMX_PADDD = 0xfe,
+ X86_MMX_PADDQ = 0xd4,
+ X86_MMX_PADDSB = 0xec,
+ X86_MMX_PADDSW = 0xed,
+ X86_MMX_PADDUSB = 0xdc,
+ X86_MMX_PADDUSW = 0xdd,
+ X86_MMX_PAND = 0xdb,
+ X86_MMX_PANDN = 0xdf,
+ X86_MMX_PAVGB = 0xe0,
+ X86_MMX_PAVGW = 0xe3,
+ X86_MMX_PCMPEQB = 0x74,
+ X86_MMX_PCMPEQW = 0x75,
+ X86_MMX_PCMPEQD = 0x76,
+ X86_MMX_PCMPGTB = 0x64,
+ X86_MMX_PCMPGTW = 0x65,
+ X86_MMX_PCMPGTD = 0x66,
+ X86_MMX_PEXTRW = 0xc5, // 64, /r ib
+ X86_MMX_PHADDW = 0x01, // 2P
+ X86_MMX_PHADDD = 0x02, // 2P
+ X86_MMX_PHADDSW = 0x03, // 2P
+ X86_MMX_PHSUBW = 0x05, // 2P
+ X86_MMX_PHSUBD = 0x06, // 2P
+ X86_MMX_PHSUBSW = 0x07, // 2P
+ X86_MMX_PINSRW = 0xc4, // 64, /r ib
+ X86_MMX_PMADDUBSW = 0x04, // 2P
+ X86_MMX_PMADDWD = 0xf5,
+ X86_MMX_PMAXSW = 0xee,
+ X86_MMX_PMAXUB = 0xde,
+ X86_MMX_PMINSW = 0xea,
+ X86_MMX_PMINUB = 0xda,
+ X86_MMX_PMOVMSKB = 0xd7, // 64
+ X86_MMX_PMULHRSW = 0x0b, // 2P
+ X86_MMX_PMULHUW = 0xe4,
+ X86_MMX_PMULHW = 0xe5,
+ X86_MMX_PMULLW = 0xd5,
+ X86_MMX_PMULUDQ = 0xf4,
+ X86_MMX_POR = 0xeb,
+ X86_MMX_PSADBW = 0xf6,
+ X86_MMX_PSHUFB = 0x00, // 2P
+ X86_MMX_PSHUFW = 0x70, // /r ib
+ X86_MMX_PSIGNB = 0x08, // 2P
+ X86_MMX_PSIGNW = 0x09, // 2P
+ X86_MMX_PSIGND = 0x0a, // 2P
+ X86_MMX_PSLLW = 0xf1,
+ X86_MMX_PSLLWi = 0x71, // /6 ib
+ X86_MMX_PSLLD = 0xf2,
+ X86_MMX_PSLLDi = 0x72, // /6 ib
+ X86_MMX_PSLLQ = 0xf3,
+ X86_MMX_PSLLQi = 0x73, // /6 ib
+ X86_MMX_PSRAW = 0xe1,
+ X86_MMX_PSRAWi = 0x71, // /4 ib
+ X86_MMX_PSRAD = 0xe2,
+ X86_MMX_PSRADi = 0x72, // /4 ib
+ X86_MMX_PSRLW = 0xd1,
+ X86_MMX_PSRLWi = 0x71, // /2 ib
+ X86_MMX_PSRLD = 0xd2,
+ X86_MMX_PSRLDi = 0x72, // /2 ib
+ X86_MMX_PSRLQ = 0xd3,
+ X86_MMX_PSRLQi = 0x73, // /2 ib
+ X86_MMX_PSUBB = 0xf8,
+ X86_MMX_PSUBW = 0xf9,
+ X86_MMX_PSUBD = 0xfa,
+ X86_MMX_PSUBQ = 0xfb,
+ X86_MMX_PSUBSB = 0xe8,
+ X86_MMX_PSUBSW = 0xe9,
+ X86_MMX_PSUBUSB = 0xd8,
+ X86_MMX_PSUBUSW = 0xd9,
+ X86_MMX_PUNPCKHBW = 0x68,
+ X86_MMX_PUNPCKHWD = 0x69,
+ X86_MMX_PUNPCKHDQ = 0x6a,
+ X86_MMX_PUNPCKLBW = 0x60,
+ X86_MMX_PUNPCKLWD = 0x61,
+ X86_MMX_PUNPCKLDQ = 0x62,
+ X86_MMX_PXOR = 0xef,
+};
+
+#define __MMXLrr(OP,RS,RSA,RD,RDA) (_REXLrr(RD, RS), _OO_Mrm (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ))
+#define __MMXLmr(OP,MD,MB,MI,MS,RD,RDA) (_REXLmr(MB, MI, RD), _OO_r_X (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
+#define __MMXLrm(OP,RS,RSA,MD,MB,MI,MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0f00|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
+#define __MMXLirr(OP,IM,RS,RSA,RD,RDA) (_REXLrr(RD, RS), _OO_Mrm_B (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ,_u8(IM)))
+#define __MMXLimr(OP,IM,MD,MB,MI,MS,RD,RDA) (_REXLmr(MB, MI, RS), _OO_r_X_B (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ,_u8(IM)))
+#define __MMXQrr(OP,RS,RSA,RD,RDA) (_REXQrr(RD, RS), _OO_Mrm (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ))
+#define __MMXQmr(OP,MD,MB,MI,MS,RD,RDA) (_REXQmr(MB, MI, RD), _OO_r_X (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
+#define __MMXQrm(OP,RS,RSA,MD,MB,MI,MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0f00|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
+#define __MMXQirr(OP,IM,RS,RSA,RD,RDA) (_REXQrr(RD, RS), _OO_Mrm_B (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ,_u8(IM)))
+#define __MMXQimr(OP,IM,MD,MB,MI,MS,RD,RDA) (_REXQmr(MB, MI, RS), _OO_r_X_B (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ,_u8(IM)))
+#define __MMX1Lrr(PX,OP,RS,RSA,RD,RDA) (_REXLrr(RD, RS), _B(0x0f),_OO_Mrm(((PX)<<8)|(OP) ,_b11,RDA(RD),RSA(RS) ))
+#define __MMX1Lmr(PX,OP,MD,MB,MI,MS,RD,RDA) (_REXLmr(MB, MI, RD), _B(0x0f),_OO_r_X(((PX)<<8)|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
+#define __MMX1Lrm(PX,OP,RS,RSA,MD,MB,MI,MS) (_REXLrm(RS, MB, MI), _B(0x0f),_OO_r_X(((PX)<<8)|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
+
+#define _MMXLrr(OP,RS,RD) __MMXLrr(OP,RS,_rM,RD,_rM)
+#define _MMXLmr(OP,MD,MB,MI,MS,RD) __MMXLmr(OP,MD,MB,MI,MS,RD,_rM)
+#define _MMXLrm(OP,RS,MD,MB,MI,MS) __MMXLrm(OP,RS,_rM,MD,MB,MI,MS)
+#define _MMXQrr(OP,RS,RD) __MMXQrr(OP,RS,_rM,RD,_rM)
+#define _MMXQmr(OP,MD,MB,MI,MS,RD) __MMXQmr(OP,MD,MB,MI,MS,RD,_rM)
+#define _MMXQrm(OP,RS,MD,MB,MI,MS) __MMXQrm(OP,RS,_rM,MD,MB,MI,MS)
+#define _2P_MMXLrr(OP,RS,RD) __MMX1Lrr(0x38, OP,RS,_rM,RD,_rM)
+#define _2P_MMXLmr(OP,MD,MB,MI,MS,RD) __MMX1Lmr(0x38, OP,MD,MB,MI,MS,RD,_rM)
+#define _2P_MMXLrm(OP,RS,MD,MB,MI,MS) __MMX1Lrm(0x38, OP,RS,_rM,MD,MB,MI,MS)
+
+#define MMX_MOVDMDrr(RS, RD) __MMXLrr(0x6e, RS,_r4, RD,_rM)
+#define MMX_MOVQMDrr(RS, RD) __MMXQrr(0x6e, RS,_r8, RD,_rM)
+#define MMX_MOVDMSrr(RS, RD) __MMXLrr(0x7e, RD,_r4, RS,_rM)
+#define MMX_MOVQMSrr(RS, RD) __MMXQrr(0x7e, RD,_r8, RS,_rM)
+
+#define MMX_MOVDmr(MD, MB, MI, MS, RD) _MMXLmr(0x6e, MD, MB, MI, MS, RD)
+#define MMX_MOVDrm(RS, MD, MB, MI, MS) _MMXLrm(0x7e, RS, MD, MB, MI, MS)
+#define MMX_MOVQrr(RS, RD) _MMXLrr(0x6f, RS, RD)
+#define MMX_MOVQmr(MD, MB, MI, MS, RD) _MMXLmr(0x6f, MD, MB, MI, MS, RD)
+#define MMX_MOVQrm(RS, MD, MB, MI, MS) _MMXLrm(0x7f, RS, MD, MB, MI, MS)
+
+// Original MMX instructions
+#define MMX_PACKSSWBrr(RS, RD) _MMXLrr(X86_MMX_PACKSSWB,RS,RD)
+#define MMX_PACKSSWBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PACKSSWB, MD, MB, MI, MS, RD)
+#define MMX_PACKSSDWrr(RS, RD) _MMXLrr(X86_MMX_PACKSSDW,RS,RD)
+#define MMX_PACKSSDWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PACKSSDW, MD, MB, MI, MS, RD)
+#define MMX_PACKUSWBrr(RS, RD) _MMXLrr(X86_MMX_PACKUSWB,RS,RD)
+#define MMX_PACKUSWBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PACKUSWB, MD, MB, MI, MS, RD)
+#define MMX_PADDBrr(RS, RD) _MMXLrr(X86_MMX_PADDB,RS,RD)
+#define MMX_PADDBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDB, MD, MB, MI, MS, RD)
+#define MMX_PADDWrr(RS, RD) _MMXLrr(X86_MMX_PADDW,RS,RD)
+#define MMX_PADDWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDW, MD, MB, MI, MS, RD)
+#define MMX_PADDDrr(RS, RD) _MMXLrr(X86_MMX_PADDD,RS,RD)
+#define MMX_PADDDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDD, MD, MB, MI, MS, RD)
+#define MMX_PADDQrr(RS, RD) _MMXLrr(X86_MMX_PADDQ,RS,RD)
+#define MMX_PADDQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDQ, MD, MB, MI, MS, RD)
+#define MMX_PADDSBrr(RS, RD) _MMXLrr(X86_MMX_PADDSB,RS,RD)
+#define MMX_PADDSBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDSB, MD, MB, MI, MS, RD)
+#define MMX_PADDSWrr(RS, RD) _MMXLrr(X86_MMX_PADDSW,RS,RD)
+#define MMX_PADDSWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDSW, MD, MB, MI, MS, RD)
+#define MMX_PADDUSBrr(RS, RD) _MMXLrr(X86_MMX_PADDUSB,RS,RD)
+#define MMX_PADDUSBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDUSB, MD, MB, MI, MS, RD)
+#define MMX_PADDUSWrr(RS, RD) _MMXLrr(X86_MMX_PADDUSW,RS,RD)
+#define MMX_PADDUSWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PADDUSW, MD, MB, MI, MS, RD)
+#define MMX_PANDrr(RS, RD) _MMXLrr(X86_MMX_PAND,RS,RD)
+#define MMX_PANDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PAND, MD, MB, MI, MS, RD)
+#define MMX_PANDNrr(RS, RD) _MMXLrr(X86_MMX_PANDN,RS,RD)
+#define MMX_PANDNmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PANDN, MD, MB, MI, MS, RD)
+#define MMX_PAVGBrr(RS, RD) _MMXLrr(X86_MMX_PAVGB,RS,RD)
+#define MMX_PAVGBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PAVGB, MD, MB, MI, MS, RD)
+#define MMX_PAVGWrr(RS, RD) _MMXLrr(X86_MMX_PAVGW,RS,RD)
+#define MMX_PAVGWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PAVGW, MD, MB, MI, MS, RD)
+#define MMX_PCMPEQBrr(RS, RD) _MMXLrr(X86_MMX_PCMPEQB,RS,RD)
+#define MMX_PCMPEQBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PCMPEQB, MD, MB, MI, MS, RD)
+#define MMX_PCMPEQWrr(RS, RD) _MMXLrr(X86_MMX_PCMPEQW,RS,RD)
+#define MMX_PCMPEQWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PCMPEQW, MD, MB, MI, MS, RD)
+#define MMX_PCMPEQDrr(RS, RD) _MMXLrr(X86_MMX_PCMPEQD,RS,RD)
+#define MMX_PCMPEQDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PCMPEQD, MD, MB, MI, MS, RD)
+#define MMX_PCMPGTBrr(RS, RD) _MMXLrr(X86_MMX_PCMPGTB,RS,RD)
+#define MMX_PCMPGTBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PCMPGTB, MD, MB, MI, MS, RD)
+#define MMX_PCMPGTWrr(RS, RD) _MMXLrr(X86_MMX_PCMPGTW,RS,RD)
+#define MMX_PCMPGTWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PCMPGTW, MD, MB, MI, MS, RD)
+#define MMX_PCMPGTDrr(RS, RD) _MMXLrr(X86_MMX_PCMPGTD,RS,RD)
+#define MMX_PCMPGTDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PCMPGTD, MD, MB, MI, MS, RD)
+#define MMX_PMADDWDrr(RS, RD) _MMXLrr(X86_MMX_PMADDWD,RS,RD)
+#define MMX_PMADDWDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMADDWD, MD, MB, MI, MS, RD)
+#define MMX_PMAXSWrr(RS, RD) _MMXLrr(X86_MMX_PMAXSW,RS,RD)
+#define MMX_PMAXSWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMAXSW, MD, MB, MI, MS, RD)
+#define MMX_PMAXUBrr(RS, RD) _MMXLrr(X86_MMX_PMAXUB,RS,RD)
+#define MMX_PMAXUBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMAXUB, MD, MB, MI, MS, RD)
+#define MMX_PMINSWrr(RS, RD) _MMXLrr(X86_MMX_PMINSW,RS,RD)
+#define MMX_PMINSWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMINSW, MD, MB, MI, MS, RD)
+#define MMX_PMINUBrr(RS, RD) _MMXLrr(X86_MMX_PMINUB,RS,RD)
+#define MMX_PMINUBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMINUB, MD, MB, MI, MS, RD)
+#define MMX_PMULHUWrr(RS, RD) _MMXLrr(X86_MMX_PMULHUW,RS,RD)
+#define MMX_PMULHUWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMULHUW, MD, MB, MI, MS, RD)
+#define MMX_PMULHWrr(RS, RD) _MMXLrr(X86_MMX_PMULHW,RS,RD)
+#define MMX_PMULHWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMULHW, MD, MB, MI, MS, RD)
+#define MMX_PMULLWrr(RS, RD) _MMXLrr(X86_MMX_PMULLW,RS,RD)
+#define MMX_PMULLWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMULLW, MD, MB, MI, MS, RD)
+#define MMX_PMULUDQrr(RS, RD) _MMXLrr(X86_MMX_PMULUDQ,RS,RD)
+#define MMX_PMULUDQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PMULUDQ, MD, MB, MI, MS, RD)
+#define MMX_PORrr(RS, RD) _MMXLrr(X86_MMX_POR,RS,RD)
+#define MMX_PORmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_POR, MD, MB, MI, MS, RD)
+#define MMX_PSADBWrr(RS, RD) _MMXLrr(X86_MMX_PSADBW,RS,RD)
+#define MMX_PSADBWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSADBW, MD, MB, MI, MS, RD)
+#define MMX_PSLLWir(IM, RD) __MMXLirr(X86_MMX_PSLLWi, IM, RD,_rM, _b110,_rN)
+#define MMX_PSLLWrr(RS, RD) _MMXLrr(X86_MMX_PSLLW,RS,RD)
+#define MMX_PSLLWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSLLW, MD, MB, MI, MS, RD)
+#define MMX_PSLLDir(IM, RD) __MMXLirr(X86_MMX_PSLLDi, IM, RD,_rM, _b110,_rN)
+#define MMX_PSLLDrr(RS, RD) _MMXLrr(X86_MMX_PSLLD,RS,RD)
+#define MMX_PSLLDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSLLD, MD, MB, MI, MS, RD)
+#define MMX_PSLLQir(IM, RD) __MMXLirr(X86_MMX_PSLLQi, IM, RD,_rM, _b110,_rN)
+#define MMX_PSLLQrr(RS, RD) _MMXLrr(X86_MMX_PSLLQ,RS,RD)
+#define MMX_PSLLQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSLLQ, MD, MB, MI, MS, RD)
+#define MMX_PSRAWir(IM, RD) __MMXLirr(X86_MMX_PSRAWi, IM, RD,_rM, _b100,_rN)
+#define MMX_PSRAWrr(RS, RD) _MMXLrr(X86_MMX_PSRAW,RS,RD)
+#define MMX_PSRAWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSRAW, MD, MB, MI, MS, RD)
+#define MMX_PSRADir(IM, RD) __MMXLirr(X86_MMX_PSRADi, IM, RD,_rM, _b100,_rN)
+#define MMX_PSRADrr(RS, RD) _MMXLrr(X86_MMX_PSRAD,RS,RD)
+#define MMX_PSRADmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSRAD, MD, MB, MI, MS, RD)
+#define MMX_PSRLWir(IM, RD) __MMXLirr(X86_MMX_PSRLWi, IM, RD,_rM, _b010,_rN)
+#define MMX_PSRLWrr(RS, RD) _MMXLrr(X86_MMX_PSRLW,RS,RD)
+#define MMX_PSRLWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSRLW, MD, MB, MI, MS, RD)
+#define MMX_PSRLDir(IM, RD) __MMXLirr(X86_MMX_PSRLDi, IM, RD,_rM, _b010,_rN)
+#define MMX_PSRLDrr(RS, RD) _MMXLrr(X86_MMX_PSRLD,RS,RD)
+#define MMX_PSRLDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSRLD, MD, MB, MI, MS, RD)
+#define MMX_PSRLQir(IM, RD) __MMXLirr(X86_MMX_PSRLQi, IM, RD,_rM, _b010,_rN)
+#define MMX_PSRLQrr(RS, RD) _MMXLrr(X86_MMX_PSRLQ,RS,RD)
+#define MMX_PSRLQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSRLQ, MD, MB, MI, MS, RD)
+#define MMX_PSUBBrr(RS, RD) _MMXLrr(X86_MMX_PSUBB,RS,RD)
+#define MMX_PSUBBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBB, MD, MB, MI, MS, RD)
+#define MMX_PSUBWrr(RS, RD) _MMXLrr(X86_MMX_PSUBW,RS,RD)
+#define MMX_PSUBWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBW, MD, MB, MI, MS, RD)
+#define MMX_PSUBDrr(RS, RD) _MMXLrr(X86_MMX_PSUBD,RS,RD)
+#define MMX_PSUBDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBD, MD, MB, MI, MS, RD)
+#define MMX_PSUBQrr(RS, RD) _MMXLrr(X86_MMX_PSUBQ,RS,RD)
+#define MMX_PSUBQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBQ, MD, MB, MI, MS, RD)
+#define MMX_PSUBSBrr(RS, RD) _MMXLrr(X86_MMX_PSUBSB,RS,RD)
+#define MMX_PSUBSBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBSB, MD, MB, MI, MS, RD)
+#define MMX_PSUBSWrr(RS, RD) _MMXLrr(X86_MMX_PSUBSW,RS,RD)
+#define MMX_PSUBSWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBSW, MD, MB, MI, MS, RD)
+#define MMX_PSUBUSBrr(RS, RD) _MMXLrr(X86_MMX_PSUBUSB,RS,RD)
+#define MMX_PSUBUSBmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBUSB, MD, MB, MI, MS, RD)
+#define MMX_PSUBUSWrr(RS, RD) _MMXLrr(X86_MMX_PSUBUSW,RS,RD)
+#define MMX_PSUBUSWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PSUBUSW, MD, MB, MI, MS, RD)
+#define MMX_PUNPCKHBWrr(RS, RD) _MMXLrr(X86_MMX_PUNPCKHBW,RS,RD)
+#define MMX_PUNPCKHBWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PUNPCKHBW, MD, MB, MI, MS, RD)
+#define MMX_PUNPCKHWDrr(RS, RD) _MMXLrr(X86_MMX_PUNPCKHWD,RS,RD)
+#define MMX_PUNPCKHWDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PUNPCKHWD, MD, MB, MI, MS, RD)
+#define MMX_PUNPCKHDQrr(RS, RD) _MMXLrr(X86_MMX_PUNPCKHDQ,RS,RD)
+#define MMX_PUNPCKHDQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PUNPCKHDQ, MD, MB, MI, MS, RD)
+#define MMX_PUNPCKLBWrr(RS, RD) _MMXLrr(X86_MMX_PUNPCKLBW,RS,RD)
+#define MMX_PUNPCKLBWmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PUNPCKLBW, MD, MB, MI, MS, RD)
+#define MMX_PUNPCKLWDrr(RS, RD) _MMXLrr(X86_MMX_PUNPCKLWD,RS,RD)
+#define MMX_PUNPCKLWDmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PUNPCKLWD, MD, MB, MI, MS, RD)
+#define MMX_PUNPCKLDQrr(RS, RD) _MMXLrr(X86_MMX_PUNPCKLDQ,RS,RD)
+#define MMX_PUNPCKLDQmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PUNPCKLDQ, MD, MB, MI, MS, RD)
+#define MMX_PXORrr(RS, RD) _MMXLrr(X86_MMX_PXOR,RS,RD)
+#define MMX_PXORmr(MD,MB,MI,MS,RD) _MMXLmr(X86_MMX_PXOR, MD, MB, MI, MS, RD)
+
+#define MMX_PSHUFWirr(IM, RS, RD) __MMXLirr(X86_MMX_PSHUFW, IM, RS,_rM, RD,_rM)
+#define MMX_PSHUFWimr(IM, MD, MB, MI, MS, RD) __MMXLimr(X86_MMX_PSHUFW, IM, MD, MB, MI, MS, RD,_rM)
+#define MMX_PEXTRWLirr(IM, RS, RD) __MMXLirr(X86_MMX_PEXTRW, IM, RS,_rM, RD,_r4)
+#define MMX_PEXTRWQirr(IM, RS, RD) __MMXQirr(X86_MMX_PEXTRW, IM, RS,_rM, RD,_r8)
+#define MMX_PINSRWLirr(IM, RS, RD) __MMXLirr(X86_MMX_PINSRW, IM, RS,_r4, RD,_rM)
+#define MMX_PINSRWLimr(IM, MD, MB, MI, MS, RD) __MMXLimr(X86_MMX_PINSRW, IM, MD, MB, MI, MS, RD,_r4)
+#define MMX_PINSRWQirr(IM, RS, RD) __MMXQirr(X86_MMX_PINSRW, IM, RS,_r4, RD,_rM)
+#define MMX_PINSRWQimr(IM, MD, MB, MI, MS, RD) __MMXQimr(X86_MMX_PINSRW, IM, MD, MB, MI, MS, RD,_r8)
+
+// Additionnal MMX instructions, brought by SSSE3 ISA
+#define MMX_PABSBrr(RS, RD) _2P_MMXLrr(X86_MMX_PABSB,RS,RD)
+#define MMX_PABSBmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PABSB, MD, MB, MI, MS, RD)
+#define MMX_PABSWrr(RS, RD) _2P_MMXLrr(X86_MMX_PABSW,RS,RD)
+#define MMX_PABSWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PABSW, MD, MB, MI, MS, RD)
+#define MMX_PABSDrr(RS, RD) _2P_MMXLrr(X86_MMX_PABSD,RS,RD)
+#define MMX_PABSDmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PABSD, MD, MB, MI, MS, RD)
+#define MMX_PHADDWrr(RS, RD) _2P_MMXLrr(X86_MMX_PHADDW,RS,RD)
+#define MMX_PHADDWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PHADDW, MD, MB, MI, MS, RD)
+#define MMX_PHADDDrr(RS, RD) _2P_MMXLrr(X86_MMX_PHADDD,RS,RD)
+#define MMX_PHADDDmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PHADDD, MD, MB, MI, MS, RD)
+#define MMX_PHADDSWrr(RS, RD) _2P_MMXLrr(X86_MMX_PHADDSW,RS,RD)
+#define MMX_PHADDSWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PHADDSW, MD, MB, MI, MS, RD)
+#define MMX_PHSUBWrr(RS, RD) _2P_MMXLrr(X86_MMX_PHSUBW,RS,RD)
+#define MMX_PHSUBWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PHSUBW, MD, MB, MI, MS, RD)
+#define MMX_PHSUBDrr(RS, RD) _2P_MMXLrr(X86_MMX_PHSUBD,RS,RD)
+#define MMX_PHSUBDmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PHSUBD, MD, MB, MI, MS, RD)
+#define MMX_PHSUBSWrr(RS, RD) _2P_MMXLrr(X86_MMX_PHSUBSW,RS,RD)
+#define MMX_PHSUBSWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PHSUBSW, MD, MB, MI, MS, RD)
+#define MMX_PMADDUBSWrr(RS, RD) _2P_MMXLrr(X86_MMX_PMADDUBSW,RS,RD)
+#define MMX_PMADDUBSWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PMADDUBSW, MD, MB, MI, MS, RD)
+#define MMX_PMULHRSWrr(RS, RD) _2P_MMXLrr(X86_MMX_PMULHRSW,RS,RD)
+#define MMX_PMULHRSWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PMULHRSW, MD, MB, MI, MS, RD)
+#define MMX_PSHUFBrr(RS, RD) _2P_MMXLrr(X86_MMX_PSHUFB,RS,RD)
+#define MMX_PSHUFBmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PSHUFB, MD, MB, MI, MS, RD)
+#define MMX_PSIGNBrr(RS, RD) _2P_MMXLrr(X86_MMX_PSIGNB,RS,RD)
+#define MMX_PSIGNBmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PSIGNB, MD, MB, MI, MS, RD)
+#define MMX_PSIGNWrr(RS, RD) _2P_MMXLrr(X86_MMX_PSIGNW,RS,RD)
+#define MMX_PSIGNWmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PSIGNW, MD, MB, MI, MS, RD)
+#define MMX_PSIGNDrr(RS, RD) _2P_MMXLrr(X86_MMX_PSIGND,RS,RD)
+#define MMX_PSIGNDmr(MD,MB,MI,MS,RD) _2P_MMXLmr(X86_MMX_PSIGND, MD, MB, MI, MS, RD)
+
+#define EMMS() _OO (0x0f77 )
+
+
+/* --- Media 128-bit instructions ------------------------------------------ */
+
+enum {
+ X86_SSE_CC_EQ = 0,
+ X86_SSE_CC_LT = 1,
+ X86_SSE_CC_GT = 1,
+ X86_SSE_CC_LE = 2,
+ X86_SSE_CC_GE = 2,
+ X86_SSE_CC_U = 3,
+ X86_SSE_CC_NEQ = 4,
+ X86_SSE_CC_NLT = 5,
+ X86_SSE_CC_NGT = 5,
+ X86_SSE_CC_NLE = 6,
+ X86_SSE_CC_NGE = 6,
+ X86_SSE_CC_O = 7
+};
+
+enum {
+ X86_SSE_UCOMI = 0x2e,
+ X86_SSE_COMI = 0x2f,
+ X86_SSE_CMP = 0xc2,
+ X86_SSE_SQRT = 0x51,
+ X86_SSE_RSQRT = 0x52,
+ X86_SSE_RCP = 0x53,
+ X86_SSE_AND = 0x54,
+ X86_SSE_ANDN = 0x55,
+ X86_SSE_OR = 0x56,
+ X86_SSE_XOR = 0x57,
+ X86_SSE_ADD = 0x58,
+ X86_SSE_MUL = 0x59,
+ X86_SSE_SUB = 0x5c,
+ X86_SSE_MIN = 0x5d,
+ X86_SSE_DIV = 0x5e,
+ X86_SSE_MAX = 0x5f,
+ X86_SSE_CVTDQ2PD = 0xe6,
+ X86_SSE_CVTDQ2PS = 0x5b,
+ X86_SSE_CVTPD2DQ = 0xe6,
+ X86_SSE_CVTPD2PI = 0x2d,
+ X86_SSE_CVTPD2PS = 0x5a,
+ X86_SSE_CVTPI2PD = 0x2a,
+ X86_SSE_CVTPI2PS = 0x2a,
+ X86_SSE_CVTPS2DQ = 0x5b,
+ X86_SSE_CVTPS2PD = 0x5a,
+ X86_SSE_CVTPS2PI = 0x2d,
+ X86_SSE_CVTSD2SI = 0x2d,
+ X86_SSE_CVTSD2SS = 0x5a,
+ X86_SSE_CVTSI2SD = 0x2a,
+ X86_SSE_CVTSI2SS = 0x2a,
+ X86_SSE_CVTSS2SD = 0x5a,
+ X86_SSE_CVTSS2SI = 0x2d,
+ X86_SSE_CVTTPD2PI = 0x2c,
+ X86_SSE_CVTTPD2DQ = 0xe6,
+ X86_SSE_CVTTPS2DQ = 0x5b,
+ X86_SSE_CVTTPS2PI = 0x2c,
+ X86_SSE_CVTTSD2SI = 0x2c,
+ X86_SSE_CVTTSS2SI = 0x2c,
+ X86_SSE_MOVMSK = 0x50,
+ X86_SSE_PACKSSDW = 0x6b,
+ X86_SSE_PACKSSWB = 0x63,
+ X86_SSE_PACKUSWB = 0x67,
+ X86_SSE_PADDB = 0xfc,
+ X86_SSE_PADDD = 0xfe,
+ X86_SSE_PADDQ = 0xd4,
+ X86_SSE_PADDSB = 0xec,
+ X86_SSE_PADDSW = 0xed,
+ X86_SSE_PADDUSB = 0xdc,
+ X86_SSE_PADDUSW = 0xdd,
+ X86_SSE_PADDW = 0xfd,
+ X86_SSE_PAND = 0xdb,
+ X86_SSE_PANDN = 0xdf,
+ X86_SSE_PAVGB = 0xe0,
+ X86_SSE_PAVGW = 0xe3,
+ X86_SSE_PCMPEQB = 0x74,
+ X86_SSE_PCMPEQD = 0x76,
+ X86_SSE_PCMPEQW = 0x75,
+ X86_SSE_PCMPGTB = 0x64,
+ X86_SSE_PCMPGTD = 0x66,
+ X86_SSE_PCMPGTW = 0x65,
+ X86_SSE_PMADDWD = 0xf5,
+ X86_SSE_PMAXSW = 0xee,
+ X86_SSE_PMAXUB = 0xde,
+ X86_SSE_PMINSW = 0xea,
+ X86_SSE_PMINUB = 0xda,
+ X86_SSE_PMOVMSKB = 0xd7,
+ X86_SSE_PMULHUW = 0xe4,
+ X86_SSE_PMULHW = 0xe5,
+ X86_SSE_PMULLW = 0xd5,
+ X86_SSE_PMULUDQ = 0xf4,
+ X86_SSE_POR = 0xeb,
+ X86_SSE_PSADBW = 0xf6,
+ X86_SSE_PSLLD = 0xf2,
+ X86_SSE_PSLLQ = 0xf3,
+ X86_SSE_PSLLW = 0xf1,
+ X86_SSE_PSRAD = 0xe2,
+ X86_SSE_PSRAW = 0xe1,
+ X86_SSE_PSRLD = 0xd2,
+ X86_SSE_PSRLQ = 0xd3,
+ X86_SSE_PSRLW = 0xd1,
+ X86_SSE_PSUBB = 0xf8,
+ X86_SSE_PSUBD = 0xfa,
+ X86_SSE_PSUBQ = 0xfb,
+ X86_SSE_PSUBSB = 0xe8,
+ X86_SSE_PSUBSW = 0xe9,
+ X86_SSE_PSUBUSB = 0xd8,
+ X86_SSE_PSUBUSW = 0xd9,
+ X86_SSE_PSUBW = 0xf9,
+ X86_SSE_PUNPCKHBW = 0x68,
+ X86_SSE_PUNPCKHDQ = 0x6a,
+ X86_SSE_PUNPCKHQDQ = 0x6d,
+ X86_SSE_PUNPCKHWD = 0x69,
+ X86_SSE_PUNPCKLBW = 0x60,
+ X86_SSE_PUNPCKLDQ = 0x62,
+ X86_SSE_PUNPCKLQDQ = 0x6c,
+ X86_SSE_PUNPCKLWD = 0x61,
+ X86_SSE_PXOR = 0xef,
+ X86_SSSE3_PSHUFB = 0x00,
+};
+
+/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */
+
+#define _SSSE3Lrr(OP1,OP2,RS,RSA,RD,RDA) (_B(0x66), _REXLrr(RD,RD), _B(0x0f), _OO_Mrm (((OP1)<<8)|(OP2) ,_b11,RDA(RD),RSA(RS) ))
+#define _SSSE3Lmr(OP1,OP2,MD,MB,MI,MS,RD,RDA) (_B(0x66), _REXLmr(MB, MI, RD), _B(0x0f), _OO_r_X (((OP1)<<8)|(OP2) ,RDA(RD) ,MD,MB,MI,MS ))
+#define _SSSE3Lirr(OP1,OP2,IM,RS,RD) (_B(0x66), _REXLrr(RD, RS), _B(0x0f), _OO_Mrm_B (((OP1)<<8)|(OP2) ,_b11,_rX(RD),_rX(RS) ,_u8(IM)))
+#define _SSSE3Limr(OP1,OP2,IM,MD,MB,MI,MS,RD) (_B(0x66), _REXLmr(MB, MI, RD), _B(0x0f), _OO_r_X_B (((OP1)<<8)|(OP2) ,_rX(RD) ,MD,MB,MI,MS ,_u8(IM)))
+
+#define __SSELir(OP,MO,IM,RD) (_REXLrr(0, RD), _OO_Mrm_B (0x0f00|(OP) ,_b11,MO ,_rX(RD) ,_u8(IM)))
+#define __SSELim(OP,MO,IM,MD,MB,MI,MS) (_REXLrm(0, MB, MI), _OO_r_X_B (0x0f00|(OP) ,MO ,MD,MB,MI,MS ,_u8(IM)))
+#define __SSELrr(OP,RS,RSA,RD,RDA) (_REXLrr(RD, RS), _OO_Mrm (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ))
+#define __SSELmr(OP,MD,MB,MI,MS,RD,RDA) (_REXLmr(MB, MI, RD), _OO_r_X (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
+#define __SSELrm(OP,RS,RSA,MD,MB,MI,MS) (_REXLrm(RS, MB, MI), _OO_r_X (0x0f00|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
+#define __SSELirr(OP,IM,RS,RD) (_REXLrr(RD, RS), _OO_Mrm_B (0x0f00|(OP) ,_b11,_rX(RD),_rX(RS) ,_u8(IM)))
+#define __SSELimr(OP,IM,MD,MB,MI,MS,RD) (_REXLmr(MB, MI, RD), _OO_r_X_B (0x0f00|(OP) ,_rX(RD) ,MD,MB,MI,MS ,_u8(IM)))
+
+#define __SSEQrr(OP,RS,RSA,RD,RDA) (_REXQrr(RD, RS), _OO_Mrm (0x0f00|(OP) ,_b11,RDA(RD),RSA(RS) ))
+#define __SSEQmr(OP,MD,MB,MI,MS,RD,RDA) (_REXQmr(MB, MI, RD), _OO_r_X (0x0f00|(OP) ,RDA(RD) ,MD,MB,MI,MS ))
+#define __SSEQrm(OP,RS,RSA,MD,MB,MI,MS) (_REXQrm(RS, MB, MI), _OO_r_X (0x0f00|(OP) ,RSA(RS) ,MD,MB,MI,MS ))
+
+#define _SSELrr(PX,OP,RS,RSA,RD,RDA) (_B(PX), __SSELrr(OP, RS, RSA, RD, RDA))
+#define _SSELmr(PX,OP,MD,MB,MI,MS,RD,RDA) (_B(PX), __SSELmr(OP, MD, MB, MI, MS, RD, RDA))
+#define _SSELrm(PX,OP,RS,RSA,MD,MB,MI,MS) (_B(PX), __SSELrm(OP, RS, RSA, MD, MB, MI, MS))
+#define _SSELir(PX,OP,MO,IM,RD) (_B(PX), __SSELir(OP, MO, IM, RD))
+#define _SSELim(PX,OP,MO,IM,MD,MB,MI,MS) (_B(PX), __SSELim(OP, MO, IM, MD, MB, MI, MS))
+#define _SSELirr(PX,OP,IM,RS,RD) (_B(PX), __SSELirr(OP, IM, RS, RD))
+#define _SSELimr(PX,OP,IM,MD,MB,MI,MS,RD) (_B(PX), __SSELimr(OP, IM, MD, MB, MI, MS, RD))
+
+#define _SSEQrr(PX,OP,RS,RSA,RD,RDA) (_B(PX), __SSEQrr(OP, RS, RSA, RD, RDA))
+#define _SSEQmr(PX,OP,MD,MB,MI,MS,RD,RDA) (_B(PX), __SSEQmr(OP, MD, MB, MI, MS, RD, RDA))
+#define _SSEQrm(PX,OP,RS,RSA,MD,MB,MI,MS) (_B(PX), __SSEQrm(OP, RS, RSA, MD, MB, MI, MS))
+
+#define _SSEPSrr(OP,RS,RD) __SSELrr( OP, RS,_rX, RD,_rX)
+#define _SSEPSmr(OP,MD,MB,MI,MS,RD) __SSELmr( OP, MD, MB, MI, MS, RD,_rX)
+#define _SSEPSrm(OP,RS,MD,MB,MI,MS) __SSELrm( OP, RS,_rX, MD, MB, MI, MS)
+#define _SSEPSirr(OP,IM,RS,RD) __SSELirr( OP, IM, RS, RD)
+#define _SSEPSimr(OP,IM,MD,MB,MI,MS,RD) __SSELimr( OP, IM, MD, MB, MI, MS, RD)
+
+#define _SSEPDrr(OP,RS,RD) _SSELrr(0x66, OP, RS,_rX, RD,_rX)
+#define _SSEPDmr(OP,MD,MB,MI,MS,RD) _SSELmr(0x66, OP, MD, MB, MI, MS, RD,_rX)
+#define _SSEPDrm(OP,RS,MD,MB,MI,MS) _SSELrm(0x66, OP, RS,_rX, MD, MB, MI, MS)
+#define _SSEPDirr(OP,IM,RS,RD) _SSELirr(0x66, OP, IM, RS, RD)
+#define _SSEPDimr(OP,IM,MD,MB,MI,MS,RD) _SSELimr(0x66, OP, IM, MD, MB, MI, MS, RD)
+
+#define _SSESSrr(OP,RS,RD) _SSELrr(0xf3, OP, RS,_rX, RD,_rX)
+#define _SSESSmr(OP,MD,MB,MI,MS,RD) _SSELmr(0xf3, OP, MD, MB, MI, MS, RD,_rX)
+#define _SSESSrm(OP,RS,MD,MB,MI,MS) _SSELrm(0xf3, OP, RS,_rX, MD, MB, MI, MS)
+#define _SSESSirr(OP,IM,RS,RD) _SSELirr(0xf3, OP, IM, RS, RD)
+#define _SSESSimr(OP,IM,MD,MB,MI,MS,RD) _SSELimr(0xf3, OP, IM, MD, MB, MI, MS, RD)
+
+#define _SSESDrr(OP,RS,RD) _SSELrr(0xf2, OP, RS,_rX, RD,_rX)
+#define _SSESDmr(OP,MD,MB,MI,MS,RD) _SSELmr(0xf2, OP, MD, MB, MI, MS, RD,_rX)
+#define _SSESDrm(OP,RS,MD,MB,MI,MS) _SSELrm(0xf2, OP, RS,_rX, MD, MB, MI, MS)
+#define _SSESDirr(OP,IM,RS,RD) _SSELirr(0xf2, OP, IM, RS, RD)
+#define _SSESDimr(OP,IM,MD,MB,MI,MS,RD) _SSELimr(0xf2, OP, IM, MD, MB, MI, MS, RD)
+
+#define ADDPSrr(RS, RD) _SSEPSrr(X86_SSE_ADD, RS, RD)
+#define ADDPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
+#define ADDPDrr(RS, RD) _SSEPDrr(X86_SSE_ADD, RS, RD)
+#define ADDPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
+
+#define ADDSSrr(RS, RD) _SSESSrr(X86_SSE_ADD, RS, RD)
+#define ADDSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
+#define ADDSDrr(RS, RD) _SSESDrr(X86_SSE_ADD, RS, RD)
+#define ADDSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_ADD, MD, MB, MI, MS, RD)
+
+#define ANDNPSrr(RS, RD) _SSEPSrr(X86_SSE_ANDN, RS, RD)
+#define ANDNPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_ANDN, MD, MB, MI, MS, RD)
+#define ANDNPDrr(RS, RD) _SSEPDrr(X86_SSE_ANDN, RS, RD)
+#define ANDNPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_ANDN, MD, MB, MI, MS, RD)
+
+#define ANDPSrr(RS, RD) _SSEPSrr(X86_SSE_AND, RS, RD)
+#define ANDPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_AND, MD, MB, MI, MS, RD)
+#define ANDPDrr(RS, RD) _SSEPDrr(X86_SSE_AND, RS, RD)
+#define ANDPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_AND, MD, MB, MI, MS, RD)
+
+#define CMPPSrr(IM, RS, RD) _SSEPSirr(X86_SSE_CMP, IM, RS, RD)
+#define CMPPSmr(IM, MD, MB, MI, MS, RD) _SSEPSimr(X86_SSE_CMP, IM, MD, MB, MI, MS, RD)
+#define CMPPDrr(IM, RS, RD) _SSEPDirr(X86_SSE_CMP, IM, RS, RD)
+#define CMPPDmr(IM, MD, MB, MI, MS, RD) _SSEPDimr(X86_SSE_CMP, IM, MD, MB, MI, MS, RD)
+
+#define CMPSSrr(IM, RS, RD) _SSESSirr(X86_SSE_CMP, IM, RS, RD)
+#define CMPSSmr(IM, MD, MB, MI, MS, RD) _SSESSimr(X86_SSE_CMP, IM, MD, MB, MI, MS, RD)
+#define CMPSDrr(IM, RS, RD) _SSESDirr(X86_SSE_CMP, IM, RS, RD)
+#define CMPSDmr(IM, MD, MB, MI, MS, RD) _SSESDimr(X86_SSE_CMP, IM, MD, MB, MI, MS, RD)
+
+#define DIVPSrr(RS, RD) _SSEPSrr(X86_SSE_DIV, RS, RD)
+#define DIVPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
+#define DIVPDrr(RS, RD) _SSEPDrr(X86_SSE_DIV, RS, RD)
+#define DIVPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
+
+#define DIVSSrr(RS, RD) _SSESSrr(X86_SSE_DIV, RS, RD)
+#define DIVSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
+#define DIVSDrr(RS, RD) _SSESDrr(X86_SSE_DIV, RS, RD)
+#define DIVSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_DIV, MD, MB, MI, MS, RD)
+
+#define MAXPSrr(RS, RD) _SSEPSrr(X86_SSE_MAX, RS, RD)
+#define MAXPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
+#define MAXPDrr(RS, RD) _SSEPDrr(X86_SSE_MAX, RS, RD)
+#define MAXPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
+
+#define MAXSSrr(RS, RD) _SSESSrr(X86_SSE_MAX, RS, RD)
+#define MAXSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
+#define MAXSDrr(RS, RD) _SSESDrr(X86_SSE_MAX, RS, RD)
+#define MAXSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_MAX, MD, MB, MI, MS, RD)
+
+#define MINPSrr(RS, RD) _SSEPSrr(X86_SSE_MIN, RS, RD)
+#define MINPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
+#define MINPDrr(RS, RD) _SSEPDrr(X86_SSE_MIN, RS, RD)
+#define MINPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
+
+#define MINSSrr(RS, RD) _SSESSrr(X86_SSE_MIN, RS, RD)
+#define MINSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
+#define MINSDrr(RS, RD) _SSESDrr(X86_SSE_MIN, RS, RD)
+#define MINSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_MIN, MD, MB, MI, MS, RD)
+
+#define MULPSrr(RS, RD) _SSEPSrr(X86_SSE_MUL, RS, RD)
+#define MULPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
+#define MULPDrr(RS, RD) _SSEPDrr(X86_SSE_MUL, RS, RD)
+#define MULPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
+
+#define MULSSrr(RS, RD) _SSESSrr(X86_SSE_MUL, RS, RD)
+#define MULSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
+#define MULSDrr(RS, RD) _SSESDrr(X86_SSE_MUL, RS, RD)
+#define MULSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_MUL, MD, MB, MI, MS, RD)
+
+#define ORPSrr(RS, RD) _SSEPSrr(X86_SSE_OR, RS, RD)
+#define ORPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_OR, MD, MB, MI, MS, RD)
+#define ORPDrr(RS, RD) _SSEPDrr(X86_SSE_OR, RS, RD)
+#define ORPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_OR, MD, MB, MI, MS, RD)
+
+#define RCPPSrr(RS, RD) _SSEPSrr(X86_SSE_RCP, RS, RD)
+#define RCPPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_RCP, MD, MB, MI, MS, RD)
+#define RCPSSrr(RS, RD) _SSESSrr(X86_SSE_RCP, RS, RD)
+#define RCPSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_RCP, MD, MB, MI, MS, RD)
+
+#define RSQRTPSrr(RS, RD) _SSEPSrr(X86_SSE_RSQRT, RS, RD)
+#define RSQRTPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_RSQRT, MD, MB, MI, MS, RD)
+#define RSQRTSSrr(RS, RD) _SSESSrr(X86_SSE_RSQRT, RS, RD)
+#define RSQRTSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_RSQRT, MD, MB, MI, MS, RD)
+
+#define SQRTPSrr(RS, RD) _SSEPSrr(X86_SSE_SQRT, RS, RD)
+#define SQRTPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
+#define SQRTPDrr(RS, RD) _SSEPDrr(X86_SSE_SQRT, RS, RD)
+#define SQRTPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
+
+#define SQRTSSrr(RS, RD) _SSESSrr(X86_SSE_SQRT, RS, RD)
+#define SQRTSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
+#define SQRTSDrr(RS, RD) _SSESDrr(X86_SSE_SQRT, RS, RD)
+#define SQRTSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_SQRT, MD, MB, MI, MS, RD)
+
+#define SUBPSrr(RS, RD) _SSEPSrr(X86_SSE_SUB, RS, RD)
+#define SUBPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
+#define SUBPDrr(RS, RD) _SSEPDrr(X86_SSE_SUB, RS, RD)
+#define SUBPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
+
+#define SUBSSrr(RS, RD) _SSESSrr(X86_SSE_SUB, RS, RD)
+#define SUBSSmr(MD, MB, MI, MS, RD) _SSESSmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
+#define SUBSDrr(RS, RD) _SSESDrr(X86_SSE_SUB, RS, RD)
+#define SUBSDmr(MD, MB, MI, MS, RD) _SSESDmr(X86_SSE_SUB, MD, MB, MI, MS, RD)
+
+#define XORPSrr(RS, RD) _SSEPSrr(X86_SSE_XOR, RS, RD)
+#define XORPSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_XOR, MD, MB, MI, MS, RD)
+#define XORPDrr(RS, RD) _SSEPDrr(X86_SSE_XOR, RS, RD)
+#define XORPDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_XOR, MD, MB, MI, MS, RD)
+
+#define COMISSrr(RS, RD) _SSEPSrr(X86_SSE_COMI, RS, RD)
+#define COMISSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_COMI, MD, MB, MI, MS, RD)
+#define COMISDrr(RS, RD) _SSEPDrr(X86_SSE_COMI, RS, RD)
+#define COMISDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_COMI, MD, MB, MI, MS, RD)
+
+#define UCOMISSrr(RS, RD) _SSEPSrr(X86_SSE_UCOMI, RS, RD)
+#define UCOMISSmr(MD, MB, MI, MS, RD) _SSEPSmr(X86_SSE_UCOMI, MD, MB, MI, MS, RD)
+#define UCOMISDrr(RS, RD) _SSEPDrr(X86_SSE_UCOMI, RS, RD)
+#define UCOMISDmr(MD, MB, MI, MS, RD) _SSEPDmr(X86_SSE_UCOMI, MD, MB, MI, MS, RD)
+
+#define MOVAPSrr(RS, RD) _SSEPSrr(0x28, RS, RD)
+#define MOVAPSmr(MD, MB, MI, MS, RD) _SSEPSmr(0x28, MD, MB, MI, MS, RD)
+#define MOVAPSrm(RS, MD, MB, MI, MS) _SSEPSrm(0x29, RS, MD, MB, MI, MS)
+
+#define MOVAPDrr(RS, RD) _SSEPDrr(0x28, RS, RD)
+#define MOVAPDmr(MD, MB, MI, MS, RD) _SSEPDmr(0x28, MD, MB, MI, MS, RD)
+#define MOVAPDrm(RS, MD, MB, MI, MS) _SSEPDrm(0x29, RS, MD, MB, MI, MS)
+
+#define CVTDQ2PDrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTDQ2PD, RS,_rX, RD,_rX)
+#define CVTDQ2PDmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTDQ2PD, MD, MB, MI, MS, RD,_rX)
+#define CVTDQ2PSrr(RS, RD) __SSELrr( X86_SSE_CVTDQ2PS, RS,_rX, RD,_rX)
+#define CVTDQ2PSmr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTDQ2PS, MD, MB, MI, MS, RD,_rX)
+#define CVTPD2DQrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTPD2DQ, RS,_rX, RD,_rX)
+#define CVTPD2DQmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTPD2DQ, MD, MB, MI, MS, RD,_rX)
+#define CVTPD2PIrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTPD2PI, RS,_rX, RD,_rM)
+#define CVTPD2PImr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTPD2PI, MD, MB, MI, MS, RD,_rM)
+#define CVTPD2PSrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTPD2PS, RS,_rX, RD,_rX)
+#define CVTPD2PSmr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTPD2PS, MD, MB, MI, MS, RD,_rX)
+#define CVTPI2PDrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTPI2PD, RS,_rM, RD,_rX)
+#define CVTPI2PDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTPI2PD, MD, MB, MI, MS, RD,_rX)
+#define CVTPI2PSrr(RS, RD) __SSELrr( X86_SSE_CVTPI2PS, RS,_rM, RD,_rX)
+#define CVTPI2PSmr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTPI2PS, MD, MB, MI, MS, RD,_rX)
+#define CVTPS2DQrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTPS2DQ, RS,_rX, RD,_rX)
+#define CVTPS2DQmr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTPS2DQ, MD, MB, MI, MS, RD,_rX)
+#define CVTPS2PDrr(RS, RD) __SSELrr( X86_SSE_CVTPS2PD, RS,_rX, RD,_rX)
+#define CVTPS2PDmr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTPS2PD, MD, MB, MI, MS, RD,_rX)
+#define CVTPS2PIrr(RS, RD) __SSELrr( X86_SSE_CVTPS2PI, RS,_rX, RD,_rM)
+#define CVTPS2PImr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTPS2PI, MD, MB, MI, MS, RD,_rM)
+#define CVTSD2SILrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTSD2SI, RS,_rX, RD,_r4)
+#define CVTSD2SILmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTSD2SI, MD, MB, MI, MS, RD,_r4)
+#define CVTSD2SIQrr(RS, RD) _SSEQrr(0xf2, X86_SSE_CVTSD2SI, RS,_rX, RD,_r8)
+#define CVTSD2SIQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf2, X86_SSE_CVTSD2SI, MD, MB, MI, MS, RD,_r8)
+#define CVTSD2SSrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTSD2SS, RS,_rX, RD,_rX)
+#define CVTSD2SSmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTSD2SS, MD, MB, MI, MS, RD,_rX)
+#define CVTSI2SDLrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTSI2SD, RS,_r4, RD,_rX)
+#define CVTSI2SDLmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTSI2SD, MD, MB, MI, MS, RD,_rX)
+#define CVTSI2SDQrr(RS, RD) _SSEQrr(0xf2, X86_SSE_CVTSI2SD, RS,_r8, RD,_rX)
+#define CVTSI2SDQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf2, X86_SSE_CVTSI2SD, MD, MB, MI, MS, RD,_rX)
+#define CVTSI2SSLrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTSI2SS, RS,_r4, RD,_rX)
+#define CVTSI2SSLmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTSI2SS, MD, MB, MI, MS, RD,_rX)
+#define CVTSI2SSQrr(RS, RD) _SSEQrr(0xf3, X86_SSE_CVTSI2SS, RS,_r8, RD,_rX)
+#define CVTSI2SSQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf3, X86_SSE_CVTSI2SS, MD, MB, MI, MS, RD,_rX)
+#define CVTSS2SDrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTSS2SD, RS,_rX, RD,_rX)
+#define CVTSS2SDmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTSS2SD, MD, MB, MI, MS, RD,_rX)
+#define CVTSS2SILrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTSS2SI, RS,_rX, RD,_r4)
+#define CVTSS2SILmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTSS2SI, MD, MB, MI, MS, RD,_r4)
+#define CVTSS2SIQrr(RS, RD) _SSEQrr(0xf3, X86_SSE_CVTSS2SI, RS,_rX, RD,_r8)
+#define CVTSS2SIQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf3, X86_SSE_CVTSS2SI, MD, MB, MI, MS, RD,_r8)
+#define CVTTPD2PIrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTTPD2PI, RS,_rX, RD,_rM)
+#define CVTTPD2PImr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTTPD2PI, MD, MB, MI, MS, RD,_rM)
+#define CVTTPD2DQrr(RS, RD) _SSELrr(0x66, X86_SSE_CVTTPD2DQ, RS,_rX, RD,_rX)
+#define CVTTPD2DQmr(MD, MB, MI, MS, RD) _SSELmr(0x66, X86_SSE_CVTTPD2DQ, MD, MB, MI, MS, RD,_rX)
+#define CVTTPS2DQrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTTPS2DQ, RS,_rX, RD,_rX)
+#define CVTTPS2DQmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTTPS2DQ, MD, MB, MI, MS, RD,_rX)
+#define CVTTPS2PIrr(RS, RD) __SSELrr( X86_SSE_CVTTPS2PI, RS,_rX, RD,_rM)
+#define CVTTPS2PImr(MD, MB, MI, MS, RD) __SSELmr( X86_SSE_CVTTPS2PI, MD, MB, MI, MS, RD,_rM)
+#define CVTTSD2SILrr(RS, RD) _SSELrr(0xf2, X86_SSE_CVTTSD2SI, RS,_rX, RD,_r4)
+#define CVTTSD2SILmr(MD, MB, MI, MS, RD) _SSELmr(0xf2, X86_SSE_CVTTSD2SI, MD, MB, MI, MS, RD,_r4)
+#define CVTTSD2SIQrr(RS, RD) _SSEQrr(0xf2, X86_SSE_CVTTSD2SI, RS,_rX, RD,_r8)
+#define CVTTSD2SIQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf2, X86_SSE_CVTTSD2SI, MD, MB, MI, MS, RD,_r8)
+#define CVTTSS2SILrr(RS, RD) _SSELrr(0xf3, X86_SSE_CVTTSS2SI, RS,_rX, RD,_r4)
+#define CVTTSS2SILmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, X86_SSE_CVTTSS2SI, MD, MB, MI, MS, RD,_r4)
+#define CVTTSS2SIQrr(RS, RD) _SSEQrr(0xf3, X86_SSE_CVTTSS2SI, RS,_rX, RD,_r8)
+#define CVTTSS2SIQmr(MD, MB, MI, MS, RD) _SSEQmr(0xf3, X86_SSE_CVTTSS2SI, MD, MB, MI, MS, RD,_r8)
+
+#define MOVDXDrr(RS, RD) _SSELrr(0x66, 0x6e, RS,_r4, RD,_rX)
+#define MOVDXDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x6e, MD, MB, MI, MS, RD,_rX)
+#define MOVQXDrr(RS, RD) _SSEQrr(0x66, 0x6e, RS,_r8, RD,_rX)
+#define MOVQXDmr(MD, MB, MI, MS, RD) _SSEQmr(0x66, 0x6e, MD, MB, MI, MS, RD,_rX)
+
+#define MOVDXSrr(RS, RD) _SSELrr(0x66, 0x7e, RD,_r4, RS,_rX)
+#define MOVDXSrm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x7e, RS,_rX, MD, MB, MI, MS)
+#define MOVQXSrr(RS, RD) _SSEQrr(0x66, 0x7e, RD,_r8, RS,_rX)
+#define MOVQXSrm(RS, MD, MB, MI, MS) _SSEQrm(0x66, 0x7e, RS,_rX, MD, MB, MI, MS)
+
+#define MOVDLMrr(RS, RD) __SSELrr( 0x6e, RS,_r4, RD,_rM)
+#define MOVDLMmr(MD, MB, MI, MS, RD) __SSELmr( 0x6e, MD, MB, MI, MS, RD,_rM)
+#define MOVDQMrr(RS, RD) __SSEQrr( 0x6e, RS,_r8, RD,_rM)
+#define MOVDQMmr(MD, MB, MI, MS, RD) __SSEQmr( 0x6e, MD, MB, MI, MS, RD,_rM)
+
+#define MOVDMLrr(RS, RD) __SSELrr( 0x7e, RS,_rM, RD,_r4)
+#define MOVDMLrm(RS, MD, MB, MI, MS) __SSELrm( 0x7e, RS,_rM, MD, MB, MI, MS)
+#define MOVDMQrr(RS, RD) __SSEQrr( 0x7e, RS,_rM, RD,_r8)
+#define MOVDMQrm(RS, MD, MB, MI, MS) __SSEQrm( 0x7e, RS,_rM, MD, MB, MI, MS)
+
+#define MOVDQ2Qrr(RS, RD) _SSELrr(0xf2, 0xd6, RS,_rX, RD,_rM)
+#define MOVMSKPSrr(RS, RD) __SSELrr( 0x50, RS,_rX, RD,_r4)
+#define MOVMSKPDrr(RS, RD) _SSELrr(0x66, 0x50, RS,_rX, RD,_r4)
+
+#define MOVHLPSrr(RS, RD) __SSELrr( 0x12, RS,_rX, RD,_rX)
+#define MOVLHPSrr(RS, RD) __SSELrr( 0x16, RS,_rX, RD,_rX)
+
+#define MOVDQArr(RS, RD) _SSELrr(0x66, 0x6f, RS,_rX, RD,_rX)
+#define MOVDQAmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x6f, MD, MB, MI, MS, RD,_rX)
+#define MOVDQArm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x7f, RS,_rX, MD, MB, MI, MS)
+
+#define MOVDQUrr(RS, RD) _SSELrr(0xf3, 0x6f, RS,_rX, RD,_rX)
+#define MOVDQUmr(MD, MB, MI, MS, RD) _SSELmr(0xf3, 0x6f, MD, MB, MI, MS, RD,_rX)
+#define MOVDQUrm(RS, MD, MB, MI, MS) _SSELrm(0xf3, 0x7f, RS,_rX, MD, MB, MI, MS)
+
+#define MOVHPDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x16, MD, MB, MI, MS, RD,_rX)
+#define MOVHPDrm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x17, RS,_rX, MD, MB, MI, MS)
+#define MOVHPSmr(MD, MB, MI, MS, RD) __SSELmr( 0x16, MD, MB, MI, MS, RD,_rX)
+#define MOVHPSrm(RS, MD, MB, MI, MS) __SSELrm( 0x17, RS,_rX, MD, MB, MI, MS)
+
+#define MOVLPDmr(MD, MB, MI, MS, RD) _SSELmr(0x66, 0x12, MD, MB, MI, MS, RD,_rX)
+#define MOVLPDrm(RS, MD, MB, MI, MS) _SSELrm(0x66, 0x13, RS,_rX, MD, MB, MI, MS)
+#define MOVLPSmr(MD, MB, MI, MS, RD) __SSELmr( 0x12, MD, MB, MI, MS, RD,_rX)
+#define MOVLPSrm(RS, MD, MB, MI, MS) __SSELrm( 0x13, RS,_rX, MD, MB, MI, MS)
+
+
+/* --- FLoating-Point instructions ----------------------------------------- */
+
+#define _ESCmi(D,B,I,S,OP) (_REXLrm(0,B,I), _O_r_X(0xd8|(OP & 7), (OP >> 3), D,B,I,S))
+
+#define FLDr(R) _OOr(0xd9c0,_rN(R))
+#define FLDLm(D,B,I,S) _ESCmi(D,B,I,S,005)
+#define FLDSm(D,B,I,S) _ESCmi(D,B,I,S,001)
+#define FLDTm(D,B,I,S) _ESCmi(D,B,I,S,053)
+
+#define FSTr(R) _OOr(0xddd0,_rN(R))
+#define FSTSm(D,B,I,S) _ESCmi(D,B,I,S,021)
+#define FSTLm(D,B,I,S) _ESCmi(D,B,I,S,025)
+
+#define FSTPr(R) _OOr(0xddd8,_rN(R))
+#define FSTPSm(D,B,I,S) _ESCmi(D,B,I,S,031)
+#define FSTPLm(D,B,I,S) _ESCmi(D,B,I,S,035)
+#define FSTPTm(D,B,I,S) _ESCmi(D,B,I,S,073)
+
+#define FADDr0(R) _OOr(0xd8c0,_rN(R))
+#define FADD0r(R) _OOr(0xdcc0,_rN(R))
+#define FADDP0r(R) _OOr(0xdec0,_rN(R))
+#define FADDSm(D,B,I,S) _ESCmi(D,B,I,S,000)
+#define FADDLm(D,B,I,S) _ESCmi(D,B,I,S,004)
+
+#define FSUBSm(D,B,I,S) _ESCmi(D,B,I,S,040)
+#define FSUBLm(D,B,I,S) _ESCmi(D,B,I,S,044)
+#define FSUBr0(R) _OOr(0xd8e0,_rN(R))
+#define FSUB0r(R) _OOr(0xdce8,_rN(R))
+#define FSUBP0r(R) _OOr(0xdee8,_rN(R))
+
+#define FSUBRr0(R) _OOr(0xd8e8,_rN(R))
+#define FSUBR0r(R) _OOr(0xdce0,_rN(R))
+#define FSUBRP0r(R) _OOr(0xdee0,_rN(R))
+#define FSUBRSm(D,B,I,S) _ESCmi(D,B,I,S,050)
+#define FSUBRLm(D,B,I,S) _ESCmi(D,B,I,S,054)
+
+#define FMULr0(R) _OOr(0xd8c8,_rN(R))
+#define FMUL0r(R) _OOr(0xdcc8,_rN(R))
+#define FMULP0r(R) _OOr(0xdec8,_rN(R))
+#define FMULSm(D,B,I,S) _ESCmi(D,B,I,S,010)
+#define FMULLm(D,B,I,S) _ESCmi(D,B,I,S,014)
+
+#define FDIVr0(R) _OOr(0xd8f0,_rN(R))
+#define FDIV0r(R) _OOr(0xdcf8,_rN(R))
+#define FDIVP0r(R) _OOr(0xdef8,_rN(R))
+#define FDIVSm(D,B,I,S) _ESCmi(D,B,I,S,060)
+#define FDIVLm(D,B,I,S) _ESCmi(D,B,I,S,064)
+
+#define FDIVRr0(R) _OOr(0xd8f8,_rN(R))
+#define FDIVR0r(R) _OOr(0xdcf0,_rN(R))
+#define FDIVRP0r(R) _OOr(0xdef0,_rN(R))
+#define FDIVRSm(D,B,I,S) _ESCmi(D,B,I,S,070)
+#define FDIVRLm(D,B,I,S) _ESCmi(D,B,I,S,074)
+
+#define FCMOVBr0(R) _OOr(0xdac0,_rN(R))
+#define FCMOVBEr0(R) _OOr(0xdad0,_rN(R))
+#define FCMOVEr0(R) _OOr(0xdac8,_rN(R))
+#define FCMOVNBr0(R) _OOr(0xdbc0,_rN(R))
+#define FCMOVNBEr0(R) _OOr(0xdbd0,_rN(R))
+#define FCMOVNEr0(R) _OOr(0xdbc8,_rN(R))
+#define FCMOVNUr0(R) _OOr(0xdbd8,_rN(R))
+#define FCMOVUr0(R) _OOr(0xdad8,_rN(R))
+#define FCOMIr0(R) _OOr(0xdbf0,_rN(R))
+#define FCOMIPr0(R) _OOr(0xdff0,_rN(R))
+
+#define FCOMr(R) _OOr(0xd8d0,_rN(R))
+#define FCOMSm(D,B,I,S) _ESCmi(D,B,I,S,020)
+#define FCOMLm(D,B,I,S) _ESCmi(D,B,I,S,024)
+
+#define FCOMPr(R) _OOr(0xd8d8,_rN(R))
+#define FCOMPSm(D,B,I,S) _ESCmi(D,B,I,S,030)
+#define FCOMPLm(D,B,I,S) _ESCmi(D,B,I,S,034)
+
+#define FUCOMIr0(R) _OOr(0xdbe8,_rN(R))
+#define FUCOMIPr0(R) _OOr(0xdfe8,_rN(R))
+#define FUCOMPr(R) _OOr(0xdde8,_rN(R))
+#define FUCOMr(R) _OOr(0xdde0,_rN(R))
+
+#define FIADDLm(D,B,I,S) _ESCmi(D,B,I,S,002)
+#define FICOMLm(D,B,I,S) _ESCmi(D,B,I,S,022)
+#define FICOMPLm(D,B,I,S) _ESCmi(D,B,I,S,032)
+#define FIDIVLm(D,B,I,S) _ESCmi(D,B,I,S,062)
+#define FIDIVRLm(D,B,I,S) _ESCmi(D,B,I,S,072)
+#define FILDLm(D,B,I,S) _ESCmi(D,B,I,S,003)
+#define FILDQm(D,B,I,S) _ESCmi(D,B,I,S,057)
+#define FIMULLm(D,B,I,S) _ESCmi(D,B,I,S,012)
+#define FISTLm(D,B,I,S) _ESCmi(D,B,I,S,023)
+#define FISTPLm(D,B,I,S) _ESCmi(D,B,I,S,033)
+#define FISTPQm(D,B,I,S) _ESCmi(D,B,I,S,077)
+#define FISUBLm(D,B,I,S) _ESCmi(D,B,I,S,042)
+#define FISUBRLm(D,B,I,S) _ESCmi(D,B,I,S,052)
+
+#define FREEr(R) _OOr(0xddc0,_rN(R))
+#define FXCHr(R) _OOr(0xd9c8,_rN(R))
+
+#endif /* X86_RTASM_H */
typedef uae_u32 uintptr;
#endif
+/* Flags for Bernie during development/debugging. Should go away eventually */
+#define DISTRUST_CONSISTENT_MEM 0
+#define TAGMASK 0x000fffff
+#define TAGSIZE (TAGMASK+1)
+#define MAXRUN 1024
+
+extern uae_u8* start_pc_p;
+extern uae_u32 start_pc;
+
+#define cacheline(x) (((uae_u32)x)&TAGMASK)
+
+typedef struct {
+ uae_u16* location;
+ uae_u8 cycles;
+ uae_u8 specmem;
+ uae_u8 dummy2;
+ uae_u8 dummy3;
+} cpu_history;
+
+struct blockinfo_t;
+
+typedef union {
+ cpuop_func* handler;
+ struct blockinfo_t* bi;
+} cacheline;
+
+extern signed long pissoff;
+
#define USE_OPTIMIZER 0
#define USE_LOW_OPTIMIZER 0
#define USE_ALIAS 1
--- /dev/null
+/*
+ * compiler/compemu.h - Public interface and definitions
+ *
+ * Original 68040 JIT compiler for UAE, copyright 2000-2002 Bernd Meyer
+ *
+ * Adaptation for Basilisk II and improvements, copyright 2000-2005
+ * Gwenole Beauchesne
+ *
+ * Basilisk II (C) 1997-2008 Christian Bauer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef COMPEMU_H
+#define COMPEMU_H
+
+#ifdef JIT
+
+#if defined __i386__ || defined __x86_64__
+#include "flags_x86.h"
+#else
+#error "Unsupported JIT compiler for this architecture"
+#endif
+
+#if JIT_DEBUG
+/* dump some information (m68k block, x86 block addresses) about the compiler state */
+extern void compiler_dumpstate(void);
+#endif
+
+/* Now that we do block chaining, and also have linked lists on each tag,
+ TAGMASK can be much smaller and still do its job. Saves several megs
+ of memory! */
+#define TAGMASK 0x0000ffff
+#define TAGSIZE (TAGMASK+1)
+#define MAXRUN 1024
+#define cacheline(x) (((uintptr)x)&TAGMASK)
+
+extern uae_u8* start_pc_p;
+extern uae_u32 start_pc;
+
+struct blockinfo_t;
+
+struct cpu_history {
+ uae_u16 * location;
+};
+
+union cacheline {
+ cpuop_func * handler;
+ blockinfo_t * bi;
+};
+
+/* Use new spill/reload strategy when calling external functions */
+#define USE_OPTIMIZED_CALLS 0
+#if USE_OPTIMIZED_CALLS
+#error implementation in progress
+#endif
+
+/* (gb) When on, this option can save save up to 30% compilation time
+ * when many lazy flushes occur (e.g. apps in MacOS 8.x).
+ */
+#define USE_SEPARATE_BIA 1
+
+/* Use chain of checksum_info_t to compute the block checksum */
+#define USE_CHECKSUM_INFO 1
+
+/* Use code inlining, aka follow-up of constant jumps */
+#define USE_INLINING 1
+
+/* Inlining requires the chained checksuming information */
+#if USE_INLINING
+#undef USE_CHECKSUM_INFO
+#define USE_CHECKSUM_INFO 1
+#endif
+
+/* Does flush_icache_range() only check for blocks falling in the requested range? */
+#define LAZY_FLUSH_ICACHE_RANGE 0
+
+#define USE_F_ALIAS 1
+#define USE_OFFSET 1
+#define COMP_DEBUG 1
+
+#if COMP_DEBUG
+#define Dif(x) if (x)
+#else
+#define Dif(x) if (0)
+#endif
+
+#define SCALE 2
+
+#define BYTES_PER_INST 10240 /* paranoid ;-) */
+#define LONGEST_68K_INST 16 /* The number of bytes the longest possible
+ 68k instruction takes */
+#define MAX_CHECKSUM_LEN 2048 /* The maximum size we calculate checksums
+ for. Anything larger will be flushed
+ unconditionally even with SOFT_FLUSH */
+#define MAX_HOLD_BI 3 /* One for the current block, and up to two
+ for jump targets */
+
+#define INDIVIDUAL_INST 0
+#if 1
+// gb-- my format from readcpu.cpp is not the same
+#define FLAG_X 0x0010
+#define FLAG_N 0x0008
+#define FLAG_Z 0x0004
+#define FLAG_V 0x0002
+#define FLAG_C 0x0001
+#else
+#define FLAG_C 0x0010
+#define FLAG_V 0x0008
+#define FLAG_Z 0x0004
+#define FLAG_N 0x0002
+#define FLAG_X 0x0001
+#endif
+#define FLAG_CZNV (FLAG_C | FLAG_Z | FLAG_N | FLAG_V)
+#define FLAG_ZNV (FLAG_Z | FLAG_N | FLAG_V)
+
+#define KILLTHERAT 1 /* Set to 1 to avoid some partial_rat_stalls */
+
+#if defined(__x86_64__)
+#define N_REGS 16 /* really only 15, but they are numbered 0-3,5-15 */
+#else
+#define N_REGS 8 /* really only 7, but they are numbered 0,1,2,3,5,6,7 */
+#endif
+#define N_FREGS 6 /* That leaves us two positions on the stack to play with */
+
+/* Functions exposed to newcpu, or to what was moved from newcpu.c to
+ * compemu_support.c */
+extern void compiler_init(void);
+extern void compiler_exit(void);
+extern bool compiler_use_jit(void);
+extern void init_comp(void);
+extern void flush(int save_regs);
+extern void small_flush(int save_regs);
+extern void set_target(uae_u8* t);
+extern uae_u8* get_target(void);
+extern void freescratch(void);
+extern void build_comp(void);
+extern void set_cache_state(int enabled);
+extern int get_cache_state(void);
+extern uae_u32 get_jitted_size(void);
+extern void (*flush_icache)(int n);
+extern void alloc_cache(void);
+extern int check_for_cache_miss(void);
+
+/* JIT FPU compilation */
+extern void comp_fpp_opp (uae_u32 opcode, uae_u16 extra);
+extern void comp_fbcc_opp (uae_u32 opcode);
+extern void comp_fscc_opp (uae_u32 opcode, uae_u16 extra);
+
+extern uae_u32 needed_flags;
+extern cacheline cache_tags[];
+extern uae_u8* comp_pc_p;
+extern void* pushall_call_handler;
+
+#define VREGS 32
+#define VFREGS 16
+
+#define INMEM 1
+#define CLEAN 2
+#define DIRTY 3
+#define UNDEF 4
+#define ISCONST 5
+
+typedef struct {
+ uae_u32* mem;
+ uae_u32 val;
+ uae_u8 is_swapped;
+ uae_u8 status;
+ uae_s8 realreg; /* gb-- realreg can hold -1 */
+ uae_u8 realind; /* The index in the holds[] array */
+ uae_u8 needflush;
+ uae_u8 validsize;
+ uae_u8 dirtysize;
+ uae_u8 dummy;
+} reg_status;
+
+typedef struct {
+ uae_u32* mem;
+ double val;
+ uae_u8 status;
+ uae_s8 realreg; /* gb-- realreg can hold -1 */
+ uae_u8 realind;
+ uae_u8 needflush;
+} freg_status;
+
+#define PC_P 16
+#define FLAGX 17
+#define FLAGTMP 18
+#define NEXT_HANDLER 19
+#define S1 20
+#define S2 21
+#define S3 22
+#define S4 23
+#define S5 24
+#define S6 25
+#define S7 26
+#define S8 27
+#define S9 28
+#define S10 29
+#define S11 30
+#define S12 31
+
+#define FP_RESULT 8
+#define FS1 9
+#define FS2 10
+#define FS3 11
+
+typedef struct {
+ uae_u32 touched;
+ uae_s8 holds[VREGS];
+ uae_u8 nholds;
+ uae_u8 canbyte;
+ uae_u8 canword;
+ uae_u8 locked;
+} n_status;
+
+typedef struct {
+ uae_u32 touched;
+ uae_s8 holds[VFREGS];
+ uae_u8 nholds;
+ uae_u8 locked;
+} fn_status;
+
+/* For flag handling */
+#define NADA 1
+#define TRASH 2
+#define VALID 3
+
+/* needflush values */
+#define NF_SCRATCH 0
+#define NF_TOMEM 1
+#define NF_HANDLER 2
+
+typedef struct {
+ /* Integer part */
+ reg_status state[VREGS];
+ n_status nat[N_REGS];
+ uae_u32 flags_on_stack;
+ uae_u32 flags_in_flags;
+ uae_u32 flags_are_important;
+ /* FPU part */
+ freg_status fate[VFREGS];
+ fn_status fat[N_FREGS];
+
+ /* x86 FPU part */
+ uae_s8 spos[N_FREGS];
+ uae_s8 onstack[6];
+ uae_s8 tos;
+} bigstate;
+
+typedef struct {
+ /* Integer part */
+ char virt[VREGS];
+ char nat[N_REGS];
+} smallstate;
+
+extern bigstate live;
+extern int touchcnt;
+
+
+#define IMM uae_s32
+#define R1 uae_u32
+#define R2 uae_u32
+#define R4 uae_u32
+#define W1 uae_u32
+#define W2 uae_u32
+#define W4 uae_u32
+#define RW1 uae_u32
+#define RW2 uae_u32
+#define RW4 uae_u32
+#define MEMR uae_u32
+#define MEMW uae_u32
+#define MEMRW uae_u32
+
+#define FW uae_u32
+#define FR uae_u32
+#define FRW uae_u32
+
+#define MIDFUNC(nargs,func,args) void func args
+#define MENDFUNC(nargs,func,args)
+#define COMPCALL(func) func
+
+#define LOWFUNC(flags,mem,nargs,func,args) static __inline__ void func args
+#define LENDFUNC(flags,mem,nargs,func,args)
+
+/* What we expose to the outside */
+#define DECLARE_MIDFUNC(func) extern void func
+DECLARE_MIDFUNC(bt_l_ri(R4 r, IMM i));
+DECLARE_MIDFUNC(bt_l_rr(R4 r, R4 b));
+DECLARE_MIDFUNC(btc_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(btc_l_rr(RW4 r, R4 b));
+DECLARE_MIDFUNC(bts_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(bts_l_rr(RW4 r, R4 b));
+DECLARE_MIDFUNC(btr_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(btr_l_rr(RW4 r, R4 b));
+DECLARE_MIDFUNC(mov_l_rm(W4 d, IMM s));
+DECLARE_MIDFUNC(call_r(R4 r));
+DECLARE_MIDFUNC(sub_l_mi(IMM d, IMM s));
+DECLARE_MIDFUNC(mov_l_mi(IMM d, IMM s));
+DECLARE_MIDFUNC(mov_w_mi(IMM d, IMM s));
+DECLARE_MIDFUNC(mov_b_mi(IMM d, IMM s));
+DECLARE_MIDFUNC(rol_b_ri(RW1 r, IMM i));
+DECLARE_MIDFUNC(rol_w_ri(RW2 r, IMM i));
+DECLARE_MIDFUNC(rol_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(rol_l_rr(RW4 d, R1 r));
+DECLARE_MIDFUNC(rol_w_rr(RW2 d, R1 r));
+DECLARE_MIDFUNC(rol_b_rr(RW1 d, R1 r));
+DECLARE_MIDFUNC(shll_l_rr(RW4 d, R1 r));
+DECLARE_MIDFUNC(shll_w_rr(RW2 d, R1 r));
+DECLARE_MIDFUNC(shll_b_rr(RW1 d, R1 r));
+DECLARE_MIDFUNC(ror_b_ri(R1 r, IMM i));
+DECLARE_MIDFUNC(ror_w_ri(R2 r, IMM i));
+DECLARE_MIDFUNC(ror_l_ri(R4 r, IMM i));
+DECLARE_MIDFUNC(ror_l_rr(R4 d, R1 r));
+DECLARE_MIDFUNC(ror_w_rr(R2 d, R1 r));
+DECLARE_MIDFUNC(ror_b_rr(R1 d, R1 r));
+DECLARE_MIDFUNC(shrl_l_rr(RW4 d, R1 r));
+DECLARE_MIDFUNC(shrl_w_rr(RW2 d, R1 r));
+DECLARE_MIDFUNC(shrl_b_rr(RW1 d, R1 r));
+DECLARE_MIDFUNC(shra_l_rr(RW4 d, R1 r));
+DECLARE_MIDFUNC(shra_w_rr(RW2 d, R1 r));
+DECLARE_MIDFUNC(shra_b_rr(RW1 d, R1 r));
+DECLARE_MIDFUNC(shll_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(shll_w_ri(RW2 r, IMM i));
+DECLARE_MIDFUNC(shll_b_ri(RW1 r, IMM i));
+DECLARE_MIDFUNC(shrl_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(shrl_w_ri(RW2 r, IMM i));
+DECLARE_MIDFUNC(shrl_b_ri(RW1 r, IMM i));
+DECLARE_MIDFUNC(shra_l_ri(RW4 r, IMM i));
+DECLARE_MIDFUNC(shra_w_ri(RW2 r, IMM i));
+DECLARE_MIDFUNC(shra_b_ri(RW1 r, IMM i));
+DECLARE_MIDFUNC(setcc(W1 d, IMM cc));
+DECLARE_MIDFUNC(setcc_m(IMM d, IMM cc));
+DECLARE_MIDFUNC(cmov_b_rr(RW1 d, R1 s, IMM cc));
+DECLARE_MIDFUNC(cmov_w_rr(RW2 d, R2 s, IMM cc));
+DECLARE_MIDFUNC(cmov_l_rr(RW4 d, R4 s, IMM cc));
+DECLARE_MIDFUNC(cmov_l_rm(RW4 d, IMM s, IMM cc));
+DECLARE_MIDFUNC(bsf_l_rr(W4 d, R4 s));
+DECLARE_MIDFUNC(pop_m(IMM d));
+DECLARE_MIDFUNC(push_m(IMM d));
+DECLARE_MIDFUNC(pop_l(W4 d));
+DECLARE_MIDFUNC(push_l_i(IMM i));
+DECLARE_MIDFUNC(push_l(R4 s));
+DECLARE_MIDFUNC(clear_16(RW4 r));
+DECLARE_MIDFUNC(clear_8(RW4 r));
+DECLARE_MIDFUNC(sign_extend_16_rr(W4 d, R2 s));
+DECLARE_MIDFUNC(sign_extend_8_rr(W4 d, R1 s));
+DECLARE_MIDFUNC(zero_extend_16_rr(W4 d, R2 s));
+DECLARE_MIDFUNC(zero_extend_8_rr(W4 d, R1 s));
+DECLARE_MIDFUNC(imul_64_32(RW4 d, RW4 s));
+DECLARE_MIDFUNC(mul_64_32(RW4 d, RW4 s));
+DECLARE_MIDFUNC(imul_32_32(RW4 d, R4 s));
+DECLARE_MIDFUNC(mul_32_32(RW4 d, R4 s));
+DECLARE_MIDFUNC(mov_b_rr(W1 d, R1 s));
+DECLARE_MIDFUNC(mov_w_rr(W2 d, R2 s));
+DECLARE_MIDFUNC(mov_l_rrm_indexed(W4 d,R4 baser, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_w_rrm_indexed(W2 d, R4 baser, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_b_rrm_indexed(W1 d, R4 baser, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_l_mrr_indexed(R4 baser, R4 index, IMM factor, R4 s));
+DECLARE_MIDFUNC(mov_w_mrr_indexed(R4 baser, R4 index, IMM factor, R2 s));
+DECLARE_MIDFUNC(mov_b_mrr_indexed(R4 baser, R4 index, IMM factor, R1 s));
+DECLARE_MIDFUNC(mov_l_bmrr_indexed(IMM base, R4 baser, R4 index, IMM factor, R4 s));
+DECLARE_MIDFUNC(mov_w_bmrr_indexed(IMM base, R4 baser, R4 index, IMM factor, R2 s));
+DECLARE_MIDFUNC(mov_b_bmrr_indexed(IMM base, R4 baser, R4 index, IMM factor, R1 s));
+DECLARE_MIDFUNC(mov_l_brrm_indexed(W4 d, IMM base, R4 baser, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_w_brrm_indexed(W2 d, IMM base, R4 baser, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_b_brrm_indexed(W1 d, IMM base, R4 baser, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_l_rm_indexed(W4 d, IMM base, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_l_rR(W4 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_w_rR(W2 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_b_rR(W1 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_l_brR(W4 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_w_brR(W2 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_b_brR(W1 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_l_Ri(R4 d, IMM i, IMM offset));
+DECLARE_MIDFUNC(mov_w_Ri(R4 d, IMM i, IMM offset));
+DECLARE_MIDFUNC(mov_b_Ri(R4 d, IMM i, IMM offset));
+DECLARE_MIDFUNC(mov_l_Rr(R4 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_w_Rr(R4 d, R2 s, IMM offset));
+DECLARE_MIDFUNC(mov_b_Rr(R4 d, R1 s, IMM offset));
+DECLARE_MIDFUNC(lea_l_brr(W4 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(lea_l_brr_indexed(W4 d, R4 s, R4 index, IMM factor, IMM offset));
+DECLARE_MIDFUNC(lea_l_rr_indexed(W4 d, R4 s, R4 index, IMM factor));
+DECLARE_MIDFUNC(mov_l_bRr(R4 d, R4 s, IMM offset));
+DECLARE_MIDFUNC(mov_w_bRr(R4 d, R2 s, IMM offset));
+DECLARE_MIDFUNC(mov_b_bRr(R4 d, R1 s, IMM offset));
+DECLARE_MIDFUNC(bswap_32(RW4 r));
+DECLARE_MIDFUNC(bswap_16(RW2 r));
+DECLARE_MIDFUNC(mov_l_rr(W4 d, R4 s));
+DECLARE_MIDFUNC(mov_l_mr(IMM d, R4 s));
+DECLARE_MIDFUNC(mov_w_mr(IMM d, R2 s));
+DECLARE_MIDFUNC(mov_w_rm(W2 d, IMM s));
+DECLARE_MIDFUNC(mov_b_mr(IMM d, R1 s));
+DECLARE_MIDFUNC(mov_b_rm(W1 d, IMM s));
+DECLARE_MIDFUNC(mov_l_ri(W4 d, IMM s));
+DECLARE_MIDFUNC(mov_w_ri(W2 d, IMM s));
+DECLARE_MIDFUNC(mov_b_ri(W1 d, IMM s));
+DECLARE_MIDFUNC(add_l_mi(IMM d, IMM s) );
+DECLARE_MIDFUNC(add_w_mi(IMM d, IMM s) );
+DECLARE_MIDFUNC(add_b_mi(IMM d, IMM s) );
+DECLARE_MIDFUNC(test_l_ri(R4 d, IMM i));
+DECLARE_MIDFUNC(test_l_rr(R4 d, R4 s));
+DECLARE_MIDFUNC(test_w_rr(R2 d, R2 s));
+DECLARE_MIDFUNC(test_b_rr(R1 d, R1 s));
+DECLARE_MIDFUNC(and_l_ri(RW4 d, IMM i));
+DECLARE_MIDFUNC(and_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(and_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(and_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(or_l_rm(RW4 d, IMM s));
+DECLARE_MIDFUNC(or_l_ri(RW4 d, IMM i));
+DECLARE_MIDFUNC(or_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(or_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(or_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(adc_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(adc_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(adc_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(add_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(add_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(add_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(sub_l_ri(RW4 d, IMM i));
+DECLARE_MIDFUNC(sub_w_ri(RW2 d, IMM i));
+DECLARE_MIDFUNC(sub_b_ri(RW1 d, IMM i));
+DECLARE_MIDFUNC(add_l_ri(RW4 d, IMM i));
+DECLARE_MIDFUNC(add_w_ri(RW2 d, IMM i));
+DECLARE_MIDFUNC(add_b_ri(RW1 d, IMM i));
+DECLARE_MIDFUNC(sbb_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(sbb_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(sbb_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(sub_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(sub_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(sub_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(cmp_l(R4 d, R4 s));
+DECLARE_MIDFUNC(cmp_l_ri(R4 r, IMM i));
+DECLARE_MIDFUNC(cmp_w(R2 d, R2 s));
+DECLARE_MIDFUNC(cmp_b(R1 d, R1 s));
+DECLARE_MIDFUNC(xor_l(RW4 d, R4 s));
+DECLARE_MIDFUNC(xor_w(RW2 d, R2 s));
+DECLARE_MIDFUNC(xor_b(RW1 d, R1 s));
+DECLARE_MIDFUNC(live_flags(void));
+DECLARE_MIDFUNC(dont_care_flags(void));
+DECLARE_MIDFUNC(duplicate_carry(void));
+DECLARE_MIDFUNC(restore_carry(void));
+DECLARE_MIDFUNC(start_needflags(void));
+DECLARE_MIDFUNC(end_needflags(void));
+DECLARE_MIDFUNC(make_flags_live(void));
+DECLARE_MIDFUNC(call_r_11(R4 r, W4 out1, R4 in1, IMM osize, IMM isize));
+DECLARE_MIDFUNC(call_r_02(R4 r, R4 in1, R4 in2, IMM isize1, IMM isize2));
+DECLARE_MIDFUNC(forget_about(W4 r));
+DECLARE_MIDFUNC(nop(void));
+
+DECLARE_MIDFUNC(f_forget_about(FW r));
+DECLARE_MIDFUNC(fmov_pi(FW r));
+DECLARE_MIDFUNC(fmov_log10_2(FW r));
+DECLARE_MIDFUNC(fmov_log2_e(FW r));
+DECLARE_MIDFUNC(fmov_loge_2(FW r));
+DECLARE_MIDFUNC(fmov_1(FW r));
+DECLARE_MIDFUNC(fmov_0(FW r));
+DECLARE_MIDFUNC(fmov_rm(FW r, MEMR m));
+DECLARE_MIDFUNC(fmovi_rm(FW r, MEMR m));
+DECLARE_MIDFUNC(fmovi_mr(MEMW m, FR r));
+DECLARE_MIDFUNC(fmovs_rm(FW r, MEMR m));
+DECLARE_MIDFUNC(fmovs_mr(MEMW m, FR r));
+DECLARE_MIDFUNC(fmov_mr(MEMW m, FR r));
+DECLARE_MIDFUNC(fmov_ext_mr(MEMW m, FR r));
+DECLARE_MIDFUNC(fmov_ext_rm(FW r, MEMR m));
+DECLARE_MIDFUNC(fmov_rr(FW d, FR s));
+DECLARE_MIDFUNC(fldcw_m_indexed(R4 index, IMM base));
+DECLARE_MIDFUNC(ftst_r(FR r));
+DECLARE_MIDFUNC(dont_care_fflags(void));
+DECLARE_MIDFUNC(fsqrt_rr(FW d, FR s));
+DECLARE_MIDFUNC(fabs_rr(FW d, FR s));
+DECLARE_MIDFUNC(frndint_rr(FW d, FR s));
+DECLARE_MIDFUNC(fsin_rr(FW d, FR s));
+DECLARE_MIDFUNC(fcos_rr(FW d, FR s));
+DECLARE_MIDFUNC(ftwotox_rr(FW d, FR s));
+DECLARE_MIDFUNC(fetox_rr(FW d, FR s));
+DECLARE_MIDFUNC(flog2_rr(FW d, FR s));
+DECLARE_MIDFUNC(fneg_rr(FW d, FR s));
+DECLARE_MIDFUNC(fadd_rr(FRW d, FR s));
+DECLARE_MIDFUNC(fsub_rr(FRW d, FR s));
+DECLARE_MIDFUNC(fmul_rr(FRW d, FR s));
+DECLARE_MIDFUNC(frem_rr(FRW d, FR s));
+DECLARE_MIDFUNC(frem1_rr(FRW d, FR s));
+DECLARE_MIDFUNC(fdiv_rr(FRW d, FR s));
+DECLARE_MIDFUNC(fcmp_rr(FR d, FR s));
+DECLARE_MIDFUNC(fflags_into_flags(W2 tmp));
+#undef DECLARE_MIDFUNC
+
+extern int failure;
+#define FAIL(x) do { failure|=x; } while (0)
+
+/* Convenience functions exposed to gencomp */
+extern uae_u32 m68k_pc_offset;
+extern void readbyte(int address, int dest, int tmp);
+extern void readword(int address, int dest, int tmp);
+extern void readlong(int address, int dest, int tmp);
+extern void writebyte(int address, int source, int tmp);
+extern void writeword(int address, int source, int tmp);
+extern void writelong(int address, int source, int tmp);
+extern void writeword_clobber(int address, int source, int tmp);
+extern void writelong_clobber(int address, int source, int tmp);
+extern void get_n_addr(int address, int dest, int tmp);
+extern void get_n_addr_jmp(int address, int dest, int tmp);
+extern void calc_disp_ea_020(int base, uae_u32 dp, int target, int tmp);
+/* Set native Z flag only if register is zero */
+extern void set_zero(int r, int tmp);
+extern int kill_rodent(int r);
+extern void sync_m68k_pc(void);
+extern uae_u32 get_const(int r);
+extern int is_const(int r);
+extern void register_branch(uae_u32 not_taken, uae_u32 taken, uae_u8 cond);
+
+#define comp_get_ibyte(o) do_get_mem_byte((uae_u8 *)(comp_pc_p + (o) + 1))
+#define comp_get_iword(o) do_get_mem_word((uae_u16 *)(comp_pc_p + (o)))
+#define comp_get_ilong(o) do_get_mem_long((uae_u32 *)(comp_pc_p + (o)))
+
+struct blockinfo_t;
+
+typedef struct dep_t {
+ uae_u32* jmp_off;
+ struct blockinfo_t* target;
+ struct blockinfo_t* source;
+ struct dep_t** prev_p;
+ struct dep_t* next;
+} dependency;
+
+typedef struct checksum_info_t {
+ uae_u8 *start_p;
+ uae_u32 length;
+ struct checksum_info_t *next;
+} checksum_info;
+
+typedef struct blockinfo_t {
+ uae_s32 count;
+ cpuop_func* direct_handler_to_use;
+ cpuop_func* handler_to_use;
+ /* The direct handler does not check for the correct address */
+
+ cpuop_func* handler;
+ cpuop_func* direct_handler;
+
+ cpuop_func* direct_pen;
+ cpuop_func* direct_pcc;
+
+ uae_u8* pc_p;
+
+ uae_u32 c1;
+ uae_u32 c2;
+#if USE_CHECKSUM_INFO
+ checksum_info *csi;
+#else
+ uae_u32 len;
+ uae_u32 min_pcp;
+#endif
+
+ struct blockinfo_t* next_same_cl;
+ struct blockinfo_t** prev_same_cl_p;
+ struct blockinfo_t* next;
+ struct blockinfo_t** prev_p;
+
+ uae_u8 optlevel;
+ uae_u8 needed_flags;
+ uae_u8 status;
+ uae_u8 havestate;
+
+ dependency dep[2]; /* Holds things we depend on */
+ dependency* deplist; /* List of things that depend on this */
+ smallstate env;
+
+#if JIT_DEBUG
+ /* (gb) size of the compiled block (direct handler) */
+ uae_u32 direct_handler_size;
+#endif
+} blockinfo;
+
+#define BI_INVALID 0
+#define BI_ACTIVE 1
+#define BI_NEED_RECOMP 2
+#define BI_NEED_CHECK 3
+#define BI_CHECKING 4
+#define BI_COMPILING 5
+#define BI_FINALIZING 6
+
+void execute_normal(void);
+void exec_nostats(void);
+void do_nothing(void);
+
+#else
+
+static __inline__ void flush_icache(int) { }
+static __inline__ void build_comp() { }
+
+#endif /* !USE_JIT */
+
+#endif /* COMPEMU_H */
* Actual encoding of the instructions on the target CPU *
*************************************************************************/
-#include "compemu_optimizer_x86.c"
+//#include "compemu_optimizer_x86.c"
STATIC_INLINE uae_u16 swap16(uae_u16 x)
{
* Get the optimizer stuff *
********************************************************************/
-#include "compemu_optimizer.c"
+//#include "compemu_optimizer.c"
#include "compemu_optimizer_x86.c"
/********************************************************************
--- /dev/null
+/*
+ * compiler/compemu_support.cpp - Core dynamic translation engine
+ *
+ * Original 68040 JIT compiler for UAE, copyright 2000-2002 Bernd Meyer
+ *
+ * Adaptation for Basilisk II and improvements, copyright 2000-2005
+ * Gwenole Beauchesne
+ *
+ * Basilisk II (C) 1997-2008 Christian Bauer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#if 0
+#if !REAL_ADDRESSING && !DIRECT_ADDRESSING
+#error "Only Real or Direct Addressing is supported with the JIT Compiler"
+#endif
+
+#if X86_ASSEMBLY && !SAHF_SETO_PROFITABLE
+#error "Only [LS]AHF scheme to [gs]et flags is supported with the JIT Compiler"
+#endif
+#endif
+
+/* NOTE: support for AMD64 assumes translation cache and other code
+ * buffers are allocated into a 32-bit address space because (i) B2/JIT
+ * code is not 64-bit clean and (ii) it's faster to resolve branches
+ * that way.
+ */
+#if 0
+#if !defined(__i386__) && !defined(__x86_64__)
+#error "Only IA-32 and X86-64 targets are supported with the JIT Compiler"
+#endif
+#endif
+
+#define USE_MATCH 0
+
+/* kludge for Brian, so he can compile under MSVC++ */
+#define USE_NORMAL_CALLING_CONVENTION 0
+
+#ifndef WIN32
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#endif
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "sysconfig.h"
+#include "sysdeps.h"
+#if 0
+#include "cpu_emulation.h"
+#include "main.h"
+#include "prefs.h"
+#include "user_strings.h"
+#include "vm_alloc.h"
+#endif
+
+//#include "machdep/m68k.h"
+#include "custom.h"
+#include "memory.h"
+//#include "readcpu.h"
+#include "newcpu.h"
+#include "comptbl.h"
+#include "jit/compemu_codegen.h"
+#include "fpu/fpu.h"
+#include "fpu/flags.h"
+
+#define DEBUG 1
+#include "debug.h"
+
+#ifdef ENABLE_MON
+#include "mon.h"
+#endif
+
+#ifndef WIN32
+#define PROFILE_COMPILE_TIME 1
+#define PROFILE_UNTRANSLATED_INSNS 1
+#endif
+
+#if defined(__x86_64__) && 0
+#define RECORD_REGISTER_USAGE 1
+#endif
+
+#ifdef WIN32
+#undef write_log
+#define write_log dummy_write_log
+static void dummy_write_log(const char *, ...) { }
+#endif
+
+#if JIT_DEBUG
+#undef abort
+#define abort() do { \
+ fprintf(stderr, "Abort in file %s at line %d\n", __FILE__, __LINE__); \
+ exit(EXIT_FAILURE); \
+} while (0)
+#endif
+
+#if RECORD_REGISTER_USAGE
+static uint64 reg_count[16];
+static int reg_count_local[16];
+
+static int reg_count_compare(const void *ap, const void *bp)
+{
+ const int a = *((int *)ap);
+ const int b = *((int *)bp);
+ return reg_count[b] - reg_count[a];
+}
+#endif
+
+#if PROFILE_COMPILE_TIME
+#include <time.h>
+static uae_u32 compile_count = 0;
+static clock_t compile_time = 0;
+static clock_t emul_start_time = 0;
+static clock_t emul_end_time = 0;
+#endif
+
+#if PROFILE_UNTRANSLATED_INSNS
+const int untranslated_top_ten = 20;
+static uae_u32 raw_cputbl_count[65536] = { 0, };
+static uae_u16 opcode_nums[65536];
+
+static int untranslated_compfn(const void *e1, const void *e2)
+{
+ return raw_cputbl_count[*(const uae_u16 *)e1] < raw_cputbl_count[*(const uae_u16 *)e2];
+}
+#endif
+
+static compop_func *compfunctbl[65536];
+static compop_func *nfcompfunctbl[65536];
+static cpuop_func *nfcpufunctbl[65536];
+uae_u8* comp_pc_p;
+
+// From newcpu.cpp
+extern bool quit_program;
+
+// gb-- Extra data for Basilisk II/JIT
+#if JIT_DEBUG
+static bool JITDebug = false; // Enable runtime disassemblers through mon?
+#else
+const bool JITDebug = false; // Don't use JIT debug mode at all
+#endif
+#if USE_INLINING
+static bool follow_const_jumps = true; // Flag: translation through constant jumps
+#else
+const bool follow_const_jumps = false;
+#endif
+
+const uae_u32 MIN_CACHE_SIZE = 1024; // Minimal translation cache size (1 MB)
+static uae_u32 cache_size = 0; // Size of total cache allocated for compiled blocks
+static uae_u32 current_cache_size = 0; // Cache grows upwards: how much has been consumed already
+static bool lazy_flush = true; // Flag: lazy translation cache invalidation
+static bool avoid_fpu = true; // Flag: compile FPU instructions ?
+static bool have_cmov = false; // target has CMOV instructions ?
+static bool have_lahf_lm = true; // target has LAHF supported in long mode ?
+static bool have_rat_stall = true; // target has partial register stalls ?
+const bool tune_alignment = true; // Tune code alignments for running CPU ?
+const bool tune_nop_fillers = true; // Tune no-op fillers for architecture
+static bool setzflg_uses_bsf = false; // setzflg virtual instruction can use native BSF instruction correctly?
+static int align_loops = 32; // Align the start of loops
+static int align_jumps = 32; // Align the start of jumps
+static int optcount[10] = {
+ 10, // How often a block has to be executed before it is translated
+ 0, // How often to use naive translation
+ 0, 0, 0, 0,
+ -1, -1, -1, -1
+};
+
+struct op_properties {
+ uae_u8 use_flags;
+ uae_u8 set_flags;
+ uae_u8 is_addx;
+ uae_u8 cflow;
+};
+static op_properties prop[65536];
+
+static inline int end_block(uae_u32 opcode)
+{
+ return (prop[opcode].cflow & fl_end_block);
+}
+
+static inline bool is_const_jump(uae_u32 opcode)
+{
+ return (prop[opcode].cflow == fl_const_jump);
+}
+
+static inline bool may_trap(uae_u32 opcode)
+{
+ return (prop[opcode].cflow & fl_trap);
+}
+
+static inline unsigned int cft_map (unsigned int f)
+{
+#ifndef HAVE_GET_WORD_UNSWAPPED
+ return f;
+#else
+ return ((f >> 8) & 255) | ((f & 255) << 8);
+#endif
+}
+
+uae_u8* start_pc_p;
+uae_u32 start_pc;
+uae_u32 current_block_pc_p;
+static uintptr current_block_start_target;
+uae_u32 needed_flags;
+static uintptr next_pc_p;
+static uintptr taken_pc_p;
+static int branch_cc;
+static int redo_current_block;
+
+int segvcount=0;
+int soft_flush_count=0;
+int hard_flush_count=0;
+int checksum_count=0;
+static uae_u8* current_compile_p=NULL;
+static uae_u8* max_compile_start;
+static uae_u8* compiled_code=NULL;
+static uae_s32 reg_alloc_run;
+const int POPALLSPACE_SIZE = 1024; /* That should be enough space */
+static uae_u8* popallspace=NULL;
+
+void* pushall_call_handler=NULL;
+static void* popall_do_nothing=NULL;
+static void* popall_exec_nostats=NULL;
+static void* popall_execute_normal=NULL;
+static void* popall_cache_miss=NULL;
+static void* popall_recompile_block=NULL;
+static void* popall_check_checksum=NULL;
+
+/* The 68k only ever executes from even addresses. So right now, we
+ * waste half the entries in this array
+ * UPDATE: We now use those entries to store the start of the linked
+ * lists that we maintain for each hash result.
+ */
+cacheline cache_tags[TAGSIZE];
+int letit=0;
+blockinfo* hold_bi[MAX_HOLD_BI];
+blockinfo* active;
+blockinfo* dormant;
+
+/* 68040 */
+extern struct cputbl op_smalltbl_0_nf[];
+extern struct comptbl op_smalltbl_0_comp_nf[];
+extern struct comptbl op_smalltbl_0_comp_ff[];
+
+/* 68020 + 68881 */
+extern struct cputbl op_smalltbl_1_nf[];
+
+/* 68020 */
+extern struct cputbl op_smalltbl_2_nf[];
+
+/* 68010 */
+extern struct cputbl op_smalltbl_3_nf[];
+
+/* 68000 */
+extern struct cputbl op_smalltbl_4_nf[];
+
+/* 68000 slow but compatible. */
+extern struct cputbl op_smalltbl_5_nf[];
+
+static void flush_icache_hard(int n);
+static void flush_icache_lazy(int n);
+static void flush_icache_none(int n);
+void (*flush_icache)(int n) = flush_icache_none;
+
+
+
+bigstate live;
+smallstate empty_ss;
+smallstate default_ss;
+static int optlev;
+
+static int writereg(int r, int size);
+static void unlock2(int r);
+static void setlock(int r);
+static int readreg_specific(int r, int size, int spec);
+static int writereg_specific(int r, int size, int spec);
+static void prepare_for_call_1(void);
+static void prepare_for_call_2(void);
+static void align_target(uae_u32 a);
+
+static uae_s32 nextused[VREGS];
+
+uae_u32 m68k_pc_offset;
+
+/* Some arithmetic ooperations can be optimized away if the operands
+ * are known to be constant. But that's only a good idea when the
+ * side effects they would have on the flags are not important. This
+ * variable indicates whether we need the side effects or not
+ */
+uae_u32 needflags=0;
+
+/* Flag handling is complicated.
+ *
+ * x86 instructions create flags, which quite often are exactly what we
+ * want. So at times, the "68k" flags are actually in the x86 flags.
+ *
+ * Then again, sometimes we do x86 instructions that clobber the x86
+ * flags, but don't represent a corresponding m68k instruction. In that
+ * case, we have to save them.
+ *
+ * We used to save them to the stack, but now store them back directly
+ * into the regflags.cznv of the traditional emulation. Thus some odd
+ * names.
+ *
+ * So flags can be in either of two places (used to be three; boy were
+ * things complicated back then!); And either place can contain either
+ * valid flags or invalid trash (and on the stack, there was also the
+ * option of "nothing at all", now gone). A couple of variables keep
+ * track of the respective states.
+ *
+ * To make things worse, we might or might not be interested in the flags.
+ * by default, we are, but a call to dont_care_flags can change that
+ * until the next call to live_flags. If we are not, pretty much whatever
+ * is in the register and/or the native flags is seen as valid.
+ */
+
+static __inline__ blockinfo* get_blockinfo(uae_u32 cl)
+{
+ return cache_tags[cl+1].bi;
+}
+
+static __inline__ blockinfo* get_blockinfo_addr(void* addr)
+{
+ blockinfo* bi=get_blockinfo(cacheline(addr));
+
+ while (bi) {
+ if (bi->pc_p==addr)
+ return bi;
+ bi=bi->next_same_cl;
+ }
+ return NULL;
+}
+
+
+/*******************************************************************
+ * All sorts of list related functions for all of the lists *
+ *******************************************************************/
+
+static __inline__ void remove_from_cl_list(blockinfo* bi)
+{
+ uae_u32 cl=cacheline(bi->pc_p);
+
+ if (bi->prev_same_cl_p)
+ *(bi->prev_same_cl_p)=bi->next_same_cl;
+ if (bi->next_same_cl)
+ bi->next_same_cl->prev_same_cl_p=bi->prev_same_cl_p;
+ if (cache_tags[cl+1].bi)
+ cache_tags[cl].handler=cache_tags[cl+1].bi->handler_to_use;
+ else
+ cache_tags[cl].handler=(cpuop_func *)popall_execute_normal;
+}
+
+static __inline__ void remove_from_list(blockinfo* bi)
+{
+ if (bi->prev_p)
+ *(bi->prev_p)=bi->next;
+ if (bi->next)
+ bi->next->prev_p=bi->prev_p;
+}
+
+static __inline__ void remove_from_lists(blockinfo* bi)
+{
+ remove_from_list(bi);
+ remove_from_cl_list(bi);
+}
+
+static __inline__ void add_to_cl_list(blockinfo* bi)
+{
+ uae_u32 cl=cacheline(bi->pc_p);
+
+ if (cache_tags[cl+1].bi)
+ cache_tags[cl+1].bi->prev_same_cl_p=&(bi->next_same_cl);
+ bi->next_same_cl=cache_tags[cl+1].bi;
+
+ cache_tags[cl+1].bi=bi;
+ bi->prev_same_cl_p=&(cache_tags[cl+1].bi);
+
+ cache_tags[cl].handler=bi->handler_to_use;
+}
+
+static __inline__ void raise_in_cl_list(blockinfo* bi)
+{
+ remove_from_cl_list(bi);
+ add_to_cl_list(bi);
+}
+
+static __inline__ void add_to_active(blockinfo* bi)
+{
+ if (active)
+ active->prev_p=&(bi->next);
+ bi->next=active;
+
+ active=bi;
+ bi->prev_p=&active;
+}
+
+static __inline__ void add_to_dormant(blockinfo* bi)
+{
+ if (dormant)
+ dormant->prev_p=&(bi->next);
+ bi->next=dormant;
+
+ dormant=bi;
+ bi->prev_p=&dormant;
+}
+
+static __inline__ void remove_dep(dependency* d)
+{
+ if (d->prev_p)
+ *(d->prev_p)=d->next;
+ if (d->next)
+ d->next->prev_p=d->prev_p;
+ d->prev_p=NULL;
+ d->next=NULL;
+}
+
+/* This block's code is about to be thrown away, so it no longer
+ depends on anything else */
+static __inline__ void remove_deps(blockinfo* bi)
+{
+ remove_dep(&(bi->dep[0]));
+ remove_dep(&(bi->dep[1]));
+}
+
+static __inline__ void adjust_jmpdep(dependency* d, cpuop_func* a)
+{
+ *(d->jmp_off)=(uintptr)a-((uintptr)d->jmp_off+4);
+}
+
+/********************************************************************
+ * Soft flush handling support functions *
+ ********************************************************************/
+
+static __inline__ void set_dhtu(blockinfo* bi, cpuop_func* dh)
+{
+ //write_log("bi is %p\n",bi);
+ if (dh!=bi->direct_handler_to_use) {
+ dependency* x=bi->deplist;
+ //write_log("bi->deplist=%p\n",bi->deplist);
+ while (x) {
+ //write_log("x is %p\n",x);
+ //write_log("x->next is %p\n",x->next);
+ //write_log("x->prev_p is %p\n",x->prev_p);
+
+ if (x->jmp_off) {
+ adjust_jmpdep(x,dh);
+ }
+ x=x->next;
+ }
+ bi->direct_handler_to_use=dh;
+ }
+}
+
+static __inline__ void invalidate_block(blockinfo* bi)
+{
+ int i;
+
+ bi->optlevel=0;
+ bi->count=optcount[0]-1;
+ bi->handler=NULL;
+ bi->handler_to_use=(cpuop_func *)popall_execute_normal;
+ bi->direct_handler=NULL;
+ set_dhtu(bi,bi->direct_pen);
+ bi->needed_flags=0xff;
+ bi->status=BI_INVALID;
+ for (i=0;i<2;i++) {
+ bi->dep[i].jmp_off=NULL;
+ bi->dep[i].target=NULL;
+ }
+ remove_deps(bi);
+}
+
+static __inline__ void create_jmpdep(blockinfo* bi, int i, uae_u32* jmpaddr, uae_u32 target)
+{
+ blockinfo* tbi=get_blockinfo_addr((void*)(uintptr)target);
+
+ Dif(!tbi) {
+ write_log("Could not create jmpdep!\n");
+ abort();
+ }
+ bi->dep[i].jmp_off=jmpaddr;
+ bi->dep[i].source=bi;
+ bi->dep[i].target=tbi;
+ bi->dep[i].next=tbi->deplist;
+ if (bi->dep[i].next)
+ bi->dep[i].next->prev_p=&(bi->dep[i].next);
+ bi->dep[i].prev_p=&(tbi->deplist);
+ tbi->deplist=&(bi->dep[i]);
+}
+
+static __inline__ void block_need_recompile(blockinfo * bi)
+{
+ uae_u32 cl = cacheline(bi->pc_p);
+
+ set_dhtu(bi, bi->direct_pen);
+ bi->direct_handler = bi->direct_pen;
+
+ bi->handler_to_use = (cpuop_func *)popall_execute_normal;
+ bi->handler = (cpuop_func *)popall_execute_normal;
+ if (bi == cache_tags[cl + 1].bi)
+ cache_tags[cl].handler = (cpuop_func *)popall_execute_normal;
+ bi->status = BI_NEED_RECOMP;
+}
+
+static __inline__ void mark_callers_recompile(blockinfo * bi)
+{
+ dependency *x = bi->deplist;
+
+ while (x) {
+ dependency *next = x->next; /* This disappears when we mark for
+ * recompilation and thus remove the
+ * blocks from the lists */
+ if (x->jmp_off) {
+ blockinfo *cbi = x->source;
+
+ Dif(cbi->status == BI_INVALID) {
+ // write_log("invalid block in dependency list\n"); // FIXME?
+ // abort();
+ }
+ if (cbi->status == BI_ACTIVE || cbi->status == BI_NEED_CHECK) {
+ block_need_recompile(cbi);
+ mark_callers_recompile(cbi);
+ }
+ else if (cbi->status == BI_COMPILING) {
+ redo_current_block = 1;
+ }
+ else if (cbi->status == BI_NEED_RECOMP) {
+ /* nothing */
+ }
+ else {
+ //write_log("Status %d in mark_callers\n",cbi->status); // FIXME?
+ }
+ }
+ x = next;
+ }
+}
+
+static __inline__ blockinfo* get_blockinfo_addr_new(void* addr, int setstate)
+{
+ blockinfo* bi=get_blockinfo_addr(addr);
+ int i;
+
+ if (!bi) {
+ for (i=0;i<MAX_HOLD_BI && !bi;i++) {
+ if (hold_bi[i]) {
+ uae_u32 cl=cacheline(addr);
+
+ bi=hold_bi[i];
+ hold_bi[i]=NULL;
+ bi->pc_p=(uae_u8 *)addr;
+ invalidate_block(bi);
+ add_to_active(bi);
+ add_to_cl_list(bi);
+
+ }
+ }
+ }
+ if (!bi) {
+ write_log("Looking for blockinfo, can't find free one\n");
+ abort();
+ }
+ return bi;
+}
+
+static void prepare_block(blockinfo* bi);
+
+/* Managment of blockinfos.
+
+ A blockinfo struct is allocated whenever a new block has to be
+ compiled. If the list of free blockinfos is empty, we allocate a new
+ pool of blockinfos and link the newly created blockinfos altogether
+ into the list of free blockinfos. Otherwise, we simply pop a structure
+ off the free list.
+
+ Blockinfo are lazily deallocated, i.e. chained altogether in the
+ list of free blockinfos whenvever a translation cache flush (hard or
+ soft) request occurs.
+*/
+
+template< class T >
+class LazyBlockAllocator
+{
+ enum {
+ kPoolSize = 1 + 4096 / sizeof(T)
+ };
+ struct Pool {
+ T chunk[kPoolSize];
+ Pool * next;
+ };
+ Pool * mPools;
+ T * mChunks;
+public:
+ LazyBlockAllocator() : mPools(0), mChunks(0) { }
+ ~LazyBlockAllocator();
+ T * acquire();
+ void release(T * const);
+};
+
+template< class T >
+LazyBlockAllocator<T>::~LazyBlockAllocator()
+{
+ Pool * currentPool = mPools;
+ while (currentPool) {
+ Pool * deadPool = currentPool;
+ currentPool = currentPool->next;
+ free(deadPool);
+ }
+}
+
+template< class T >
+T * LazyBlockAllocator<T>::acquire()
+{
+ if (!mChunks) {
+ // There is no chunk left, allocate a new pool and link the
+ // chunks into the free list
+ Pool * newPool = (Pool *)malloc(sizeof(Pool));
+ for (T * chunk = &newPool->chunk[0]; chunk < &newPool->chunk[kPoolSize]; chunk++) {
+ chunk->next = mChunks;
+ mChunks = chunk;
+ }
+ newPool->next = mPools;
+ mPools = newPool;
+ }
+ T * chunk = mChunks;
+ mChunks = chunk->next;
+ return chunk;
+}
+
+template< class T >
+void LazyBlockAllocator<T>::release(T * const chunk)
+{
+ chunk->next = mChunks;
+ mChunks = chunk;
+}
+
+template< class T >
+class HardBlockAllocator
+{
+public:
+ T * acquire() {
+ T * data = (T *)current_compile_p;
+ current_compile_p += sizeof(T);
+ return data;
+ }
+
+ void release(T * const chunk) {
+ // Deallocated on invalidation
+ }
+};
+
+#if USE_SEPARATE_BIA
+static LazyBlockAllocator<blockinfo> BlockInfoAllocator;
+static LazyBlockAllocator<checksum_info> ChecksumInfoAllocator;
+#else
+static HardBlockAllocator<blockinfo> BlockInfoAllocator;
+static HardBlockAllocator<checksum_info> ChecksumInfoAllocator;
+#endif
+
+static __inline__ checksum_info *alloc_checksum_info(void)
+{
+ checksum_info *csi = ChecksumInfoAllocator.acquire();
+ csi->next = NULL;
+ return csi;
+}
+
+static __inline__ void free_checksum_info(checksum_info *csi)
+{
+ csi->next = NULL;
+ ChecksumInfoAllocator.release(csi);
+}
+
+static __inline__ void free_checksum_info_chain(checksum_info *csi)
+{
+ while (csi != NULL) {
+ checksum_info *csi2 = csi->next;
+ free_checksum_info(csi);
+ csi = csi2;
+ }
+}
+
+static __inline__ blockinfo *alloc_blockinfo(void)
+{
+ blockinfo *bi = BlockInfoAllocator.acquire();
+#if USE_CHECKSUM_INFO
+ bi->csi = NULL;
+#endif
+ return bi;
+}
+
+static __inline__ void free_blockinfo(blockinfo *bi)
+{
+#if USE_CHECKSUM_INFO
+ free_checksum_info_chain(bi->csi);
+ bi->csi = NULL;
+#endif
+ BlockInfoAllocator.release(bi);
+}
+
+static __inline__ void alloc_blockinfos(void)
+{
+ int i;
+ blockinfo* bi;
+
+ for (i=0;i<MAX_HOLD_BI;i++) {
+ if (hold_bi[i])
+ return;
+ bi=hold_bi[i]=alloc_blockinfo();
+ prepare_block(bi);
+ }
+}
+
+/********************************************************************
+ * Functions to emit data into memory, and other general support *
+ ********************************************************************/
+
+static uae_u8* target;
+
+static void emit_init(void)
+{
+}
+
+static __inline__ void emit_byte(uae_u8 x)
+{
+ *target++=x;
+}
+
+static __inline__ void emit_word(uae_u16 x)
+{
+ *((uae_u16*)target)=x;
+ target+=2;
+}
+
+static __inline__ void emit_long(uae_u32 x)
+{
+ *((uae_u32*)target)=x;
+ target+=4;
+}
+
+static __inline__ void emit_quad(uae_u64 x)
+{
+ *((uae_u64*)target)=x;
+ target+=8;
+}
+
+static __inline__ void emit_block(const uae_u8 *block, uae_u32 blocklen)
+{
+ memcpy((uae_u8 *)target,block,blocklen);
+ target+=blocklen;
+}
+
+static __inline__ uae_u32 reverse32(uae_u32 v)
+{
+#if 1
+ // gb-- We have specialized byteswapping functions, just use them
+ return do_byteswap_32(v);
+#else
+ return ((v>>24)&0xff) | ((v>>8)&0xff00) | ((v<<8)&0xff0000) | ((v<<24)&0xff000000);
+#endif
+}
+
+/********************************************************************
+ * Getting the information about the target CPU *
+ ********************************************************************/
+
+#include "codegen_x86.cpp"
+
+void set_target(uae_u8* t)
+{
+ target=t;
+}
+
+static __inline__ uae_u8* get_target_noopt(void)
+{
+ return target;
+}
+
+__inline__ uae_u8* get_target(void)
+{
+ return get_target_noopt();
+}
+
+
+/********************************************************************
+ * Flags status handling. EMIT TIME! *
+ ********************************************************************/
+
+static void bt_l_ri_noclobber(R4 r, IMM i);
+
+static void make_flags_live_internal(void)
+{
+ if (live.flags_in_flags==VALID)
+ return;
+ Dif (live.flags_on_stack==TRASH) {
+ write_log("Want flags, got something on stack, but it is TRASH\n");
+ abort();
+ }
+ if (live.flags_on_stack==VALID) {
+ int tmp;
+ tmp=readreg_specific(FLAGTMP,4,FLAG_NREG2);
+ raw_reg_to_flags(tmp);
+ unlock2(tmp);
+
+ live.flags_in_flags=VALID;
+ return;
+ }
+ write_log("Huh? live.flags_in_flags=%d, live.flags_on_stack=%d, but need to make live\n",
+ live.flags_in_flags,live.flags_on_stack);
+ abort();
+}
+
+static void flags_to_stack(void)
+{
+ if (live.flags_on_stack==VALID)
+ return;
+ if (!live.flags_are_important) {
+ live.flags_on_stack=VALID;
+ return;
+ }
+ Dif (live.flags_in_flags!=VALID)
+ abort();
+ else {
+ int tmp;
+ tmp=writereg_specific(FLAGTMP,4,FLAG_NREG1);
+ raw_flags_to_reg(tmp);
+ unlock2(tmp);
+ }
+ live.flags_on_stack=VALID;
+}
+
+static __inline__ void clobber_flags(void)
+{
+ if (live.flags_in_flags==VALID && live.flags_on_stack!=VALID)
+ flags_to_stack();
+ live.flags_in_flags=TRASH;
+}
+
+/* Prepare for leaving the compiled stuff */
+static __inline__ void flush_flags(void)
+{
+ flags_to_stack();
+ return;
+}
+
+int touchcnt;
+
+/********************************************************************
+ * Partial register flushing for optimized calls *
+ ********************************************************************/
+
+struct regusage {
+ uae_u16 rmask;
+ uae_u16 wmask;
+};
+
+static inline void ru_set(uae_u16 *mask, int reg)
+{
+#if USE_OPTIMIZED_CALLS
+ *mask |= 1 << reg;
+#endif
+}
+
+static inline bool ru_get(const uae_u16 *mask, int reg)
+{
+#if USE_OPTIMIZED_CALLS
+ return (*mask & (1 << reg));
+#else
+ /* Default: instruction reads & write to register */
+ return true;
+#endif
+}
+
+static inline void ru_set_read(regusage *ru, int reg)
+{
+ ru_set(&ru->rmask, reg);
+}
+
+static inline void ru_set_write(regusage *ru, int reg)
+{
+ ru_set(&ru->wmask, reg);
+}
+
+static inline bool ru_read_p(const regusage *ru, int reg)
+{
+ return ru_get(&ru->rmask, reg);
+}
+
+static inline bool ru_write_p(const regusage *ru, int reg)
+{
+ return ru_get(&ru->wmask, reg);
+}
+
+static void ru_fill_ea(regusage *ru, int reg, amodes mode,
+ wordsizes size, int write_mode)
+{
+ switch (mode) {
+ case Areg:
+ reg += 8;
+ /* fall through */
+ case Dreg:
+ ru_set(write_mode ? &ru->wmask : &ru->rmask, reg);
+ break;
+ case Ad16:
+ /* skip displacment */
+ m68k_pc_offset += 2;
+ case Aind:
+ case Aipi:
+ case Apdi:
+ ru_set_read(ru, reg+8);
+ break;
+ case Ad8r:
+ ru_set_read(ru, reg+8);
+ /* fall through */
+ case PC8r: {
+ uae_u16 dp = comp_get_iword((m68k_pc_offset+=2)-2);
+ reg = (dp >> 12) & 15;
+ ru_set_read(ru, reg);
+ if (dp & 0x100)
+ m68k_pc_offset += (((dp & 0x30) >> 3) & 7) + ((dp & 3) * 2);
+ break;
+ }
+ case PC16:
+ case absw:
+ case imm0:
+ case imm1:
+ m68k_pc_offset += 2;
+ break;
+ case absl:
+ case imm2:
+ m68k_pc_offset += 4;
+ break;
+ case immi:
+ m68k_pc_offset += (size == sz_long) ? 4 : 2;
+ break;
+ }
+}
+
+/* TODO: split into a static initialization part and a dynamic one
+ (instructions depending on extension words) */
+static void ru_fill(regusage *ru, uae_u32 opcode)
+{
+ m68k_pc_offset += 2;
+
+ /* Default: no register is used or written to */
+ ru->rmask = 0;
+ ru->wmask = 0;
+
+ uae_u32 real_opcode = cft_map(opcode);
+ struct instr *dp = &table68k[real_opcode];
+
+ bool rw_dest = true;
+ bool handled = false;
+
+ /* Handle some instructions specifically */
+ uae_u16 reg, ext;
+ switch (dp->mnemo) {
+ case i_BFCHG:
+ case i_BFCLR:
+ case i_BFEXTS:
+ case i_BFEXTU:
+ case i_BFFFO:
+ case i_BFINS:
+ case i_BFSET:
+ case i_BFTST:
+ ext = comp_get_iword((m68k_pc_offset+=2)-2);
+ if (ext & 0x800) ru_set_read(ru, (ext >> 6) & 7);
+ if (ext & 0x020) ru_set_read(ru, ext & 7);
+ ru_fill_ea(ru, dp->dreg, (amodes)dp->dmode, (wordsizes)dp->size, 1);
+ if (dp->dmode == Dreg)
+ ru_set_read(ru, dp->dreg);
+ switch (dp->mnemo) {
+ case i_BFEXTS:
+ case i_BFEXTU:
+ case i_BFFFO:
+ ru_set_write(ru, (ext >> 12) & 7);
+ break;
+ case i_BFINS:
+ ru_set_read(ru, (ext >> 12) & 7);
+ /* fall through */
+ case i_BFCHG:
+ case i_BFCLR:
+ case i_BSET:
+ if (dp->dmode == Dreg)
+ ru_set_write(ru, dp->dreg);
+ break;
+ }
+ handled = true;
+ rw_dest = false;
+ break;
+
+ case i_BTST:
+ rw_dest = false;
+ break;
+
+ case i_CAS:
+ {
+ ext = comp_get_iword((m68k_pc_offset+=2)-2);
+ int Du = ext & 7;
+ ru_set_read(ru, Du);
+ int Dc = (ext >> 6) & 7;
+ ru_set_read(ru, Dc);
+ ru_set_write(ru, Dc);
+ break;
+ }
+ case i_CAS2:
+ {
+ int Dc1, Dc2, Du1, Du2, Rn1, Rn2;
+ ext = comp_get_iword((m68k_pc_offset+=2)-2);
+ Rn1 = (ext >> 12) & 15;
+ Du1 = (ext >> 6) & 7;
+ Dc1 = ext & 7;
+ ru_set_read(ru, Rn1);
+ ru_set_read(ru, Du1);
+ ru_set_read(ru, Dc1);
+ ru_set_write(ru, Dc1);
+ ext = comp_get_iword((m68k_pc_offset+=2)-2);
+ Rn2 = (ext >> 12) & 15;
+ Du2 = (ext >> 6) & 7;
+ Dc2 = ext & 7;
+ ru_set_read(ru, Rn2);
+ ru_set_read(ru, Du2);
+ ru_set_write(ru, Dc2);
+ break;
+ }
+ case i_DIVL: case i_MULL:
+ m68k_pc_offset += 2;
+ break;
+ case i_LEA:
+ case i_MOVE: case i_MOVEA: case i_MOVE16:
+ rw_dest = false;
+ break;
+ case i_PACK: case i_UNPK:
+ rw_dest = false;
+ m68k_pc_offset += 2;
+ break;
+ case i_TRAPcc:
+ m68k_pc_offset += (dp->size == sz_long) ? 4 : 2;
+ break;
+ case i_RTR:
+ /* do nothing, just for coverage debugging */
+ break;
+ /* TODO: handle EXG instruction */
+ }
+
+ /* Handle A-Traps better */
+ if ((real_opcode & 0xf000) == 0xa000) {
+ handled = true;
+ }
+
+ /* Handle EmulOps better */
+ if ((real_opcode & 0xff00) == 0x7100) {
+ handled = true;
+ ru->rmask = 0xffff;
+ ru->wmask = 0;
+ }
+
+ if (dp->suse && !handled)
+ ru_fill_ea(ru, dp->sreg, (amodes)dp->smode, (wordsizes)dp->size, 0);
+
+ if (dp->duse && !handled)
+ ru_fill_ea(ru, dp->dreg, (amodes)dp->dmode, (wordsizes)dp->size, 1);
+
+ if (rw_dest)
+ ru->rmask |= ru->wmask;
+
+ handled = handled || dp->suse || dp->duse;
+
+ /* Mark all registers as used/written if the instruction may trap */
+ if (may_trap(opcode)) {
+ handled = true;
+ ru->rmask = 0xffff;
+ ru->wmask = 0xffff;
+ }
+
+ if (!handled) {
+ write_log("ru_fill: %04x = { %04x, %04x }\n",
+ real_opcode, ru->rmask, ru->wmask);
+ abort();
+ }
+}
+
+/********************************************************************
+ * register allocation per block logging *
+ ********************************************************************/
+
+static uae_s8 vstate[VREGS];
+static uae_s8 vwritten[VREGS];
+static uae_s8 nstate[N_REGS];
+
+#define L_UNKNOWN -127
+#define L_UNAVAIL -1
+#define L_NEEDED -2
+#define L_UNNEEDED -3
+
+static __inline__ void big_to_small_state(bigstate * b, smallstate * s)
+{
+ int i;
+
+ for (i = 0; i < VREGS; i++)
+ s->virt[i] = vstate[i];
+ for (i = 0; i < N_REGS; i++)
+ s->nat[i] = nstate[i];
+}
+
+static __inline__ int callers_need_recompile(bigstate * b, smallstate * s)
+{
+ int i;
+ int reverse = 0;
+
+ for (i = 0; i < VREGS; i++) {
+ if (vstate[i] != L_UNNEEDED && s->virt[i] == L_UNNEEDED)
+ return 1;
+ if (vstate[i] == L_UNNEEDED && s->virt[i] != L_UNNEEDED)
+ reverse++;
+ }
+ for (i = 0; i < N_REGS; i++) {
+ if (nstate[i] >= 0 && nstate[i] != s->nat[i])
+ return 1;
+ if (nstate[i] < 0 && s->nat[i] >= 0)
+ reverse++;
+ }
+ if (reverse >= 2 && USE_MATCH)
+ return 1; /* In this case, it might be worth recompiling the
+ * callers */
+ return 0;
+}
+
+static __inline__ void log_startblock(void)
+{
+ int i;
+
+ for (i = 0; i < VREGS; i++) {
+ vstate[i] = L_UNKNOWN;
+ vwritten[i] = 0;
+ }
+ for (i = 0; i < N_REGS; i++)
+ nstate[i] = L_UNKNOWN;
+}
+
+/* Using an n-reg for a temp variable */
+static __inline__ void log_isused(int n)
+{
+ if (nstate[n] == L_UNKNOWN)
+ nstate[n] = L_UNAVAIL;
+}
+
+static __inline__ void log_visused(int r)
+{
+ if (vstate[r] == L_UNKNOWN)
+ vstate[r] = L_NEEDED;
+}
+
+static __inline__ void do_load_reg(int n, int r)
+{
+ if (r == FLAGTMP)
+ raw_load_flagreg(n, r);
+ else if (r == FLAGX)
+ raw_load_flagx(n, r);
+ else
+ raw_mov_l_rm(n, (uintptr) live.state[r].mem);
+}
+
+static __inline__ void check_load_reg(int n, int r)
+{
+ raw_mov_l_rm(n, (uintptr) live.state[r].mem);
+}
+
+static __inline__ void log_vwrite(int r)
+{
+ vwritten[r] = 1;
+}
+
+/* Using an n-reg to hold a v-reg */
+static __inline__ void log_isreg(int n, int r)
+{
+ static int count = 0;
+
+ if (nstate[n] == L_UNKNOWN && r < 16 && !vwritten[r] && USE_MATCH)
+ nstate[n] = r;
+ else {
+ do_load_reg(n, r);
+ if (nstate[n] == L_UNKNOWN)
+ nstate[n] = L_UNAVAIL;
+ }
+ if (vstate[r] == L_UNKNOWN)
+ vstate[r] = L_NEEDED;
+}
+
+static __inline__ void log_clobberreg(int r)
+{
+ if (vstate[r] == L_UNKNOWN)
+ vstate[r] = L_UNNEEDED;
+}
+
+/* This ends all possibility of clever register allocation */
+
+static __inline__ void log_flush(void)
+{
+ int i;
+
+ for (i = 0; i < VREGS; i++)
+ if (vstate[i] == L_UNKNOWN)
+ vstate[i] = L_NEEDED;
+ for (i = 0; i < N_REGS; i++)
+ if (nstate[i] == L_UNKNOWN)
+ nstate[i] = L_UNAVAIL;
+}
+
+static __inline__ void log_dump(void)
+{
+ int i;
+
+ return;
+
+ write_log("----------------------\n");
+ for (i = 0; i < N_REGS; i++) {
+ switch (nstate[i]) {
+ case L_UNKNOWN:
+ write_log("Nat %d : UNKNOWN\n", i);
+ break;
+ case L_UNAVAIL:
+ write_log("Nat %d : UNAVAIL\n", i);
+ break;
+ default:
+ write_log("Nat %d : %d\n", i, nstate[i]);
+ break;
+ }
+ }
+ for (i = 0; i < VREGS; i++) {
+ if (vstate[i] == L_UNNEEDED)
+ write_log("Virt %d: UNNEEDED\n", i);
+ }
+}
+
+/********************************************************************
+ * register status handling. EMIT TIME! *
+ ********************************************************************/
+
+static __inline__ void set_status(int r, int status)
+{
+ if (status == ISCONST)
+ log_clobberreg(r);
+ live.state[r].status=status;
+}
+
+static __inline__ int isinreg(int r)
+{
+ return live.state[r].status==CLEAN || live.state[r].status==DIRTY;
+}
+
+static __inline__ void adjust_nreg(int r, uae_u32 val)
+{
+ if (!val)
+ return;
+ raw_lea_l_brr(r,r,val);
+}
+
+static void tomem(int r)
+{
+ int rr=live.state[r].realreg;
+
+ if (isinreg(r)) {
+ if (live.state[r].val && live.nat[rr].nholds==1
+ && !live.nat[rr].locked) {
+ // write_log("RemovingA offset %x from reg %d (%d) at %p\n",
+ // live.state[r].val,r,rr,target);
+ adjust_nreg(rr,live.state[r].val);
+ live.state[r].val=0;
+ live.state[r].dirtysize=4;
+ set_status(r,DIRTY);
+ }
+ }
+
+ if (live.state[r].status==DIRTY) {
+ switch (live.state[r].dirtysize) {
+ case 1: raw_mov_b_mr((uintptr)live.state[r].mem,rr); break;
+ case 2: raw_mov_w_mr((uintptr)live.state[r].mem,rr); break;
+ case 4: raw_mov_l_mr((uintptr)live.state[r].mem,rr); break;
+ default: abort();
+ }
+ log_vwrite(r);
+ set_status(r,CLEAN);
+ live.state[r].dirtysize=0;
+ }
+}
+
+static __inline__ int isconst(int r)
+{
+ return live.state[r].status==ISCONST;
+}
+
+int is_const(int r)
+{
+ return isconst(r);
+}
+
+static __inline__ void writeback_const(int r)
+{
+ if (!isconst(r))
+ return;
+ Dif (live.state[r].needflush==NF_HANDLER) {
+ write_log("Trying to write back constant NF_HANDLER!\n");
+ abort();
+ }
+
+ raw_mov_l_mi((uintptr)live.state[r].mem,live.state[r].val);
+ log_vwrite(r);
+ live.state[r].val=0;
+ set_status(r,INMEM);
+}
+
+static __inline__ void tomem_c(int r)
+{
+ if (isconst(r)) {
+ writeback_const(r);
+ }
+ else
+ tomem(r);
+}
+
+static void evict(int r)
+{
+ int rr;
+
+ if (!isinreg(r))
+ return;
+ tomem(r);
+ rr=live.state[r].realreg;
+
+ Dif (live.nat[rr].locked &&
+ live.nat[rr].nholds==1) {
+ write_log("register %d in nreg %d is locked!\n",r,live.state[r].realreg);
+ abort();
+ }
+
+ live.nat[rr].nholds--;
+ if (live.nat[rr].nholds!=live.state[r].realind) { /* Was not last */
+ int topreg=live.nat[rr].holds[live.nat[rr].nholds];
+ int thisind=live.state[r].realind;
+
+ live.nat[rr].holds[thisind]=topreg;
+ live.state[topreg].realind=thisind;
+ }
+ live.state[r].realreg=-1;
+ set_status(r,INMEM);
+}
+
+static __inline__ void free_nreg(int r)
+{
+ int i=live.nat[r].nholds;
+
+ while (i) {
+ int vr;
+
+ --i;
+ vr=live.nat[r].holds[i];
+ evict(vr);
+ }
+ Dif (live.nat[r].nholds!=0) {
+ write_log("Failed to free nreg %d, nholds is %d\n",r,live.nat[r].nholds);
+ abort();
+ }
+}
+
+/* Use with care! */
+static __inline__ void isclean(int r)
+{
+ if (!isinreg(r))
+ return;
+ live.state[r].validsize=4;
+ live.state[r].dirtysize=0;
+ live.state[r].val=0;
+ set_status(r,CLEAN);
+}
+
+static __inline__ void disassociate(int r)
+{
+ isclean(r);
+ evict(r);
+}
+
+static __inline__ void set_const(int r, uae_u32 val)
+{
+ disassociate(r);
+ live.state[r].val=val;
+ set_status(r,ISCONST);
+}
+
+static __inline__ uae_u32 get_offset(int r)
+{
+ return live.state[r].val;
+}
+
+static int alloc_reg_hinted(int r, int size, int willclobber, int hint)
+{
+ int bestreg;
+ uae_s32 when;
+ int i;
+ uae_s32 badness=0; /* to shut up gcc */
+ bestreg=-1;
+ when=2000000000;
+
+ /* XXX use a regalloc_order table? */
+ for (i=0;i<N_REGS;i++) {
+ badness=live.nat[i].touched;
+ if (live.nat[i].nholds==0)
+ badness=0;
+ if (i==hint)
+ badness-=200000000;
+ if (!live.nat[i].locked && badness<when) {
+ if ((size==1 && live.nat[i].canbyte) ||
+ (size==2 && live.nat[i].canword) ||
+ (size==4)) {
+ bestreg=i;
+ when=badness;
+ if (live.nat[i].nholds==0 && hint<0)
+ break;
+ if (i==hint)
+ break;
+ }
+ }
+ }
+ Dif (bestreg==-1)
+ abort();
+
+ if (live.nat[bestreg].nholds>0) {
+ free_nreg(bestreg);
+ }
+ if (isinreg(r)) {
+ int rr=live.state[r].realreg;
+ /* This will happen if we read a partially dirty register at a
+ bigger size */
+ Dif (willclobber || live.state[r].validsize>=size)
+ abort();
+ Dif (live.nat[rr].nholds!=1)
+ abort();
+ if (size==4 && live.state[r].validsize==2) {
+ log_isused(bestreg);
+ log_visused(r);
+ raw_mov_l_rm(bestreg,(uintptr)live.state[r].mem);
+ raw_bswap_32(bestreg);
+ raw_zero_extend_16_rr(rr,rr);
+ raw_zero_extend_16_rr(bestreg,bestreg);
+ raw_bswap_32(bestreg);
+ raw_lea_l_brr_indexed(rr,rr,bestreg,1,0);
+ live.state[r].validsize=4;
+ live.nat[rr].touched=touchcnt++;
+ return rr;
+ }
+ if (live.state[r].validsize==1) {
+ /* Nothing yet */
+ }
+ evict(r);
+ }
+
+ if (!willclobber) {
+ if (live.state[r].status!=UNDEF) {
+ if (isconst(r)) {
+ raw_mov_l_ri(bestreg,live.state[r].val);
+ live.state[r].val=0;
+ live.state[r].dirtysize=4;
+ set_status(r,DIRTY);
+ log_isused(bestreg);
+ }
+ else {
+ log_isreg(bestreg, r); /* This will also load it! */
+ live.state[r].dirtysize=0;
+ set_status(r,CLEAN);
+ }
+ }
+ else {
+ live.state[r].val=0;
+ live.state[r].dirtysize=0;
+ set_status(r,CLEAN);
+ log_isused(bestreg);
+ }
+ live.state[r].validsize=4;
+ }
+ else { /* this is the easiest way, but not optimal. FIXME! */
+ /* Now it's trickier, but hopefully still OK */
+ if (!isconst(r) || size==4) {
+ live.state[r].validsize=size;
+ live.state[r].dirtysize=size;
+ live.state[r].val=0;
+ set_status(r,DIRTY);
+ if (size == 4) {
+ log_clobberreg(r);
+ log_isused(bestreg);
+ }
+ else {
+ log_visused(r);
+ log_isused(bestreg);
+ }
+ }
+ else {
+ if (live.state[r].status!=UNDEF)
+ raw_mov_l_ri(bestreg,live.state[r].val);
+ live.state[r].val=0;
+ live.state[r].validsize=4;
+ live.state[r].dirtysize=4;
+ set_status(r,DIRTY);
+ log_isused(bestreg);
+ }
+ }
+ live.state[r].realreg=bestreg;
+ live.state[r].realind=live.nat[bestreg].nholds;
+ live.nat[bestreg].touched=touchcnt++;
+ live.nat[bestreg].holds[live.nat[bestreg].nholds]=r;
+ live.nat[bestreg].nholds++;
+
+ return bestreg;
+}
+
+static int alloc_reg(int r, int size, int willclobber)
+{
+ return alloc_reg_hinted(r,size,willclobber,-1);
+}
+
+static void unlock2(int r)
+{
+ Dif (!live.nat[r].locked)
+ abort();
+ live.nat[r].locked--;
+}
+
+static void setlock(int r)
+{
+ live.nat[r].locked++;
+}
+
+
+static void mov_nregs(int d, int s)
+{
+ int ns=live.nat[s].nholds;
+ int nd=live.nat[d].nholds;
+ int i;
+
+ if (s==d)
+ return;
+
+ if (nd>0)
+ free_nreg(d);
+
+ log_isused(d);
+ raw_mov_l_rr(d,s);
+
+ for (i=0;i<live.nat[s].nholds;i++) {
+ int vs=live.nat[s].holds[i];
+
+ live.state[vs].realreg=d;
+ live.state[vs].realind=i;
+ live.nat[d].holds[i]=vs;
+ }
+ live.nat[d].nholds=live.nat[s].nholds;
+
+ live.nat[s].nholds=0;
+}
+
+
+static __inline__ void make_exclusive(int r, int size, int spec)
+{
+ int clobber;
+ reg_status oldstate;
+ int rr=live.state[r].realreg;
+ int nr;
+ int nind;
+ int ndirt=0;
+ int i;
+
+ if (!isinreg(r))
+ return;
+ if (live.nat[rr].nholds==1)
+ return;
+ for (i=0;i<live.nat[rr].nholds;i++) {
+ int vr=live.nat[rr].holds[i];
+ if (vr!=r &&
+ (live.state[vr].status==DIRTY || live.state[vr].val))
+ ndirt++;
+ }
+ if (!ndirt && size<live.state[r].validsize && !live.nat[rr].locked) {
+ /* Everything else is clean, so let's keep this register */
+ for (i=0;i<live.nat[rr].nholds;i++) {
+ int vr=live.nat[rr].holds[i];
+ if (vr!=r) {
+ evict(vr);
+ i--; /* Try that index again! */
+ }
+ }
+ Dif (live.nat[rr].nholds!=1) {
+ write_log("natreg %d holds %d vregs, %d not exclusive\n",
+ rr,live.nat[rr].nholds,r);
+ abort();
+ }
+ return;
+ }
+
+ /* We have to split the register */
+ oldstate=live.state[r];
+
+ setlock(rr); /* Make sure this doesn't go away */
+ /* Forget about r being in the register rr */
+ disassociate(r);
+ /* Get a new register, that we will clobber completely */
+ if (oldstate.status==DIRTY) {
+ /* If dirtysize is <4, we need a register that can handle the
+ eventual smaller memory store! Thanks to Quake68k for exposing
+ this detail ;-) */
+ nr=alloc_reg_hinted(r,oldstate.dirtysize,1,spec);
+ }
+ else {
+ nr=alloc_reg_hinted(r,4,1,spec);
+ }
+ nind=live.state[r].realind;
+ live.state[r]=oldstate; /* Keep all the old state info */
+ live.state[r].realreg=nr;
+ live.state[r].realind=nind;
+
+ if (size<live.state[r].validsize) {
+ if (live.state[r].val) {
+ /* Might as well compensate for the offset now */
+ raw_lea_l_brr(nr,rr,oldstate.val);
+ live.state[r].val=0;
+ live.state[r].dirtysize=4;
+ set_status(r,DIRTY);
+ }
+ else
+ raw_mov_l_rr(nr,rr); /* Make another copy */
+ }
+ unlock2(rr);
+}
+
+static __inline__ void add_offset(int r, uae_u32 off)
+{
+ live.state[r].val+=off;
+}
+
+static __inline__ void remove_offset(int r, int spec)
+{
+ reg_status oldstate;
+ int rr;
+
+ if (isconst(r))
+ return;
+ if (live.state[r].val==0)
+ return;
+ if (isinreg(r) && live.state[r].validsize<4)
+ evict(r);
+
+ if (!isinreg(r))
+ alloc_reg_hinted(r,4,0,spec);
+
+ Dif (live.state[r].validsize!=4) {
+ write_log("Validsize=%d in remove_offset\n",live.state[r].validsize);
+ abort();
+ }
+ make_exclusive(r,0,-1);
+ /* make_exclusive might have done the job already */
+ if (live.state[r].val==0)
+ return;
+
+ rr=live.state[r].realreg;
+
+ if (live.nat[rr].nholds==1) {
+ //write_log("RemovingB offset %x from reg %d (%d) at %p\n",
+ // live.state[r].val,r,rr,target);
+ adjust_nreg(rr,live.state[r].val);
+ live.state[r].dirtysize=4;
+ live.state[r].val=0;
+ set_status(r,DIRTY);
+ return;
+ }
+ write_log("Failed in remove_offset\n");
+ abort();
+}
+
+static __inline__ void remove_all_offsets(void)
+{
+ int i;
+
+ for (i=0;i<VREGS;i++)
+ remove_offset(i,-1);
+}
+
+static inline void flush_reg_count(void)
+{
+#if RECORD_REGISTER_USAGE
+ for (int r = 0; r < 16; r++)
+ if (reg_count_local[r])
+ ADDQim(reg_count_local[r], ((uintptr)reg_count) + (8 * r), X86_NOREG, X86_NOREG, 1);
+#endif
+}
+
+static inline void record_register(int r)
+{
+#if RECORD_REGISTER_USAGE
+ if (r < 16)
+ reg_count_local[r]++;
+#endif
+}
+
+static __inline__ int readreg_general(int r, int size, int spec, int can_offset)
+{
+ int n;
+ int answer=-1;
+
+ record_register(r);
+ if (live.state[r].status==UNDEF) {
+ write_log("WARNING: Unexpected read of undefined register %d\n",r);
+ }
+ if (!can_offset)
+ remove_offset(r,spec);
+
+ if (isinreg(r) && live.state[r].validsize>=size) {
+ n=live.state[r].realreg;
+ switch(size) {
+ case 1:
+ if (live.nat[n].canbyte || spec>=0) {
+ answer=n;
+ }
+ break;
+ case 2:
+ if (live.nat[n].canword || spec>=0) {
+ answer=n;
+ }
+ break;
+ case 4:
+ answer=n;
+ break;
+ default: abort();
+ }
+ if (answer<0)
+ evict(r);
+ }
+ /* either the value was in memory to start with, or it was evicted and
+ is in memory now */
+ if (answer<0) {
+ answer=alloc_reg_hinted(r,spec>=0?4:size,0,spec);
+ }
+
+ if (spec>=0 && spec!=answer) {
+ /* Too bad */
+ mov_nregs(spec,answer);
+ answer=spec;
+ }
+ live.nat[answer].locked++;
+ live.nat[answer].touched=touchcnt++;
+ return answer;
+}
+
+
+
+static int readreg(int r, int size)
+{
+ return readreg_general(r,size,-1,0);
+}
+
+static int readreg_specific(int r, int size, int spec)
+{
+ return readreg_general(r,size,spec,0);
+}
+
+static int readreg_offset(int r, int size)
+{
+ return readreg_general(r,size,-1,1);
+}
+
+/* writereg_general(r, size, spec)
+ *
+ * INPUT
+ * - r : mid-layer register
+ * - size : requested size (1/2/4)
+ * - spec : -1 if find or make a register free, otherwise specifies
+ * the physical register to use in any case
+ *
+ * OUTPUT
+ * - hard (physical, x86 here) register allocated to virtual register r
+ */
+static __inline__ int writereg_general(int r, int size, int spec)
+{
+ int n;
+ int answer=-1;
+
+ record_register(r);
+ if (size<4) {
+ remove_offset(r,spec);
+ }
+
+ make_exclusive(r,size,spec);
+ if (isinreg(r)) {
+ int nvsize=size>live.state[r].validsize?size:live.state[r].validsize;
+ int ndsize=size>live.state[r].dirtysize?size:live.state[r].dirtysize;
+ n=live.state[r].realreg;
+
+ Dif (live.nat[n].nholds!=1)
+ abort();
+ switch(size) {
+ case 1:
+ if (live.nat[n].canbyte || spec>=0) {
+ live.state[r].dirtysize=ndsize;
+ live.state[r].validsize=nvsize;
+ answer=n;
+ }
+ break;
+ case 2:
+ if (live.nat[n].canword || spec>=0) {
+ live.state[r].dirtysize=ndsize;
+ live.state[r].validsize=nvsize;
+ answer=n;
+ }
+ break;
+ case 4:
+ live.state[r].dirtysize=ndsize;
+ live.state[r].validsize=nvsize;
+ answer=n;
+ break;
+ default: abort();
+ }
+ if (answer<0)
+ evict(r);
+ }
+ /* either the value was in memory to start with, or it was evicted and
+ is in memory now */
+ if (answer<0) {
+ answer=alloc_reg_hinted(r,size,1,spec);
+ }
+ if (spec>=0 && spec!=answer) {
+ mov_nregs(spec,answer);
+ answer=spec;
+ }
+ if (live.state[r].status==UNDEF)
+ live.state[r].validsize=4;
+ live.state[r].dirtysize=size>live.state[r].dirtysize?size:live.state[r].dirtysize;
+ live.state[r].validsize=size>live.state[r].validsize?size:live.state[r].validsize;
+
+ live.nat[answer].locked++;
+ live.nat[answer].touched=touchcnt++;
+ if (size==4) {
+ live.state[r].val=0;
+ }
+ else {
+ Dif (live.state[r].val) {
+ write_log("Problem with val\n");
+ abort();
+ }
+ }
+ set_status(r,DIRTY);
+ return answer;
+}
+
+static int writereg(int r, int size)
+{
+ return writereg_general(r,size,-1);
+}
+
+static int writereg_specific(int r, int size, int spec)
+{
+ return writereg_general(r,size,spec);
+}
+
+static __inline__ int rmw_general(int r, int wsize, int rsize, int spec)
+{
+ int n;
+ int answer=-1;
+
+ record_register(r);
+ if (live.state[r].status==UNDEF) {
+ write_log("WARNING: Unexpected read of undefined register %d\n",r);
+ }
+ remove_offset(r,spec);
+ make_exclusive(r,0,spec);
+
+ Dif (wsize<rsize) {
+ write_log("Cannot handle wsize<rsize in rmw_general()\n");
+ abort();
+ }
+ if (isinreg(r) && live.state[r].validsize>=rsize) {
+ n=live.state[r].realreg;
+ Dif (live.nat[n].nholds!=1)
+ abort();
+
+ switch(rsize) {
+ case 1:
+ if (live.nat[n].canbyte || spec>=0) {
+ answer=n;
+ }
+ break;
+ case 2:
+ if (live.nat[n].canword || spec>=0) {
+ answer=n;
+ }
+ break;
+ case 4:
+ answer=n;
+ break;
+ default: abort();
+ }
+ if (answer<0)
+ evict(r);
+ }
+ /* either the value was in memory to start with, or it was evicted and
+ is in memory now */
+ if (answer<0) {
+ answer=alloc_reg_hinted(r,spec>=0?4:rsize,0,spec);
+ }
+
+ if (spec>=0 && spec!=answer) {
+ /* Too bad */
+ mov_nregs(spec,answer);
+ answer=spec;
+ }
+ if (wsize>live.state[r].dirtysize)
+ live.state[r].dirtysize=wsize;
+ if (wsize>live.state[r].validsize)
+ live.state[r].validsize=wsize;
+ set_status(r,DIRTY);
+
+ live.nat[answer].locked++;
+ live.nat[answer].touched=touchcnt++;
+
+ Dif (live.state[r].val) {
+ write_log("Problem with val(rmw)\n");
+ abort();
+ }
+ return answer;
+}
+
+static int rmw(int r, int wsize, int rsize)
+{
+ return rmw_general(r,wsize,rsize,-1);
+}
+
+static int rmw_specific(int r, int wsize, int rsize, int spec)
+{
+ return rmw_general(r,wsize,rsize,spec);
+}
+
+
+/* needed for restoring the carry flag on non-P6 cores */
+static void bt_l_ri_noclobber(R4 r, IMM i)
+{
+ int size=4;
+ if (i<16)
+ size=2;
+ r=readreg(r,size);
+ raw_bt_l_ri(r,i);
+ unlock2(r);
+}
+
+/********************************************************************
+ * FPU register status handling. EMIT TIME! *
+ ********************************************************************/
+
+static void f_tomem(int r)
+{
+ if (live.fate[r].status==DIRTY) {
+#if USE_LONG_DOUBLE
+ raw_fmov_ext_mr((uintptr)live.fate[r].mem,live.fate[r].realreg);
+#else
+ raw_fmov_mr((uintptr)live.fate[r].mem,live.fate[r].realreg);
+#endif
+ live.fate[r].status=CLEAN;
+ }
+}
+
+static void f_tomem_drop(int r)
+{
+ if (live.fate[r].status==DIRTY) {
+#if USE_LONG_DOUBLE
+ raw_fmov_ext_mr_drop((uintptr)live.fate[r].mem,live.fate[r].realreg);
+#else
+ raw_fmov_mr_drop((uintptr)live.fate[r].mem,live.fate[r].realreg);
+#endif
+ live.fate[r].status=INMEM;
+ }
+}
+
+
+static __inline__ int f_isinreg(int r)
+{
+ return live.fate[r].status==CLEAN || live.fate[r].status==DIRTY;
+}
+
+static void f_evict(int r)
+{
+ int rr;
+
+ if (!f_isinreg(r))
+ return;
+ rr=live.fate[r].realreg;
+ if (live.fat[rr].nholds==1)
+ f_tomem_drop(r);
+ else
+ f_tomem(r);
+
+ Dif (live.fat[rr].locked &&
+ live.fat[rr].nholds==1) {
+ write_log("FPU register %d in nreg %d is locked!\n",r,live.fate[r].realreg);
+ abort();
+ }
+
+ live.fat[rr].nholds--;
+ if (live.fat[rr].nholds!=live.fate[r].realind) { /* Was not last */
+ int topreg=live.fat[rr].holds[live.fat[rr].nholds];
+ int thisind=live.fate[r].realind;
+ live.fat[rr].holds[thisind]=topreg;
+ live.fate[topreg].realind=thisind;
+ }
+ live.fate[r].status=INMEM;
+ live.fate[r].realreg=-1;
+}
+
+static __inline__ void f_free_nreg(int r)
+{
+ int i=live.fat[r].nholds;
+
+ while (i) {
+ int vr;
+
+ --i;
+ vr=live.fat[r].holds[i];
+ f_evict(vr);
+ }
+ Dif (live.fat[r].nholds!=0) {
+ write_log("Failed to free nreg %d, nholds is %d\n",r,live.fat[r].nholds);
+ abort();
+ }
+}
+
+
+/* Use with care! */
+static __inline__ void f_isclean(int r)
+{
+ if (!f_isinreg(r))
+ return;
+ live.fate[r].status=CLEAN;
+}
+
+static __inline__ void f_disassociate(int r)
+{
+ f_isclean(r);
+ f_evict(r);
+}
+
+
+
+static int f_alloc_reg(int r, int willclobber)
+{
+ int bestreg;
+ uae_s32 when;
+ int i;
+ uae_s32 badness;
+ bestreg=-1;
+ when=2000000000;
+ for (i=N_FREGS;i--;) {
+ badness=live.fat[i].touched;
+ if (live.fat[i].nholds==0)
+ badness=0;
+
+ if (!live.fat[i].locked && badness<when) {
+ bestreg=i;
+ when=badness;
+ if (live.fat[i].nholds==0)
+ break;
+ }
+ }
+ Dif (bestreg==-1)
+ abort();
+
+ if (live.fat[bestreg].nholds>0) {
+ f_free_nreg(bestreg);
+ }
+ if (f_isinreg(r)) {
+ f_evict(r);
+ }
+
+ if (!willclobber) {
+ if (live.fate[r].status!=UNDEF) {
+#if USE_LONG_DOUBLE
+ raw_fmov_ext_rm(bestreg,(uintptr)live.fate[r].mem);
+#else
+ raw_fmov_rm(bestreg,(uintptr)live.fate[r].mem);
+#endif
+ }
+ live.fate[r].status=CLEAN;
+ }
+ else {
+ live.fate[r].status=DIRTY;
+ }
+ live.fate[r].realreg=bestreg;
+ live.fate[r].realind=live.fat[bestreg].nholds;
+ live.fat[bestreg].touched=touchcnt++;
+ live.fat[bestreg].holds[live.fat[bestreg].nholds]=r;
+ live.fat[bestreg].nholds++;
+
+ return bestreg;
+}
+
+static void f_unlock(int r)
+{
+ Dif (!live.fat[r].locked)
+ abort();
+ live.fat[r].locked--;
+}
+
+static void f_setlock(int r)
+{
+ live.fat[r].locked++;
+}
+
+static __inline__ int f_readreg(int r)
+{
+ int n;
+ int answer=-1;
+
+ if (f_isinreg(r)) {
+ n=live.fate[r].realreg;
+ answer=n;
+ }
+ /* either the value was in memory to start with, or it was evicted and
+ is in memory now */
+ if (answer<0)
+ answer=f_alloc_reg(r,0);
+
+ live.fat[answer].locked++;
+ live.fat[answer].touched=touchcnt++;
+ return answer;
+}
+
+static __inline__ void f_make_exclusive(int r, int clobber)
+{
+ freg_status oldstate;
+ int rr=live.fate[r].realreg;
+ int nr;
+ int nind;
+ int ndirt=0;
+ int i;
+
+ if (!f_isinreg(r))
+ return;
+ if (live.fat[rr].nholds==1)
+ return;
+ for (i=0;i<live.fat[rr].nholds;i++) {
+ int vr=live.fat[rr].holds[i];
+ if (vr!=r && live.fate[vr].status==DIRTY)
+ ndirt++;
+ }
+ if (!ndirt && !live.fat[rr].locked) {
+ /* Everything else is clean, so let's keep this register */
+ for (i=0;i<live.fat[rr].nholds;i++) {
+ int vr=live.fat[rr].holds[i];
+ if (vr!=r) {
+ f_evict(vr);
+ i--; /* Try that index again! */
+ }
+ }
+ Dif (live.fat[rr].nholds!=1) {
+ write_log("realreg %d holds %d (",rr,live.fat[rr].nholds);
+ for (i=0;i<live.fat[rr].nholds;i++) {
+ write_log(" %d(%d,%d)",live.fat[rr].holds[i],
+ live.fate[live.fat[rr].holds[i]].realreg,
+ live.fate[live.fat[rr].holds[i]].realind);
+ }
+ write_log("\n");
+ abort();
+ }
+ return;
+ }
+
+ /* We have to split the register */
+ oldstate=live.fate[r];
+
+ f_setlock(rr); /* Make sure this doesn't go away */
+ /* Forget about r being in the register rr */
+ f_disassociate(r);
+ /* Get a new register, that we will clobber completely */
+ nr=f_alloc_reg(r,1);
+ nind=live.fate[r].realind;
+ if (!clobber)
+ raw_fmov_rr(nr,rr); /* Make another copy */
+ live.fate[r]=oldstate; /* Keep all the old state info */
+ live.fate[r].realreg=nr;
+ live.fate[r].realind=nind;
+ f_unlock(rr);
+}
+
+
+static __inline__ int f_writereg(int r)
+{
+ int n;
+ int answer=-1;
+
+ f_make_exclusive(r,1);
+ if (f_isinreg(r)) {
+ n=live.fate[r].realreg;
+ answer=n;
+ }
+ if (answer<0) {
+ answer=f_alloc_reg(r,1);
+ }
+ live.fate[r].status=DIRTY;
+ live.fat[answer].locked++;
+ live.fat[answer].touched=touchcnt++;
+ return answer;
+}
+
+static int f_rmw(int r)
+{
+ int n;
+
+ f_make_exclusive(r,0);
+ if (f_isinreg(r)) {
+ n=live.fate[r].realreg;
+ }
+ else
+ n=f_alloc_reg(r,0);
+ live.fate[r].status=DIRTY;
+ live.fat[n].locked++;
+ live.fat[n].touched=touchcnt++;
+ return n;
+}
+
+static void fflags_into_flags_internal(uae_u32 tmp)
+{
+ int r;
+
+ clobber_flags();
+ r=f_readreg(FP_RESULT);
+ if (FFLAG_NREG_CLOBBER_CONDITION) {
+ int tmp2=tmp;
+ tmp=writereg_specific(tmp,4,FFLAG_NREG);
+ raw_fflags_into_flags(r);
+ unlock2(tmp);
+ forget_about(tmp2);
+ }
+ else
+ raw_fflags_into_flags(r);
+ f_unlock(r);
+ live_flags();
+}
+
+
+
+
+/********************************************************************
+ * CPU functions exposed to gencomp. Both CREATE and EMIT time *
+ ********************************************************************/
+
+/*
+ * RULES FOR HANDLING REGISTERS:
+ *
+ * * In the function headers, order the parameters
+ * - 1st registers written to
+ * - 2nd read/modify/write registers
+ * - 3rd registers read from
+ * * Before calling raw_*, you must call readreg, writereg or rmw for
+ * each register
+ * * The order for this is
+ * - 1st call remove_offset for all registers written to with size<4
+ * - 2nd call readreg for all registers read without offset
+ * - 3rd call rmw for all rmw registers
+ * - 4th call readreg_offset for all registers that can handle offsets
+ * - 5th call get_offset for all the registers from the previous step
+ * - 6th call writereg for all written-to registers
+ * - 7th call raw_*
+ * - 8th unlock2 all registers that were locked
+ */
+
+MIDFUNC(0,live_flags,(void))
+{
+ live.flags_on_stack=TRASH;
+ live.flags_in_flags=VALID;
+ live.flags_are_important=1;
+}
+MENDFUNC(0,live_flags,(void))
+
+MIDFUNC(0,dont_care_flags,(void))
+{
+ live.flags_are_important=0;
+}
+MENDFUNC(0,dont_care_flags,(void))
+
+
+MIDFUNC(0,duplicate_carry,(void))
+{
+ evict(FLAGX);
+ make_flags_live_internal();
+ COMPCALL(setcc_m)((uintptr)live.state[FLAGX].mem,2);
+ log_vwrite(FLAGX);
+}
+MENDFUNC(0,duplicate_carry,(void))
+
+MIDFUNC(0,restore_carry,(void))
+{
+ if (!have_rat_stall) { /* Not a P6 core, i.e. no partial stalls */
+ bt_l_ri_noclobber(FLAGX,0);
+ }
+ else { /* Avoid the stall the above creates.
+ This is slow on non-P6, though.
+ */
+ COMPCALL(rol_b_ri(FLAGX,8));
+ isclean(FLAGX);
+ }
+}
+MENDFUNC(0,restore_carry,(void))
+
+MIDFUNC(0,start_needflags,(void))
+{
+ needflags=1;
+}
+MENDFUNC(0,start_needflags,(void))
+
+MIDFUNC(0,end_needflags,(void))
+{
+ needflags=0;
+}
+MENDFUNC(0,end_needflags,(void))
+
+MIDFUNC(0,make_flags_live,(void))
+{
+ make_flags_live_internal();
+}
+MENDFUNC(0,make_flags_live,(void))
+
+MIDFUNC(1,fflags_into_flags,(W2 tmp))
+{
+ clobber_flags();
+ fflags_into_flags_internal(tmp);
+}
+MENDFUNC(1,fflags_into_flags,(W2 tmp))
+
+
+MIDFUNC(2,bt_l_ri,(R4 r, IMM i)) /* This is defined as only affecting C */
+{
+ int size=4;
+ if (i<16)
+ size=2;
+ CLOBBER_BT;
+ r=readreg(r,size);
+ raw_bt_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,bt_l_ri,(R4 r, IMM i)) /* This is defined as only affecting C */
+
+MIDFUNC(2,bt_l_rr,(R4 r, R4 b)) /* This is defined as only affecting C */
+{
+ CLOBBER_BT;
+ r=readreg(r,4);
+ b=readreg(b,4);
+ raw_bt_l_rr(r,b);
+ unlock2(r);
+ unlock2(b);
+}
+MENDFUNC(2,bt_l_rr,(R4 r, R4 b)) /* This is defined as only affecting C */
+
+MIDFUNC(2,btc_l_ri,(RW4 r, IMM i))
+{
+ int size=4;
+ if (i<16)
+ size=2;
+ CLOBBER_BT;
+ r=rmw(r,size,size);
+ raw_btc_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,btc_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,btc_l_rr,(RW4 r, R4 b))
+{
+ CLOBBER_BT;
+ b=readreg(b,4);
+ r=rmw(r,4,4);
+ raw_btc_l_rr(r,b);
+ unlock2(r);
+ unlock2(b);
+}
+MENDFUNC(2,btc_l_rr,(RW4 r, R4 b))
+
+
+MIDFUNC(2,btr_l_ri,(RW4 r, IMM i))
+{
+ int size=4;
+ if (i<16)
+ size=2;
+ CLOBBER_BT;
+ r=rmw(r,size,size);
+ raw_btr_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,btr_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,btr_l_rr,(RW4 r, R4 b))
+{
+ CLOBBER_BT;
+ b=readreg(b,4);
+ r=rmw(r,4,4);
+ raw_btr_l_rr(r,b);
+ unlock2(r);
+ unlock2(b);
+}
+MENDFUNC(2,btr_l_rr,(RW4 r, R4 b))
+
+
+MIDFUNC(2,bts_l_ri,(RW4 r, IMM i))
+{
+ int size=4;
+ if (i<16)
+ size=2;
+ CLOBBER_BT;
+ r=rmw(r,size,size);
+ raw_bts_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,bts_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,bts_l_rr,(RW4 r, R4 b))
+{
+ CLOBBER_BT;
+ b=readreg(b,4);
+ r=rmw(r,4,4);
+ raw_bts_l_rr(r,b);
+ unlock2(r);
+ unlock2(b);
+}
+MENDFUNC(2,bts_l_rr,(RW4 r, R4 b))
+
+MIDFUNC(2,mov_l_rm,(W4 d, IMM s))
+{
+ CLOBBER_MOV;
+ d=writereg(d,4);
+ raw_mov_l_rm(d,s);
+ unlock2(d);
+}
+MENDFUNC(2,mov_l_rm,(W4 d, IMM s))
+
+
+MIDFUNC(1,call_r,(R4 r)) /* Clobbering is implicit */
+{
+ r=readreg(r,4);
+ raw_call_r(r);
+ unlock2(r);
+}
+MENDFUNC(1,call_r,(R4 r)) /* Clobbering is implicit */
+
+MIDFUNC(2,sub_l_mi,(IMM d, IMM s))
+{
+ CLOBBER_SUB;
+ raw_sub_l_mi(d,s) ;
+}
+MENDFUNC(2,sub_l_mi,(IMM d, IMM s))
+
+MIDFUNC(2,mov_l_mi,(IMM d, IMM s))
+{
+ CLOBBER_MOV;
+ raw_mov_l_mi(d,s) ;
+}
+MENDFUNC(2,mov_l_mi,(IMM d, IMM s))
+
+MIDFUNC(2,mov_w_mi,(IMM d, IMM s))
+{
+ CLOBBER_MOV;
+ raw_mov_w_mi(d,s) ;
+}
+MENDFUNC(2,mov_w_mi,(IMM d, IMM s))
+
+MIDFUNC(2,mov_b_mi,(IMM d, IMM s))
+{
+ CLOBBER_MOV;
+ raw_mov_b_mi(d,s) ;
+}
+MENDFUNC(2,mov_b_mi,(IMM d, IMM s))
+
+MIDFUNC(2,rol_b_ri,(RW1 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_ROL;
+ r=rmw(r,1,1);
+ raw_rol_b_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,rol_b_ri,(RW1 r, IMM i))
+
+MIDFUNC(2,rol_w_ri,(RW2 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_ROL;
+ r=rmw(r,2,2);
+ raw_rol_w_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,rol_w_ri,(RW2 r, IMM i))
+
+MIDFUNC(2,rol_l_ri,(RW4 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_ROL;
+ r=rmw(r,4,4);
+ raw_rol_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,rol_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,rol_l_rr,(RW4 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(rol_l_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_ROL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,4,4);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_rol_b\n",r);
+ abort();
+ }
+ raw_rol_l_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,rol_l_rr,(RW4 d, R1 r))
+
+MIDFUNC(2,rol_w_rr,(RW2 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(rol_w_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_ROL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,2,2);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_rol_b\n",r);
+ abort();
+ }
+ raw_rol_w_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,rol_w_rr,(RW2 d, R1 r))
+
+MIDFUNC(2,rol_b_rr,(RW1 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(rol_b_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+
+ CLOBBER_ROL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,1,1);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_rol_b\n",r);
+ abort();
+ }
+ raw_rol_b_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,rol_b_rr,(RW1 d, R1 r))
+
+
+MIDFUNC(2,shll_l_rr,(RW4 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(shll_l_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_SHLL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,4,4);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_rol_b\n",r);
+ abort();
+ }
+ raw_shll_l_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shll_l_rr,(RW4 d, R1 r))
+
+MIDFUNC(2,shll_w_rr,(RW2 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(shll_w_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_SHLL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,2,2);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_shll_b\n",r);
+ abort();
+ }
+ raw_shll_w_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shll_w_rr,(RW2 d, R1 r))
+
+MIDFUNC(2,shll_b_rr,(RW1 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(shll_b_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+
+ CLOBBER_SHLL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,1,1);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_shll_b\n",r);
+ abort();
+ }
+ raw_shll_b_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shll_b_rr,(RW1 d, R1 r))
+
+
+MIDFUNC(2,ror_b_ri,(R1 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_ROR;
+ r=rmw(r,1,1);
+ raw_ror_b_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,ror_b_ri,(R1 r, IMM i))
+
+MIDFUNC(2,ror_w_ri,(R2 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_ROR;
+ r=rmw(r,2,2);
+ raw_ror_w_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,ror_w_ri,(R2 r, IMM i))
+
+MIDFUNC(2,ror_l_ri,(R4 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_ROR;
+ r=rmw(r,4,4);
+ raw_ror_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,ror_l_ri,(R4 r, IMM i))
+
+MIDFUNC(2,ror_l_rr,(R4 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(ror_l_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_ROR;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,4,4);
+ raw_ror_l_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,ror_l_rr,(R4 d, R1 r))
+
+MIDFUNC(2,ror_w_rr,(R2 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(ror_w_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_ROR;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,2,2);
+ raw_ror_w_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,ror_w_rr,(R2 d, R1 r))
+
+MIDFUNC(2,ror_b_rr,(R1 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(ror_b_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+
+ CLOBBER_ROR;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,1,1);
+ raw_ror_b_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,ror_b_rr,(R1 d, R1 r))
+
+MIDFUNC(2,shrl_l_rr,(RW4 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(shrl_l_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_SHRL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,4,4);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_rol_b\n",r);
+ abort();
+ }
+ raw_shrl_l_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shrl_l_rr,(RW4 d, R1 r))
+
+MIDFUNC(2,shrl_w_rr,(RW2 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(shrl_w_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_SHRL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,2,2);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_shrl_b\n",r);
+ abort();
+ }
+ raw_shrl_w_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shrl_w_rr,(RW2 d, R1 r))
+
+MIDFUNC(2,shrl_b_rr,(RW1 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(shrl_b_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+
+ CLOBBER_SHRL;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,1,1);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_shrl_b\n",r);
+ abort();
+ }
+ raw_shrl_b_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shrl_b_rr,(RW1 d, R1 r))
+
+
+
+MIDFUNC(2,shll_l_ri,(RW4 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ if (isconst(r) && !needflags) {
+ live.state[r].val<<=i;
+ return;
+ }
+ CLOBBER_SHLL;
+ r=rmw(r,4,4);
+ raw_shll_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shll_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,shll_w_ri,(RW2 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHLL;
+ r=rmw(r,2,2);
+ raw_shll_w_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shll_w_ri,(RW2 r, IMM i))
+
+MIDFUNC(2,shll_b_ri,(RW1 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHLL;
+ r=rmw(r,1,1);
+ raw_shll_b_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shll_b_ri,(RW1 r, IMM i))
+
+MIDFUNC(2,shrl_l_ri,(RW4 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ if (isconst(r) && !needflags) {
+ live.state[r].val>>=i;
+ return;
+ }
+ CLOBBER_SHRL;
+ r=rmw(r,4,4);
+ raw_shrl_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shrl_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,shrl_w_ri,(RW2 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHRL;
+ r=rmw(r,2,2);
+ raw_shrl_w_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shrl_w_ri,(RW2 r, IMM i))
+
+MIDFUNC(2,shrl_b_ri,(RW1 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHRL;
+ r=rmw(r,1,1);
+ raw_shrl_b_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shrl_b_ri,(RW1 r, IMM i))
+
+MIDFUNC(2,shra_l_ri,(RW4 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHRA;
+ r=rmw(r,4,4);
+ raw_shra_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shra_l_ri,(RW4 r, IMM i))
+
+MIDFUNC(2,shra_w_ri,(RW2 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHRA;
+ r=rmw(r,2,2);
+ raw_shra_w_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shra_w_ri,(RW2 r, IMM i))
+
+MIDFUNC(2,shra_b_ri,(RW1 r, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ CLOBBER_SHRA;
+ r=rmw(r,1,1);
+ raw_shra_b_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,shra_b_ri,(RW1 r, IMM i))
+
+MIDFUNC(2,shra_l_rr,(RW4 d, R1 r))
+{
+ if (isconst(r)) {
+ COMPCALL(shra_l_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_SHRA;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,4,4);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_rol_b\n",r);
+ abort();
+ }
+ raw_shra_l_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shra_l_rr,(RW4 d, R1 r))
+
+MIDFUNC(2,shra_w_rr,(RW2 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(shra_w_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+ CLOBBER_SHRA;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,2,2);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_shra_b\n",r);
+ abort();
+ }
+ raw_shra_w_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shra_w_rr,(RW2 d, R1 r))
+
+MIDFUNC(2,shra_b_rr,(RW1 d, R1 r))
+{ /* Can only do this with r==1, i.e. cl */
+
+ if (isconst(r)) {
+ COMPCALL(shra_b_ri)(d,(uae_u8)live.state[r].val);
+ return;
+ }
+
+ CLOBBER_SHRA;
+ r=readreg_specific(r,1,SHIFTCOUNT_NREG);
+ d=rmw(d,1,1);
+ Dif (r!=1) {
+ write_log("Illegal register %d in raw_shra_b\n",r);
+ abort();
+ }
+ raw_shra_b_rr(d,r) ;
+ unlock2(r);
+ unlock2(d);
+}
+MENDFUNC(2,shra_b_rr,(RW1 d, R1 r))
+
+
+MIDFUNC(2,setcc,(W1 d, IMM cc))
+{
+ CLOBBER_SETCC;
+ d=writereg(d,1);
+ raw_setcc(d,cc);
+ unlock2(d);
+}
+MENDFUNC(2,setcc,(W1 d, IMM cc))
+
+MIDFUNC(2,setcc_m,(IMM d, IMM cc))
+{
+ CLOBBER_SETCC;
+ raw_setcc_m(d,cc);
+}
+MENDFUNC(2,setcc_m,(IMM d, IMM cc))
+
+MIDFUNC(3,cmov_b_rr,(RW1 d, R1 s, IMM cc))
+{
+ if (d==s)
+ return;
+ CLOBBER_CMOV;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+ raw_cmov_b_rr(d,s,cc);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(3,cmov_b_rr,(RW1 d, R1 s, IMM cc))
+
+MIDFUNC(3,cmov_w_rr,(RW2 d, R2 s, IMM cc))
+{
+ if (d==s)
+ return;
+ CLOBBER_CMOV;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+ raw_cmov_w_rr(d,s,cc);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(3,cmov_w_rr,(RW2 d, R2 s, IMM cc))
+
+MIDFUNC(3,cmov_l_rr,(RW4 d, R4 s, IMM cc))
+{
+ if (d==s)
+ return;
+ CLOBBER_CMOV;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+ raw_cmov_l_rr(d,s,cc);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(3,cmov_l_rr,(RW4 d, R4 s, IMM cc))
+
+MIDFUNC(3,cmov_l_rm,(RW4 d, IMM s, IMM cc))
+{
+ CLOBBER_CMOV;
+ d=rmw(d,4,4);
+ raw_cmov_l_rm(d,s,cc);
+ unlock2(d);
+}
+MENDFUNC(3,cmov_l_rm,(RW4 d, IMM s, IMM cc))
+
+MIDFUNC(2,bsf_l_rr,(W4 d, W4 s))
+{
+ CLOBBER_BSF;
+ s = readreg(s, 4);
+ d = writereg(d, 4);
+ raw_bsf_l_rr(d, s);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(2,bsf_l_rr,(W4 d, W4 s))
+
+/* Set the Z flag depending on the value in s. Note that the
+ value has to be 0 or -1 (or, more precisely, for non-zero
+ values, bit 14 must be set)! */
+MIDFUNC(2,simulate_bsf,(W4 tmp, RW4 s))
+{
+ CLOBBER_BSF;
+ s=rmw_specific(s,4,4,FLAG_NREG3);
+ tmp=writereg(tmp,4);
+ raw_flags_set_zero(s, tmp);
+ unlock2(tmp);
+ unlock2(s);
+}
+MENDFUNC(2,simulate_bsf,(W4 tmp, RW4 s))
+
+MIDFUNC(2,imul_32_32,(RW4 d, R4 s))
+{
+ CLOBBER_MUL;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+ raw_imul_32_32(d,s);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(2,imul_32_32,(RW4 d, R4 s))
+
+MIDFUNC(2,imul_64_32,(RW4 d, RW4 s))
+{
+ CLOBBER_MUL;
+ s=rmw_specific(s,4,4,MUL_NREG2);
+ d=rmw_specific(d,4,4,MUL_NREG1);
+ raw_imul_64_32(d,s);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(2,imul_64_32,(RW4 d, RW4 s))
+
+MIDFUNC(2,mul_64_32,(RW4 d, RW4 s))
+{
+ CLOBBER_MUL;
+ s=rmw_specific(s,4,4,MUL_NREG2);
+ d=rmw_specific(d,4,4,MUL_NREG1);
+ raw_mul_64_32(d,s);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(2,mul_64_32,(RW4 d, RW4 s))
+
+MIDFUNC(2,mul_32_32,(RW4 d, R4 s))
+{
+ CLOBBER_MUL;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+ raw_mul_32_32(d,s);
+ unlock2(s);
+ unlock2(d);
+}
+MENDFUNC(2,mul_32_32,(RW4 d, R4 s))
+
+#if SIZEOF_VOID_P == 8
+MIDFUNC(2,sign_extend_32_rr,(W4 d, R2 s))
+{
+ int isrmw;
+
+ if (isconst(s)) {
+ set_const(d,(uae_s32)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_SE32;
+ isrmw=(s==d);
+ if (!isrmw) {
+ s=readreg(s,4);
+ d=writereg(d,4);
+ }
+ else { /* If we try to lock this twice, with different sizes, we
+ are int trouble! */
+ s=d=rmw(s,4,4);
+ }
+ raw_sign_extend_32_rr(d,s);
+ if (!isrmw) {
+ unlock2(d);
+ unlock2(s);
+ }
+ else {
+ unlock2(s);
+ }
+}
+MENDFUNC(2,sign_extend_32_rr,(W4 d, R2 s))
+#endif
+
+MIDFUNC(2,sign_extend_16_rr,(W4 d, R2 s))
+{
+ int isrmw;
+
+ if (isconst(s)) {
+ set_const(d,(uae_s32)(uae_s16)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_SE16;
+ isrmw=(s==d);
+ if (!isrmw) {
+ s=readreg(s,2);
+ d=writereg(d,4);
+ }
+ else { /* If we try to lock this twice, with different sizes, we
+ are int trouble! */
+ s=d=rmw(s,4,2);
+ }
+ raw_sign_extend_16_rr(d,s);
+ if (!isrmw) {
+ unlock2(d);
+ unlock2(s);
+ }
+ else {
+ unlock2(s);
+ }
+}
+MENDFUNC(2,sign_extend_16_rr,(W4 d, R2 s))
+
+MIDFUNC(2,sign_extend_8_rr,(W4 d, R1 s))
+{
+ int isrmw;
+
+ if (isconst(s)) {
+ set_const(d,(uae_s32)(uae_s8)live.state[s].val);
+ return;
+ }
+
+ isrmw=(s==d);
+ CLOBBER_SE8;
+ if (!isrmw) {
+ s=readreg(s,1);
+ d=writereg(d,4);
+ }
+ else { /* If we try to lock this twice, with different sizes, we
+ are int trouble! */
+ s=d=rmw(s,4,1);
+ }
+
+ raw_sign_extend_8_rr(d,s);
+
+ if (!isrmw) {
+ unlock2(d);
+ unlock2(s);
+ }
+ else {
+ unlock2(s);
+ }
+}
+MENDFUNC(2,sign_extend_8_rr,(W4 d, R1 s))
+
+
+MIDFUNC(2,zero_extend_16_rr,(W4 d, R2 s))
+{
+ int isrmw;
+
+ if (isconst(s)) {
+ set_const(d,(uae_u32)(uae_u16)live.state[s].val);
+ return;
+ }
+
+ isrmw=(s==d);
+ CLOBBER_ZE16;
+ if (!isrmw) {
+ s=readreg(s,2);
+ d=writereg(d,4);
+ }
+ else { /* If we try to lock this twice, with different sizes, we
+ are int trouble! */
+ s=d=rmw(s,4,2);
+ }
+ raw_zero_extend_16_rr(d,s);
+ if (!isrmw) {
+ unlock2(d);
+ unlock2(s);
+ }
+ else {
+ unlock2(s);
+ }
+}
+MENDFUNC(2,zero_extend_16_rr,(W4 d, R2 s))
+
+MIDFUNC(2,zero_extend_8_rr,(W4 d, R1 s))
+{
+ int isrmw;
+ if (isconst(s)) {
+ set_const(d,(uae_u32)(uae_u8)live.state[s].val);
+ return;
+ }
+
+ isrmw=(s==d);
+ CLOBBER_ZE8;
+ if (!isrmw) {
+ s=readreg(s,1);
+ d=writereg(d,4);
+ }
+ else { /* If we try to lock this twice, with different sizes, we
+ are int trouble! */
+ s=d=rmw(s,4,1);
+ }
+
+ raw_zero_extend_8_rr(d,s);
+
+ if (!isrmw) {
+ unlock2(d);
+ unlock2(s);
+ }
+ else {
+ unlock2(s);
+ }
+}
+MENDFUNC(2,zero_extend_8_rr,(W4 d, R1 s))
+
+MIDFUNC(2,mov_b_rr,(W1 d, R1 s))
+{
+ if (d==s)
+ return;
+ if (isconst(s)) {
+ COMPCALL(mov_b_ri)(d,(uae_u8)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,1);
+ d=writereg(d,1);
+ raw_mov_b_rr(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,mov_b_rr,(W1 d, R1 s))
+
+MIDFUNC(2,mov_w_rr,(W2 d, R2 s))
+{
+ if (d==s)
+ return;
+ if (isconst(s)) {
+ COMPCALL(mov_w_ri)(d,(uae_u16)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,2);
+ d=writereg(d,2);
+ raw_mov_w_rr(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,mov_w_rr,(W2 d, R2 s))
+
+
+MIDFUNC(4,mov_l_rrm_indexed,(W4 d,R4 baser, R4 index, IMM factor))
+{
+ CLOBBER_MOV;
+ baser=readreg(baser,4);
+ index=readreg(index,4);
+ d=writereg(d,4);
+
+ raw_mov_l_rrm_indexed(d,baser,index,factor);
+ unlock2(d);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(4,mov_l_rrm_indexed,(W4 d,R4 baser, R4 index, IMM factor))
+
+MIDFUNC(4,mov_w_rrm_indexed,(W2 d, R4 baser, R4 index, IMM factor))
+{
+ CLOBBER_MOV;
+ baser=readreg(baser,4);
+ index=readreg(index,4);
+ d=writereg(d,2);
+
+ raw_mov_w_rrm_indexed(d,baser,index,factor);
+ unlock2(d);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(4,mov_w_rrm_indexed,(W2 d, R4 baser, R4 index, IMM factor))
+
+MIDFUNC(4,mov_b_rrm_indexed,(W1 d, R4 baser, R4 index, IMM factor))
+{
+ CLOBBER_MOV;
+ baser=readreg(baser,4);
+ index=readreg(index,4);
+ d=writereg(d,1);
+
+ raw_mov_b_rrm_indexed(d,baser,index,factor);
+
+ unlock2(d);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(4,mov_b_rrm_indexed,(W1 d, R4 baser, R4 index, IMM factor))
+
+
+MIDFUNC(4,mov_l_mrr_indexed,(R4 baser, R4 index, IMM factor, R4 s))
+{
+ CLOBBER_MOV;
+ baser=readreg(baser,4);
+ index=readreg(index,4);
+ s=readreg(s,4);
+
+ Dif (baser==s || index==s)
+ abort();
+
+
+ raw_mov_l_mrr_indexed(baser,index,factor,s);
+ unlock2(s);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(4,mov_l_mrr_indexed,(R4 baser, R4 index, IMM factor, R4 s))
+
+MIDFUNC(4,mov_w_mrr_indexed,(R4 baser, R4 index, IMM factor, R2 s))
+{
+ CLOBBER_MOV;
+ baser=readreg(baser,4);
+ index=readreg(index,4);
+ s=readreg(s,2);
+
+ raw_mov_w_mrr_indexed(baser,index,factor,s);
+ unlock2(s);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(4,mov_w_mrr_indexed,(R4 baser, R4 index, IMM factor, R2 s))
+
+MIDFUNC(4,mov_b_mrr_indexed,(R4 baser, R4 index, IMM factor, R1 s))
+{
+ CLOBBER_MOV;
+ s=readreg(s,1);
+ baser=readreg(baser,4);
+ index=readreg(index,4);
+
+ raw_mov_b_mrr_indexed(baser,index,factor,s);
+ unlock2(s);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(4,mov_b_mrr_indexed,(R4 baser, R4 index, IMM factor, R1 s))
+
+
+MIDFUNC(5,mov_l_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R4 s))
+{
+ int basereg=baser;
+ int indexreg=index;
+
+ CLOBBER_MOV;
+ s=readreg(s,4);
+ baser=readreg_offset(baser,4);
+ index=readreg_offset(index,4);
+
+ base+=get_offset(basereg);
+ base+=factor*get_offset(indexreg);
+
+ raw_mov_l_bmrr_indexed(base,baser,index,factor,s);
+ unlock2(s);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(5,mov_l_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R4 s))
+
+MIDFUNC(5,mov_w_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R2 s))
+{
+ int basereg=baser;
+ int indexreg=index;
+
+ CLOBBER_MOV;
+ s=readreg(s,2);
+ baser=readreg_offset(baser,4);
+ index=readreg_offset(index,4);
+
+ base+=get_offset(basereg);
+ base+=factor*get_offset(indexreg);
+
+ raw_mov_w_bmrr_indexed(base,baser,index,factor,s);
+ unlock2(s);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(5,mov_w_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R2 s))
+
+MIDFUNC(5,mov_b_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R1 s))
+{
+ int basereg=baser;
+ int indexreg=index;
+
+ CLOBBER_MOV;
+ s=readreg(s,1);
+ baser=readreg_offset(baser,4);
+ index=readreg_offset(index,4);
+
+ base+=get_offset(basereg);
+ base+=factor*get_offset(indexreg);
+
+ raw_mov_b_bmrr_indexed(base,baser,index,factor,s);
+ unlock2(s);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(5,mov_b_bmrr_indexed,(IMM base, R4 baser, R4 index, IMM factor, R1 s))
+
+
+
+/* Read a long from base+baser+factor*index */
+MIDFUNC(5,mov_l_brrm_indexed,(W4 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ int basereg=baser;
+ int indexreg=index;
+
+ CLOBBER_MOV;
+ baser=readreg_offset(baser,4);
+ index=readreg_offset(index,4);
+ base+=get_offset(basereg);
+ base+=factor*get_offset(indexreg);
+ d=writereg(d,4);
+ raw_mov_l_brrm_indexed(d,base,baser,index,factor);
+ unlock2(d);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(5,mov_l_brrm_indexed,(W4 d, IMM base, R4 baser, R4 index, IMM factor))
+
+
+MIDFUNC(5,mov_w_brrm_indexed,(W2 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ int basereg=baser;
+ int indexreg=index;
+
+ CLOBBER_MOV;
+ remove_offset(d,-1);
+ baser=readreg_offset(baser,4);
+ index=readreg_offset(index,4);
+ base+=get_offset(basereg);
+ base+=factor*get_offset(indexreg);
+ d=writereg(d,2);
+ raw_mov_w_brrm_indexed(d,base,baser,index,factor);
+ unlock2(d);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(5,mov_w_brrm_indexed,(W2 d, IMM base, R4 baser, R4 index, IMM factor))
+
+
+MIDFUNC(5,mov_b_brrm_indexed,(W1 d, IMM base, R4 baser, R4 index, IMM factor))
+{
+ int basereg=baser;
+ int indexreg=index;
+
+ CLOBBER_MOV;
+ remove_offset(d,-1);
+ baser=readreg_offset(baser,4);
+ index=readreg_offset(index,4);
+ base+=get_offset(basereg);
+ base+=factor*get_offset(indexreg);
+ d=writereg(d,1);
+ raw_mov_b_brrm_indexed(d,base,baser,index,factor);
+ unlock2(d);
+ unlock2(baser);
+ unlock2(index);
+}
+MENDFUNC(5,mov_b_brrm_indexed,(W1 d, IMM base, R4 baser, R4 index, IMM factor))
+
+/* Read a long from base+factor*index */
+MIDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor))
+{
+ int indexreg=index;
+
+ if (isconst(index)) {
+ COMPCALL(mov_l_rm)(d,base+factor*live.state[index].val);
+ return;
+ }
+
+ CLOBBER_MOV;
+ index=readreg_offset(index,4);
+ base+=get_offset(indexreg)*factor;
+ d=writereg(d,4);
+
+ raw_mov_l_rm_indexed(d,base,index,factor);
+ unlock2(index);
+ unlock2(d);
+}
+MENDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, R4 index, IMM factor))
+
+
+/* read the long at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_l_rR,(W4 d, R4 s, IMM offset))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_l_rm)(d,live.state[s].val+offset);
+ return;
+ }
+ CLOBBER_MOV;
+ s=readreg(s,4);
+ d=writereg(d,4);
+
+ raw_mov_l_rR(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_l_rR,(W4 d, R4 s, IMM offset))
+
+/* read the word at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_w_rR,(W2 d, R4 s, IMM offset))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_w_rm)(d,live.state[s].val+offset);
+ return;
+ }
+ CLOBBER_MOV;
+ s=readreg(s,4);
+ d=writereg(d,2);
+
+ raw_mov_w_rR(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_w_rR,(W2 d, R4 s, IMM offset))
+
+/* read the word at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_b_rR,(W1 d, R4 s, IMM offset))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_b_rm)(d,live.state[s].val+offset);
+ return;
+ }
+ CLOBBER_MOV;
+ s=readreg(s,4);
+ d=writereg(d,1);
+
+ raw_mov_b_rR(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_b_rR,(W1 d, R4 s, IMM offset))
+
+/* read the long at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_l_brR,(W4 d, R4 s, IMM offset))
+{
+ int sreg=s;
+ if (isconst(s)) {
+ COMPCALL(mov_l_rm)(d,live.state[s].val+offset);
+ return;
+ }
+ CLOBBER_MOV;
+ s=readreg_offset(s,4);
+ offset+=get_offset(sreg);
+ d=writereg(d,4);
+
+ raw_mov_l_brR(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_l_brR,(W4 d, R4 s, IMM offset))
+
+/* read the word at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_w_brR,(W2 d, R4 s, IMM offset))
+{
+ int sreg=s;
+ if (isconst(s)) {
+ COMPCALL(mov_w_rm)(d,live.state[s].val+offset);
+ return;
+ }
+ CLOBBER_MOV;
+ remove_offset(d,-1);
+ s=readreg_offset(s,4);
+ offset+=get_offset(sreg);
+ d=writereg(d,2);
+
+ raw_mov_w_brR(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_w_brR,(W2 d, R4 s, IMM offset))
+
+/* read the word at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_b_brR,(W1 d, R4 s, IMM offset))
+{
+ int sreg=s;
+ if (isconst(s)) {
+ COMPCALL(mov_b_rm)(d,live.state[s].val+offset);
+ return;
+ }
+ CLOBBER_MOV;
+ remove_offset(d,-1);
+ s=readreg_offset(s,4);
+ offset+=get_offset(sreg);
+ d=writereg(d,1);
+
+ raw_mov_b_brR(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_b_brR,(W1 d, R4 s, IMM offset))
+
+MIDFUNC(3,mov_l_Ri,(R4 d, IMM i, IMM offset))
+{
+ int dreg=d;
+ if (isconst(d)) {
+ COMPCALL(mov_l_mi)(live.state[d].val+offset,i);
+ return;
+ }
+
+ CLOBBER_MOV;
+ d=readreg_offset(d,4);
+ offset+=get_offset(dreg);
+ raw_mov_l_Ri(d,i,offset);
+ unlock2(d);
+}
+MENDFUNC(3,mov_l_Ri,(R4 d, IMM i, IMM offset))
+
+MIDFUNC(3,mov_w_Ri,(R4 d, IMM i, IMM offset))
+{
+ int dreg=d;
+ if (isconst(d)) {
+ COMPCALL(mov_w_mi)(live.state[d].val+offset,i);
+ return;
+ }
+
+ CLOBBER_MOV;
+ d=readreg_offset(d,4);
+ offset+=get_offset(dreg);
+ raw_mov_w_Ri(d,i,offset);
+ unlock2(d);
+}
+MENDFUNC(3,mov_w_Ri,(R4 d, IMM i, IMM offset))
+
+MIDFUNC(3,mov_b_Ri,(R4 d, IMM i, IMM offset))
+{
+ int dreg=d;
+ if (isconst(d)) {
+ COMPCALL(mov_b_mi)(live.state[d].val+offset,i);
+ return;
+ }
+
+ CLOBBER_MOV;
+ d=readreg_offset(d,4);
+ offset+=get_offset(dreg);
+ raw_mov_b_Ri(d,i,offset);
+ unlock2(d);
+}
+MENDFUNC(3,mov_b_Ri,(R4 d, IMM i, IMM offset))
+
+ /* Warning! OFFSET is byte sized only! */
+MIDFUNC(3,mov_l_Rr,(R4 d, R4 s, IMM offset))
+{
+ if (isconst(d)) {
+ COMPCALL(mov_l_mr)(live.state[d].val+offset,s);
+ return;
+ }
+ if (isconst(s)) {
+ COMPCALL(mov_l_Ri)(d,live.state[s].val,offset);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,4);
+ d=readreg(d,4);
+
+ raw_mov_l_Rr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_l_Rr,(R4 d, R4 s, IMM offset))
+
+MIDFUNC(3,mov_w_Rr,(R4 d, R2 s, IMM offset))
+{
+ if (isconst(d)) {
+ COMPCALL(mov_w_mr)(live.state[d].val+offset,s);
+ return;
+ }
+ if (isconst(s)) {
+ COMPCALL(mov_w_Ri)(d,(uae_u16)live.state[s].val,offset);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,2);
+ d=readreg(d,4);
+ raw_mov_w_Rr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_w_Rr,(R4 d, R2 s, IMM offset))
+
+MIDFUNC(3,mov_b_Rr,(R4 d, R1 s, IMM offset))
+{
+ if (isconst(d)) {
+ COMPCALL(mov_b_mr)(live.state[d].val+offset,s);
+ return;
+ }
+ if (isconst(s)) {
+ COMPCALL(mov_b_Ri)(d,(uae_u8)live.state[s].val,offset);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,1);
+ d=readreg(d,4);
+ raw_mov_b_Rr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_b_Rr,(R4 d, R1 s, IMM offset))
+
+MIDFUNC(3,lea_l_brr,(W4 d, R4 s, IMM offset))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_l_ri)(d,live.state[s].val+offset);
+ return;
+ }
+#if USE_OFFSET
+ if (d==s) {
+ add_offset(d,offset);
+ return;
+ }
+#endif
+ CLOBBER_LEA;
+ s=readreg(s,4);
+ d=writereg(d,4);
+ raw_lea_l_brr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,lea_l_brr,(W4 d, R4 s, IMM offset))
+
+MIDFUNC(5,lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset))
+{
+ if (!offset) {
+ COMPCALL(lea_l_rr_indexed)(d,s,index,factor);
+ return;
+ }
+ CLOBBER_LEA;
+ s=readreg(s,4);
+ index=readreg(index,4);
+ d=writereg(d,4);
+
+ raw_lea_l_brr_indexed(d,s,index,factor,offset);
+ unlock2(d);
+ unlock2(index);
+ unlock2(s);
+}
+MENDFUNC(5,lea_l_brr_indexed,(W4 d, R4 s, R4 index, IMM factor, IMM offset))
+
+MIDFUNC(4,lea_l_rr_indexed,(W4 d, R4 s, R4 index, IMM factor))
+{
+ CLOBBER_LEA;
+ s=readreg(s,4);
+ index=readreg(index,4);
+ d=writereg(d,4);
+
+ raw_lea_l_rr_indexed(d,s,index,factor);
+ unlock2(d);
+ unlock2(index);
+ unlock2(s);
+}
+MENDFUNC(4,lea_l_rr_indexed,(W4 d, R4 s, R4 index, IMM factor))
+
+/* write d to the long at the address contained in s+offset */
+MIDFUNC(3,mov_l_bRr,(R4 d, R4 s, IMM offset))
+{
+ int dreg=d;
+ if (isconst(d)) {
+ COMPCALL(mov_l_mr)(live.state[d].val+offset,s);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,4);
+ d=readreg_offset(d,4);
+ offset+=get_offset(dreg);
+
+ raw_mov_l_bRr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_l_bRr,(R4 d, R4 s, IMM offset))
+
+/* write the word at the address contained in s+offset and store in d */
+MIDFUNC(3,mov_w_bRr,(R4 d, R2 s, IMM offset))
+{
+ int dreg=d;
+
+ if (isconst(d)) {
+ COMPCALL(mov_w_mr)(live.state[d].val+offset,s);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,2);
+ d=readreg_offset(d,4);
+ offset+=get_offset(dreg);
+ raw_mov_w_bRr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_w_bRr,(R4 d, R2 s, IMM offset))
+
+MIDFUNC(3,mov_b_bRr,(R4 d, R1 s, IMM offset))
+{
+ int dreg=d;
+ if (isconst(d)) {
+ COMPCALL(mov_b_mr)(live.state[d].val+offset,s);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,1);
+ d=readreg_offset(d,4);
+ offset+=get_offset(dreg);
+ raw_mov_b_bRr(d,s,offset);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(3,mov_b_bRr,(R4 d, R1 s, IMM offset))
+
+MIDFUNC(1,bswap_32,(RW4 r))
+{
+ int reg=r;
+
+ if (isconst(r)) {
+ uae_u32 oldv=live.state[r].val;
+ live.state[r].val=reverse32(oldv);
+ return;
+ }
+
+ CLOBBER_SW32;
+ r=rmw(r,4,4);
+ raw_bswap_32(r);
+ unlock2(r);
+}
+MENDFUNC(1,bswap_32,(RW4 r))
+
+MIDFUNC(1,bswap_16,(RW2 r))
+{
+ if (isconst(r)) {
+ uae_u32 oldv=live.state[r].val;
+ live.state[r].val=((oldv>>8)&0xff) | ((oldv<<8)&0xff00) |
+ (oldv&0xffff0000);
+ return;
+ }
+
+ CLOBBER_SW16;
+ r=rmw(r,2,2);
+
+ raw_bswap_16(r);
+ unlock2(r);
+}
+MENDFUNC(1,bswap_16,(RW2 r))
+
+
+
+MIDFUNC(2,mov_l_rr,(W4 d, R4 s))
+{
+ int olds;
+
+ if (d==s) { /* How pointless! */
+ return;
+ }
+ if (isconst(s)) {
+ COMPCALL(mov_l_ri)(d,live.state[s].val);
+ return;
+ }
+ olds=s;
+ disassociate(d);
+ s=readreg_offset(s,4);
+ live.state[d].realreg=s;
+ live.state[d].realind=live.nat[s].nholds;
+ live.state[d].val=live.state[olds].val;
+ live.state[d].validsize=4;
+ live.state[d].dirtysize=4;
+ set_status(d,DIRTY);
+
+ live.nat[s].holds[live.nat[s].nholds]=d;
+ live.nat[s].nholds++;
+ log_clobberreg(d);
+ /* write_log("Added %d to nreg %d(%d), now holds %d regs\n",
+ d,s,live.state[d].realind,live.nat[s].nholds); */
+ unlock2(s);
+}
+MENDFUNC(2,mov_l_rr,(W4 d, R4 s))
+
+MIDFUNC(2,mov_l_mr,(IMM d, R4 s))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_l_mi)(d,live.state[s].val);
+ return;
+ }
+ CLOBBER_MOV;
+ s=readreg(s,4);
+
+ raw_mov_l_mr(d,s);
+ unlock2(s);
+}
+MENDFUNC(2,mov_l_mr,(IMM d, R4 s))
+
+
+MIDFUNC(2,mov_w_mr,(IMM d, R2 s))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_w_mi)(d,(uae_u16)live.state[s].val);
+ return;
+ }
+ CLOBBER_MOV;
+ s=readreg(s,2);
+
+ raw_mov_w_mr(d,s);
+ unlock2(s);
+}
+MENDFUNC(2,mov_w_mr,(IMM d, R2 s))
+
+MIDFUNC(2,mov_w_rm,(W2 d, IMM s))
+{
+ CLOBBER_MOV;
+ d=writereg(d,2);
+
+ raw_mov_w_rm(d,s);
+ unlock2(d);
+}
+MENDFUNC(2,mov_w_rm,(W2 d, IMM s))
+
+MIDFUNC(2,mov_b_mr,(IMM d, R1 s))
+{
+ if (isconst(s)) {
+ COMPCALL(mov_b_mi)(d,(uae_u8)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_MOV;
+ s=readreg(s,1);
+
+ raw_mov_b_mr(d,s);
+ unlock2(s);
+}
+MENDFUNC(2,mov_b_mr,(IMM d, R1 s))
+
+MIDFUNC(2,mov_b_rm,(W1 d, IMM s))
+{
+ CLOBBER_MOV;
+ d=writereg(d,1);
+
+ raw_mov_b_rm(d,s);
+ unlock2(d);
+}
+MENDFUNC(2,mov_b_rm,(W1 d, IMM s))
+
+MIDFUNC(2,mov_l_ri,(W4 d, IMM s))
+{
+ set_const(d,s);
+ return;
+}
+MENDFUNC(2,mov_l_ri,(W4 d, IMM s))
+
+MIDFUNC(2,mov_w_ri,(W2 d, IMM s))
+{
+ CLOBBER_MOV;
+ d=writereg(d,2);
+
+ raw_mov_w_ri(d,s);
+ unlock2(d);
+}
+MENDFUNC(2,mov_w_ri,(W2 d, IMM s))
+
+MIDFUNC(2,mov_b_ri,(W1 d, IMM s))
+{
+ CLOBBER_MOV;
+ d=writereg(d,1);
+
+ raw_mov_b_ri(d,s);
+ unlock2(d);
+}
+MENDFUNC(2,mov_b_ri,(W1 d, IMM s))
+
+
+MIDFUNC(2,add_l_mi,(IMM d, IMM s))
+{
+ CLOBBER_ADD;
+ raw_add_l_mi(d,s) ;
+}
+MENDFUNC(2,add_l_mi,(IMM d, IMM s))
+
+MIDFUNC(2,add_w_mi,(IMM d, IMM s))
+{
+ CLOBBER_ADD;
+ raw_add_w_mi(d,s) ;
+}
+MENDFUNC(2,add_w_mi,(IMM d, IMM s))
+
+MIDFUNC(2,add_b_mi,(IMM d, IMM s))
+{
+ CLOBBER_ADD;
+ raw_add_b_mi(d,s) ;
+}
+MENDFUNC(2,add_b_mi,(IMM d, IMM s))
+
+
+MIDFUNC(2,test_l_ri,(R4 d, IMM i))
+{
+ CLOBBER_TEST;
+ d=readreg(d,4);
+
+ raw_test_l_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,test_l_ri,(R4 d, IMM i))
+
+MIDFUNC(2,test_l_rr,(R4 d, R4 s))
+{
+ CLOBBER_TEST;
+ d=readreg(d,4);
+ s=readreg(s,4);
+
+ raw_test_l_rr(d,s);;
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,test_l_rr,(R4 d, R4 s))
+
+MIDFUNC(2,test_w_rr,(R2 d, R2 s))
+{
+ CLOBBER_TEST;
+ d=readreg(d,2);
+ s=readreg(s,2);
+
+ raw_test_w_rr(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,test_w_rr,(R2 d, R2 s))
+
+MIDFUNC(2,test_b_rr,(R1 d, R1 s))
+{
+ CLOBBER_TEST;
+ d=readreg(d,1);
+ s=readreg(s,1);
+
+ raw_test_b_rr(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,test_b_rr,(R1 d, R1 s))
+
+
+MIDFUNC(2,and_l_ri,(RW4 d, IMM i))
+{
+ if (isconst(d) && !needflags) {
+ live.state[d].val &= i;
+ return;
+ }
+
+ CLOBBER_AND;
+ d=rmw(d,4,4);
+
+ raw_and_l_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,and_l_ri,(RW4 d, IMM i))
+
+MIDFUNC(2,and_l,(RW4 d, R4 s))
+{
+ CLOBBER_AND;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_and_l(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,and_l,(RW4 d, R4 s))
+
+MIDFUNC(2,and_w,(RW2 d, R2 s))
+{
+ CLOBBER_AND;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_and_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,and_w,(RW2 d, R2 s))
+
+MIDFUNC(2,and_b,(RW1 d, R1 s))
+{
+ CLOBBER_AND;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_and_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,and_b,(RW1 d, R1 s))
+
+// gb-- used for making an fpcr value in compemu_fpp.cpp
+MIDFUNC(2,or_l_rm,(RW4 d, IMM s))
+{
+ CLOBBER_OR;
+ d=rmw(d,4,4);
+
+ raw_or_l_rm(d,s);
+ unlock2(d);
+}
+MENDFUNC(2,or_l_rm,(RW4 d, IMM s))
+
+MIDFUNC(2,or_l_ri,(RW4 d, IMM i))
+{
+ if (isconst(d) && !needflags) {
+ live.state[d].val|=i;
+ return;
+ }
+ CLOBBER_OR;
+ d=rmw(d,4,4);
+
+ raw_or_l_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,or_l_ri,(RW4 d, IMM i))
+
+MIDFUNC(2,or_l,(RW4 d, R4 s))
+{
+ if (isconst(d) && isconst(s) && !needflags) {
+ live.state[d].val|=live.state[s].val;
+ return;
+ }
+ CLOBBER_OR;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_or_l(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,or_l,(RW4 d, R4 s))
+
+MIDFUNC(2,or_w,(RW2 d, R2 s))
+{
+ CLOBBER_OR;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_or_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,or_w,(RW2 d, R2 s))
+
+MIDFUNC(2,or_b,(RW1 d, R1 s))
+{
+ CLOBBER_OR;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_or_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,or_b,(RW1 d, R1 s))
+
+MIDFUNC(2,adc_l,(RW4 d, R4 s))
+{
+ CLOBBER_ADC;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_adc_l(d,s);
+
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,adc_l,(RW4 d, R4 s))
+
+MIDFUNC(2,adc_w,(RW2 d, R2 s))
+{
+ CLOBBER_ADC;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_adc_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,adc_w,(RW2 d, R2 s))
+
+MIDFUNC(2,adc_b,(RW1 d, R1 s))
+{
+ CLOBBER_ADC;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_adc_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,adc_b,(RW1 d, R1 s))
+
+MIDFUNC(2,add_l,(RW4 d, R4 s))
+{
+ if (isconst(s)) {
+ COMPCALL(add_l_ri)(d,live.state[s].val);
+ return;
+ }
+
+ CLOBBER_ADD;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_add_l(d,s);
+
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,add_l,(RW4 d, R4 s))
+
+MIDFUNC(2,add_w,(RW2 d, R2 s))
+{
+ if (isconst(s)) {
+ COMPCALL(add_w_ri)(d,(uae_u16)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_ADD;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_add_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,add_w,(RW2 d, R2 s))
+
+MIDFUNC(2,add_b,(RW1 d, R1 s))
+{
+ if (isconst(s)) {
+ COMPCALL(add_b_ri)(d,(uae_u8)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_ADD;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_add_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,add_b,(RW1 d, R1 s))
+
+MIDFUNC(2,sub_l_ri,(RW4 d, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ if (isconst(d) && !needflags) {
+ live.state[d].val-=i;
+ return;
+ }
+#if USE_OFFSET
+ if (!needflags) {
+ add_offset(d,-i);
+ return;
+ }
+#endif
+
+ CLOBBER_SUB;
+ d=rmw(d,4,4);
+
+ raw_sub_l_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,sub_l_ri,(RW4 d, IMM i))
+
+MIDFUNC(2,sub_w_ri,(RW2 d, IMM i))
+{
+ if (!i && !needflags)
+ return;
+
+ CLOBBER_SUB;
+ d=rmw(d,2,2);
+
+ raw_sub_w_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,sub_w_ri,(RW2 d, IMM i))
+
+MIDFUNC(2,sub_b_ri,(RW1 d, IMM i))
+{
+ if (!i && !needflags)
+ return;
+
+ CLOBBER_SUB;
+ d=rmw(d,1,1);
+
+ raw_sub_b_ri(d,i);
+
+ unlock2(d);
+}
+MENDFUNC(2,sub_b_ri,(RW1 d, IMM i))
+
+MIDFUNC(2,add_l_ri,(RW4 d, IMM i))
+{
+ if (!i && !needflags)
+ return;
+ if (isconst(d) && !needflags) {
+ live.state[d].val+=i;
+ return;
+ }
+#if USE_OFFSET
+ if (!needflags) {
+ add_offset(d,i);
+ return;
+ }
+#endif
+ CLOBBER_ADD;
+ d=rmw(d,4,4);
+ raw_add_l_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,add_l_ri,(RW4 d, IMM i))
+
+MIDFUNC(2,add_w_ri,(RW2 d, IMM i))
+{
+ if (!i && !needflags)
+ return;
+
+ CLOBBER_ADD;
+ d=rmw(d,2,2);
+
+ raw_add_w_ri(d,i);
+ unlock2(d);
+}
+MENDFUNC(2,add_w_ri,(RW2 d, IMM i))
+
+MIDFUNC(2,add_b_ri,(RW1 d, IMM i))
+{
+ if (!i && !needflags)
+ return;
+
+ CLOBBER_ADD;
+ d=rmw(d,1,1);
+
+ raw_add_b_ri(d,i);
+
+ unlock2(d);
+}
+MENDFUNC(2,add_b_ri,(RW1 d, IMM i))
+
+MIDFUNC(2,sbb_l,(RW4 d, R4 s))
+{
+ CLOBBER_SBB;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_sbb_l(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,sbb_l,(RW4 d, R4 s))
+
+MIDFUNC(2,sbb_w,(RW2 d, R2 s))
+{
+ CLOBBER_SBB;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_sbb_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,sbb_w,(RW2 d, R2 s))
+
+MIDFUNC(2,sbb_b,(RW1 d, R1 s))
+{
+ CLOBBER_SBB;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_sbb_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,sbb_b,(RW1 d, R1 s))
+
+MIDFUNC(2,sub_l,(RW4 d, R4 s))
+{
+ if (isconst(s)) {
+ COMPCALL(sub_l_ri)(d,live.state[s].val);
+ return;
+ }
+
+ CLOBBER_SUB;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_sub_l(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,sub_l,(RW4 d, R4 s))
+
+MIDFUNC(2,sub_w,(RW2 d, R2 s))
+{
+ if (isconst(s)) {
+ COMPCALL(sub_w_ri)(d,(uae_u16)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_SUB;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_sub_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,sub_w,(RW2 d, R2 s))
+
+MIDFUNC(2,sub_b,(RW1 d, R1 s))
+{
+ if (isconst(s)) {
+ COMPCALL(sub_b_ri)(d,(uae_u8)live.state[s].val);
+ return;
+ }
+
+ CLOBBER_SUB;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_sub_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,sub_b,(RW1 d, R1 s))
+
+MIDFUNC(2,cmp_l,(R4 d, R4 s))
+{
+ CLOBBER_CMP;
+ s=readreg(s,4);
+ d=readreg(d,4);
+
+ raw_cmp_l(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,cmp_l,(R4 d, R4 s))
+
+MIDFUNC(2,cmp_l_ri,(R4 r, IMM i))
+{
+ CLOBBER_CMP;
+ r=readreg(r,4);
+
+ raw_cmp_l_ri(r,i);
+ unlock2(r);
+}
+MENDFUNC(2,cmp_l_ri,(R4 r, IMM i))
+
+MIDFUNC(2,cmp_w,(R2 d, R2 s))
+{
+ CLOBBER_CMP;
+ s=readreg(s,2);
+ d=readreg(d,2);
+
+ raw_cmp_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,cmp_w,(R2 d, R2 s))
+
+MIDFUNC(2,cmp_b,(R1 d, R1 s))
+{
+ CLOBBER_CMP;
+ s=readreg(s,1);
+ d=readreg(d,1);
+
+ raw_cmp_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,cmp_b,(R1 d, R1 s))
+
+
+MIDFUNC(2,xor_l,(RW4 d, R4 s))
+{
+ CLOBBER_XOR;
+ s=readreg(s,4);
+ d=rmw(d,4,4);
+
+ raw_xor_l(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,xor_l,(RW4 d, R4 s))
+
+MIDFUNC(2,xor_w,(RW2 d, R2 s))
+{
+ CLOBBER_XOR;
+ s=readreg(s,2);
+ d=rmw(d,2,2);
+
+ raw_xor_w(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,xor_w,(RW2 d, R2 s))
+
+MIDFUNC(2,xor_b,(RW1 d, R1 s))
+{
+ CLOBBER_XOR;
+ s=readreg(s,1);
+ d=rmw(d,1,1);
+
+ raw_xor_b(d,s);
+ unlock2(d);
+ unlock2(s);
+}
+MENDFUNC(2,xor_b,(RW1 d, R1 s))
+
+MIDFUNC(5,call_r_11,(W4 out1, R4 r, R4 in1, IMM osize, IMM isize))
+{
+ clobber_flags();
+ remove_all_offsets();
+ if (osize==4) {
+ if (out1!=in1 && out1!=r) {
+ COMPCALL(forget_about)(out1);
+ }
+ }
+ else {
+ tomem_c(out1);
+ }
+
+ in1=readreg_specific(in1,isize,REG_PAR1);
+ r=readreg(r,4);
+ prepare_for_call_1(); /* This should ensure that there won't be
+ any need for swapping nregs in prepare_for_call_2
+ */
+#if USE_NORMAL_CALLING_CONVENTION
+ raw_push_l_r(in1);
+#endif
+ unlock2(in1);
+ unlock2(r);
+
+ prepare_for_call_2();
+ raw_call_r(r);
+
+#if USE_NORMAL_CALLING_CONVENTION
+ raw_inc_sp(4);
+#endif
+
+
+ live.nat[REG_RESULT].holds[0]=out1;
+ live.nat[REG_RESULT].nholds=1;
+ live.nat[REG_RESULT].touched=touchcnt++;
+
+ live.state[out1].realreg=REG_RESULT;
+ live.state[out1].realind=0;
+ live.state[out1].val=0;
+ live.state[out1].validsize=osize;
+ live.state[out1].dirtysize=osize;
+ set_status(out1,DIRTY);
+}
+MENDFUNC(5,call_r_11,(W4 out1, R4 r, R4 in1, IMM osize, IMM isize))
+
+MIDFUNC(5,call_r_02,(R4 r, R4 in1, R4 in2, IMM isize1, IMM isize2))
+{
+ clobber_flags();
+ remove_all_offsets();
+ in1=readreg_specific(in1,isize1,REG_PAR1);
+ in2=readreg_specific(in2,isize2,REG_PAR2);
+ r=readreg(r,4);
+ prepare_for_call_1(); /* This should ensure that there won't be
+ any need for swapping nregs in prepare_for_call_2
+ */
+#if USE_NORMAL_CALLING_CONVENTION
+ raw_push_l_r(in2);
+ raw_push_l_r(in1);
+#endif
+ unlock2(r);
+ unlock2(in1);
+ unlock2(in2);
+ prepare_for_call_2();
+ raw_call_r(r);
+#if USE_NORMAL_CALLING_CONVENTION
+ raw_inc_sp(8);
+#endif
+}
+MENDFUNC(5,call_r_02,(R4 r, R4 in1, R4 in2, IMM isize1, IMM isize2))
+
+/* forget_about() takes a mid-layer register */
+MIDFUNC(1,forget_about,(W4 r))
+{
+ if (isinreg(r))
+ disassociate(r);
+ live.state[r].val=0;
+ set_status(r,UNDEF);
+}
+MENDFUNC(1,forget_about,(W4 r))
+
+MIDFUNC(0,nop,(void))
+{
+ raw_nop();
+}
+MENDFUNC(0,nop,(void))
+
+
+MIDFUNC(1,f_forget_about,(FW r))
+{
+ if (f_isinreg(r))
+ f_disassociate(r);
+ live.fate[r].status=UNDEF;
+}
+MENDFUNC(1,f_forget_about,(FW r))
+
+MIDFUNC(1,fmov_pi,(FW r))
+{
+ r=f_writereg(r);
+ raw_fmov_pi(r);
+ f_unlock(r);
+}
+MENDFUNC(1,fmov_pi,(FW r))
+
+MIDFUNC(1,fmov_log10_2,(FW r))
+{
+ r=f_writereg(r);
+ raw_fmov_log10_2(r);
+ f_unlock(r);
+}
+MENDFUNC(1,fmov_log10_2,(FW r))
+
+MIDFUNC(1,fmov_log2_e,(FW r))
+{
+ r=f_writereg(r);
+ raw_fmov_log2_e(r);
+ f_unlock(r);
+}
+MENDFUNC(1,fmov_log2_e,(FW r))
+
+MIDFUNC(1,fmov_loge_2,(FW r))
+{
+ r=f_writereg(r);
+ raw_fmov_loge_2(r);
+ f_unlock(r);
+}
+MENDFUNC(1,fmov_loge_2,(FW r))
+
+MIDFUNC(1,fmov_1,(FW r))
+{
+ r=f_writereg(r);
+ raw_fmov_1(r);
+ f_unlock(r);
+}
+MENDFUNC(1,fmov_1,(FW r))
+
+MIDFUNC(1,fmov_0,(FW r))
+{
+ r=f_writereg(r);
+ raw_fmov_0(r);
+ f_unlock(r);
+}
+MENDFUNC(1,fmov_0,(FW r))
+
+MIDFUNC(2,fmov_rm,(FW r, MEMR m))
+{
+ r=f_writereg(r);
+ raw_fmov_rm(r,m);
+ f_unlock(r);
+}
+MENDFUNC(2,fmov_rm,(FW r, MEMR m))
+
+MIDFUNC(2,fmovi_rm,(FW r, MEMR m))
+{
+ r=f_writereg(r);
+ raw_fmovi_rm(r,m);
+ f_unlock(r);
+}
+MENDFUNC(2,fmovi_rm,(FW r, MEMR m))
+
+MIDFUNC(2,fmovi_mr,(MEMW m, FR r))
+{
+ r=f_readreg(r);
+ raw_fmovi_mr(m,r);
+ f_unlock(r);
+}
+MENDFUNC(2,fmovi_mr,(MEMW m, FR r))
+
+MIDFUNC(2,fmovs_rm,(FW r, MEMR m))
+{
+ r=f_writereg(r);
+ raw_fmovs_rm(r,m);
+ f_unlock(r);
+}
+MENDFUNC(2,fmovs_rm,(FW r, MEMR m))
+
+MIDFUNC(2,fmovs_mr,(MEMW m, FR r))
+{
+ r=f_readreg(r);
+ raw_fmovs_mr(m,r);
+ f_unlock(r);
+}
+MENDFUNC(2,fmovs_mr,(MEMW m, FR r))
+
+MIDFUNC(2,fmov_ext_mr,(MEMW m, FR r))
+{
+ r=f_readreg(r);
+ raw_fmov_ext_mr(m,r);
+ f_unlock(r);
+}
+MENDFUNC(2,fmov_ext_mr,(MEMW m, FR r))
+
+MIDFUNC(2,fmov_mr,(MEMW m, FR r))
+{
+ r=f_readreg(r);
+ raw_fmov_mr(m,r);
+ f_unlock(r);
+}
+MENDFUNC(2,fmov_mr,(MEMW m, FR r))
+
+MIDFUNC(2,fmov_ext_rm,(FW r, MEMR m))
+{
+ r=f_writereg(r);
+ raw_fmov_ext_rm(r,m);
+ f_unlock(r);
+}
+MENDFUNC(2,fmov_ext_rm,(FW r, MEMR m))
+
+MIDFUNC(2,fmov_rr,(FW d, FR s))
+{
+ if (d==s) { /* How pointless! */
+ return;
+ }
+#if USE_F_ALIAS
+ f_disassociate(d);
+ s=f_readreg(s);
+ live.fate[d].realreg=s;
+ live.fate[d].realind=live.fat[s].nholds;
+ live.fate[d].status=DIRTY;
+ live.fat[s].holds[live.fat[s].nholds]=d;
+ live.fat[s].nholds++;
+ f_unlock(s);
+#else
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fmov_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+#endif
+}
+MENDFUNC(2,fmov_rr,(FW d, FR s))
+
+MIDFUNC(2,fldcw_m_indexed,(R4 index, IMM base))
+{
+ index=readreg(index,4);
+
+ raw_fldcw_m_indexed(index,base);
+ unlock2(index);
+}
+MENDFUNC(2,fldcw_m_indexed,(R4 index, IMM base))
+
+MIDFUNC(1,ftst_r,(FR r))
+{
+ r=f_readreg(r);
+ raw_ftst_r(r);
+ f_unlock(r);
+}
+MENDFUNC(1,ftst_r,(FR r))
+
+MIDFUNC(0,dont_care_fflags,(void))
+{
+ f_disassociate(FP_RESULT);
+}
+MENDFUNC(0,dont_care_fflags,(void))
+
+MIDFUNC(2,fsqrt_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fsqrt_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fsqrt_rr,(FW d, FR s))
+
+MIDFUNC(2,fabs_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fabs_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fabs_rr,(FW d, FR s))
+
+MIDFUNC(2,fsin_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fsin_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fsin_rr,(FW d, FR s))
+
+MIDFUNC(2,fcos_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fcos_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fcos_rr,(FW d, FR s))
+
+MIDFUNC(2,ftwotox_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_ftwotox_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,ftwotox_rr,(FW d, FR s))
+
+MIDFUNC(2,fetox_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fetox_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fetox_rr,(FW d, FR s))
+
+MIDFUNC(2,frndint_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_frndint_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,frndint_rr,(FW d, FR s))
+
+MIDFUNC(2,flog2_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_flog2_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,flog2_rr,(FW d, FR s))
+
+MIDFUNC(2,fneg_rr,(FW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_writereg(d);
+ raw_fneg_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fneg_rr,(FW d, FR s))
+
+MIDFUNC(2,fadd_rr,(FRW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_rmw(d);
+ raw_fadd_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fadd_rr,(FRW d, FR s))
+
+MIDFUNC(2,fsub_rr,(FRW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_rmw(d);
+ raw_fsub_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fsub_rr,(FRW d, FR s))
+
+MIDFUNC(2,fcmp_rr,(FR d, FR s))
+{
+ d=f_readreg(d);
+ s=f_readreg(s);
+ raw_fcmp_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fcmp_rr,(FR d, FR s))
+
+MIDFUNC(2,fdiv_rr,(FRW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_rmw(d);
+ raw_fdiv_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fdiv_rr,(FRW d, FR s))
+
+MIDFUNC(2,frem_rr,(FRW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_rmw(d);
+ raw_frem_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,frem_rr,(FRW d, FR s))
+
+MIDFUNC(2,frem1_rr,(FRW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_rmw(d);
+ raw_frem1_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,frem1_rr,(FRW d, FR s))
+
+MIDFUNC(2,fmul_rr,(FRW d, FR s))
+{
+ s=f_readreg(s);
+ d=f_rmw(d);
+ raw_fmul_rr(d,s);
+ f_unlock(s);
+ f_unlock(d);
+}
+MENDFUNC(2,fmul_rr,(FRW d, FR s))
+
+/********************************************************************
+ * Support functions exposed to gencomp. CREATE time *
+ ********************************************************************/
+
+void set_zero(int r, int tmp)
+{
+ if (setzflg_uses_bsf)
+ bsf_l_rr(r,r);
+ else
+ simulate_bsf(tmp,r);
+}
+
+int kill_rodent(int r)
+{
+ return KILLTHERAT &&
+ have_rat_stall &&
+ (live.state[r].status==INMEM ||
+ live.state[r].status==CLEAN ||
+ live.state[r].status==ISCONST ||
+ live.state[r].dirtysize==4);
+}
+
+uae_u32 get_const(int r)
+{
+ Dif (!isconst(r)) {
+ write_log("Register %d should be constant, but isn't\n",r);
+ abort();
+ }
+ return live.state[r].val;
+}
+
+void sync_m68k_pc(void)
+{
+ if (m68k_pc_offset) {
+ add_l_ri(PC_P,m68k_pc_offset);
+ comp_pc_p+=m68k_pc_offset;
+ m68k_pc_offset=0;
+ }
+}
+
+/********************************************************************
+ * Scratch registers management *
+ ********************************************************************/
+
+struct scratch_t {
+ uae_u32 regs[VREGS];
+ fpu_register fregs[VFREGS];
+};
+
+static scratch_t scratch;
+
+/********************************************************************
+ * Support functions exposed to newcpu *
+ ********************************************************************/
+
+static inline const char *str_on_off(bool b)
+{
+ return b ? "on" : "off";
+}
+
+void compiler_init(void)
+{
+ static bool initialized = false;
+ if (initialized)
+ return;
+
+#if JIT_DEBUG
+ // JIT debug mode ?
+ JITDebug = PrefsFindBool("jitdebug");
+#endif
+ write_log("<JIT compiler> : enable runtime disassemblers : %s\n", JITDebug ? "yes" : "no");
+
+#ifdef USE_JIT_FPU
+ // Use JIT compiler for FPU instructions ?
+ avoid_fpu = !PrefsFindBool("jitfpu");
+#else
+ // JIT FPU is always disabled
+ avoid_fpu = true;
+#endif
+ write_log("<JIT compiler> : compile FPU instructions : %s\n", !avoid_fpu ? "yes" : "no");
+
+ // Get size of the translation cache (in KB)
+ cache_size = PrefsFindInt32("jitcachesize");
+ write_log("<JIT compiler> : requested translation cache size : %d KB\n", cache_size);
+
+ // Initialize target CPU (check for features, e.g. CMOV, rat stalls)
+ raw_init_cpu();
+ setzflg_uses_bsf = target_check_bsf();
+ write_log("<JIT compiler> : target processor has CMOV instructions : %s\n", have_cmov ? "yes" : "no");
+ write_log("<JIT compiler> : target processor can suffer from partial register stalls : %s\n", have_rat_stall ? "yes" : "no");
+ write_log("<JIT compiler> : alignment for loops, jumps are %d, %d\n", align_loops, align_jumps);
+
+ // Translation cache flush mechanism
+ lazy_flush = PrefsFindBool("jitlazyflush");
+ write_log("<JIT compiler> : lazy translation cache invalidation : %s\n", str_on_off(lazy_flush));
+ flush_icache = lazy_flush ? flush_icache_lazy : flush_icache_hard;
+
+ // Compiler features
+ write_log("<JIT compiler> : register aliasing : %s\n", str_on_off(1));
+ write_log("<JIT compiler> : FP register aliasing : %s\n", str_on_off(USE_F_ALIAS));
+ write_log("<JIT compiler> : lazy constant offsetting : %s\n", str_on_off(USE_OFFSET));
+#if USE_INLINING
+ follow_const_jumps = PrefsFindBool("jitinline");
+#endif
+ write_log("<JIT compiler> : translate through constant jumps : %s\n", str_on_off(follow_const_jumps));
+ write_log("<JIT compiler> : separate blockinfo allocation : %s\n", str_on_off(USE_SEPARATE_BIA));
+
+ // Build compiler tables
+ build_comp();
+
+ initialized = true;
+
+#if PROFILE_UNTRANSLATED_INSNS
+ write_log("<JIT compiler> : gather statistics on untranslated insns count\n");
+#endif
+
+#if PROFILE_COMPILE_TIME
+ write_log("<JIT compiler> : gather statistics on translation time\n");
+ emul_start_time = clock();
+#endif
+}
+
+void compiler_exit(void)
+{
+#if PROFILE_COMPILE_TIME
+ emul_end_time = clock();
+#endif
+
+ // Deallocate translation cache
+ if (compiled_code) {
+ vm_release(compiled_code, cache_size * 1024);
+ compiled_code = 0;
+ }
+
+ // Deallocate popallspace
+ if (popallspace) {
+ vm_release(popallspace, POPALLSPACE_SIZE);
+ popallspace = 0;
+ }
+
+#if PROFILE_COMPILE_TIME
+ write_log("### Compile Block statistics\n");
+ write_log("Number of calls to compile_block : %d\n", compile_count);
+ uae_u32 emul_time = emul_end_time - emul_start_time;
+ write_log("Total emulation time : %.1f sec\n", double(emul_time)/double(CLOCKS_PER_SEC));
+ write_log("Total compilation time : %.1f sec (%.1f%%)\n", double(compile_time)/double(CLOCKS_PER_SEC),
+ 100.0*double(compile_time)/double(emul_time));
+ write_log("\n");
+#endif
+
+#if PROFILE_UNTRANSLATED_INSNS
+ uae_u64 untranslated_count = 0;
+ for (int i = 0; i < 65536; i++) {
+ opcode_nums[i] = i;
+ untranslated_count += raw_cputbl_count[i];
+ }
+ write_log("Sorting out untranslated instructions count...\n");
+ qsort(opcode_nums, 65536, sizeof(uae_u16), untranslated_compfn);
+ write_log("\nRank Opc Count Name\n");
+ for (int i = 0; i < untranslated_top_ten; i++) {
+ uae_u32 count = raw_cputbl_count[opcode_nums[i]];
+ struct instr *dp;
+ struct mnemolookup *lookup;
+ if (!count)
+ break;
+ dp = table68k + opcode_nums[i];
+ for (lookup = lookuptab; lookup->mnemo != dp->mnemo; lookup++)
+ ;
+ write_log("%03d: %04x %10lu %s\n", i, opcode_nums[i], count, lookup->name);
+ }
+#endif
+
+#if RECORD_REGISTER_USAGE
+ int reg_count_ids[16];
+ uint64 tot_reg_count = 0;
+ for (int i = 0; i < 16; i++) {
+ reg_count_ids[i] = i;
+ tot_reg_count += reg_count[i];
+ }
+ qsort(reg_count_ids, 16, sizeof(int), reg_count_compare);
+ uint64 cum_reg_count = 0;
+ for (int i = 0; i < 16; i++) {
+ int r = reg_count_ids[i];
+ cum_reg_count += reg_count[r];
+ printf("%c%d : %16ld %2.1f%% [%2.1f]\n", r < 8 ? 'D' : 'A', r % 8,
+ reg_count[r],
+ 100.0*double(reg_count[r])/double(tot_reg_count),
+ 100.0*double(cum_reg_count)/double(tot_reg_count));
+ }
+#endif
+}
+
+bool compiler_use_jit(void)
+{
+ // Check for the "jit" prefs item
+ if (!PrefsFindBool("jit"))
+ return false;
+
+ // Don't use JIT if translation cache size is less then MIN_CACHE_SIZE KB
+ if (PrefsFindInt32("jitcachesize") < MIN_CACHE_SIZE) {
+ write_log("<JIT compiler> : translation cache size is less than %d KB. Disabling JIT.\n", MIN_CACHE_SIZE);
+ return false;
+ }
+
+ // Enable JIT for 68020+ emulation only
+ if (CPUType < 2) {
+ write_log("<JIT compiler> : JIT is not supported in 680%d0 emulation mode, disabling.\n", CPUType);
+ return false;
+ }
+
+ return true;
+}
+
+void init_comp(void)
+{
+ int i;
+ uae_s8* cb=can_byte;
+ uae_s8* cw=can_word;
+ uae_s8* au=always_used;
+
+#if RECORD_REGISTER_USAGE
+ for (i=0;i<16;i++)
+ reg_count_local[i] = 0;
+#endif
+
+ for (i=0;i<VREGS;i++) {
+ live.state[i].realreg=-1;
+ live.state[i].needflush=NF_SCRATCH;
+ live.state[i].val=0;
+ set_status(i,UNDEF);
+ }
+
+ for (i=0;i<VFREGS;i++) {
+ live.fate[i].status=UNDEF;
+ live.fate[i].realreg=-1;
+ live.fate[i].needflush=NF_SCRATCH;
+ }
+
+ for (i=0;i<VREGS;i++) {
+ if (i<16) { /* First 16 registers map to 68k registers */
+ live.state[i].mem=((uae_u32*)®s)+i;
+ live.state[i].needflush=NF_TOMEM;
+ set_status(i,INMEM);
+ }
+ else
+ live.state[i].mem=scratch.regs+i;
+ }
+ live.state[PC_P].mem=(uae_u32*)&(regs.pc_p);
+ live.state[PC_P].needflush=NF_TOMEM;
+ set_const(PC_P,(uintptr)comp_pc_p);
+
+ live.state[FLAGX].mem=(uae_u32*)&(regflags.x);
+ live.state[FLAGX].needflush=NF_TOMEM;
+ set_status(FLAGX,INMEM);
+
+ live.state[FLAGTMP].mem=(uae_u32*)&(regflags.cznv);
+ live.state[FLAGTMP].needflush=NF_TOMEM;
+ set_status(FLAGTMP,INMEM);
+
+ live.state[NEXT_HANDLER].needflush=NF_HANDLER;
+ set_status(NEXT_HANDLER,UNDEF);
+
+ for (i=0;i<VFREGS;i++) {
+ if (i<8) { /* First 8 registers map to 68k FPU registers */
+ live.fate[i].mem=(uae_u32*)fpu_register_address(i);
+ live.fate[i].needflush=NF_TOMEM;
+ live.fate[i].status=INMEM;
+ }
+ else if (i==FP_RESULT) {
+ live.fate[i].mem=(uae_u32*)(&fpu.result);
+ live.fate[i].needflush=NF_TOMEM;
+ live.fate[i].status=INMEM;
+ }
+ else
+ live.fate[i].mem=(uae_u32*)(&scratch.fregs[i]);
+ }
+
+
+ for (i=0;i<N_REGS;i++) {
+ live.nat[i].touched=0;
+ live.nat[i].nholds=0;
+ live.nat[i].locked=0;
+ if (*cb==i) {
+ live.nat[i].canbyte=1; cb++;
+ } else live.nat[i].canbyte=0;
+ if (*cw==i) {
+ live.nat[i].canword=1; cw++;
+ } else live.nat[i].canword=0;
+ if (*au==i) {
+ live.nat[i].locked=1; au++;
+ }
+ }
+
+ for (i=0;i<N_FREGS;i++) {
+ live.fat[i].touched=0;
+ live.fat[i].nholds=0;
+ live.fat[i].locked=0;
+ }
+
+ touchcnt=1;
+ m68k_pc_offset=0;
+ live.flags_in_flags=TRASH;
+ live.flags_on_stack=VALID;
+ live.flags_are_important=1;
+
+ raw_fp_init();
+}
+
+/* Only do this if you really mean it! The next call should be to init!*/
+void flush(int save_regs)
+{
+ int fi,i;
+
+ log_flush();
+ flush_flags(); /* low level */
+ sync_m68k_pc(); /* mid level */
+
+ if (save_regs) {
+ for (i=0;i<VFREGS;i++) {
+ if (live.fate[i].needflush==NF_SCRATCH ||
+ live.fate[i].status==CLEAN) {
+ f_disassociate(i);
+ }
+ }
+ for (i=0;i<VREGS;i++) {
+ if (live.state[i].needflush==NF_TOMEM) {
+ switch(live.state[i].status) {
+ case INMEM:
+ if (live.state[i].val) {
+ raw_add_l_mi((uintptr)live.state[i].mem,live.state[i].val);
+ log_vwrite(i);
+ live.state[i].val=0;
+ }
+ break;
+ case CLEAN:
+ case DIRTY:
+ remove_offset(i,-1); tomem(i); break;
+ case ISCONST:
+ if (i!=PC_P)
+ writeback_const(i);
+ break;
+ default: break;
+ }
+ Dif (live.state[i].val && i!=PC_P) {
+ write_log("Register %d still has val %x\n",
+ i,live.state[i].val);
+ }
+ }
+ }
+ for (i=0;i<VFREGS;i++) {
+ if (live.fate[i].needflush==NF_TOMEM &&
+ live.fate[i].status==DIRTY) {
+ f_evict(i);
+ }
+ }
+ raw_fp_cleanup_drop();
+ }
+ if (needflags) {
+ write_log("Warning! flush with needflags=1!\n");
+ }
+}
+
+static void flush_keepflags(void)
+{
+ int fi,i;
+
+ for (i=0;i<VFREGS;i++) {
+ if (live.fate[i].needflush==NF_SCRATCH ||
+ live.fate[i].status==CLEAN) {
+ f_disassociate(i);
+ }
+ }
+ for (i=0;i<VREGS;i++) {
+ if (live.state[i].needflush==NF_TOMEM) {
+ switch(live.state[i].status) {
+ case INMEM:
+ /* Can't adjust the offset here --- that needs "add" */
+ break;
+ case CLEAN:
+ case DIRTY:
+ remove_offset(i,-1); tomem(i); break;
+ case ISCONST:
+ if (i!=PC_P)
+ writeback_const(i);
+ break;
+ default: break;
+ }
+ }
+ }
+ for (i=0;i<VFREGS;i++) {
+ if (live.fate[i].needflush==NF_TOMEM &&
+ live.fate[i].status==DIRTY) {
+ f_evict(i);
+ }
+ }
+ raw_fp_cleanup_drop();
+}
+
+void freescratch(void)
+{
+ int i;
+ for (i=0;i<N_REGS;i++)
+ if (live.nat[i].locked && i!=4)
+ write_log("Warning! %d is locked\n",i);
+
+ for (i=0;i<VREGS;i++)
+ if (live.state[i].needflush==NF_SCRATCH) {
+ forget_about(i);
+ }
+
+ for (i=0;i<VFREGS;i++)
+ if (live.fate[i].needflush==NF_SCRATCH) {
+ f_forget_about(i);
+ }
+}
+
+/********************************************************************
+ * Support functions, internal *
+ ********************************************************************/
+
+
+static void align_target(uae_u32 a)
+{
+ if (!a)
+ return;
+
+ if (tune_nop_fillers)
+ raw_emit_nop_filler(a - (((uintptr)target) & (a - 1)));
+ else {
+ /* Fill with NOPs --- makes debugging with gdb easier */
+ while ((uintptr)target&(a-1))
+ *target++=0x90;
+ }
+}
+
+static __inline__ int isinrom(uintptr addr)
+{
+ return ((addr >= (uintptr)ROMBaseHost) && (addr < (uintptr)ROMBaseHost + ROMSize));
+}
+
+static void flush_all(void)
+{
+ int i;
+
+ log_flush();
+ for (i=0;i<VREGS;i++)
+ if (live.state[i].status==DIRTY) {
+ if (!call_saved[live.state[i].realreg]) {
+ tomem(i);
+ }
+ }
+ for (i=0;i<VFREGS;i++)
+ if (f_isinreg(i))
+ f_evict(i);
+ raw_fp_cleanup_drop();
+}
+
+/* Make sure all registers that will get clobbered by a call are
+ save and sound in memory */
+static void prepare_for_call_1(void)
+{
+ flush_all(); /* If there are registers that don't get clobbered,
+ * we should be a bit more selective here */
+}
+
+/* We will call a C routine in a moment. That will clobber all registers,
+ so we need to disassociate everything */
+static void prepare_for_call_2(void)
+{
+ int i;
+ for (i=0;i<N_REGS;i++)
+ if (!call_saved[i] && live.nat[i].nholds>0)
+ free_nreg(i);
+
+ for (i=0;i<N_FREGS;i++)
+ if (live.fat[i].nholds>0)
+ f_free_nreg(i);
+
+ live.flags_in_flags=TRASH; /* Note: We assume we already rescued the
+ flags at the very start of the call_r
+ functions! */
+}
+
+/********************************************************************
+ * Memory access and related functions, CREATE time *
+ ********************************************************************/
+
+void register_branch(uae_u32 not_taken, uae_u32 taken, uae_u8 cond)
+{
+ next_pc_p=not_taken;
+ taken_pc_p=taken;
+ branch_cc=cond;
+}
+
+
+static uae_u32 get_handler_address(uae_u32 addr)
+{
+ uae_u32 cl=cacheline(addr);
+ blockinfo* bi=get_blockinfo_addr_new((void*)(uintptr)addr,0);
+ return (uintptr)&(bi->direct_handler_to_use);
+}
+
+static uae_u32 get_handler(uae_u32 addr)
+{
+ uae_u32 cl=cacheline(addr);
+ blockinfo* bi=get_blockinfo_addr_new((void*)(uintptr)addr,0);
+ return (uintptr)bi->direct_handler_to_use;
+}
+
+static void load_handler(int reg, uae_u32 addr)
+{
+ mov_l_rm(reg,get_handler_address(addr));
+}
+
+/* This version assumes that it is writing *real* memory, and *will* fail
+ * if that assumption is wrong! No branches, no second chances, just
+ * straight go-for-it attitude */
+
+static void writemem_real(int address, int source, int size, int tmp, int clobber)
+{
+ int f=tmp;
+
+ if (clobber)
+ f=source;
+
+ switch(size) {
+ case 1: mov_b_bRr(address,source,MEMBaseDiff); break;
+ case 2: mov_w_rr(f,source); bswap_16(f); mov_w_bRr(address,f,MEMBaseDiff); break;
+ case 4: mov_l_rr(f,source); bswap_32(f); mov_l_bRr(address,f,MEMBaseDiff); break;
+ }
+ forget_about(tmp);
+ forget_about(f);
+}
+
+void writebyte(int address, int source, int tmp)
+{
+ writemem_real(address,source,1,tmp,0);
+}
+
+static __inline__ void writeword_general(int address, int source, int tmp,
+ int clobber)
+{
+ writemem_real(address,source,2,tmp,clobber);
+}
+
+void writeword_clobber(int address, int source, int tmp)
+{
+ writeword_general(address,source,tmp,1);
+}
+
+void writeword(int address, int source, int tmp)
+{
+ writeword_general(address,source,tmp,0);
+}
+
+static __inline__ void writelong_general(int address, int source, int tmp,
+ int clobber)
+{
+ writemem_real(address,source,4,tmp,clobber);
+}
+
+void writelong_clobber(int address, int source, int tmp)
+{
+ writelong_general(address,source,tmp,1);
+}
+
+void writelong(int address, int source, int tmp)
+{
+ writelong_general(address,source,tmp,0);
+}
+
+
+
+/* This version assumes that it is reading *real* memory, and *will* fail
+ * if that assumption is wrong! No branches, no second chances, just
+ * straight go-for-it attitude */
+
+static void readmem_real(int address, int dest, int size, int tmp)
+{
+ int f=tmp;
+
+ if (size==4 && address!=dest)
+ f=dest;
+
+ switch(size) {
+ case 1: mov_b_brR(dest,address,MEMBaseDiff); break;
+ case 2: mov_w_brR(dest,address,MEMBaseDiff); bswap_16(dest); break;
+ case 4: mov_l_brR(dest,address,MEMBaseDiff); bswap_32(dest); break;
+ }
+ forget_about(tmp);
+}
+
+void readbyte(int address, int dest, int tmp)
+{
+ readmem_real(address,dest,1,tmp);
+}
+
+void readword(int address, int dest, int tmp)
+{
+ readmem_real(address,dest,2,tmp);
+}
+
+void readlong(int address, int dest, int tmp)
+{
+ readmem_real(address,dest,4,tmp);
+}
+
+void get_n_addr(int address, int dest, int tmp)
+{
+ // a is the register containing the virtual address
+ // after the offset had been fetched
+ int a=tmp;
+
+ // f is the register that will contain the offset
+ int f=tmp;
+
+ // a == f == tmp if (address == dest)
+ if (address!=dest) {
+ a=address;
+ f=dest;
+ }
+
+#if REAL_ADDRESSING
+ mov_l_rr(dest, address);
+#elif DIRECT_ADDRESSING
+ lea_l_brr(dest,address,MEMBaseDiff);
+#endif
+ forget_about(tmp);
+}
+
+void get_n_addr_jmp(int address, int dest, int tmp)
+{
+ /* For this, we need to get the same address as the rest of UAE
+ would --- otherwise we end up translating everything twice */
+ get_n_addr(address,dest,tmp);
+}
+
+
+/* base is a register, but dp is an actual value.
+ target is a register, as is tmp */
+void calc_disp_ea_020(int base, uae_u32 dp, int target, int tmp)
+{
+ int reg = (dp >> 12) & 15;
+ int regd_shift=(dp >> 9) & 3;
+
+ if (dp & 0x100) {
+ int ignorebase=(dp&0x80);
+ int ignorereg=(dp&0x40);
+ int addbase=0;
+ int outer=0;
+
+ if ((dp & 0x30) == 0x20) addbase = (uae_s32)(uae_s16)comp_get_iword((m68k_pc_offset+=2)-2);
+ if ((dp & 0x30) == 0x30) addbase = comp_get_ilong((m68k_pc_offset+=4)-4);
+
+ if ((dp & 0x3) == 0x2) outer = (uae_s32)(uae_s16)comp_get_iword((m68k_pc_offset+=2)-2);
+ if ((dp & 0x3) == 0x3) outer = comp_get_ilong((m68k_pc_offset+=4)-4);
+
+ if ((dp & 0x4) == 0) { /* add regd *before* the get_long */
+ if (!ignorereg) {
+ if ((dp & 0x800) == 0)
+ sign_extend_16_rr(target,reg);
+ else
+ mov_l_rr(target,reg);
+ shll_l_ri(target,regd_shift);
+ }
+ else
+ mov_l_ri(target,0);
+
+ /* target is now regd */
+ if (!ignorebase)
+ add_l(target,base);
+ add_l_ri(target,addbase);
+ if (dp&0x03) readlong(target,target,tmp);
+ } else { /* do the getlong first, then add regd */
+ if (!ignorebase) {
+ mov_l_rr(target,base);
+ add_l_ri(target,addbase);
+ }
+ else
+ mov_l_ri(target,addbase);
+ if (dp&0x03) readlong(target,target,tmp);
+
+ if (!ignorereg) {
+ if ((dp & 0x800) == 0)
+ sign_extend_16_rr(tmp,reg);
+ else
+ mov_l_rr(tmp,reg);
+ shll_l_ri(tmp,regd_shift);
+ /* tmp is now regd */
+ add_l(target,tmp);
+ }
+ }
+ add_l_ri(target,outer);
+ }
+ else { /* 68000 version */
+ if ((dp & 0x800) == 0) { /* Sign extend */
+ sign_extend_16_rr(target,reg);
+ lea_l_brr_indexed(target,base,target,1<<regd_shift,(uae_s32)((uae_s8)dp));
+ }
+ else {
+ lea_l_brr_indexed(target,base,reg,1<<regd_shift,(uae_s32)((uae_s8)dp));
+ }
+ }
+ forget_about(tmp);
+}
+
+
+
+
+
+void set_cache_state(int enabled)
+{
+ if (enabled!=letit)
+ flush_icache_hard(77);
+ letit=enabled;
+}
+
+int get_cache_state(void)
+{
+ return letit;
+}
+
+uae_u32 get_jitted_size(void)
+{
+ if (compiled_code)
+ return current_compile_p-compiled_code;
+ return 0;
+}
+
+const int CODE_ALLOC_MAX_ATTEMPTS = 10;
+const int CODE_ALLOC_BOUNDARIES = 128 * 1024; // 128 KB
+
+static uint8 *do_alloc_code(uint32 size, int depth)
+{
+#if defined(__linux__) && 0
+ /*
+ This is a really awful hack that is known to work on Linux at
+ least.
+
+ The trick here is to make sure the allocated cache is nearby
+ code segment, and more precisely in the positive half of a
+ 32-bit address space. i.e. addr < 0x80000000. Actually, it
+ turned out that a 32-bit binary run on AMD64 yields a cache
+ allocated around 0xa0000000, thus causing some troubles when
+ translating addresses from m68k to x86.
+ */
+ static uint8 * code_base = NULL;
+ if (code_base == NULL) {
+ uintptr page_size = getpagesize();
+ uintptr boundaries = CODE_ALLOC_BOUNDARIES;
+ if (boundaries < page_size)
+ boundaries = page_size;
+ code_base = (uint8 *)sbrk(0);
+ for (int attempts = 0; attempts < CODE_ALLOC_MAX_ATTEMPTS; attempts++) {
+ if (vm_acquire_fixed(code_base, size) == 0) {
+ uint8 *code = code_base;
+ code_base += size;
+ return code;
+ }
+ code_base += boundaries;
+ }
+ return NULL;
+ }
+
+ if (vm_acquire_fixed(code_base, size) == 0) {
+ uint8 *code = code_base;
+ code_base += size;
+ return code;
+ }
+
+ if (depth >= CODE_ALLOC_MAX_ATTEMPTS)
+ return NULL;
+
+ return do_alloc_code(size, depth + 1);
+#else
+ uint8 *code = (uint8 *)vm_acquire(size);
+ return code == VM_MAP_FAILED ? NULL : code;
+#endif
+}
+
+static inline uint8 *alloc_code(uint32 size)
+{
+ uint8 *ptr = do_alloc_code(size, 0);
+ /* allocated code must fit in 32-bit boundaries */
+ assert((uintptr)ptr <= 0xffffffff);
+ return ptr;
+}
+
+void alloc_cache(void)
+{
+ if (compiled_code) {
+ flush_icache_hard(6);
+ vm_release(compiled_code, cache_size * 1024);
+ compiled_code = 0;
+ }
+
+ if (cache_size == 0)
+ return;
+
+ while (!compiled_code && cache_size) {
+ if ((compiled_code = alloc_code(cache_size * 1024)) == NULL) {
+ compiled_code = 0;
+ cache_size /= 2;
+ }
+ }
+ vm_protect(compiled_code, cache_size * 1024, VM_PAGE_READ | VM_PAGE_WRITE | VM_PAGE_EXECUTE);
+
+ if (compiled_code) {
+ write_log("<JIT compiler> : actual translation cache size : %d KB at 0x%08X\n", cache_size, compiled_code);
+ max_compile_start = compiled_code + cache_size*1024 - BYTES_PER_INST;
+ current_compile_p = compiled_code;
+ current_cache_size = 0;
+ }
+}
+
+
+
+extern void op_illg_1 (uae_u32 opcode) REGPARAM;
+
+static void calc_checksum(blockinfo* bi, uae_u32* c1, uae_u32* c2)
+{
+ uae_u32 k1 = 0;
+ uae_u32 k2 = 0;
+
+#if USE_CHECKSUM_INFO
+ checksum_info *csi = bi->csi;
+ Dif(!csi) abort();
+ while (csi) {
+ uae_s32 len = csi->length;
+ uintptr tmp = (uintptr)csi->start_p;
+#else
+ uae_s32 len = bi->len;
+ uintptr tmp = (uintptr)bi->min_pcp;
+#endif
+ uae_u32*pos;
+
+ len += (tmp & 3);
+ tmp &= ~((uintptr)3);
+ pos = (uae_u32 *)tmp;
+
+ if (len >= 0 && len <= MAX_CHECKSUM_LEN) {
+ while (len > 0) {
+ k1 += *pos;
+ k2 ^= *pos;
+ pos++;
+ len -= 4;
+ }
+ }
+
+#if USE_CHECKSUM_INFO
+ csi = csi->next;
+ }
+#endif
+
+ *c1 = k1;
+ *c2 = k2;
+}
+
+#if 0
+static void show_checksum(CSI_TYPE* csi)
+{
+ uae_u32 k1=0;
+ uae_u32 k2=0;
+ uae_s32 len=CSI_LENGTH(csi);
+ uae_u32 tmp=(uintptr)CSI_START_P(csi);
+ uae_u32* pos;
+
+ len+=(tmp&3);
+ tmp&=(~3);
+ pos=(uae_u32*)tmp;
+
+ if (len<0 || len>MAX_CHECKSUM_LEN) {
+ return;
+ }
+ else {
+ while (len>0) {
+ write_log("%08x ",*pos);
+ pos++;
+ len-=4;
+ }
+ write_log(" bla\n");
+ }
+}
+#endif
+
+
+int check_for_cache_miss(void)
+{
+ blockinfo* bi=get_blockinfo_addr(regs.pc_p);
+
+ if (bi) {
+ int cl=cacheline(regs.pc_p);
+ if (bi!=cache_tags[cl+1].bi) {
+ raise_in_cl_list(bi);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void recompile_block(void)
+{
+ /* An existing block's countdown code has expired. We need to make
+ sure that execute_normal doesn't refuse to recompile due to a
+ perceived cache miss... */
+ blockinfo* bi=get_blockinfo_addr(regs.pc_p);
+
+ Dif (!bi)
+ abort();
+ raise_in_cl_list(bi);
+ execute_normal();
+ return;
+}
+static void cache_miss(void)
+{
+ blockinfo* bi=get_blockinfo_addr(regs.pc_p);
+ uae_u32 cl=cacheline(regs.pc_p);
+ blockinfo* bi2=get_blockinfo(cl);
+
+ if (!bi) {
+ execute_normal(); /* Compile this block now */
+ return;
+ }
+ Dif (!bi2 || bi==bi2) {
+ write_log("Unexplained cache miss %p %p\n",bi,bi2);
+ abort();
+ }
+ raise_in_cl_list(bi);
+ return;
+}
+
+static int called_check_checksum(blockinfo* bi);
+
+static inline int block_check_checksum(blockinfo* bi)
+{
+ uae_u32 c1,c2;
+ bool isgood;
+
+ if (bi->status!=BI_NEED_CHECK)
+ return 1; /* This block is in a checked state */
+
+ checksum_count++;
+
+ if (bi->c1 || bi->c2)
+ calc_checksum(bi,&c1,&c2);
+ else {
+ c1=c2=1; /* Make sure it doesn't match */
+ }
+
+ isgood=(c1==bi->c1 && c2==bi->c2);
+
+ if (isgood) {
+ /* This block is still OK. So we reactivate. Of course, that
+ means we have to move it into the needs-to-be-flushed list */
+ bi->handler_to_use=bi->handler;
+ set_dhtu(bi,bi->direct_handler);
+ bi->status=BI_CHECKING;
+ isgood=called_check_checksum(bi);
+ }
+ if (isgood) {
+ /* write_log("reactivate %p/%p (%x %x/%x %x)\n",bi,bi->pc_p,
+ c1,c2,bi->c1,bi->c2);*/
+ remove_from_list(bi);
+ add_to_active(bi);
+ raise_in_cl_list(bi);
+ bi->status=BI_ACTIVE;
+ }
+ else {
+ /* This block actually changed. We need to invalidate it,
+ and set it up to be recompiled */
+ /* write_log("discard %p/%p (%x %x/%x %x)\n",bi,bi->pc_p,
+ c1,c2,bi->c1,bi->c2); */
+ invalidate_block(bi);
+ raise_in_cl_list(bi);
+ }
+ return isgood;
+}
+
+static int called_check_checksum(blockinfo* bi)
+{
+ dependency* x=bi->deplist;
+ int isgood=1;
+ int i;
+
+ for (i=0;i<2 && isgood;i++) {
+ if (bi->dep[i].jmp_off) {
+ isgood=block_check_checksum(bi->dep[i].target);
+ }
+ }
+ return isgood;
+}
+
+static void check_checksum(void)
+{
+ blockinfo* bi=get_blockinfo_addr(regs.pc_p);
+ uae_u32 cl=cacheline(regs.pc_p);
+ blockinfo* bi2=get_blockinfo(cl);
+
+ /* These are not the droids you are looking for... */
+ if (!bi) {
+ /* Whoever is the primary target is in a dormant state, but
+ calling it was accidental, and we should just compile this
+ new block */
+ execute_normal();
+ return;
+ }
+ if (bi!=bi2) {
+ /* The block was hit accidentally, but it does exist. Cache miss */
+ cache_miss();
+ return;
+ }
+
+ if (!block_check_checksum(bi))
+ execute_normal();
+}
+
+static __inline__ void match_states(blockinfo* bi)
+{
+ int i;
+ smallstate* s=&(bi->env);
+
+ if (bi->status==BI_NEED_CHECK) {
+ block_check_checksum(bi);
+ }
+ if (bi->status==BI_ACTIVE ||
+ bi->status==BI_FINALIZING) { /* Deal with the *promises* the
+ block makes (about not using
+ certain vregs) */
+ for (i=0;i<16;i++) {
+ if (s->virt[i]==L_UNNEEDED) {
+ // write_log("unneeded reg %d at %p\n",i,target);
+ COMPCALL(forget_about)(i); // FIXME
+ }
+ }
+ }
+ flush(1);
+
+ /* And now deal with the *demands* the block makes */
+ for (i=0;i<N_REGS;i++) {
+ int v=s->nat[i];
+ if (v>=0) {
+ // printf("Loading reg %d into %d at %p\n",v,i,target);
+ readreg_specific(v,4,i);
+ // do_load_reg(i,v);
+ // setlock(i);
+ }
+ }
+ for (i=0;i<N_REGS;i++) {
+ int v=s->nat[i];
+ if (v>=0) {
+ unlock2(i);
+ }
+ }
+}
+
+static __inline__ void create_popalls(void)
+{
+ int i,r;
+
+ if ((popallspace = alloc_code(POPALLSPACE_SIZE)) == NULL) {
+ write_log("FATAL: Could not allocate popallspace!\n");
+ abort();
+ }
+ vm_protect(popallspace, POPALLSPACE_SIZE, VM_PAGE_READ | VM_PAGE_WRITE);
+
+ int stack_space = STACK_OFFSET;
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ stack_space += sizeof(void *);
+ }
+ stack_space %= STACK_ALIGN;
+ if (stack_space)
+ stack_space = STACK_ALIGN - stack_space;
+
+ current_compile_p=popallspace;
+ set_target(current_compile_p);
+
+ /* We need to guarantee 16-byte stack alignment on x86 at any point
+ within the JIT generated code. We have multiple exit points
+ possible but a single entry. A "jmp" is used so that we don't
+ have to generate stack alignment in generated code that has to
+ call external functions (e.g. a generic instruction handler).
+
+ In summary, JIT generated code is not leaf so we have to deal
+ with it here to maintain correct stack alignment. */
+ align_target(align_jumps);
+ current_compile_p=get_target();
+ pushall_call_handler=get_target();
+ for (i=N_REGS;i--;) {
+ if (need_to_preserve[i])
+ raw_push_l_r(i);
+ }
+ raw_dec_sp(stack_space);
+ r=REG_PC_TMP;
+ raw_mov_l_rm(r,(uintptr)®s.pc_p);
+ raw_and_l_ri(r,TAGMASK);
+ raw_jmp_m_indexed((uintptr)cache_tags,r,SIZEOF_VOID_P);
+
+ /* now the exit points */
+ align_target(align_jumps);
+ popall_do_nothing=get_target();
+ raw_inc_sp(stack_space);
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ raw_pop_l_r(i);
+ }
+ raw_jmp((uintptr)do_nothing);
+
+ align_target(align_jumps);
+ popall_execute_normal=get_target();
+ raw_inc_sp(stack_space);
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ raw_pop_l_r(i);
+ }
+ raw_jmp((uintptr)execute_normal);
+
+ align_target(align_jumps);
+ popall_cache_miss=get_target();
+ raw_inc_sp(stack_space);
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ raw_pop_l_r(i);
+ }
+ raw_jmp((uintptr)cache_miss);
+
+ align_target(align_jumps);
+ popall_recompile_block=get_target();
+ raw_inc_sp(stack_space);
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ raw_pop_l_r(i);
+ }
+ raw_jmp((uintptr)recompile_block);
+
+ align_target(align_jumps);
+ popall_exec_nostats=get_target();
+ raw_inc_sp(stack_space);
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ raw_pop_l_r(i);
+ }
+ raw_jmp((uintptr)exec_nostats);
+
+ align_target(align_jumps);
+ popall_check_checksum=get_target();
+ raw_inc_sp(stack_space);
+ for (i=0;i<N_REGS;i++) {
+ if (need_to_preserve[i])
+ raw_pop_l_r(i);
+ }
+ raw_jmp((uintptr)check_checksum);
+
+ // no need to further write into popallspace
+ vm_protect(popallspace, POPALLSPACE_SIZE, VM_PAGE_READ | VM_PAGE_EXECUTE);
+}
+
+static __inline__ void reset_lists(void)
+{
+ int i;
+
+ for (i=0;i<MAX_HOLD_BI;i++)
+ hold_bi[i]=NULL;
+ active=NULL;
+ dormant=NULL;
+}
+
+static void prepare_block(blockinfo* bi)
+{
+ int i;
+
+ set_target(current_compile_p);
+ align_target(align_jumps);
+ bi->direct_pen=(cpuop_func *)get_target();
+ raw_mov_l_rm(0,(uintptr)&(bi->pc_p));
+ raw_mov_l_mr((uintptr)®s.pc_p,0);
+ raw_jmp((uintptr)popall_execute_normal);
+
+ align_target(align_jumps);
+ bi->direct_pcc=(cpuop_func *)get_target();
+ raw_mov_l_rm(0,(uintptr)&(bi->pc_p));
+ raw_mov_l_mr((uintptr)®s.pc_p,0);
+ raw_jmp((uintptr)popall_check_checksum);
+ current_compile_p=get_target();
+
+ bi->deplist=NULL;
+ for (i=0;i<2;i++) {
+ bi->dep[i].prev_p=NULL;
+ bi->dep[i].next=NULL;
+ }
+ bi->env=default_ss;
+ bi->status=BI_INVALID;
+ bi->havestate=0;
+ //bi->env=empty_ss;
+}
+
+// OPCODE is in big endian format, use cft_map() beforehand, if needed.
+static inline void reset_compop(int opcode)
+{
+ compfunctbl[opcode] = NULL;
+ nfcompfunctbl[opcode] = NULL;
+}
+
+static int read_opcode(const char *p)
+{
+ int opcode = 0;
+ for (int i = 0; i < 4; i++) {
+ int op = p[i];
+ switch (op) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ opcode = (opcode << 4) | (op - '0');
+ break;
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ opcode = (opcode << 4) | ((op - 'a') + 10);
+ break;
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ opcode = (opcode << 4) | ((op - 'A') + 10);
+ break;
+ default:
+ return -1;
+ }
+ }
+ return opcode;
+}
+
+static bool merge_blacklist()
+{
+ const char *blacklist = PrefsFindString("jitblacklist");
+ if (blacklist) {
+ const char *p = blacklist;
+ for (;;) {
+ if (*p == 0)
+ return true;
+
+ int opcode1 = read_opcode(p);
+ if (opcode1 < 0)
+ return false;
+ p += 4;
+
+ int opcode2 = opcode1;
+ if (*p == '-') {
+ p++;
+ opcode2 = read_opcode(p);
+ if (opcode2 < 0)
+ return false;
+ p += 4;
+ }
+
+ if (*p == 0 || *p == ',' || *p == ';') {
+ write_log("<JIT compiler> : blacklist opcodes : %04x-%04x\n", opcode1, opcode2);
+ for (int opcode = opcode1; opcode <= opcode2; opcode++)
+ reset_compop(cft_map(opcode));
+
+ if (*p == ',' || *p++ == ';')
+ continue;
+
+ return true;
+ }
+
+ return false;
+ }
+ }
+ return true;
+}
+
+void build_comp(void)
+{
+ int i;
+ int jumpcount=0;
+ unsigned long opcode;
+ struct comptbl* tbl=op_smalltbl_0_comp_ff;
+ struct comptbl* nftbl=op_smalltbl_0_comp_nf;
+ int count;
+ int cpu_level = 0; // 68000 (default)
+ if (CPUType == 4)
+ cpu_level = 4; // 68040 with FPU
+ else {
+ if (FPUType)
+ cpu_level = 3; // 68020 with FPU
+ else if (CPUType >= 2)
+ cpu_level = 2; // 68020
+ else if (CPUType == 1)
+ cpu_level = 1;
+ }
+ struct cputbl *nfctbl = (
+ cpu_level == 4 ? op_smalltbl_0_nf
+ : cpu_level == 3 ? op_smalltbl_1_nf
+ : cpu_level == 2 ? op_smalltbl_2_nf
+ : cpu_level == 1 ? op_smalltbl_3_nf
+ : op_smalltbl_4_nf);
+
+ write_log ("<JIT compiler> : building compiler function tables\n");
+
+ for (opcode = 0; opcode < 65536; opcode++) {
+ reset_compop(opcode);
+ nfcpufunctbl[opcode] = op_illg_1;
+ prop[opcode].use_flags = 0x1f;
+ prop[opcode].set_flags = 0x1f;
+ prop[opcode].cflow = fl_trap; // ILLEGAL instructions do trap
+ }
+
+ for (i = 0; tbl[i].opcode < 65536; i++) {
+ int cflow = table68k[tbl[i].opcode].cflow;
+ if (follow_const_jumps && (tbl[i].specific & 16))
+ cflow = fl_const_jump;
+ else
+ cflow &= ~fl_const_jump;
+ prop[cft_map(tbl[i].opcode)].cflow = cflow;
+
+ int uses_fpu = tbl[i].specific & 32;
+ if (uses_fpu && avoid_fpu)
+ compfunctbl[cft_map(tbl[i].opcode)] = NULL;
+ else
+ compfunctbl[cft_map(tbl[i].opcode)] = tbl[i].handler;
+ }
+
+ for (i = 0; nftbl[i].opcode < 65536; i++) {
+ int uses_fpu = tbl[i].specific & 32;
+ if (uses_fpu && avoid_fpu)
+ nfcompfunctbl[cft_map(nftbl[i].opcode)] = NULL;
+ else
+ nfcompfunctbl[cft_map(nftbl[i].opcode)] = nftbl[i].handler;
+
+ nfcpufunctbl[cft_map(nftbl[i].opcode)] = nfctbl[i].handler;
+ }
+
+ for (i = 0; nfctbl[i].handler; i++) {
+ nfcpufunctbl[cft_map(nfctbl[i].opcode)] = nfctbl[i].handler;
+ }
+
+ for (opcode = 0; opcode < 65536; opcode++) {
+ compop_func *f;
+ compop_func *nff;
+ cpuop_func *nfcf;
+ int isaddx,cflow;
+
+ if (table68k[opcode].mnemo == i_ILLG || table68k[opcode].clev > cpu_level)
+ continue;
+
+ if (table68k[opcode].handler != -1) {
+ f = compfunctbl[cft_map(table68k[opcode].handler)];
+ nff = nfcompfunctbl[cft_map(table68k[opcode].handler)];
+ nfcf = nfcpufunctbl[cft_map(table68k[opcode].handler)];
+ cflow = prop[cft_map(table68k[opcode].handler)].cflow;
+ isaddx = prop[cft_map(table68k[opcode].handler)].is_addx;
+ prop[cft_map(opcode)].cflow = cflow;
+ prop[cft_map(opcode)].is_addx = isaddx;
+ compfunctbl[cft_map(opcode)] = f;
+ nfcompfunctbl[cft_map(opcode)] = nff;
+ Dif (nfcf == op_illg_1)
+ abort();
+ nfcpufunctbl[cft_map(opcode)] = nfcf;
+ }
+ prop[cft_map(opcode)].set_flags = table68k[opcode].flagdead;
+ prop[cft_map(opcode)].use_flags = table68k[opcode].flaglive;
+ /* Unconditional jumps don't evaluate condition codes, so they
+ * don't actually use any flags themselves */
+ if (prop[cft_map(opcode)].cflow & fl_const_jump)
+ prop[cft_map(opcode)].use_flags = 0;
+ }
+ for (i = 0; nfctbl[i].handler != NULL; i++) {
+ if (nfctbl[i].specific)
+ nfcpufunctbl[cft_map(tbl[i].opcode)] = nfctbl[i].handler;
+ }
+
+ /* Merge in blacklist */
+ if (!merge_blacklist())
+ write_log("<JIT compiler> : blacklist merge failure!\n");
+
+ count=0;
+ for (opcode = 0; opcode < 65536; opcode++) {
+ if (compfunctbl[cft_map(opcode)])
+ count++;
+ }
+ write_log("<JIT compiler> : supposedly %d compileable opcodes!\n",count);
+
+ /* Initialise state */
+ create_popalls();
+ alloc_cache();
+ reset_lists();
+
+ for (i=0;i<TAGSIZE;i+=2) {
+ cache_tags[i].handler=(cpuop_func *)popall_execute_normal;
+ cache_tags[i+1].bi=NULL;
+ }
+
+#if 0
+ for (i=0;i<N_REGS;i++) {
+ empty_ss.nat[i].holds=-1;
+ empty_ss.nat[i].validsize=0;
+ empty_ss.nat[i].dirtysize=0;
+ }
+#endif
+ for (i=0;i<VREGS;i++) {
+ empty_ss.virt[i]=L_NEEDED;
+ }
+ for (i=0;i<N_REGS;i++) {
+ empty_ss.nat[i]=L_UNKNOWN;
+ }
+ default_ss=empty_ss;
+}
+
+
+static void flush_icache_none(int n)
+{
+ /* Nothing to do. */
+}
+
+static void flush_icache_hard(int n)
+{
+ uae_u32 i;
+ blockinfo* bi, *dbi;
+
+ hard_flush_count++;
+#if 0
+ write_log("Flush Icache_hard(%d/%x/%p), %u KB\n",
+ n,regs.pc,regs.pc_p,current_cache_size/1024);
+ current_cache_size = 0;
+#endif
+ bi=active;
+ while(bi) {
+ cache_tags[cacheline(bi->pc_p)].handler=(cpuop_func *)popall_execute_normal;
+ cache_tags[cacheline(bi->pc_p)+1].bi=NULL;
+ dbi=bi; bi=bi->next;
+ free_blockinfo(dbi);
+ }
+ bi=dormant;
+ while(bi) {
+ cache_tags[cacheline(bi->pc_p)].handler=(cpuop_func *)popall_execute_normal;
+ cache_tags[cacheline(bi->pc_p)+1].bi=NULL;
+ dbi=bi; bi=bi->next;
+ free_blockinfo(dbi);
+ }
+
+ reset_lists();
+ if (!compiled_code)
+ return;
+ current_compile_p=compiled_code;
+ SPCFLAGS_SET( SPCFLAG_JIT_EXEC_RETURN ); /* To get out of compiled code */
+}
+
+
+/* "Soft flushing" --- instead of actually throwing everything away,
+ we simply mark everything as "needs to be checked".
+*/
+
+static inline void flush_icache_lazy(int n)
+{
+ uae_u32 i;
+ blockinfo* bi;
+ blockinfo* bi2;
+
+ soft_flush_count++;
+ if (!active)
+ return;
+
+ bi=active;
+ while (bi) {
+ uae_u32 cl=cacheline(bi->pc_p);
+ if (bi->status==BI_INVALID ||
+ bi->status==BI_NEED_RECOMP) {
+ if (bi==cache_tags[cl+1].bi)
+ cache_tags[cl].handler=(cpuop_func *)popall_execute_normal;
+ bi->handler_to_use=(cpuop_func *)popall_execute_normal;
+ set_dhtu(bi,bi->direct_pen);
+ bi->status=BI_INVALID;
+ }
+ else {
+ if (bi==cache_tags[cl+1].bi)
+ cache_tags[cl].handler=(cpuop_func *)popall_check_checksum;
+ bi->handler_to_use=(cpuop_func *)popall_check_checksum;
+ set_dhtu(bi,bi->direct_pcc);
+ bi->status=BI_NEED_CHECK;
+ }
+ bi2=bi;
+ bi=bi->next;
+ }
+ /* bi2 is now the last entry in the active list */
+ bi2->next=dormant;
+ if (dormant)
+ dormant->prev_p=&(bi2->next);
+
+ dormant=active;
+ active->prev_p=&dormant;
+ active=NULL;
+}
+
+void flush_icache_range(uae_u8 *start_p, uae_u32 length)
+{
+ if (!active)
+ return;
+
+#if LAZY_FLUSH_ICACHE_RANGE
+ blockinfo *bi = active;
+ while (bi) {
+#if USE_CHECKSUM_INFO
+ bool candidate = false;
+ for (checksum_info *csi = bi->csi; csi; csi = csi->next) {
+ if (((start_p - csi->start_p) < csi->length) ||
+ ((csi->start_p - start_p) < length)) {
+ candidate = true;
+ break;
+ }
+ }
+#else
+ // Assume system is consistent and would invalidate the right range
+ const bool candidate = (bi->pc_p - start_p) < length;
+#endif
+ blockinfo *dbi = bi;
+ bi = bi->next;
+ if (candidate) {
+ uae_u32 cl = cacheline(dbi->pc_p);
+ if (dbi->status == BI_INVALID || dbi->status == BI_NEED_RECOMP) {
+ if (dbi == cache_tags[cl+1].bi)
+ cache_tags[cl].handler = (cpuop_func *)popall_execute_normal;
+ dbi->handler_to_use = (cpuop_func *)popall_execute_normal;
+ set_dhtu(dbi, dbi->direct_pen);
+ dbi->status = BI_INVALID;
+ }
+ else {
+ if (dbi == cache_tags[cl+1].bi)
+ cache_tags[cl].handler = (cpuop_func *)popall_check_checksum;
+ dbi->handler_to_use = (cpuop_func *)popall_check_checksum;
+ set_dhtu(dbi, dbi->direct_pcc);
+ dbi->status = BI_NEED_CHECK;
+ }
+ remove_from_list(dbi);
+ add_to_dormant(dbi);
+ }
+ }
+ return;
+#endif
+ flush_icache(-1);
+}
+
+static void catastrophe(void)
+{
+ abort();
+}
+
+int failure;
+
+#define TARGET_M68K 0
+#define TARGET_POWERPC 1
+#define TARGET_X86 2
+#define TARGET_X86_64 3
+#if defined(i386) || defined(__i386__)
+#define TARGET_NATIVE TARGET_X86
+#endif
+#if defined(powerpc) || defined(__powerpc__)
+#define TARGET_NATIVE TARGET_POWERPC
+#endif
+#if defined(x86_64) || defined(__x86_64__)
+#define TARGET_NATIVE TARGET_X86_64
+#endif
+
+#ifdef ENABLE_MON
+static uae_u32 mon_read_byte_jit(uintptr addr)
+{
+ uae_u8 *m = (uae_u8 *)addr;
+ return (uintptr)(*m);
+}
+
+static void mon_write_byte_jit(uintptr addr, uae_u32 b)
+{
+ uae_u8 *m = (uae_u8 *)addr;
+ *m = b;
+}
+#endif
+
+void disasm_block(int target, uint8 * start, size_t length)
+{
+ if (!JITDebug)
+ return;
+
+#if defined(JIT_DEBUG) && defined(ENABLE_MON)
+ char disasm_str[200];
+ sprintf(disasm_str, "%s $%x $%x",
+ target == TARGET_M68K ? "d68" :
+ target == TARGET_X86 ? "d86" :
+ target == TARGET_X86_64 ? "d8664" :
+ target == TARGET_POWERPC ? "d" : "x",
+ start, start + length - 1);
+
+ uae_u32 (*old_mon_read_byte)(uintptr) = mon_read_byte;
+ void (*old_mon_write_byte)(uintptr, uae_u32) = mon_write_byte;
+
+ mon_read_byte = mon_read_byte_jit;
+ mon_write_byte = mon_write_byte_jit;
+
+ char *arg[5] = {"mon", "-m", "-r", disasm_str, NULL};
+ mon(4, arg);
+
+ mon_read_byte = old_mon_read_byte;
+ mon_write_byte = old_mon_write_byte;
+#endif
+}
+
+static void disasm_native_block(uint8 *start, size_t length)
+{
+ disasm_block(TARGET_NATIVE, start, length);
+}
+
+static void disasm_m68k_block(uint8 *start, size_t length)
+{
+ disasm_block(TARGET_M68K, start, length);
+}
+
+#ifdef HAVE_GET_WORD_UNSWAPPED
+# define DO_GET_OPCODE(a) (do_get_mem_word_unswapped((uae_u16 *)(a)))
+#else
+# define DO_GET_OPCODE(a) (do_get_mem_word((uae_u16 *)(a)))
+#endif
+
+#if JIT_DEBUG
+static uae_u8 *last_regs_pc_p = 0;
+static uae_u8 *last_compiled_block_addr = 0;
+
+void compiler_dumpstate(void)
+{
+ if (!JITDebug)
+ return;
+
+ write_log("### Host addresses\n");
+ write_log("MEM_BASE : %x\n", MEMBaseDiff);
+ write_log("PC_P : %p\n", ®s.pc_p);
+ write_log("SPCFLAGS : %p\n", ®s.spcflags);
+ write_log("D0-D7 : %p-%p\n", ®s.regs[0], ®s.regs[7]);
+ write_log("A0-A7 : %p-%p\n", ®s.regs[8], ®s.regs[15]);
+ write_log("\n");
+
+ write_log("### M68k processor state\n");
+ m68k_dumpstate(0);
+ write_log("\n");
+
+ write_log("### Block in Mac address space\n");
+ write_log("M68K block : %p\n",
+ (void *)(uintptr)get_virtual_address(last_regs_pc_p));
+ write_log("Native block : %p (%d bytes)\n",
+ (void *)(uintptr)get_virtual_address(last_compiled_block_addr),
+ get_blockinfo_addr(last_regs_pc_p)->direct_handler_size);
+ write_log("\n");
+}
+#endif
+
+static void compile_block(cpu_history* pc_hist, int blocklen)
+{
+ if (letit && compiled_code) {
+#if PROFILE_COMPILE_TIME
+ compile_count++;
+ clock_t start_time = clock();
+#endif
+#if JIT_DEBUG
+ bool disasm_block = false;
+#endif
+
+ /* OK, here we need to 'compile' a block */
+ int i;
+ int r;
+ int was_comp=0;
+ uae_u8 liveflags[MAXRUN+1];
+#if USE_CHECKSUM_INFO
+ bool trace_in_rom = isinrom((uintptr)pc_hist[0].location);
+ uintptr max_pcp=(uintptr)pc_hist[blocklen - 1].location;
+ uintptr min_pcp=max_pcp;
+#else
+ uintptr max_pcp=(uintptr)pc_hist[0].location;
+ uintptr min_pcp=max_pcp;
+#endif
+ uae_u32 cl=cacheline(pc_hist[0].location);
+ void* specflags=(void*)®s.spcflags;
+ blockinfo* bi=NULL;
+ blockinfo* bi2;
+ int extra_len=0;
+
+ redo_current_block=0;
+ if (current_compile_p>=max_compile_start)
+ flush_icache_hard(7);
+
+ alloc_blockinfos();
+
+ bi=get_blockinfo_addr_new(pc_hist[0].location,0);
+ bi2=get_blockinfo(cl);
+
+ optlev=bi->optlevel;
+ if (bi->status!=BI_INVALID) {
+ Dif (bi!=bi2) {
+ /* I don't think it can happen anymore. Shouldn't, in
+ any case. So let's make sure... */
+ write_log("WOOOWOO count=%d, ol=%d %p %p\n",
+ bi->count,bi->optlevel,bi->handler_to_use,
+ cache_tags[cl].handler);
+ abort();
+ }
+
+ Dif (bi->count!=-1 && bi->status!=BI_NEED_RECOMP) {
+ write_log("bi->count=%d, bi->status=%d\n",bi->count,bi->status);
+ /* What the heck? We are not supposed to be here! */
+ abort();
+ }
+ }
+ if (bi->count==-1) {
+ optlev++;
+ while (!optcount[optlev])
+ optlev++;
+ bi->count=optcount[optlev]-1;
+ }
+ current_block_pc_p=(uintptr)pc_hist[0].location;
+
+ remove_deps(bi); /* We are about to create new code */
+ bi->optlevel=optlev;
+ bi->pc_p=(uae_u8*)pc_hist[0].location;
+#if USE_CHECKSUM_INFO
+ free_checksum_info_chain(bi->csi);
+ bi->csi = NULL;
+#endif
+
+ liveflags[blocklen]=0x1f; /* All flags needed afterwards */
+ i=blocklen;
+ while (i--) {
+ uae_u16* currpcp=pc_hist[i].location;
+ uae_u32 op=DO_GET_OPCODE(currpcp);
+
+#if USE_CHECKSUM_INFO
+ trace_in_rom = trace_in_rom && isinrom((uintptr)currpcp);
+ if (follow_const_jumps && is_const_jump(op)) {
+ checksum_info *csi = alloc_checksum_info();
+ csi->start_p = (uae_u8 *)min_pcp;
+ csi->length = max_pcp - min_pcp + LONGEST_68K_INST;
+ csi->next = bi->csi;
+ bi->csi = csi;
+ max_pcp = (uintptr)currpcp;
+ }
+ min_pcp = (uintptr)currpcp;
+#else
+ if ((uintptr)currpcp<min_pcp)
+ min_pcp=(uintptr)currpcp;
+ if ((uintptr)currpcp>max_pcp)
+ max_pcp=(uintptr)currpcp;
+#endif
+
+ liveflags[i]=((liveflags[i+1]&
+ (~prop[op].set_flags))|
+ prop[op].use_flags);
+ if (prop[op].is_addx && (liveflags[i+1]&FLAG_Z)==0)
+ liveflags[i]&= ~FLAG_Z;
+ }
+
+#if USE_CHECKSUM_INFO
+ checksum_info *csi = alloc_checksum_info();
+ csi->start_p = (uae_u8 *)min_pcp;
+ csi->length = max_pcp - min_pcp + LONGEST_68K_INST;
+ csi->next = bi->csi;
+ bi->csi = csi;
+#endif
+
+ bi->needed_flags=liveflags[0];
+
+ align_target(align_loops);
+ was_comp=0;
+
+ bi->direct_handler=(cpuop_func *)get_target();
+ set_dhtu(bi,bi->direct_handler);
+ bi->status=BI_COMPILING;
+ current_block_start_target=(uintptr)get_target();
+
+ log_startblock();
+
+ if (bi->count>=0) { /* Need to generate countdown code */
+ raw_mov_l_mi((uintptr)®s.pc_p,(uintptr)pc_hist[0].location);
+ raw_sub_l_mi((uintptr)&(bi->count),1);
+ raw_jl((uintptr)popall_recompile_block);
+ }
+ if (optlev==0) { /* No need to actually translate */
+ /* Execute normally without keeping stats */
+ raw_mov_l_mi((uintptr)®s.pc_p,(uintptr)pc_hist[0].location);
+ raw_jmp((uintptr)popall_exec_nostats);
+ }
+ else {
+ reg_alloc_run=0;
+ next_pc_p=0;
+ taken_pc_p=0;
+ branch_cc=0;
+
+ comp_pc_p=(uae_u8*)pc_hist[0].location;
+ init_comp();
+ was_comp=1;
+
+#ifdef USE_CPU_EMUL_SERVICES
+ raw_sub_l_mi((uintptr)&emulated_ticks,blocklen);
+ raw_jcc_b_oponly(NATIVE_CC_GT);
+ uae_s8 *branchadd=(uae_s8*)get_target();
+ emit_byte(0);
+ raw_call((uintptr)cpu_do_check_ticks);
+ *branchadd=(uintptr)get_target()-((uintptr)branchadd+1);
+#endif
+
+#if JIT_DEBUG
+ if (JITDebug) {
+ raw_mov_l_mi((uintptr)&last_regs_pc_p,(uintptr)pc_hist[0].location);
+ raw_mov_l_mi((uintptr)&last_compiled_block_addr,current_block_start_target);
+ }
+#endif
+
+ for (i=0;i<blocklen &&
+ get_target_noopt()<max_compile_start;i++) {
+ cpuop_func **cputbl;
+ compop_func **comptbl;
+ uae_u32 opcode=DO_GET_OPCODE(pc_hist[i].location);
+ needed_flags=(liveflags[i+1] & prop[opcode].set_flags);
+ if (!needed_flags) {
+ cputbl=nfcpufunctbl;
+ comptbl=nfcompfunctbl;
+ }
+ else {
+ cputbl=cpufunctbl;
+ comptbl=compfunctbl;
+ }
+
+#if FLIGHT_RECORDER
+ {
+ mov_l_ri(S1, get_virtual_address((uae_u8 *)(pc_hist[i].location)) | 1);
+ clobber_flags();
+ remove_all_offsets();
+ int arg = readreg_specific(S1,4,REG_PAR1);
+ prepare_for_call_1();
+ unlock2(arg);
+ prepare_for_call_2();
+ raw_call((uintptr)m68k_record_step);
+ }
+#endif
+
+ failure = 1; // gb-- defaults to failure state
+ if (comptbl[opcode] && optlev>1) {
+ failure=0;
+ if (!was_comp) {
+ comp_pc_p=(uae_u8*)pc_hist[i].location;
+ init_comp();
+ }
+ was_comp=1;
+
+ comptbl[opcode](opcode);
+ freescratch();
+ if (!(liveflags[i+1] & FLAG_CZNV)) {
+ /* We can forget about flags */
+ dont_care_flags();
+ }
+#if INDIVIDUAL_INST
+ flush(1);
+ nop();
+ flush(1);
+ was_comp=0;
+#endif
+ }
+
+ if (failure) {
+ if (was_comp) {
+ flush(1);
+ was_comp=0;
+ }
+ raw_mov_l_ri(REG_PAR1,(uae_u32)opcode);
+#if USE_NORMAL_CALLING_CONVENTION
+ raw_push_l_r(REG_PAR1);
+#endif
+ raw_mov_l_mi((uintptr)®s.pc_p,
+ (uintptr)pc_hist[i].location);
+ raw_call((uintptr)cputbl[opcode]);
+#if PROFILE_UNTRANSLATED_INSNS
+ // raw_cputbl_count[] is indexed with plain opcode (in m68k order)
+ raw_add_l_mi((uintptr)&raw_cputbl_count[cft_map(opcode)],1);
+#endif
+#if USE_NORMAL_CALLING_CONVENTION
+ raw_inc_sp(4);
+#endif
+
+ if (i < blocklen - 1) {
+ uae_s8* branchadd;
+
+ raw_mov_l_rm(0,(uintptr)specflags);
+ raw_test_l_rr(0,0);
+ raw_jz_b_oponly();
+ branchadd=(uae_s8 *)get_target();
+ emit_byte(0);
+ raw_jmp((uintptr)popall_do_nothing);
+ *branchadd=(uintptr)get_target()-(uintptr)branchadd-1;
+ }
+ }
+ }
+#if 1 /* This isn't completely kosher yet; It really needs to be
+ be integrated into a general inter-block-dependency scheme */
+ if (next_pc_p && taken_pc_p &&
+ was_comp && taken_pc_p==current_block_pc_p) {
+ blockinfo* bi1=get_blockinfo_addr_new((void*)next_pc_p,0);
+ blockinfo* bi2=get_blockinfo_addr_new((void*)taken_pc_p,0);
+ uae_u8 x=bi1->needed_flags;
+
+ if (x==0xff || 1) { /* To be on the safe side */
+ uae_u16* next=(uae_u16*)next_pc_p;
+ uae_u32 op=DO_GET_OPCODE(next);
+
+ x=0x1f;
+ x&=(~prop[op].set_flags);
+ x|=prop[op].use_flags;
+ }
+
+ x|=bi2->needed_flags;
+ if (!(x & FLAG_CZNV)) {
+ /* We can forget about flags */
+ dont_care_flags();
+ extra_len+=2; /* The next instruction now is part of this
+ block */
+ }
+
+ }
+#endif
+ log_flush();
+
+ if (next_pc_p) { /* A branch was registered */
+ uintptr t1=next_pc_p;
+ uintptr t2=taken_pc_p;
+ int cc=branch_cc;
+
+ uae_u32* branchadd;
+ uae_u32* tba;
+ bigstate tmp;
+ blockinfo* tbi;
+
+ if (taken_pc_p<next_pc_p) {
+ /* backward branch. Optimize for the "taken" case ---
+ which means the raw_jcc should fall through when
+ the 68k branch is taken. */
+ t1=taken_pc_p;
+ t2=next_pc_p;
+ cc=branch_cc^1;
+ }
+
+ tmp=live; /* ouch! This is big... */
+ raw_jcc_l_oponly(cc);
+ branchadd=(uae_u32*)get_target();
+ emit_long(0);
+
+ /* predicted outcome */
+ tbi=get_blockinfo_addr_new((void*)t1,1);
+ match_states(tbi);
+ raw_cmp_l_mi((uintptr)specflags,0);
+ raw_jcc_l_oponly(4);
+ tba=(uae_u32*)get_target();
+ emit_long(get_handler(t1)-((uintptr)tba+4));
+ raw_mov_l_mi((uintptr)®s.pc_p,t1);
+ flush_reg_count();
+ raw_jmp((uintptr)popall_do_nothing);
+ create_jmpdep(bi,0,tba,t1);
+
+ align_target(align_jumps);
+ /* not-predicted outcome */
+ *branchadd=(uintptr)get_target()-((uintptr)branchadd+4);
+ live=tmp; /* Ouch again */
+ tbi=get_blockinfo_addr_new((void*)t2,1);
+ match_states(tbi);
+
+ //flush(1); /* Can only get here if was_comp==1 */
+ raw_cmp_l_mi((uintptr)specflags,0);
+ raw_jcc_l_oponly(4);
+ tba=(uae_u32*)get_target();
+ emit_long(get_handler(t2)-((uintptr)tba+4));
+ raw_mov_l_mi((uintptr)®s.pc_p,t2);
+ flush_reg_count();
+ raw_jmp((uintptr)popall_do_nothing);
+ create_jmpdep(bi,1,tba,t2);
+ }
+ else
+ {
+ if (was_comp) {
+ flush(1);
+ }
+ flush_reg_count();
+
+ /* Let's find out where next_handler is... */
+ if (was_comp && isinreg(PC_P)) {
+ r=live.state[PC_P].realreg;
+ raw_and_l_ri(r,TAGMASK);
+ int r2 = (r==0) ? 1 : 0;
+ raw_mov_l_ri(r2,(uintptr)popall_do_nothing);
+ raw_cmp_l_mi((uintptr)specflags,0);
+ raw_cmov_l_rm_indexed(r2,(uintptr)cache_tags,r,SIZEOF_VOID_P,NATIVE_CC_EQ);
+ raw_jmp_r(r2);
+ }
+ else if (was_comp && isconst(PC_P)) {
+ uae_u32 v=live.state[PC_P].val;
+ uae_u32* tba;
+ blockinfo* tbi;
+
+ tbi=get_blockinfo_addr_new((void*)(uintptr)v,1);
+ match_states(tbi);
+
+ raw_cmp_l_mi((uintptr)specflags,0);
+ raw_jcc_l_oponly(4);
+ tba=(uae_u32*)get_target();
+ emit_long(get_handler(v)-((uintptr)tba+4));
+ raw_mov_l_mi((uintptr)®s.pc_p,v);
+ raw_jmp((uintptr)popall_do_nothing);
+ create_jmpdep(bi,0,tba,v);
+ }
+ else {
+ r=REG_PC_TMP;
+ raw_mov_l_rm(r,(uintptr)®s.pc_p);
+ raw_and_l_ri(r,TAGMASK);
+ int r2 = (r==0) ? 1 : 0;
+ raw_mov_l_ri(r2,(uintptr)popall_do_nothing);
+ raw_cmp_l_mi((uintptr)specflags,0);
+ raw_cmov_l_rm_indexed(r2,(uintptr)cache_tags,r,SIZEOF_VOID_P,NATIVE_CC_EQ);
+ raw_jmp_r(r2);
+ }
+ }
+ }
+
+#if USE_MATCH
+ if (callers_need_recompile(&live,&(bi->env))) {
+ mark_callers_recompile(bi);
+ }
+
+ big_to_small_state(&live,&(bi->env));
+#endif
+
+#if USE_CHECKSUM_INFO
+ remove_from_list(bi);
+ if (trace_in_rom) {
+ // No need to checksum that block trace on cache invalidation
+ free_checksum_info_chain(bi->csi);
+ bi->csi = NULL;
+ add_to_dormant(bi);
+ }
+ else {
+ calc_checksum(bi,&(bi->c1),&(bi->c2));
+ add_to_active(bi);
+ }
+#else
+ if (next_pc_p+extra_len>=max_pcp &&
+ next_pc_p+extra_len<max_pcp+LONGEST_68K_INST)
+ max_pcp=next_pc_p+extra_len; /* extra_len covers flags magic */
+ else
+ max_pcp+=LONGEST_68K_INST;
+
+ bi->len=max_pcp-min_pcp;
+ bi->min_pcp=min_pcp;
+
+ remove_from_list(bi);
+ if (isinrom(min_pcp) && isinrom(max_pcp)) {
+ add_to_dormant(bi); /* No need to checksum it on cache flush.
+ Please don't start changing ROMs in
+ flight! */
+ }
+ else {
+ calc_checksum(bi,&(bi->c1),&(bi->c2));
+ add_to_active(bi);
+ }
+#endif
+
+ current_cache_size += get_target() - (uae_u8 *)current_compile_p;
+
+#if JIT_DEBUG
+ if (JITDebug)
+ bi->direct_handler_size = get_target() - (uae_u8 *)current_block_start_target;
+
+ if (JITDebug && disasm_block) {
+ uaecptr block_addr = start_pc + ((char *)pc_hist[0].location - (char *)start_pc_p);
+ D(bug("M68K block @ 0x%08x (%d insns)\n", block_addr, blocklen));
+ uae_u32 block_size = ((uae_u8 *)pc_hist[blocklen - 1].location - (uae_u8 *)pc_hist[0].location) + 1;
+ disasm_m68k_block((uae_u8 *)pc_hist[0].location, block_size);
+ D(bug("Compiled block @ 0x%08x\n", pc_hist[0].location));
+ disasm_native_block((uae_u8 *)current_block_start_target, bi->direct_handler_size);
+ getchar();
+ }
+#endif
+
+ log_dump();
+ align_target(align_jumps);
+
+ /* This is the non-direct handler */
+ bi->handler=
+ bi->handler_to_use=(cpuop_func *)get_target();
+ raw_cmp_l_mi((uintptr)®s.pc_p,(uintptr)pc_hist[0].location);
+ raw_jnz((uintptr)popall_cache_miss);
+ comp_pc_p=(uae_u8*)pc_hist[0].location;
+
+ bi->status=BI_FINALIZING;
+ init_comp();
+ match_states(bi);
+ flush(1);
+
+ raw_jmp((uintptr)bi->direct_handler);
+
+ current_compile_p=get_target();
+ raise_in_cl_list(bi);
+
+ /* We will flush soon, anyway, so let's do it now */
+ if (current_compile_p>=max_compile_start)
+ flush_icache_hard(7);
+
+ bi->status=BI_ACTIVE;
+ if (redo_current_block)
+ block_need_recompile(bi);
+
+#if PROFILE_COMPILE_TIME
+ compile_time += (clock() - start_time);
+#endif
+ }
+
+ /* Account for compilation time */
+ cpu_do_check_ticks();
+}
+
+void do_nothing(void)
+{
+ /* What did you expect this to do? */
+}
+
+void exec_nostats(void)
+{
+ for (;;) {
+ uae_u32 opcode = GET_OPCODE;
+#if FLIGHT_RECORDER
+ m68k_record_step(m68k_getpc());
+#endif
+ (*cpufunctbl[opcode])(opcode);
+ cpu_check_ticks();
+ if (end_block(opcode) || SPCFLAGS_TEST(SPCFLAG_ALL)) {
+ return; /* We will deal with the spcflags in the caller */
+ }
+ }
+}
+
+void execute_normal(void)
+{
+ if (!check_for_cache_miss()) {
+ cpu_history pc_hist[MAXRUN];
+ int blocklen = 0;
+#if REAL_ADDRESSING || DIRECT_ADDRESSING
+ start_pc_p = regs.pc_p;
+ start_pc = get_virtual_address(regs.pc_p);
+#else
+ start_pc_p = regs.pc_oldp;
+ start_pc = regs.pc;
+#endif
+ for (;;) { /* Take note: This is the do-it-normal loop */
+ pc_hist[blocklen++].location = (uae_u16 *)regs.pc_p;
+ uae_u32 opcode = GET_OPCODE;
+#if FLIGHT_RECORDER
+ m68k_record_step(m68k_getpc());
+#endif
+ (*cpufunctbl[opcode])(opcode);
+ cpu_check_ticks();
+ if (end_block(opcode) || SPCFLAGS_TEST(SPCFLAG_ALL) || blocklen>=MAXRUN) {
+ compile_block(pc_hist, blocklen);
+ return; /* We will deal with the spcflags in the caller */
+ }
+ /* No need to check regs.spcflags, because if they were set,
+ we'd have ended up inside that "if" */
+ }
+ }
+}
+
+typedef void (*compiled_handler)(void);
+
+static void m68k_do_compile_execute(void)
+{
+ for (;;) {
+ ((compiled_handler)(pushall_call_handler))();
+ /* Whenever we return from that, we should check spcflags */
+ if (SPCFLAGS_TEST(SPCFLAG_ALL)) {
+ if (m68k_do_specialties ())
+ return;
+ }
+ }
+}
+
+void m68k_compile_execute (void)
+{
+ for (;;) {
+ if (quit_program)
+ break;
+ m68k_do_compile_execute();
+ }
+}
* cputbl.h that way), but cpuopti can't cope. That could be fixed, but
* I don't dare to touch the 68k version. */
- headerfile = fopen ("comptbl.h", "wb");
- stblfile = fopen ("compstbl.c", "wb");
- freopen ("compemu.c", "wb", stdout);
+ headerfile = fopen ("jit/comptbl.h", "wb");
+ stblfile = fopen ("jit/compstbl.c", "wb");
+ freopen ("jit/compemu.c", "wb", stdout);
generate_includes (stdout);
generate_includes (stblfile);
static struct romlist *rl;
static int romlist_cnt;
-void romlist_add (char *path, struct romdata *rd)
+char *romlist_get (struct romdata *rd)
{
- struct romlist *rl2;
+ int i;
- romlist_cnt++;
- rl = (struct romlist*)realloc (rl, sizeof (struct romlist) * romlist_cnt);
- rl2 = rl + romlist_cnt - 1;
- rl2->path = my_strdup (path);
- rl2->rd = rd;
+ if (!rd)
+ return 0;
+ for (i = 0; i < romlist_cnt; i++) {
+ if (rl[i].rd->id == rd->id)
+ return rl[i].path;
+ }
+ return 0;
}
-char *romlist_get (struct romdata *rd)
+static struct romlist *romlist_getrl (struct romdata *rd)
{
int i;
return 0;
for (i = 0; i < romlist_cnt; i++) {
if (rl[i].rd == rd)
- return rl[i].path;
+ return &rl[i];
}
return 0;
}
-void romlist_clear (void)
+static void romlist_cleanup (void);
+void romlist_add (char *path, struct romdata *rd)
{
- xfree (rl);
- rl = 0;
- romlist_cnt = 0;
+ struct romlist *rl2;
+
+ if (path == NULL || rd == NULL) {
+ romlist_cleanup ();
+ return;
+ }
+ romlist_cnt++;
+ rl = (struct romlist*)realloc (rl, sizeof (struct romlist) * romlist_cnt);
+ rl2 = rl + romlist_cnt - 1;
+ rl2->path = my_strdup (path);
+ rl2->rd = rd;
}
+
struct romdata *getromdatabypath(char *path)
{
int i;
return NULL;
}
-#define NEXT_ROM_ID 73
+#define NEXT_ROM_ID 72
static struct romheader romheaders[] = {
{ "Freezer Cartridges", 1 },
0xe0f37258, 0xC39BD909,0x4D4E5F4E,0x28C1411F,0x30869504,0x06062E87 },
{ "KS ROM v1.4 (A3000)", 1, 4, 36, 16, "A3000\0", 524288, 59, 3, 0, ROMTYPE_KICK, 0, 0,
0xbc0ec13f, 0xF76316BF,0x36DFF14B,0x20FA349E,0xD02E4B11,0xDD932B07 },
-
+ ALTROM(59, 1, 1, 262144, ROMTYPE_EVEN, 0x58327536,0xd1713d7f,0x31474a59,0x48e6d488,0xe3368606,0x1cf3d1e2)
+ ALTROM(59, 1, 2, 262144, ROMTYPE_ODD , 0xfe2f7fb9,0xc05c9c52,0xd014c66f,0x9019152b,0x3f2a2adc,0x2c678794)
{ "KS ROM v2.04 (A500+)", 2, 4, 37, 175, "A500+\0", 524288, 7, 0, 0, ROMTYPE_KICK, 0, 0,
0xc3bdb240, 0xC5839F5C,0xB98A7A89,0x47065C3E,0xD2F14F5F,0x42E334A1 },
{ "KS ROM v2.05 (A600)", 2, 5, 37, 299, "A600\0", 524288, 8, 0, 0, ROMTYPE_KICK, 0, 0,
0x64466c2a, 0xF72D8914,0x8DAC39C6,0x96E30B10,0x859EBC85,0x9226637B },
{ "KS ROM v2.05 (A600HD)", 2, 5, 37, 350, "A600HD\0A600\0", 524288, 10, 0, 0, ROMTYPE_KICK, 0, 0,
0x43b0df7b, 0x02843C42,0x53BBD29A,0xBA535B0A,0xA3BD9A85,0x034ECDE4 },
- { "KS ROM v2.04 (A3000)", 2, 4, 37, 132, "A3000\0", 524288, 71, 3, 0, ROMTYPE_KICK, 0, 0,
+ { "KS ROM v2.04 (A3000)", 2, 4, 37, 175, "A3000\0", 524288, 71, 3, 0, ROMTYPE_KICK, 0, 0,
0x234a7233, 0xd82ebb59,0xafc53540,0xddf2d718,0x7ecf239b,0x7ea91590 },
ALTROM(71, 1, 1, 262144, ROMTYPE_EVEN, 0x7db1332b,0x48f14b31,0x279da675,0x7848df6f,0xeb531881,0x8f8f576c)
ALTROM(71, 1, 2, 262144, ROMTYPE_ODD , 0xa245dbdf,0x83bab8e9,0x5d378b55,0xb0c6ae65,0x61385a96,0xf638598f)
{ "KS ROM v3.0 (A1200)", 3, 0, 39, 106, "A1200\0", 524288, 11, 0, 0, ROMTYPE_KICK, 0, 0,
0x6c9b07d2, 0x70033828,0x182FFFC7,0xED106E53,0x73A8B89D,0xDA76FAA5 },
+ ALTROM(11, 1, 1, 262144, ROMTYPE_EVEN, 0xc742a412,0x999eb81c,0x65dfd07a,0x71ee1931,0x5d99c7eb,0x858ab186)
+ ALTROM(11, 1, 2, 262144, ROMTYPE_ODD , 0xd55c6ec6,0x3341108d,0x3a402882,0xb5ef9d3b,0x242cbf3c,0x8ab1a3e9)
{ "KS ROM v3.0 (A4000)", 3, 0, 39, 106, "A4000\0", 524288, 12, 2 | 4, 0, ROMTYPE_KICK, 0, 0,
0x9e6ac152, 0xF0B4E9E2,0x9E12218C,0x2D5BD702,0x0E4E7852,0x97D91FD7 },
+ ALTROM(12, 1, 1, 262144, ROMTYPE_EVEN, 0x36f64dd0,0x196e9f3f,0x9cad934e,0x181c07da,0x33083b1f,0x0a3c702f)
+ ALTROM(12, 1, 2, 262144, ROMTYPE_ODD , 0x17266a55,0x42fbed34,0x53d1f11c,0xcbde89a9,0x826f2d11,0x75cca5cc)
{ "KS ROM v3.1 (A4000)", 3, 1, 40, 70, "A4000\0", 524288, 13, 2 | 4, 0, ROMTYPE_KICK, 0, 0,
0x2b4566f1, 0x81c631dd,0x096bbb31,0xd2af9029,0x9c76b774,0xdb74076c },
+ ALTROM(13, 1, 1, 262144, ROMTYPE_EVEN, 0xf9cbecc9,0x138d8cb4,0x3b8312fe,0x16d69070,0xde607469,0xb3d4078e)
+ ALTROM(13, 1, 2, 262144, ROMTYPE_ODD , 0xf8248355,0xc2379547,0x9fae3910,0xc185512c,0xa268b82f,0x1ae4fe05)
{ "KS ROM v3.1 (A500,A600,A2000)", 3, 1, 40, 63, "A500\0A600\0A2000\0", 524288, 14, 0, 0, ROMTYPE_KICK, 0, 0,
0xfc24ae0d, 0x3B7F1493,0xB27E2128,0x30F989F2,0x6CA76C02,0x049F09CA },
{ "KS ROM v3.1 (A1200)", 3, 1, 40, 68, "A1200\0", 524288, 15, 1, 0, ROMTYPE_KICK, 0, 0,
0x1483a091, 0xE2154572,0x3FE8374E,0x91342617,0x604F1B3D,0x703094F1 },
+ ALTROM(15, 1, 1, 262144, ROMTYPE_EVEN, 0x08dbf275,0xb8800f5f,0x90929810,0x9ea69690,0xb1b8523f,0xa22ddb37)
+ ALTROM(15, 1, 2, 262144, ROMTYPE_ODD , 0x16c07bf8,0x90e331be,0x1970b0e5,0x3f53a9b0,0x390b51b5,0x9b3869c2)
{ "KS ROM v3.1 (A3000)", 3, 1, 40, 68, "A3000\0", 524288, 61, 2, 0, ROMTYPE_KICK, 0, 0,
0xefb239cc, 0xF8E210D7,0x2B4C4853,0xE0C9B85D,0x223BA20E,0x3D1B36EE },
+ ALTROM(61, 1, 1, 262144, ROMTYPE_EVEN, 0x286b9a0d,0x6763a225,0x8ec493f7,0x408cf663,0x110dae9a,0x17803ad1)
+ ALTROM(61, 1, 2, 262144, ROMTYPE_ODD , 0x0b8cde6a,0x5f02e97b,0x48ebbba8,0x7d516a56,0xb0400c6f,0xc3434d8d)
{ "KS ROM v3.1 (A4000)(Cloanto)", 3, 1, 40, 68, "A4000\0", 524288, 31, 2 | 4, 1, ROMTYPE_KICK, 0, 0,
0x43b6dd22, 0xC3C48116,0x0866E60D,0x085E436A,0x24DB3617,0xFF60B5F9 },
{ "KS ROM v3.1 (A4000)", 3, 1, 40, 68, "A4000\0", 524288, 16, 2 | 4, 0, ROMTYPE_KICK, 0, 0,
0xd6bae334, 0x5FE04842,0xD04A4897,0x20F0F4BB,0x0E469481,0x99406F49 },
+ ALTROM(16, 1, 1, 262144, ROMTYPE_EVEN, 0xb2af34f8,0x24e52b5e,0xfc020495,0x17387ab7,0xb1a1475f,0xc540350e)
+ ALTROM(16, 1, 2, 262144, ROMTYPE_ODD , 0xe65636a3,0x313c7cbd,0xa5779e56,0xf19a41d3,0x4e760f51,0x7626d882)
{ "KS ROM v3.1 (A4000T)", 3, 1, 40, 70, "A4000T\0", 524288, 17, 2 | 4, 0, ROMTYPE_KICK, 0, 0,
0x75932c3a, 0xB0EC8B84,0xD6768321,0xE01209F1,0x1E6248F2,0xF5281A21 },
+ ALTROM(17, 1, 1, 262144, ROMTYPE_EVEN, 0x0ca94f70,0xb3806eda,0xcb3362fc,0x16a154ce,0x1eeec5bf,0x5bc24789)
+ ALTROM(17, 1, 2, 262144, ROMTYPE_ODD , 0xdfe03120,0xcd7a706c,0x431b04d8,0x7814d3a2,0xd8b39710,0x0cf44c0c)
{ "KS ROM v3.X (A4000)(Cloanto)", 3, 10, 45, 57, "A4000\0", 524288, 46, 2 | 4, 0, ROMTYPE_KICK, 0, 0,
0x08b69382, 0x81D3AEA3,0x0DB7FBBB,0x4AFEE41C,0x21C5ED66,0x2B70CA53 },
0x87746be2, 0x5BEF3D62,0x8CE59CC0,0x2A66E6E4,0xAE0DA48F,0x60E78F7F },
{ "CD32 ROM (KS + extended)", 3, 1, 40, 60, "CD32\0", 2 * 524288, 64, 1, 0, ROMTYPE_KICKCD32 | ROMTYPE_EXTCD32, 0, 0,
0xd3837ae4, 0x06807db3,0x18163745,0x5f4d4658,0x2d9972af,0xec8956d9 },
- { "CD32 MPEG Cartridge ROM", 3, 1, 40, 30, "CD32\0", 262144, 72, 1, 0, ROMTYPE_CD32CART, 0, 0,
+ { "CD32 MPEG Cartridge ROM", 3, 1, 40, 30, "CD32\0", 262144, 23, 1, 0, ROMTYPE_CD32CART, 0, 0,
0xc35c37bf, 0x03ca81c7,0xa7b259cf,0x64bc9582,0x863eca0f,0x6529f435 },
{ "CDTV extended ROM v1.00", 1, 0, 1, 0, "CDTV\0", 262144, 20, 0, 0, ROMTYPE_EXTCDTV, 0, 0,
0x42baa124, 0x7BA40FFA,0x17E500ED,0x9FED041F,0x3424BD81,0xD9C907BE },
- ALTROM(20, 1, 1, 131072, ROMTYPE_EVEN, 0x791cb14b,0x277a1778,0x92449635,0x3ffe56be,0x68063d2a,0x334360e4)
- ALTROM(20, 1, 2, 131072, ROMTYPE_ODD, 0xaccbbc2e,0x41b06d16,0x79c6e693,0x3c3378b7,0x626025f7,0x641ebc5c)
+ ALTROM(20, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x791cb14b,0x277a1778,0x92449635,0x3ffe56be,0x68063d2a,0x334360e4)
+ ALTROM(20, 1, 2, 131072, ROMTYPE_ODD | ROMTYPE_8BIT, 0xaccbbc2e,0x41b06d16,0x79c6e693,0x3c3378b7,0x626025f7,0x641ebc5c)
{ "CDTV extended ROM v2.07", 2, 7, 2, 7, "CDTV\0", 262144, 22, 0, 0, ROMTYPE_EXTCDTV, 0, 0,
0xceae68d2, 0x5BC114BB,0xA29F60A6,0x14A31174,0x5B3E2464,0xBFA06846 },
+ ALTROM(22, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x36d73cb8,0x9574e546,0x4b390697,0xf28f9a43,0x4e604e5e,0xf5e5490a)
+ ALTROM(22, 1, 2, 131072, ROMTYPE_ODD | ROMTYPE_8BIT, 0x6e84dce7,0x01a0679e,0x895a1a0f,0x559c7253,0xf539606b,0xd447b54f)
{ "CDTV extended ROM v2.30", 2, 30, 2, 30, "CDTV\0", 262144, 21, 0, 0, ROMTYPE_EXTCDTV, 0, 0,
0x30b54232, 0xED7E461D,0x1FFF3CDA,0x321631AE,0x42B80E3C,0xD4FA5EBB },
+ ALTROM(21, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x48e4d74f,0x54946054,0x2269e410,0x36018402,0xe1f6b855,0xfd89092b)
+ ALTROM(21, 1, 2, 131072, ROMTYPE_ODD | ROMTYPE_8BIT, 0x8a54f362,0x03df800f,0x032046fd,0x892f6e7e,0xec08b76d,0x33981e8c)
- { "A1000 bootstrap ROM", 0, 0, 0, 0, "A1000\0", 8192, 23, 0, 0, ROMTYPE_KICK, 0, 0,
- 0x62f11c04, 0xC87F9FAD,0xA4EE4E69,0xF3CCA0C3,0x6193BE82,0x2B9F5FE6 },
{ "A1000 bootstrap ROM", 0, 0, 0, 0, "A1000\0", 65536, 24, 0, 0, ROMTYPE_KICK, 0, 0,
0x0b1ad2d0, 0xBA93B8B8,0x5CA0D83A,0x68225CC3,0x3B95050D,0x72D2FDD7 },
- ALTROM(23, 1, 1, 65536, 0, 0x0b1ad2d0,0xBA93B8B8,0x5CA0D83A,0x68225CC3,0x3B95050D,0x72D2FDD7)
- ALTROM(23, 2, 1, 4096, ROMTYPE_EVEN, 0x42553bc4,0x8855a97f,0x7a44e3f6,0x2d1c88d9,0x38fee1f4,0xc606af5b)
- ALTROM(23, 2, 2, 4096, ROMTYPE_ODD , 0x8e5b9a37,0xd10f1564,0xb99f5ffe,0x108fa042,0x362e877f,0x569de2c3)
+ ALTROM(24, 1, 1, 8192, 0, 0x62f11c04, 0xC87F9FAD,0xA4EE4E69,0xF3CCA0C3,0x6193BE82,0x2B9F5FE6)
+ ALTROM(24, 2, 1, 4096, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x42553bc4,0x8855a97f,0x7a44e3f6,0x2d1c88d9,0x38fee1f4,0xc606af5b)
+ ALTROM(24, 2, 2, 4096, ROMTYPE_ODD | ROMTYPE_8BIT, 0x8e5b9a37,0xd10f1564,0xb99f5ffe,0x108fa042,0x362e877f,0x569de2c3)
{ "Freezer: Action Replay Mk I v1.00", 1, 0, 1, 0, "AR\0", 65536, 52, 0, 0, ROMTYPE_AR, 0, 1,
0x2d921771, 0x1EAD9DDA,0x2DAD2914,0x6441F5EF,0x72183750,0x22E01248 },
+ ALTROM(52, 1, 1, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x82d6eb87, 0x7c9bac11,0x28666017,0xeee6f019,0x63fb3890,0x7fbea355)
+ ALTROM(52, 1, 2, 32768, ROMTYPE_ODD | ROMTYPE_8BIT, 0x40ae490c, 0x81d8e432,0x01b73fd9,0x2e204ebd,0x68af8602,0xb62ce397)
{ "Freezer: Action Replay Mk I v1.50", 1, 50, 1, 50, "AR\0", 65536, 25, 0, 0, ROMTYPE_AR, 0, 1,
0xd4ce0675, 0x843B433B,0x2C56640E,0x045D5FDC,0x854DC6B1,0xA4964E7C },
+ ALTROM(25, 1, 1, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x7fbd6de2, 0xb5f71a5c,0x09d65ecc,0xa8a3bc93,0x93558461,0xca190228)
+ ALTROM(25, 1, 2, 32768, ROMTYPE_ODD | ROMTYPE_8BIT, 0x43018069, 0xad8ff242,0xb2cbf125,0x1fc53a73,0x581cf57a,0xb69cee00)
{ "Freezer: Action Replay Mk II v2.05", 2, 5, 2, 5, "AR\0", 131072, 26, 0, 0, ROMTYPE_AR, 0, 1,
0x1287301f, 0xF6601DE8,0x888F0050,0x72BF562B,0x9F533BBC,0xAF1B0074 },
{ "Freezer: Action Replay Mk II v2.12", 2, 12, 2, 12, "AR\0", 131072, 27, 0, 0, ROMTYPE_AR, 0, 1,
0xe668a0be, 0x633A6E65,0xA93580B8,0xDDB0BE9C,0x9A64D4A1,0x7D4B4801 },
{ "Freezer: X-Power Professional 500 v1.2", 1, 2, 1, 2, "XPOWER\0", 131072, 65, 0, 0, ROMTYPE_XPOWER, 0, 1,
0x9e70c231, 0xa2977a1c,0x41a8ca7d,0x4af4a168,0x726da542,0x179d5963 },
- ALTROM(65, 1, 1, 65536, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED, 0xf98742e4,0xe8e683ba,0xd8b38d1f,0x79f3ad83,0xa9e67c6f,0xa91dc96c)
- ALTROM(65, 1, 2, 65536, ROMTYPE_ODD |ROMTYPE_SCRAMBLED, 0xdfb9984b,0x8d6bdd49,0x469ec8e2,0x0143fbb3,0x72e92500,0x99f07910)
+ ALTROM(65, 1, 1, 65536, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0xf98742e4,0xe8e683ba,0xd8b38d1f,0x79f3ad83,0xa9e67c6f,0xa91dc96c)
+ ALTROM(65, 1, 2, 65536, ROMTYPE_ODD |ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0xdfb9984b,0x8d6bdd49,0x469ec8e2,0x0143fbb3,0x72e92500,0x99f07910)
{ "Freezer: X-Power Professional 500 v1.3", 1, 2, 1, 2, "XPOWER\0", 131072, 68, 0, 0, ROMTYPE_XPOWER, 0, 1,
0x31e057f0, 0x84650266,0x465d1859,0x7fd71dee,0x00775930,0xb7e450ee },
- ALTROM(68, 1, 1, 65536, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED, 0x0b2ce0c7,0x45ad5456,0x89192404,0x956f47ce,0xf66a5274,0x57ace33b)
- ALTROM(68, 1, 2, 65536, ROMTYPE_ODD |ROMTYPE_SCRAMBLED, 0x34580c35,0x8ad42566,0x7364f238,0x978f4381,0x08f8d5ec,0x470e72ea)
+ ALTROM(68, 1, 1, 65536, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0x0b2ce0c7,0x45ad5456,0x89192404,0x956f47ce,0xf66a5274,0x57ace33b)
+ ALTROM(68, 1, 2, 65536, ROMTYPE_ODD |ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0x34580c35,0x8ad42566,0x7364f238,0x978f4381,0x08f8d5ec,0x470e72ea)
{ "Freezer: Nordic Power v1.5", 1, 5, 1, 5, "NPOWER\0", 65536, 69, 0, 0, ROMTYPE_NORDIC, 0, 1,
0x83b4b21c, 0xc56ced25,0x506a5aab,0x3fa13813,0x4fc9e5ae,0x0f9d3709 },
- ALTROM(69, 1, 1, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED, 0xdd207174,0xae67652d,0x64f5db20,0x0f4b2110,0xee59567f,0xfbd90a1b)
- ALTROM(69, 1, 2, 32768, ROMTYPE_ODD |ROMTYPE_SCRAMBLED, 0x8f93d85d,0x73c62d21,0x40c0c092,0x6315b702,0xdd5d0f05,0x3dad7fab)
+ ALTROM(69, 1, 1, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0xdd207174,0xae67652d,0x64f5db20,0x0f4b2110,0xee59567f,0xfbd90a1b)
+ ALTROM(69, 1, 2, 32768, ROMTYPE_ODD |ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0x8f93d85d,0x73c62d21,0x40c0c092,0x6315b702,0xdd5d0f05,0x3dad7fab)
{ "Freezer: Nordic Power v2.0", 2, 0, 2, 0, "NPOWER\0", 65536, 67, 0, 0, ROMTYPE_NORDIC, 0, 1,
0xa4db2906, 0x0aec68f7,0x25470c89,0x6b699ff4,0x6623dec5,0xc777466e },
- ALTROM(67, 1, 1, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED, 0xb21be46c,0x50dc607c,0xce976bbd,0x3841eaf0,0x591ddc7e,0xa1939ad2)
- ALTROM(67, 1, 2, 32768, ROMTYPE_ODD |ROMTYPE_SCRAMBLED, 0x96057aed,0xdd9209e2,0x1d5edfc1,0xcdb52abe,0x93de0f35,0xc43da696)
+ ALTROM(67, 1, 1, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0xb21be46c,0x50dc607c,0xce976bbd,0x3841eaf0,0x591ddc7e,0xa1939ad2)
+ ALTROM(67, 1, 2, 32768, ROMTYPE_ODD |ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0x96057aed,0xdd9209e2,0x1d5edfc1,0xcdb52abe,0x93de0f35,0xc43da696)
{ "Freezer: Nordic Power v3.0", 3, 0, 3, 0, "NPOWER\0", 65536, 70, 0, 0, ROMTYPE_NORDIC, 0, 1,
0x72850aef, 0x59c91d1f,0xa8f118f9,0x0bdba05a,0x9ae788d7,0x7a6cc7c9 },
- ALTROM(70, 1, 1, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED, 0xf3330e1f,0x3a597db2,0xb7d11b6c,0xb8e13496,0xc215f223,0x88c4ca3c)
- ALTROM(70, 1, 2, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED, 0xee58e0f9,0x4148f4cb,0xb42cec33,0x8ca144de,0xd4f54118,0xe0f185dd)
+ ALTROM(70, 1, 1, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0xf3330e1f,0x3a597db2,0xb7d11b6c,0xb8e13496,0xc215f223,0x88c4ca3c)
+ ALTROM(70, 1, 2, 32768, ROMTYPE_EVEN|ROMTYPE_SCRAMBLED|ROMTYPE_8BIT, 0xee58e0f9,0x4148f4cb,0xb42cec33,0x8ca144de,0xd4f54118,0xe0f185dd)
{ "Freezer: HRTMon v2.30 (built-in)", 0, 0, 0, 0, "HRTMON\0", 0, 63, 0, 0, ROMTYPE_HRTMON, 0, 1,
0xffffffff, 0, 0, 0, 0, 0, "HRTMon" },
{ "A590/A2091 SCSI boot ROM", 0, 0, 6, 0, "A590\0A2091\0", 16384, 53, 0, 0, ROMTYPE_A2091BOOT, 0, 0,
0x8396cf4e, 0x5E03BC61,0x8C862ABE,0x7BF79723,0xB4EEF4D2,0x1859A0F2 },
+ ALTROM(53, 1, 1, 8192, ROMTYPE_ODD | ROMTYPE_8BIT, 0xb0b8cf24,0xfcf40175,0x05f4d441,0x814b45d5,0x59c19eab,0x43816b30)
+ ALTROM(53, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x2e77bbff,0x8a098845,0x068f32cf,0xa4d34a27,0x8cd290f6,0x1d35a52c)
{ "A590/A2091 SCSI boot ROM", 0, 0, 6, 6, "A590\0A2091\0", 16384, 54, 0, 0, ROMTYPE_A2091BOOT, 0, 0,
0x33e00a7a, 0x739BB828,0xE874F064,0x9360F59D,0x26B5ED3F,0xBC99BB66 },
+ ALTROM(54, 1, 1, 8192, ROMTYPE_ODD | ROMTYPE_8BIT, 0xe536bbb2,0xfd7f8a6d,0xa18c1b02,0xd07eb990,0xc2467a24,0x183ede12)
+ ALTROM(54, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, 0xc0871d25,0xe155f18a,0xbb90cf82,0x0589c15e,0x70559d3b,0x6b391af8)
{ "A590/A2091 SCSI boot ROM", 0, 0, 7, 0, "A590\0A2091\0", 16384, 55, 0, 0, ROMTYPE_A2091BOOT, 0, 0,
0x714a97a2, 0xE50F01BA,0xF2899892,0x85547863,0x72A82C33,0x3C91276E },
+ ALTROM(55, 1, 1, 8192, ROMTYPE_ODD | ROMTYPE_8BIT, 0xa9ccffed,0x149f5bd5,0x2e2d2990,0x4e3de483,0xb9ad7724,0x48e9278e)
+ ALTROM(55, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x2942747a,0xdbd7648e,0x79c75333,0x7ff3e4f4,0x91de224b,0xf05e6bb6)
{ "A590/A2091 SCSI Guru boot ROM", 0, 0, 6, 14, "A590\0A2091\0", 32768, 56, 0, 0, ROMTYPE_A2091BOOT, 0, 0,
0x04e52f93, 0x6DA21B6F,0x5E8F8837,0xD64507CD,0x8A4D5CDC,0xAC4F426B },
{ "A4091 SCSI boot ROM", 0, 0, 40, 9, "A4091\0", 32768, 57, 0, 0, ROMTYPE_A4091BOOT, 0, 0,
};
+void romlist_clear (void)
+{
+ int i;
+ int mask = 0;
+ xfree (rl);
+ rl = 0;
+ romlist_cnt = 0;
+ for (i = 0; roms[i].name; i++) {
+ struct romdata *rd = &roms[i];
+ if (rd->group == 0) {
+ mask = rd->type;
+ } else {
+ rd->type &= ~ROMTYPE_MASK;
+ rd->type |= mask & ROMTYPE_MASK;
+ }
+ }
+}
+
+/* remove rom entries that need 2 or more roms but not everyone is present */
+static void romlist_cleanup (void)
+{
+ int i = 0;
+ while (roms[i].name) {
+ struct romdata *rd = &roms[i];
+ int grp = rd->group >> 16;
+ int ok = 1;
+ int j = i;
+ int k = i;
+ while (rd->name && (rd->group >> 16) == grp && grp > 0) {
+ struct romlist *rl = romlist_getrl (rd);
+ if (!rl)
+ ok = 0;
+ rd++;
+ j++;
+ }
+ if (ok == 0) {
+ while (i < j) {
+ struct romlist *rl = romlist_getrl (&roms[i]);
+ if (rl) {
+ int cnt = romlist_cnt - i - 1;
+ write_log ("%d '%s' removed from romlist\n", roms[k].name, rl->path);
+ xfree (rl->path);
+ if (cnt > 0)
+ memmove (rl, rl + 1, cnt * sizeof (struct romlist));
+ romlist_cnt--;
+ }
+ i++;
+ }
+ }
+ i++;
+ }
+ for (i = 0; i < romlist_cnt; i++) {
+ struct romlist *rll = &rl[i];
+ //write_log ("%s (%s)\n", rll->rd->name, rll->path);
+ }
+}
+
struct romlist **getromlistbyident(int ver, int rev, int subver, int subrev, char *model, int all)
{
int i, j, ok, out, max;
return 1;
}
-static void addkey(int *pkeyid, uae_u8 *key, int size, const char *name)
+static void addkey (int *pkeyid, uae_u8 *key, int size, const char *name)
{
int keyid = *pkeyid;
int i;
return 0;
}
+struct romdata *getromdatabyidgroup (int id, int group, int subitem)
+{
+ int i = 0;
+ group = (group << 16) | subitem;
+ while (roms[i].name) {
+ if (id == roms[i].id && roms[i].group == group)
+ return &roms[i];
+ i++;
+ }
+ return 0;
+}
+
STATIC_INLINE int notcrc32(uae_u32 crc32)
{
if (crc32 == 0xffffffff || crc32 == 0x00000000)
name[0] = 0;
if (!rd)
return;
+ while (rd->group)
+ rd--;
strcat (name, rd->name);
if ((rd->subrev || rd->subver) && rd->subver != rd->ver)
sprintf (name + strlen (name), " rev %d.%d", rd->subver, rd->subrev);
rd = getromdatabyid (ids[i]);
if (rd) {
for (j = 0; j < romlist_cnt; j++) {
- if (rl[j].rd == rd)
+ if (rl[j].rd->id == rd->id)
return &rl[j];
}
}
return 1;
}
+static int read_rom_file (uae_u8 *buf, struct romdata *rd)
+{
+ struct zfile *zf;
+ struct romlist *rl = romlist_getrl (rd);
+ if (!rl || strlen (rl->path) == 0)
+ return 0;
+ zf = zfile_fopen (rl->path, "rb");
+ if (!zf)
+ return 0;
+ zfile_fread (buf, rd->size, 1, zf);
+ zfile_fclose (zf);
+ return 1;
+}
+
+static void byteswap (uae_u8 *buf, int size)
+{
+ int i;
+ for (i = 0; i < size; i += 2) {
+ uae_u8 t = buf[i];
+ buf[i] = buf[i + 1];
+ buf[i + 1] = t;
+ }
+}
+
+static void descramble (struct romdata *rd, uae_u8 *data, int size, int odd)
+{
+ int flags = rd->type;
+
+ if (flags & (ROMTYPE_NORDIC | ROMTYPE_XPOWER))
+ descramble_nordicpro (data, size, odd);
+}
+
+struct zfile *read_rom (struct romdata *rd)
+{
+ struct romdata *rd2 = rd;
+ char *name;
+ int id = rd->id;
+ uae_u32 crc32;
+ int size;
+ uae_u8 *buf, *buf2;
+
+ /* find parent node */
+ for (;;) {
+ if (rd2 == &roms[0])
+ break;
+ if (rd2[-1].id != id)
+ break;
+ rd2--;
+ }
+ size = rd2->size;
+ crc32 = rd2->crc32;
+ name = rd->name;
+ buf = xmalloc (size * 2);
+ if (!buf)
+ return NULL;
+ buf2 = buf + size;
+ while (rd->id == id) {
+ int i;
+ int ok = 0;
+ uae_u32 flags = rd->type;
+ int odd = (flags & ROMTYPE_ODD) ? 1 : 0;
+
+ for (i = 0; i < 2; i++) {
+ memset (buf, 0, size);
+ if (!(flags & (ROMTYPE_EVEN | ROMTYPE_ODD))) {
+ read_rom_file (buf, rd);
+ if (flags & ROMTYPE_BYTESWAP)
+ byteswap (buf, size);
+ rd++;
+ i++;
+ } else {
+ int romsize = size / 2;
+ if (i)
+ odd = !odd;
+ read_rom_file (buf2, rd);
+ if (flags & ROMTYPE_BYTESWAP)
+ byteswap (buf2, romsize);
+ if (flags & ROMTYPE_SCRAMBLED)
+ descramble (rd, buf2, romsize, odd);
+ for (i = 0; i < size; i += 2)
+ buf[i + odd] = buf2[i / 2];
+ read_rom_file (buf2, rd + 1);
+ if (flags & ROMTYPE_BYTESWAP)
+ byteswap (buf2, romsize);
+ if (flags & ROMTYPE_SCRAMBLED)
+ descramble (rd + 1, buf2, romsize, !odd);
+ for (i = 0; i < size; i += 2)
+ buf[i + (1 - odd)] = buf2[i / 2];
+ rd += 2;
+ }
+ if (get_crc32 (buf, size) == crc32) {
+ ok = 1;
+ } else {
+ /* perhaps it is byteswapped without byteswap entry? */
+ byteswap (buf, size);
+ if (get_crc32 (buf, size) == crc32)
+ ok = 1;
+ }
+ if (ok) {
+ struct zfile *zf = zfile_fopen_empty (name, size);
+ if (zf) {
+ zfile_fwrite (buf, size, 1, zf);
+ zfile_fseek (zf, 0, SEEK_SET);
+ }
+ xfree (buf);
+ return zf;
+ }
+ }
+
+ }
+ xfree (buf);
+ return NULL;
+}
+
+struct zfile *read_rom_name (const char *filename)
+{
+ int i;
+ struct zfile *f;
+
+ for (i = 0; i < romlist_cnt; i++) {
+ if (!strcmpi (filename, rl[i].path)) {
+ f = read_rom (rl[i].rd);
+ if (f)
+ return f;
+ }
+ }
+ f = zfile_fopen (filename, "rb");
+ return f;
+}
+
static char *kickstring = "exec.library";
static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksum, int *cloanto_rom, int noalias)
{
extendedkickmem_type = EXTENDED_ROM_ARCADIA;
return 0;
}
- f = zfile_fopen (currprefs.romextfile, "rb");
+ f = read_rom_name (currprefs.romextfile);
if (!f) {
notify_user (NUMSG_NOEXTROM);
return 0;
static int load_kickstart (void)
{
- struct zfile *f = zfile_fopen (currprefs.romfile, "rb");
+ struct zfile *f = read_rom_name (currprefs.romfile);
char tmprom[MAX_DPATH], tmprom2[MAX_DPATH];
int patched = 0;
map_banks (&gayle_bank, 0xD8, 6, 0);
map_banks (&gayle2_bank, 0xDD, 2, 0);
}
- if (currprefs.cs_pcmcia) {
- map_banks (&gayle_attr_bank, 0xA0, 8, 0);
- if (currprefs.chipmem_size <= 4 * 1024 * 1024 && currprefs.fastmem_size <= 4 * 1024 * 1024)
- map_banks (&gayle_common_bank, PCMCIA_COMMON_START >> 16, PCMCIA_COMMON_SIZE >> 16, 0);
- }
+ gayle_map_pcmcia ();
if (currprefs.cs_ide == 2 || currprefs.cs_mbdmac == 2)
map_banks (&gayle_bank, 0xDD, 1, 0);
if (currprefs.cs_ide < 0 && !currprefs.cs_pcmcia)
}
-static uae_u8 read_rom(uaecptr addr)
+static uae_u8 read_rombyte (uaecptr addr)
{
uae_u8 v = rom[addr];
//write_log ("%08.8X = %02.2X PC=%08X\n", addr, v, M68K_GETPC);
return v;
}
-void ncr_bput2(uaecptr addr, uae_u32 val)
+void ncr_bput2 (uaecptr addr, uae_u32 val)
{
uae_u32 v = val;
addr &= board_mask;
ncrregs[addr] = val;
}
-uae_u32 ncr_bget2(uaecptr addr)
+uae_u32 ncr_bget2 (uaecptr addr)
{
uae_u32 v = 0, v2;
addr &= board_mask;
if (rom && addr >= ROM_VECTOR && addr >= ROM_OFFSET)
- return read_rom(addr);
+ return read_rombyte (addr);
if (addr >= NCR_REGS)
return v;
v2 = v = ncrregs[addr];
rl = getromlistbyids(roms);
if (rl) {
- write_log ("A4091 BOOT ROM '%s' %d.%d ", rl->path, rl->rd->ver, rl->rd->rev);
- z = zfile_fopen(rl->path, "rb");
+ write_log ("A4091 BOOT ROM %d.%d\n", rl->rd->ver, rl->rd->rev);
+ z = read_rom (rl->rd);
if (z) {
- write_log ("loaded\n");
rom = (uae_u8*)xmalloc (ROM_SIZE * 4);
for (i = 0; i < ROM_SIZE; i++) {
uae_u8 b;
rom[i * 4 + 2] = b << 4;
}
zfile_fclose(z);
- } else {
- write_log ("failed to load\n");
}
} else {
romwarning(roms);
#ifdef JIT
extern uae_u8* compiled_code;
-#include "compemu.h"
+#include "jit/compemu.h"
#include <signal.h>
/* For faster cycles handling */
signed long pissoff = 0;
if (deaddr)
*deaddr = newpc;
if (cctrue (®s.ccrflags, dp->cc))
- buf = buf_out (buf, &bufsize, " == %08lX (TRUE)", newpc);
+ buf = buf_out (buf, &bufsize, " == $%08lX (T)", newpc);
else
- buf = buf_out (buf, &bufsize, " == %08lX (FALSE)", newpc);
+ buf = buf_out (buf, &bufsize, " == $%08lX (F)", newpc);
} else if ((opcode & 0xff00) == 0x6100) { /* BSR */
if (deaddr)
*deaddr = newpc;
- buf = buf_out (buf, &bufsize, " == %08lX", newpc);
+ buf = buf_out (buf, &bufsize, " == $%08lX", newpc);
}
buf = buf_out (buf, &bufsize, "\n");
}
#include "resource.h"
#include "avioutput.h"
#include "registry.h"
+#include "threaddep/thread.h"
#define MAX_AVI_SIZE (0x80000000 - 0x1000000)
+static smp_comm_pipe workindex;
+static smp_comm_pipe queuefull;
+static volatile int alive;
+static uae_thread_id workertid;
+static volatile int avioutput_failed;
+
static int avioutput_init = 0;
static int actual_width = 320, actual_height = 256;
static int avioutput_needs_restart;
static int frame_start; // start frame
static int frame_count; // current frame
-static int frame_end; // end frame (0 = no end, infinite)
static int frame_skip;
static unsigned int total_avi_size;
static int partcnt;
static int first_frame = 1;
-static unsigned int StreamSizeAudio; // audio write position
-static double StreamSizeAudioExpected;
-
int avioutput_audio, avioutput_video, avioutput_enabled, avioutput_requested;
+static int videoallocated;
int avioutput_width, avioutput_height, avioutput_bits;
int avioutput_fps = VBLANK_HZ_PAL;
extern char config_filename[256];
static CRITICAL_SECTION AVIOutput_CriticalSection;
+static int cs_allocated;
static PAVIFILE pfile = NULL; // handle of our AVI file
static PAVISTREAM AVIStreamInterface = NULL; // Address of stream interface
+struct avientry {
+ uae_u8 *lpVideo;
+ LPBITMAPINFOHEADER lpbi;
+ uae_u8 *lpAudio;
+ int sndsize;
+};
+
+#define AVIENTRY_MAX 10
+static int avientryindex;
+static struct avientry *avientries[AVIENTRY_MAX + 1];
/* audio */
+static unsigned int StreamSizeAudio; // audio write position
+static double StreamSizeAudioExpected;
static PAVISTREAM AVIAudioStream = NULL; // compressed stream pointer
-
static HACMSTREAM has = NULL; // stream handle that can be used to perform conversions
static ACMSTREAMHEADER ash;
-
static ACMFORMATCHOOSE acmopt;
-
static WAVEFORMATEX wfxSrc; // source audio format
static LPWAVEFORMATEX pwfxDst = NULL; // pointer to destination audio format
static DWORD wfxMaxFmtSize;
-
static FILE *wavfile;
/* video */
static PAVISTREAM AVIVideoStream = NULL; // compressed stream pointer
-
static AVICOMPRESSOPTIONS videoOptions;
static AVICOMPRESSOPTIONS FAR * aOptions[] = { &videoOptions }; // array of pointers to AVICOMPRESSOPTIONS structures
-
+static LPBITMAPINFOHEADER lpbi;
static PCOMPVARS pcompvars;
-static LPBITMAPINFOHEADER lpbi = NULL; // can also be used as LPBITMAPINFO because we allocate memory for bitmap info header + bitmap infomation
-static uae_u8 *lpVideo = NULL; // pointer to video data (bitmap bits)
+static int lpbisize (void)
+{
+ return sizeof(BITMAPINFOHEADER) + (((avioutput_bits <= 8) ? 1 << avioutput_bits : 0) * sizeof(RGBQUAD));
+}
+
+static void freeavientry (struct avientry *ae)
+{
+ xfree (ae->lpAudio);
+ xfree (ae->lpVideo);
+ xfree (ae->lpbi);
+ xfree (ae);
+}
+
+static struct avientry *allocavientry_audio (uae_u8 *snd, int size)
+{
+ struct avientry *ae = xcalloc (sizeof (struct avientry), 1);
+ ae->lpAudio = xmalloc (size);
+ memcpy (ae->lpAudio, snd, size);
+ ae->sndsize = size;
+ return ae;
+}
+
+static struct avientry *allocavientry_video (void)
+{
+ struct avientry *ae = xcalloc (sizeof (struct avientry), 1);
+ ae->lpbi = xmalloc (lpbisize());
+ memcpy (ae->lpbi, lpbi, lpbisize ());
+ ae->lpVideo = calloc(lpbi->biSizeImage, 1);
+ return ae;
+}
+static void queueavientry (struct avientry *ae)
+{
+ EnterCriticalSection (&AVIOutput_CriticalSection);
+ avientries[++avientryindex] = ae;
+ LeaveCriticalSection (&AVIOutput_CriticalSection);
+ write_comm_pipe_u32 (&workindex, 0, 1);
+}
+
+static struct avientry *getavientry (void)
+{
+ int i;
+ struct avientry *ae;
+ if (avientryindex < 0)
+ return NULL;
+ ae = avientries[0];
+ for (i = 0; i < avientryindex; i++)
+ avientries[i] = avientries[i + 1];
+ avientryindex--;
+ return ae;
+}
+
+static void freequeue (void)
+{
+ struct avientry *ae;
+ while ((ae = getavientry ()))
+ freeavientry (ae);
+}
+
+static void waitqueuefull (void)
+{
+ for (;;) {
+ EnterCriticalSection (&AVIOutput_CriticalSection);
+ if (avientryindex < AVIENTRY_MAX) {
+ LeaveCriticalSection (&AVIOutput_CriticalSection);
+ while (comm_pipe_has_data (&queuefull))
+ read_comm_pipe_u32_blocking (&queuefull);
+ return;
+ }
+ LeaveCriticalSection (&AVIOutput_CriticalSection);
+ read_comm_pipe_u32_blocking (&queuefull);
+ }
+}
static UAEREG *openavikey(void)
{
}
}
-void AVIOutput_ReleaseVideo(void)
-{
- if(lpbi) {
- free(lpbi);
- lpbi = NULL;
- }
- if(lpVideo) {
- free(lpVideo);
- lpVideo = NULL;
- }
-}
-
-static int AVIOutput_AudioAllocated(void)
+static int AVIOutput_AudioAllocated (void)
{
return pwfxDst ? 1 : 0;
}
-static int AVIOutput_AllocateAudio(void)
+static int AVIOutput_AllocateAudio (void)
{
MMRESULT err;
// set the source format
wfxSrc.wFormatTag = WAVE_FORMAT_PCM;
- wfxSrc.nChannels = get_audio_nativechannels();
+ wfxSrc.nChannels = get_audio_nativechannels ();
wfxSrc.nSamplesPerSec = workprefs.sound_freq;
wfxSrc.nBlockAlign = wfxSrc.nChannels * (workprefs.sound_bits / 8);
wfxSrc.nAvgBytesPerSec = wfxSrc.nBlockAlign * wfxSrc.nSamplesPerSec;
return 1;
}
-static int AVIOutput_ValidateAudio(WAVEFORMATEX *wft, char *name, int len)
+static int AVIOutput_ValidateAudio (WAVEFORMATEX *wft, char *name, int len)
{
DWORD ret;
ACMFORMATTAGDETAILS aftd;
return 1;
}
-static int AVIOutput_GetAudioFromRegistry(WAVEFORMATEX *wft)
+static int AVIOutput_GetAudioFromRegistry (WAVEFORMATEX *wft)
{
DWORD ss;
int ok = 0;
-static int AVIOutput_GetAudioCodecName(WAVEFORMATEX *wft, char *name, int len)
+static int AVIOutput_GetAudioCodecName (WAVEFORMATEX *wft, char *name, int len)
{
return AVIOutput_ValidateAudio(wft, name, len);
}
-int AVIOutput_GetAudioCodec(char *name, int len)
+int AVIOutput_GetAudioCodec (char *name, int len)
{
- if (AVIOutput_AudioAllocated())
- return AVIOutput_GetAudioCodecName(pwfxDst, name, len);
- if (!AVIOutput_AllocateAudio())
+ if (AVIOutput_AudioAllocated ())
+ return AVIOutput_GetAudioCodecName (pwfxDst, name, len);
+ if (!AVIOutput_AllocateAudio ())
return 0;
- if (AVIOutput_GetAudioFromRegistry(pwfxDst)) {
- AVIOutput_GetAudioCodecName(pwfxDst, name, len);
+ if (AVIOutput_GetAudioFromRegistry (pwfxDst)) {
+ AVIOutput_GetAudioCodecName (pwfxDst, name, len);
return 1;
}
- AVIOutput_ReleaseAudio();
+ AVIOutput_ReleaseAudio ();
return 0;
}
-int AVIOutput_ChooseAudioCodec(HWND hwnd, char *s, int len)
+int AVIOutput_ChooseAudioCodec (HWND hwnd, char *s, int len)
{
AVIOutput_End();
- if (!AVIOutput_AllocateAudio())
+ if (!AVIOutput_AllocateAudio ())
return 0;
acmopt.hwndOwner = hwnd;
static int AVIOutput_VideoAllocated(void)
{
- return lpbi ? 1 : 0;
+ return videoallocated ? 1 : 0;
}
-static int AVIOutput_AllocateVideo(void)
+void AVIOutput_ReleaseVideo (void)
{
- AVIOutput_ReleaseVideo();
+ videoallocated = 0;
+ freequeue ();
+ xfree (lpbi);
+ lpbi = NULL;
+}
- avioutput_width = WIN32GFX_GetWidth();
- avioutput_height = WIN32GFX_GetHeight();
- avioutput_bits = WIN32GFX_GetDepth(0);
+static int AVIOutput_AllocateVideo (void)
+{
+ avioutput_width = WIN32GFX_GetWidth ();
+ avioutput_height = WIN32GFX_GetHeight ();
+ avioutput_bits = WIN32GFX_GetDepth (0);
+ AVIOutput_ReleaseVideo ();
if (!avioutput_width || !avioutput_height || !avioutput_bits) {
avioutput_width = workprefs.gfx_size.width;
avioutput_height = workprefs.gfx_size.height;
avioutput_bits = 24;
}
-
- if(!(lpbi = (LPBITMAPINFOHEADER) malloc(sizeof(BITMAPINFOHEADER) + (((avioutput_bits <= 8) ? 1 << avioutput_bits : 0) * sizeof(RGBQUAD)))))
- return 0;
-
+ lpbi = xcalloc(lpbisize (), 1);
lpbi->biSize = sizeof(BITMAPINFOHEADER);
lpbi->biWidth = avioutput_width;
lpbi->biHeight = avioutput_height;
lpbi->biClrUsed = (lpbi->biBitCount <= 8) ? 1 << lpbi->biBitCount : 0;
lpbi->biClrImportant = 0;
+ videoallocated = 1;
return 1;
}
static int compressorallocated;
-static void AVIOutput_FreeCOMPVARS(COMPVARS *pcv)
+static void AVIOutput_FreeCOMPVARS (COMPVARS *pcv)
{
ICClose(pcv->hic);
if (compressorallocated)
pcv->hic = NULL;
}
-static int AVIOutput_GetCOMPVARSFromRegistry(COMPVARS *pcv)
+static int AVIOutput_GetCOMPVARSFromRegistry (COMPVARS *pcv)
{
UAEREG *avikey;
DWORD ss;
return ok;
}
-static int AVIOutput_GetVideoCodecName(COMPVARS *pcv, char *name, int len)
+static int AVIOutput_GetVideoCodecName (COMPVARS *pcv, char *name, int len)
{
ICINFO icinfo = { 0 };
return 0;
}
-int AVIOutput_GetVideoCodec(char *name, int len)
+int AVIOutput_GetVideoCodec (char *name, int len)
{
- if (AVIOutput_VideoAllocated())
- return AVIOutput_GetVideoCodecName(pcompvars, name, len);
- if (!AVIOutput_AllocateVideo())
+ if (AVIOutput_VideoAllocated ())
+ return AVIOutput_GetVideoCodecName (pcompvars, name, len);
+ if (!AVIOutput_AllocateVideo ())
return 0;
- AVIOutput_FreeCOMPVARS(pcompvars);
- if (AVIOutput_GetCOMPVARSFromRegistry(pcompvars)) {
- AVIOutput_GetVideoCodecName(pcompvars, name, len);
+ AVIOutput_FreeCOMPVARS (pcompvars);
+ if (AVIOutput_GetCOMPVARSFromRegistry (pcompvars)) {
+ AVIOutput_GetVideoCodecName (pcompvars, name, len);
return 1;
}
- AVIOutput_ReleaseVideo();
+ AVIOutput_ReleaseVideo ();
return 0;
}
-int AVIOutput_ChooseVideoCodec(HWND hwnd, char *s, int len)
+int AVIOutput_ChooseVideoCodec (HWND hwnd, char *s, int len)
{
- AVIOutput_End();
- if (!AVIOutput_AllocateVideo())
+ AVIOutput_End ();
+ if (!AVIOutput_AllocateVideo ())
return 0;
- AVIOutput_FreeCOMPVARS(pcompvars);
+ AVIOutput_FreeCOMPVARS (pcompvars);
// we really should check first to see if the user has a particular compressor installed before we set one
// we could set one but we will leave it up to the operating system and the set priority levels for the compressors
pcompvars->lQ = 10000; // 10000 is maximum quality setting or ICQUALITY_DEFAULT for default
pcompvars->lKey = avioutput_fps; // default to one key frame per second, every (FPS) frames
pcompvars->dwFlags = 0;
-
if(ICCompressorChoose(hwnd, ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME, lpbi, NULL, pcompvars, "Choose Video Codec") == TRUE) {
UAEREG *avikey;
int ss;
if (!force && total_avi_size < MAX_AVI_SIZE)
return;
+ if (total_avi_size == 0)
+ return;
strcpy (fn, avioutput_filename_tmp);
sprintf (avioutput_filename, "%s_%d.avi", fn, tmp_partcnt);
write_log ("AVI split %d at %d bytes, %d frames\n",
static void AVIOuput_AVIWriteAudio (uae_u8 *sndbuffer, int sndbufsize)
{
- DWORD dwOutputBytes = 0, written = 0, swritten = 0;
- unsigned int err;
- uae_u8 *lpAudio = NULL;
-
+ struct avientry *ae;
+
+ if (avioutput_failed) {
+ AVIOutput_End ();
+ return;
+ }
+ checkAVIsize (0);
if (avioutput_needs_restart)
dorestart ();
+ waitqueuefull ();
+ ae = allocavientry_audio (sndbuffer, sndbufsize);
+ queueavientry (ae);
+}
- EnterCriticalSection(&AVIOutput_CriticalSection);
+static int AVIOutput_AVIWriteAudio_Thread (struct avientry *ae)
+{
+ DWORD dwOutputBytes = 0, written = 0, swritten = 0;
+ unsigned int err;
+ uae_u8 *lpAudio = NULL;
if(avioutput_audio) {
if(!avioutput_init)
goto error;
- if((err = acmStreamSize(has, sndbufsize, &dwOutputBytes, ACM_STREAMSIZEF_SOURCE) != 0)) {
+ if((err = acmStreamSize(has, ae->sndsize, &dwOutputBytes, ACM_STREAMSIZEF_SOURCE) != 0)) {
gui_message("acmStreamSize() FAILED (%X)\n", err);
goto error;
}
ash.dwUser = 0;
// source
- ash.pbSrc = sndbuffer;
+ ash.pbSrc = ae->lpAudio;
- ash.cbSrcLength = sndbufsize;
+ ash.cbSrcLength = ae->sndsize;
ash.cbSrcLengthUsed = 0; // This member is not valid until the conversion is complete.
ash.dwSrcUser = 0;
acmStreamUnprepareHeader(has, &ash, 0);
- if(lpAudio) {
- free(lpAudio);
- lpAudio = NULL;
- }
- checkAVIsize (0);
+ free(lpAudio);
+ lpAudio = NULL;
}
- LeaveCriticalSection(&AVIOutput_CriticalSection);
- return;
+ return 1;
error:
free(lpAudio);
- LeaveCriticalSection(&AVIOutput_CriticalSection);
- AVIOutput_End();
+ return 0;
}
static void AVIOuput_WAVWriteAudio (uae_u8 *sndbuffer, int sndbufsize)
static int skipsample;
-void AVIOutput_WriteAudio(uae_u8 *sndbuffer, int sndbufsize)
+void AVIOutput_WriteAudio (uae_u8 *sndbuffer, int sndbufsize)
{
int size = sndbufsize;
AVIOuput_AVIWriteAudio (sndbuffer, size);
}
-static int getFromDC(LPBITMAPINFO lpbi)
+static int getFromDC (struct avientry *avie)
{
HDC hdc;
HBITMAP hbitmap = NULL;
HDC hdcMem = NULL;
int ok = 1;
- hdc = gethdc();
+ hdc = gethdc ();
if (!hdc)
return 0;
// create a memory device context compatible with the application's current screen
- hdcMem = CreateCompatibleDC(hdc);
- hbitmap = CreateCompatibleBitmap(hdc, avioutput_width, avioutput_height);
- hbitmapOld = SelectObject(hdcMem, hbitmap);
+ hdcMem = CreateCompatibleDC (hdc);
+ hbitmap = CreateCompatibleBitmap (hdc, avioutput_width, avioutput_height);
+ hbitmapOld = SelectObject (hdcMem, hbitmap);
// probably not the best idea to use slow GDI functions for this,
// locking the surfaces and copying them by hand would be more efficient perhaps
// draw centered in frame
- BitBlt(hdcMem, (avioutput_width / 2) - (actual_width / 2), (avioutput_height / 2) - (actual_height / 2), actual_width, actual_height, hdc, 0, 0, SRCCOPY);
- SelectObject(hdcMem, hbitmapOld);
- if(GetDIBits(hdc, hbitmap, 0, avioutput_height, lpVideo, (LPBITMAPINFO) lpbi, DIB_RGB_COLORS) == 0)
- {
+ BitBlt (hdcMem, (avioutput_width / 2) - (actual_width / 2), (avioutput_height / 2) - (actual_height / 2), actual_width, actual_height, hdc, 0, 0, SRCCOPY);
+ SelectObject (hdcMem, hbitmapOld);
+ if(GetDIBits (hdc, hbitmap, 0, avioutput_height, avie->lpVideo, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS) == 0) {
gui_message("GetDIBits() FAILED (%X)\n", GetLastError());
ok = 0;
}
- DeleteObject(hbitmap);
- DeleteDC(hdcMem);
- releasehdc(hdc);
+ DeleteObject (hbitmap);
+ DeleteDC (hdcMem);
+ releasehdc (hdc);
return ok;
}
static int rgb_type;
-void AVIOutput_RGBinfo(int rb, int gb, int bb, int rs, int gs, int bs)
+void AVIOutput_RGBinfo (int rb, int gb, int bb, int rs, int gs, int bs)
{
if (bs == 0 && gs == 5 && rs == 11)
rgb_type = 1;
#if defined (GFXFILTER)
extern uae_u8 *bufmem_ptr;
-static int getFromBuffer(LPBITMAPINFO lpbi)
+static int getFromBuffer (struct avientry *ae)
{
int x, y;
uae_u8 *src;
- uae_u8 *dst = lpVideo;
+ uae_u8 *dst = ae->lpVideo;
src = bufmem_ptr;
if (!src)
return 0;
dst += avioutput_width * avioutput_bits / 8 * avioutput_height;
for (y = 0; y < (gfxvidinfo.height > avioutput_height ? avioutput_height : gfxvidinfo.height); y++) {
+ uae_u8 *d;
dst -= avioutput_width * avioutput_bits / 8;
+ d = dst;
for (x = 0; x < (gfxvidinfo.width > avioutput_width ? avioutput_width : gfxvidinfo.width); x++) {
if (avioutput_bits == 8) {
- dst[x] = src[x];
+ *d++ = src[x];
} else if (avioutput_bits == 16) {
uae_u16 v = ((uae_u16*)src)[x];
uae_u16 v2 = v;
v2 |= (v >> 1) & (31 << 5);
v2 |= (v >> 1) & (31 << 10);
}
- ((uae_u16*)dst)[x] = v2;
+ ((uae_u16*)d)[0] = v2;
+ d += 2;
} else if (avioutput_bits == 32) {
uae_u32 v = ((uae_u32*)src)[x];
- ((uae_u32*)dst)[x] = v;
+ ((uae_u32*)d)[0] = v;
+ d += 4;
+ } else if (avioutput_bits == 24) {
+ uae_u32 v = ((uae_u32*)src)[x];
+ *d++ = v;
+ *d++ = v >> 8;
+ *d++ = v >> 16;
}
}
src += gfxvidinfo.rowbytes;
}
#endif
-void AVIOutput_WriteVideo(void)
+void AVIOutput_WriteVideo (void)
{
- DWORD written = 0;
+ struct avientry *ae;
int v;
- unsigned int err;
+ if (avioutput_failed) {
+ AVIOutput_End ();
+ return;
+ }
+
+ checkAVIsize (0);
if (avioutput_needs_restart)
dorestart ();
+ waitqueuefull ();
+ ae = allocavientry_video ();
+#if defined (GFXFILTER)
+ if (!usedfilter || (usedfilter && usedfilter->x[0]) || WIN32GFX_IsPicassoScreen ())
+ v = getFromDC (ae);
+ else
+ v = getFromBuffer (ae);
+#else
+ v = getFromDC (avie);
+#endif
+ if (v)
+ queueavientry (ae);
+ else
+ AVIOutput_End ();
+}
- EnterCriticalSection(&AVIOutput_CriticalSection);
+static int AVIOutput_AVIWriteVideo_Thread (struct avientry *ae)
+{
+ DWORD written = 0;
+ unsigned int err;
if(avioutput_video) {
actual_width = gfxvidinfo.width;
actual_height = gfxvidinfo.height;
-#if defined (GFXFILTER)
- if (!usedfilter || (usedfilter && usedfilter->x[0]) || WIN32GFX_IsPicassoScreen ())
- v = getFromDC((LPBITMAPINFO)lpbi);
- else
- v = getFromBuffer((LPBITMAPINFO)lpbi);
-#else
- v = getFromDC((LPBITMAPINFO)lpbi);
-#endif
- if (!v)
- goto error;
-
// GetDIBits tends to change this and ruins palettized output
- lpbi->biClrUsed = (avioutput_bits <= 8) ? 1 << avioutput_bits : 0;
+ ae->lpbi->biClrUsed = (avioutput_bits <= 8) ? 1 << avioutput_bits : 0;
if(!frame_count)
{
- if((err = AVIStreamSetFormat(AVIVideoStream, frame_count, lpbi, lpbi->biSize + (lpbi->biClrUsed * sizeof(RGBQUAD)))) != 0)
+ if((err = AVIStreamSetFormat(AVIVideoStream, frame_count, ae->lpbi, ae->lpbi->biSize + (ae->lpbi->biClrUsed * sizeof(RGBQUAD)))) != 0)
{
gui_message("AVIStreamSetFormat() FAILED (%X)\n", err);
goto error;
}
}
- if((err = AVIStreamWrite(AVIVideoStream, frame_count, 1, lpVideo, lpbi->biSizeImage, 0, NULL, &written)) != 0)
+ if((err = AVIStreamWrite(AVIVideoStream, frame_count, 1, ae->lpVideo, ae->lpbi->biSizeImage, 0, NULL, &written)) != 0)
{
gui_message("AVIStreamWrite() FAILED (%X)\n", err);
goto error;
frame_count++;
total_avi_size += written;
- if(frame_end)
- {
- if(frame_count >= frame_end)
- {
- AVIOutput_End();
- }
- }
- checkAVIsize (0);
-
} else {
gui_message("DirectDraw_GetDC() FAILED\n");
}
- LeaveCriticalSection(&AVIOutput_CriticalSection);
if ((frame_count % (avioutput_fps * 10)) == 0)
write_log ("AVIOutput: %d frames, (%d fps)\n", frame_count, avioutput_fps);
- return;
+ return 1;
error:
-
- LeaveCriticalSection(&AVIOutput_CriticalSection);
- AVIOutput_End();
+ return 0;
}
static void writewavheader (uae_u32 size)
fwrite (&tl, 1, 4, wavfile);
}
-void AVIOutput_Restart(void)
+void AVIOutput_Restart (void)
{
avioutput_needs_restart = 1;
}
-void AVIOutput_End(void)
+void AVIOutput_End (void)
{
- EnterCriticalSection(&AVIOutput_CriticalSection);
-
first_frame = 1;
+ avioutput_failed = 0;
avioutput_enabled = 0;
- if(has) {
- acmStreamUnprepareHeader(has, &ash, 0);
- acmStreamClose(has, 0);
+
+ if (alive) {
+ write_log ("killing worker thread\n");
+ write_comm_pipe_u32 (&workindex, 0xfffffffe, 1);
+ while (alive) {
+ while (comm_pipe_has_data (&queuefull))
+ read_comm_pipe_u32_blocking (&queuefull);
+ Sleep (10);
+ }
+ }
+ freequeue ();
+ destroy_comm_pipe (&workindex);
+ destroy_comm_pipe (&queuefull);
+ if (has) {
+ acmStreamUnprepareHeader (has, &ash, 0);
+ acmStreamClose (has, 0);
has = NULL;
}
- if(AVIAudioStream) {
- AVIStreamRelease(AVIAudioStream);
+ if (AVIAudioStream) {
+ AVIStreamRelease (AVIAudioStream);
AVIAudioStream = NULL;
}
- if(AVIVideoStream) {
- AVIStreamRelease(AVIVideoStream);
+ if (AVIVideoStream) {
+ AVIStreamRelease (AVIVideoStream);
AVIVideoStream = NULL;
}
- if(AVIStreamInterface) {
- AVIStreamRelease(AVIStreamInterface);
+ if (AVIStreamInterface) {
+ AVIStreamRelease (AVIStreamInterface);
AVIStreamInterface = NULL;
}
- if(pfile) {
+ if (pfile) {
AVIFileRelease(pfile);
pfile = NULL;
}
fclose (wavfile);
wavfile = 0;
}
-
- LeaveCriticalSection(&AVIOutput_CriticalSection);
}
-void AVIOutput_Begin(void)
+static void *AVIOutput_worker (void *arg);
+
+void AVIOutput_Begin (void)
{
AVISTREAMINFO avistreaminfo; // Structure containing information about the stream, including the stream type and its sample rate
int i, err;
char *ext1, *ext2;
+ struct avientry *ae = NULL;
+ avientryindex = -1;
if (avioutput_enabled) {
if (!avioutput_requested)
AVIOutput_End ();
}
if(avioutput_video) {
+ ae = allocavientry_video ();
if (!AVIOutput_AllocateVideo())
goto error;
- if(!(lpVideo = calloc(lpbi->biSizeImage, 1))) {
- goto error;
- }
// fill in the header for the video stream
memset(&avistreaminfo, 0, sizeof(AVISTREAMINFO));
//avistreaminfo.fccHandler = 0;
// incase the amiga changes palette
- if(lpbi->biBitCount < 24)
+ if(ae->lpbi->biBitCount < 24)
avistreaminfo.dwFlags = AVISTREAMINFO_FORMATCHANGES;
//avistreaminfo.dwCaps =; // Capability flags; currently unused
//avistreaminfo.wPriority =; // Priority of the stream
avistreaminfo.dwStart = 0; // no delay
avistreaminfo.dwLength = 1; // initial length
//avistreaminfo.dwInitialFrames =; // audio only
- avistreaminfo.dwSuggestedBufferSize = lpbi->biSizeImage;
+ avistreaminfo.dwSuggestedBufferSize = ae->lpbi->biSizeImage;
avistreaminfo.dwQuality = -1; // drivers will use the default quality setting
avistreaminfo.dwSampleSize = 0; // variable video data samples
- SetRect(&avistreaminfo.rcFrame, 0, 0, lpbi->biWidth, lpbi->biHeight); // rectangle for stream
+ SetRect(&avistreaminfo.rcFrame, 0, 0, ae->lpbi->biWidth, ae->lpbi->biHeight); // rectangle for stream
//avistreaminfo.dwEditCount =; // Number of times the stream has been edited. The stream handler maintains this count.
//avistreaminfo.dwFormatChangeCount =; // Number of times the stream format has changed. The stream handler maintains this count.
goto error;
}
}
+ freeavientry (ae);
+ init_comm_pipe (&workindex, 20, 1);
+ init_comm_pipe (&queuefull, 20, 1);
+ alive = -1;
+ uae_start_thread ("aviworker", AVIOutput_worker, NULL, &workertid);
write_log ("AVIOutput enabled: video=%d audio=%d\n", avioutput_video, avioutput_audio);
return;
error:
+ freeavientry (ae);
AVIOutput_End();
}
-void AVIOutput_Release(void)
+void AVIOutput_Release (void)
{
- AVIOutput_End();
+ AVIOutput_End ();
- AVIOutput_ReleaseAudio();
- AVIOutput_ReleaseVideo();
+ AVIOutput_ReleaseAudio ();
+ AVIOutput_ReleaseVideo ();
- if(avioutput_init) {
+ if (avioutput_init) {
AVIFileExit();
avioutput_init = 0;
}
- if(pcompvars) {
- AVIOutput_FreeCOMPVARS(pcompvars);
- free(pcompvars);
+ if (pcompvars) {
+ AVIOutput_FreeCOMPVARS (pcompvars);
+ xfree (pcompvars);
pcompvars = NULL;
}
- DeleteCriticalSection(&AVIOutput_CriticalSection);
+ if (cs_allocated) {
+ DeleteCriticalSection (&AVIOutput_CriticalSection);
+ cs_allocated = 0;
+ }
}
-void AVIOutput_Initialize(void)
+void AVIOutput_Initialize (void)
{
- InitializeCriticalSection(&AVIOutput_CriticalSection);
+ InitializeCriticalSection (&AVIOutput_CriticalSection);
+ cs_allocated = 1;
- pcompvars = (PCOMPVARS) malloc(sizeof(COMPVARS));
+ pcompvars = xcalloc (sizeof (COMPVARS), 1);
if (!pcompvars)
return;
- memset(pcompvars, 0, sizeof(COMPVARS));
- pcompvars->cbSize = sizeof(COMPVARS);
+ pcompvars->cbSize = sizeof (COMPVARS);
- if(!avioutput_init) {
- AVIFileInit();
+ if (!avioutput_init) {
+ AVIFileInit ();
avioutput_init = 1;
}
}
+
+static void *AVIOutput_worker (void *arg)
+{
+ write_log ("AVIOutput worker thread started\n");
+ alive = 1;
+ for (;;) {
+ uae_u32 idx = read_comm_pipe_u32_blocking (&workindex);
+ struct avientry *ae;
+ int r1 = 1;
+ int r2 = 1;
+ if (idx == 0xffffffff)
+ break;
+ for (;;) {
+ EnterCriticalSection (&AVIOutput_CriticalSection);
+ ae = getavientry ();
+ LeaveCriticalSection (&AVIOutput_CriticalSection);
+ if (ae == NULL)
+ break;
+ write_comm_pipe_u32 (&queuefull, 0, 1);
+ if (ae->lpAudio)
+ r1 = AVIOutput_AVIWriteAudio_Thread (ae);
+ if (ae->lpVideo)
+ r2 = AVIOutput_AVIWriteVideo_Thread (ae);
+ if (r1 == 0 || r2 == 0)
+ avioutput_failed = 1;
+ freeavientry (ae);
+ if (idx != 0xfffffffe)
+ break;
+ }
+ if (idx == 0xfffffffe || idx == 0xffffffff)
+ break;
+ }
+ write_log ("AVIOutput worker thread killed\n");
+ alive = 0;
+ return 0;
+}
+
+
#include <math.h>
#define ADJUST_SIZE 10
skipsample += idiff / 10;
if (skipsample > 4)
skipsample = 4;
- write_log ("%d ", skipsample);
}
sound_setadjust (0.0);
StreamSizeAudio, StreamSizeAudioExpected, idiff);
#endif
}
-
-
-
static void bsdsetpriority (HANDLE thread)
{
- int pri = os_winnt ? THREAD_PRIORITY_NORMAL : priorities[currprefs.win32_active_priority].value;
+ int pri = THREAD_PRIORITY_NORMAL;
SetThreadPriority(thread, pri);
}
if(bsd->hSockWnd) {
// Make sure we're outrunning the wolves
int pri = THREAD_PRIORITY_ABOVE_NORMAL;
- if (!os_winnt) {
- pri = priorities[currprefs.win32_active_priority].value;
- if (pri == THREAD_PRIORITY_HIGHEST)
- pri = THREAD_PRIORITY_TIME_CRITICAL;
- else
- pri++;
- }
SetThreadPriority(GetCurrentThread(), pri);
while(bsd->hSockThread && bsd->hSockWnd) {
Name : RetroPlatformGuestIPC.c
Project : RetroPlatform Player
Client : Cloanto Italia srl
- Legal : Copyright © 2007 Cloanto Italia srl - All rights reserved. This
+ Legal : Copyright 2007, 2008 Cloanto Italia srl - All rights reserved. This
: file is made available under the terms of the GNU General Public
: License version 2 as published by the Free Software Foundation.
Authors : os, mcb
Created : 2007-08-24 15:28:48
+ Updated : 2008-02-03 06:49:00
Comment : RP Player interprocess communication functions (guest side)
Note : Can be compiled both in Unicode and Multibyte projects
*****************************************************************************/
_TCHAR szGuestClass[(sizeof(g_szGuestWndClass)/sizeof(_TCHAR))+20];
_TCHAR *pszHostClass;
LRESULT lr;
- int n;
if (!pInfo || !pszHostInfo)
return E_POINTER;
Name : RetroPlatformGuestIPC.h
Project : RetroPlatform Player
Client : Cloanto Italia srl
- Legal : Copyright © 2007 Cloanto Italia srl - All rights reserved. This
+ Legal : Copyright 2007, 2008 Cloanto Italia srl - All rights reserved. This
: file is made available under the terms of the GNU General Public
: License version 2 as published by the Free Software Foundation.
Authors : os
Created : 2007-08-24 15:29:26
+ Updated : 2008-02-03 06:49:00
Comment : RP Player interprocess communication include file (guest side)
*****************************************************************************/
Name : RetroPlatformIPC.h
Project : RetroPlatform Player
Client : Cloanto Italia srl
- Legal : Copyright © 2007 Cloanto Italia srl - All rights reserved. This
+ Legal : Copyright 2007, 2008 Cloanto Italia srl - All rights reserved. This
: file is made available under the terms of the GNU General Public
: License version 2 as published by the Free Software Foundation.
Authors : os, mcb
Created : 2007-08-27 13:55:49
+ Updated : 2008-02-03 06:49:00
Comment : RP Player interprocess communication include file
*****************************************************************************/
// Guest-to-Host Messages
// ****************************************************************************
-// Message:
-// RPIPCGM_REGISTER
-// Description:
-// this is a private message and is automatically sent
-// by the RPInitializeGuest() function
-// to register the caller as a RetroPlatform guest
-//
#define RPIPCGM_REGISTER (WM_APP + 0)
-
-// Message:
-// RPIPCGM_FEATURES
-// Description:
-// the guest uses this message to tell the host
-// about the features it supports;
-// at startup time, the guest sends initialization messages
-// so that the host can adapt the GUI based on the reported features;
-// these messages include:
-// RPIPCGM_FEATURES (describes guest features),
-// RPIPCGM_POWERLED (turns on the power LED in the GUI),
-// RPIPCGM_DEVICES (one for each device category: tells the number of emulated devices),
-// RPIPCGM_DEVICEIMAGE (one for each device with an image file loaded),
-// RPIPCGM_TURBO (tells if some of the turbo modes are activated from the start),
-// RPIPCGM_INPUTMODE (tells if keyboard mode or joystick mode is active),
-// RPIPCGM_VOLUME (reports about starting volume level),
-// RPIPCGM_SCREENMODE (communicates the screen mode and the guest window handle);
-// note that at startup time the guest should create a borderless and hidden window
-// and send its handle using a RPIPCGM_SCREENMODE message, which must be the last
-// of the initialization messages, since it displays the guest window
-// and the host "frame window" (the part of the player user interface
-// with command and status icons which can be used to drag the guest window, etc.)
-// Data sent:
-// WPARAM = RP_FEATURE_* flags
-// Response:
-// none
-//
#define RPIPCGM_FEATURES (WM_APP + 1)
-
-// Message:
-// RPIPCGM_CLOSED
-// Description:
-// this message is sent to the host when the guest is terminating
-// Data sent:
-// none
-// Response:
-// none
-//
#define RPIPCGM_CLOSED (WM_APP + 2)
-
-// Message:
-// RPIPCGM_ACTIVATED
-// Description:
-// the guest sends this message to the host
-// when its window is being activated
-// Data sent:
-// LPARAM = identifier of the thread that owns the window being deactivated
-// Response:
-// none
-//
#define RPIPCGM_ACTIVATED (WM_APP + 3)
-
-// Message:
-// RPIPCGM_DEACTIVATED
-// Description:
-// the guest sends this message to the host
-// when its window is being deactivated
-// Data sent:
-// LPARAM = identifier of the thread that owns the window being activated
-// Response:
-// none
-//
#define RPIPCGM_DEACTIVATED (WM_APP + 4)
-
-// Message:
-// RPIPCGM_ZORDER
-// Description:
-// the guest sends this message to notify the host about a change
-// in the Z order (front-to-back position) of its window
-// (e.g. the user clicked the window icon in the application bar
-// to bring the window to the front)
-// Data sent:
-// none
-// Response:
-// none
-//
-#define RPIPCGM_ZORDER (WM_APP + 5)
-
-// Message:
-// RPIPCGM_MINIMIZED
-// Description:
-// the guest sends this message to the host when its window
-// has been minimized
-// (e.g. using the Minimize menu command in the application bar)
-// Data sent:
-// none
-// Response:
-// none
-//
-#define RPIPCGM_MINIMIZED (WM_APP + 6)
-
-// Message:
-// RPIPCGM_RESTORED
-// Description:
-// the guest sends this message to the host when its window
-// has been restored from the minimized status
-// (e.g. using the Restore menu command in the application bar)
-// Data sent:
-// none
-// Response:
-// none
-//
-#define RPIPCGM_RESTORED (WM_APP + 7)
-
-// Message:
-// RPIPCGM_MOVED
-// Description:
-// the guest sends this message to the host when its window position
-// has been changed
-// (e.g. using the Move menu command in the application bar)
-// Data sent:
-// none
-// Response:
-// none
-//
-#define RPIPCGM_MOVED (WM_APP + 8)
-
-// Message:
-// RPIPCGM_SCREENMODE
-// Description:
-// the guest sends a RPIPCGM_SCREENMODE message to notify the host
-// about a change in its "screen mode" (1x/2x/4x/full screen, etc.);
-// screen mode changes requested by the host
-// (see the RPIPCHM_SCREENMODE message) must not be notified,
-// unless this is an asynchronous screen mode change
-// (i.e. the guest returned the INVALID_HANDLE_VALUE
-// response to a RPIPCHM_SCREENMODE host request);
-// this message can also be sent when the guest has to close
-// and reopen its window for other reasons;
-// at startup-time, the guest must create
-// a borderless and hidden window and send its handle
-// using this message; the host will then take care
-// of preparing, positioning and showing the guest window
-// Data sent:
-// WPARAM = new screen mode (RP_SCREENMODE_* value)
-// LPARAM = handle of the (new) guest window
-// Response:
-// none
-//
#define RPIPCGM_SCREENMODE (WM_APP + 9)
-
-// Message:
-// RPIPCGM_POWERLED
-// Description:
-// sent to the host to change the power LED state
-// Data sent:
-// WPARAM = power LED intensity (min/off 0, max 100)
-// Response:
-// none
-//
#define RPIPCGM_POWERLED (WM_APP + 10)
-
-// Message:
-// RPIPCGM_DEVICES
-// Description:
-// this message is used to notify the host about a change
-// in the number of emulated devices (floppy drives, hard disks, etc.)
-// Data sent:
-// WPARAM = device category (RP_DEVICE_* value)
-// LPARAM = 32-bit bitfield representing the devices
-// emulated in the specified category
-// (every bit set to 1 corresponds to a mounted drive
-// e.g. 0x00000005 = drive 0 and drive 2 are emulated)
-// Response:
-// none
-//
#define RPIPCGM_DEVICES (WM_APP + 11)
-
-// Message:
-// RPIPCGM_DEVICEACTIVITY
-// Description:
-// this message can be used to turn on or off the activity indicator
-// of a specified device (like a LED on the original hardware);
-// the indicator can also be "blinked", i.e. the host will turn the
-// LED on and then off again after the specified amount of time
-// Data sent:
-// WPARAM = device category (RP_DEVICE_* value) and device number
-// combined with the MAKEWORD macro;
-// e.g. MAKEWORD(RP_DEVICE_FLOPPY, 0)
-// LPARAM = 0 turns off the activity LED,
-// (LPARAM)-1 turns on the activity LED,
-// <millisecond delay> turns on the activity LED
-// for the specified amount of time (blink)
-// Response:
-// none
-//
#define RPIPCGM_DEVICEACTIVITY (WM_APP + 12)
-
-// Message:
-// RPIPCGM_MOUSECAPTURE
-// Description:
-// the guest sends this message when the mouse is captured/released
-// (the mouse is "captured" when its movements are restricted to the guest window area
-// and the system cursor is not visible);
-// mouse capture changes requested by the host
-// (see the RPIPCHM_MOUSECAPTURE message) must not be notified;
-// for consistency across different guests, a guest which sends RPIPCGM_MOUSECAPTURE
-// messages should also implement a keyboard-actuated escape functionality
-// (the preferred key for this purpose is included in the parameters sent from the
-// host at startup time - see RPLaunchGuest() in RetroPlatformPlugin.h);
-// note that in order not to interfere with the window dragging functionality,
-// the mouse should not be captured when the guest window gets the focus,
-// but when a mouse button event is received
-// Data sent:
-// WPARAM = non-zero if the mouse has been captured,
-// zero if the mouse has been released
-// Response:
-// none
-//
#define RPIPCGM_MOUSECAPTURE (WM_APP + 13)
-
-// Message:
-// RPIPCGM_HOSTAPIVERSION
-// Description:
-// the guest can send a RPIPCGM_HOSTAPIVERSION to query the host
-// about the RetroPlatform API version it implements;
-// since the guest plugin already asks for a minimim version of the API
-// on the host side, this message can be used to check the host API version
-// and enable optional functionality
-// Data sent:
-// none
-// Response:
-// LRESULT = major and minor version combined with the MAKELONG macro
-// (e.g. LOWORD(lr) = major version; HIWORD(lr) = minor version)
-//
#define RPIPCGM_HOSTAPIVERSION (WM_APP + 14)
-
-// Message:
-// RPIPCGM_PAUSE
-// Description:
-// the guest sends this message to the host
-// when it enters or exits pause mode;
-// pause mode changes requested by the host
-// (see the RPIPCHM_PAUSE message) must not be notified;
-// note: when paused, the guest should release the mouse (if captured)
-// Data sent:
-// WPARAM = non-zero when the guest enters pause mode
-// or zero when the guest exits from pause mode
-// Response:
-// none
-//
#define RPIPCGM_PAUSE (WM_APP + 15)
-
-// Message:
-// RPIPCGM_DEVICEIMAGE
-// Description:
-// the guest sends a RPIPCGM_DEVICEIMAGE message
-// to notify the host that an image file has been loaded into
-// (or ejected from) an emulated device;
-// this notification must not be sent when the event
-// has been requested by the host (see the RPIPCHM_DEVICEIMAGE message)
-// Data sent:
-// pData = a RPDEVICEIMAGE structure (see below);
-// the szImageFile field of the structure
-// contains an empty string when the guest
-// is ejecting an image file from the device
-// Response:
-// none
-//
-#define RPIPCGM_DEVICEIMAGE (WM_APP + 16)
-
-// Message:
-// RPIPCGM_TURBO
-// Description:
-// the guest sends a RPIPCGM_TURBO message
-// to notify the host about activation of "turbo" (maximum speed) mode
-// of some of its functionalities (e.g. floppy, CPU);
-// turbo mode activations/deactivations requested by the host
-// (see the RPIPCHM_TURBO message) must not be notified;
-// Data sent:
-// WPARAM = mask of functionalities affected (RP_TURBO_* flags)
-// LPARAM = bits corresponding to those set in WPARAM
-// (1 = turbo mode activated for the guest functionality
-// 0 = guest functionality reverted to normal speed)
-// Response:
-// none
-//
+#define RPIPCGM_DEVICECONTENT (WM_APP + 16)
#define RPIPCGM_TURBO (WM_APP + 17)
-
-// Message:
-// RPIPCGM_INPUTMODE
-// Description:
-// the RPIPCGM_INPUTMODE message can be used
-// to notify the host about activation
-// of the specified input mode (e.g. keyboard vs. game controller)
-// of the guest; input mode changes requested by the host
-// (see the RPIPCHM_INPUTMODE message) must not be notified
-// Data sent:
-// WPARAM = input mode activated (RP_INPUTMODE_* value)
-// Response:
-// none
-//
-#define RPIPCGM_INPUTMODE (WM_APP + 18)
-
-// Message:
-// RPIPCGM_VOLUME
-// Description:
-// the guest uses the RPIPCGM_VOLUME message
-// to notify the host about a change of its audio level;
-// audio level changes requested by the host
-// (see the RPIPCHM_VOLUME message) must not be notified
-// Data sent:
-// WPARAM = volume level (min/off 0, max 100)
-// Response:
-// none
-//
+#define RPIPCGM_PING (WM_APP + 18)
#define RPIPCGM_VOLUME (WM_APP + 19)
-
-// Message:
-// RPIPCGM_ESCAPED
-// Description:
-// this message is sent to notify the host
-// that the escape key has been held down
-// Data sent:
-// none
-// Response:
-// none
-//
#define RPIPCGM_ESCAPED (WM_APP + 20)
-
+#define RPIPCGM_PARENT (WM_APP + 21)
// ****************************************************************************
// Host-to-Guest Messages
// ****************************************************************************
-// Message:
-// RPIPCHM_CLOSE
-// Description:
-// sent from the host when the emulation must be terminated
-// (e.g. the user has hit the close button in the host window);
-// the guest should destroy its window and terminate (see Response below)
-// Data sent:
-// none
-// Response:
-// LRESULT = non-zero if the guest can safely terminate or 0 otherwise
-//
#define RPIPCHM_CLOSE (WM_APP + 200)
-
-// Message:
-// RPIPCHM_MINIMIZE
-// Description:
-// sent from the host when the emulation window must be minimized
-// Data sent:
-// none
-// Response:
-// LRESULT = non-zero if the guest can minimized its window or 0 otherwise
-//
-#define RPIPCHM_MINIMIZE (WM_APP + 201)
-
-// Message:
-// RPIPCHM_SCREENMODE
-// Description:
-// this message is sent to ask the guest to activate a specified screen mode;
-// when switching to the new screen mode, the guest can resize (reuse) its window
-// or close its window and open a new one
-// Data sent:
-// WPARAM = RP_SCREENMODE_* value
-// Response:
-// LRESULT = handle of the (new) guest window
-// or NULL (the screen mode couldn't be changed)
-// or INVALID_HANDLE_VALUE (the screen mode will be changed asynchronously
-// and the host will soon get a RPIPCGM_SCREENMODE notification)
-//
#define RPIPCHM_SCREENMODE (WM_APP + 202)
-
-// Message:
-// RPIPCHM_SCREENCAPTURE
-// Description:
-// with this message the host asks the guest to save its screen
-// to the the specified file in BMP format
-// Data sent:
-// pData = (Unicode) full path and name of the file to save
-// (note: the file may exist and can be overwritten)
-// Response:
-// LRESULT = non-zero if the guest saved its screen to the file
-//
#define RPIPCHM_SCREENCAPTURE (WM_APP + 203)
-
-// Message:
-// RPIPCHM_PAUSE
-// Description:
-// the RPIPCHM_PAUSE message sets the guest into pause mode
-// or resumes the guest from pause mode;
-// note: when paused, the guest should release the mouse (if captured)
-// Data sent:
-// WPARAM = non-zero to set the guest into pause mode
-// or zero to resume the guest from pause mode
-// Response:
-// LRESULT = non-zero if the guest executed the command
-//
#define RPIPCHM_PAUSE (WM_APP + 204)
-
-// Message:
-// RPIPCHM_DEVICEIMAGE
-// Description:
-// the host sends a RPIPCHM_DEVICEIMAGE message
-// to load an image file into an emulated device
-// (e.g. an ADF floppy file into a floppy drive)
-// or to unload the currently loaded image from the device
-// Data sent:
-// pData = a RPDEVICEIMAGE structure (see below);
-// if the szImageFile field of the structure
-// contains an empty string, the guest should
-// unload the current image file from the device
-// Response:
-// LRESULT = non-zero if the guest executed the command
-//
-#define RPIPCHM_DEVICEIMAGE (WM_APP + 205)
-
-// Message:
-// RPIPCHM_RESET
-// Description:
-// the host sends this message to reset the guest
-// Data sent:
-// WPARAM = a RP_RESET_* value
-// Response:
-// LRESULT = non-zero if the guest executed the command
-//
+#define RPIPCHM_DEVICECONTENT (WM_APP + 205)
#define RPIPCHM_RESET (WM_APP + 206)
-
-// Message:
-// RPIPCHM_TURBO
-// Description:
-// the host sends this message to activate or deactivate
-// the turbo mode of selected guest functionalities
-// Data sent:
-// WPARAM = mask of functionalities to change (RP_TURBO_* flags)
-// LPARAM = bits corresponding to those set in WPARAM
-// (1 = speedup the guest functionality
-// 0 = revert to normal speed emulation)
-// Response:
-// LRESULT = non-zero if the guest executed the command
-//
#define RPIPCHM_TURBO (WM_APP + 207)
-
-// Message:
-// RPIPCHM_INPUTMODE
-// Description:
-// the RPIPCHM_INPUTMODE message activates
-// the specified input mode of the guest
-// Data sent:
-// WPARAM = input mode (RP_INPUTMODE_* value)
-// Response:
-// LRESULT = non-zero if the guest executed the command
-//
-#define RPIPCHM_INPUTMODE (WM_APP + 208)
-
-// Message:
-// RPIPCHM_VOLUME
-// Description:
-// the host uses the RPIPCHM_VOLUME message to set
-// the audio level of the guest
-// Data sent:
-// WPARAM = volume level (min 0, max 100)
-// Response:
-// LRESULT = non-zero if the guest set the volume as requested
-//
+#define RPIPCHM_PING (WM_APP + 208)
#define RPIPCHM_VOLUME (WM_APP + 209)
-
-// Message:
-// RPIPCHM_ESCAPEKEY
-// Description:
-// the host uses the RPIPCHM_ESCAPEKEY message
-// to change the escape key information
-// Data sent:
-// WPARAM = DirectInput DIK_* identifier of the escape key
-// (e.g. 1 for the Esc key - see DIK_* constants in dinput.h)
-// LPARAM = milliseconds value
-// (amount of time the user has to hold the above key to trigger the escape functionality)
-// Response:
-// LRESULT = non-zero if the guest accepted the new settings
-//
#define RPIPCHM_ESCAPEKEY (WM_APP + 210)
-
-// Message:
-// RPIPCHM_EVENT
-// Description:
-// the host uses the RPIPCHM_EVENT message
-// to simulate keyboard, mouse, joystick (press/release)
-// and other guest-specific events
-// Data sent:
-// pData = (Unicode) event string (guest-specific)
-// Response:
-// LRESULT = non-zero if the guest simulated the specified event
-//
#define RPIPCHM_EVENT (WM_APP + 211)
-
-// Message:
-// RPIPCHM_MOUSECAPTURE
-// Description:
-// the host uses this message to ask the guest
-// to capture or release the mouse
-// Data sent:
-// WPARAM = non-zero if the mouse should be captured,
-// zero if the mouse should be released
-// Response:
-// LRESULT = non-zero if the guest executed the command
-//
#define RPIPCHM_MOUSECAPTURE (WM_APP + 212)
-
// ****************************************************************************
// Message Data Structures and Defines
// ****************************************************************************
#define RP_FEATURE_SCREENCAPTURE 0x00000020 // screen capture functionality is available (see RPIPCHM_SCREENCAPTURE message)
#define RP_FEATURE_PAUSE 0x00000040 // pause functionality is available (see RPIPCHM_PAUSE message)
#define RP_FEATURE_TURBO 0x00000080 // turbo mode functionality is available (see RPIPCHM_TURBO message)
-#define RP_FEATURE_INPUTMODE 0x00000100 // input mode switching is supported (see RPIPCHM_INPUTMODE message)
-#define RP_FEATURE_VOLUME 0x00000200 // volume adjustment is possible (see RPIPCHM_VOLUME message)
+#define RP_FEATURE_VOLUME 0x00000100 // volume adjustment is possible (see RPIPCHM_VOLUME message)
// Screen Modes
#define RP_SCREENMODE_1X 0 // 1x windowed mode
#define RP_SCREENMODE_FULLSCREEN 3 // full screen
// Device Categories
-#define RP_DEVICE_FLOPPY 0 // floppy disk drive
-#define RP_DEVICE_HD 1 // hard disk drive
-#define RP_DEVICE_CD 2 // CD/DVD drive
-#define RP_DEVICE_NET 3 // network card
-#define RP_DEVICE_TAPE 4 // cassette tape drive
-#define RP_DEVICE_CARTRIDGE 5 // expansion cartridge
-
-typedef struct RPDeviceImage
+#define RP_DEVICE_FLOPPY 0 // floppy disk drive
+#define RP_DEVICE_HD 1 // hard disk drive
+#define RP_DEVICE_CD 2 // CD/DVD drive
+#define RP_DEVICE_NET 3 // network card
+#define RP_DEVICE_TAPE 4 // cassette tape drive
+#define RP_DEVICE_CARTRIDGE 5 // expansion cartridge
+#define RP_DEVICE_INPUTPORT 6 // input port
+#define RP_DEVICE_CATEGORIES 7 // total number of device categories
+
+#define RP_ALL_DEVICES 32 // constant for the RPIPCGM_DEVICEACTIVITY message
+
+typedef struct RPDeviceContent
{
- BYTE btDeviceCategory; // RP_DEVICE_* value
- BYTE btDeviceNumber; // device number (range 0..31)
- WCHAR szImageFile[1]; // full path and name of the image file to load (Unicode, variable-sized field)
-} RPDEVICEIMAGE;
+ BYTE btDeviceCategory; // RP_DEVICE_* value
+ BYTE btDeviceNumber; // device number (range 0..31)
+ WCHAR szContent[1]; // full path and name of the image file to load, or input port device (Unicode, variable-sized field)
+} RPDEVICECONTENT;
+
+// Input Port Devices
+#define RP_IPD_MOUSE1 L"Mouse1" // first mouse type (e.g. Windows Mouse for WinUAE)
+#define RP_IPD_MOUSE2 L"Mouse2" // second mouse type (e.g. Mouse for WinUAE)
+#define RP_IPD_MOUSE3 L"Mouse3" // third mouse type (e.g. Mousehack Mouse for WinUAE)
+#define RP_IPD_MOUSE4 L"Mouse4" // fourth mouse type (e.g. RAW Mouse for WinUAE)
+#define RP_IPD_JOYSTICK1 L"Joystick1" // first joystick type (e.g. standard joystick for WinUAE, described as "Joystick1\ProductGUID\ProductName")
+#define RP_IPD_JOYSTICK2 L"Joystick2" // second joystick type (e.g. X-Arcade (Left) joystick for WinUAE, described as "Joystick2\ProductGUID\ProductName")
+#define RP_IPD_JOYSTICK3 L"Joystick3" // third joystick type (e.g. X-Arcade (Right) joystick for WinUAE, described as "Joystick3\ProductGUID\ProductName")
+#define RP_IPD_KEYBDL1 L"KeyboardLayout1" // first joystick emulation keyboard layout (e.g. Keyboard Layout A for WinUAE)
+#define RP_IPD_KEYBDL2 L"KeyboardLayout2" // second joystick emulation keyboard layout (e.g. Keyboard Layout B for WinUAE)
+#define RP_IPD_KEYBDL3 L"KeyboardLayout3" // third joystick emulation keyboard layout (e.g. Keyboard Layout C for WinUAE)
// Turbo Mode Functionalities
#define RP_TURBO_CPU 0x00000001 // CPU
#define RP_TURBO_FLOPPY 0x00000002 // floppy disk drive
#define RP_TURBO_TAPE 0x00000004 // cassette tape drive
-// Input Modes
-#define RP_INPUTMODE_KEYBOARD 0 // the keyboard is used to simulate a joystick
-#define RP_INPUTMODE_JOYSTICK 1 // use the joystick connected to the system
-
// Reset Type
#define RP_RESET_SOFT 0 // soft reset
#define RP_RESET_HARD 1 // hard reset
static HWND hDbgWnd = 0;
static HWND hOutput = 0;
static HACCEL dbgaccel = 0;
+static HFONT udfont = 0;
extern int consoleopen;
+BOOL debuggerinitializing = FALSE;
extern uae_u32 get_fpsr();
static char linebreak[] = {'\r', '\n', '\0'};
struct debuggerpage {
HWND ctrl[MAXPAGECONTROLS];
- uae_u32 addr;
+ uae_u32 memaddr;
+ int memsel;
+ uae_u32 dasmaddr;
+ int dasmsel;
char addrinput[9];
int init;
+ BOOL autoset;
};
static struct debuggerpage dbgpage[MAXPAGES];
static int currpage, pages;
static int dbgwnd_minx = 800, dbgwnd_miny = 600;
+static BOOL useinternalcmd = FALSE;
+static char internalcmd[MAX_LINEWIDTH + 1];
+
+static const char *ucbranch[] = { "BSR", "JMP", "JSR", 0 };
+static const char *cbranch[] = { "B", "DB", "FB", "FDB", 0 };
+static const char *ccode[] = { "T ", "F ", "HI", "LS", "CC", "CS", "NE", "EQ",
+ "VC", "VS", "PL", "MI", "GE", "LT", "GT", "LE", 0 };
+
static void OutputCurrHistNode(HWND hWnd)
{
int txtlen;
if (!hDbgWnd)
return 0;
- inputfinished = 0;
hInput = GetDlgItem(hDbgWnd, IDC_DBG_INPUT);
chars = GetWindowText(hInput, out, maxlen);
if (chars == 0)
static void ShowBreakpoints(void)
{
HWND hBrkpts;
- int i, line = 0, lines_old, got;
+ int i, lines_old, got;
char outbp[MAX_LINEWIDTH + 1], outw[50];
hBrkpts = GetDlgItem(hDbgWnd, IDC_DBG_BRKPTS);
if (!got)
ULBS("none");
for (i = ulbs_pos; i < lines_old; i++)
- SendMessage(hBrkpts, LB_DELETESTRING, line, 0);
+ SendMessage(hBrkpts, LB_DELETESTRING, ulbs_pos, 0);
}
static void ShowMem(int offset)
char out[MAX_LINEWIDTH + 1];
HWND hMemory;
- dbgpage[currpage].addr += offset;
- addr = dbgpage[currpage].addr;
- hMemory = GetDlgItem(hDbgWnd, IDC_DBG_MEM);
+ dbgpage[currpage].memaddr += offset;
+ addr = dbgpage[currpage].memaddr;
+ if (currpage == 0)
+ hMemory = GetDlgItem(hDbgWnd, IDC_DBG_MEM2);
+ else
+ hMemory = GetDlgItem(hDbgWnd, IDC_DBG_MEM);
lines_old = SendMessage(hMemory, LB_GETCOUNT, 0, 0);
lines_new = GetLBOutputLines(hMemory);
for (i = 0; i < lines_new; i++) {
char out[MAX_LINEWIDTH + 1];
HWND hDasm;
- hDasm = GetDlgItem(hDbgWnd, IDC_DBG_DASM);
+ if (currpage == 0)
+ hDasm = GetDlgItem(hDbgWnd, IDC_DBG_DASM2);
+ else
+ hDasm = GetDlgItem(hDbgWnd, IDC_DBG_DASM);
+
if (!dbgpage[currpage].init) {
addr = m68k_getpc (®s);
dbgpage[currpage].init = 1;
}
+ else if (dbgpage[currpage].autoset && direction == 0) {
+ addr = m68k_getpc (®s);
+ }
else
- addr = dbgpage[currpage].addr;
+ addr = dbgpage[currpage].dasmaddr;
if (direction > 0) {
m68k_disasm_2(NULL, 0, addr, &addr, 1, NULL, NULL, 0);
- if (!addr || addr < dbgpage[currpage].addr)
- addr = dbgpage[currpage].addr;
+ if (!addr || addr < dbgpage[currpage].dasmaddr)
+ addr = dbgpage[currpage].dasmaddr;
}
else if (direction < 0 && addr > 0) {
if (GetPrevAddr(addr, &prev))
else
addr -= 2;
}
- if (addr % 2)
- return;
- dbgpage[currpage].addr = addr;
+ dbgpage[currpage].dasmaddr = addr;
lines_old = SendMessage(hDasm, LB_GETCOUNT, 0, 0);
lines_new = GetLBOutputLines(hDasm);
for (i = 0; i < lines_new; i++) {
m68k_disasm_2(out, sizeof(out), addr, &addr, 1, NULL, NULL, 0);
- if (addr > dbgpage[currpage].addr)
+ if (addr > dbgpage[currpage].dasmaddr)
UpdateListboxString(hDasm, i, out, FALSE);
else
UpdateListboxString(hDasm, i, "", FALSE);
{
int i, id;
- dbgpage[currpage].addr = m68k_getpc (®s);
- sprintf(dbgpage[currpage].addrinput, "%08lX", dbgpage[currpage].addr);
+ dbgpage[currpage].dasmaddr = m68k_getpc (®s);
+ sprintf(dbgpage[currpage].addrinput, "%08lX", dbgpage[currpage].dasmaddr);
for (i = 0; i < MAXPAGECONTROLS; i++) {
id = GetDlgCtrlID(dbgpage[currpage].ctrl[i]);
if (id == IDC_DBG_MEMINPUT)
id = GetDlgCtrlID(dbgpage[currpage].ctrl[i]);
if (id == IDC_DBG_MEMINPUT)
GetWindowText(dbgpage[currpage].ctrl[i], dbgpage[currpage].addrinput, 9);
- ShowWindow(dbgpage[currpage].ctrl[i], SW_HIDE);
+ if (index != currpage)
+ ShowWindow(dbgpage[currpage].ctrl[i], SW_HIDE);
}
}
}
pagetype = 0;
+ currpage = index;
for (i = 0; i < MAXPAGECONTROLS; i++) {
if (dbgpage[index].ctrl[i]) {
id = GetDlgCtrlID(dbgpage[index].ctrl[i]);
if (id == IDC_DBG_OUTPUT1 || id == IDC_DBG_OUTPUT2) {
hOutput = dbgpage[index].ctrl[i];
- } else if (id == IDC_DBG_MEM) {
+ } else if (id == IDC_DBG_MEM || id == IDC_DBG_MEM2) {
ShowMem(0);
pagetype = id;
} else if (id == IDC_DBG_DASM) {
ShowDasm(0);
pagetype = id;
- } else if (id == IDC_DBG_MEMINPUT) {
+ } else if (id == IDC_DBG_DASM2) {
+ ShowDasm(0);
+ }
+ else if (id == IDC_DBG_MEMINPUT) {
SetWindowText(dbgpage[index].ctrl[i], dbgpage[index].addrinput);
} else if (id == IDC_DBG_BRKPTS) {
ShowBreakpoints();
ShowMisc();
} else if (id == IDC_DBG_CUSTOM) {
ShowCustom();
+ } else if (id == IDC_DBG_AUTOSET) {
+ SendMessage(dbgpage[index].ctrl[i], BM_SETCHECK, (WPARAM)dbgpage[index].autoset ? BST_CHECKED : BST_UNCHECKED, (LPARAM)0);
}
ShowWindow(dbgpage[index].ctrl[i], SW_SHOW);
}
}
- currpage = index;
pstatuscolor[currpage] = COLOR_HIGHLIGHT;
hwnd = GetDlgItem(hDbgWnd, IDC_DBG_STATUS);
RedrawWindow(hwnd, 0, 0, RDW_INVALIDATE);
dbgpage[pages].ctrl[i] = GetDlgItem(hDbgWnd, iddata[i]);
ShowWindow(dbgpage[pages].ctrl[i], SW_HIDE);
}
+ if (pages == 0)
+ dbgpage[pages].autoset = TRUE;
+ else
+ dbgpage[pages].autoset = FALSE;
pages++;
}
HWND hwnd;
int dpage[][MAXPAGECONTROLS + 1] = {
- { IDC_DBG_OUTPUT1, -1 },
+ { IDC_DBG_OUTPUT1, IDC_DBG_DASM2, IDC_DBG_MEM2, -1 },
{ IDC_DBG_OUTPUT2, -1 },
{ IDC_DBG_MEM, IDC_DBG_MEMINPUT, -1 },
{ IDC_DBG_MEM, IDC_DBG_MEMINPUT, -1 },
- { IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC, -1 },
- { IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC, -1 },
+ { IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC, IDC_DBG_AUTOSET, -1 },
+ { IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC, IDC_DBG_AUTOSET, -1 },
{ IDC_DBG_BRKPTS, -1 },
{ IDC_DBG_MISC, -1 },
{ IDC_DBG_CUSTOM, -1 }
return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
}
+static int addrinputdialogactive;
+
static LRESULT CALLBACK MemInputProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HANDLE hdata;
case VK_RETURN:
sprintf(addrstr, "0x");
GetWindowText(hWnd, addrstr + 2, 9);
- addr = strtoul(addrstr, NULL, 0);
- dbgpage[currpage].addr = addr;
- ShowPage(currpage, TRUE);
+ if (addrstr[2] != 0) {
+ addr = strtoul(addrstr, NULL, 0);
+ if (pagetype == IDC_DBG_MEM || pagetype == IDC_DBG_MEM2) {
+ dbgpage[currpage].memaddr = addr;
+ ShowMem(0);
+ }
+ else if (pagetype == IDC_DBG_DASM) {
+ dbgpage[currpage].dasmaddr = addr;
+ ShowDasm(0);
+ }
+ }
+ addrinputdialogactive = -1;
break;
}
break;
return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
}
+static INT_PTR CALLBACK AddrInputDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg)
+ {
+ case WM_DESTROY:
+ PostQuitMessage (0);
+ return TRUE;
+ case WM_CLOSE:
+ addrinputdialogactive = 0;
+ DestroyWindow(hDlg);
+ return TRUE;
+ case WM_INITDIALOG:
+ {
+ WNDPROC oldproc;
+ HWND hwnd = GetDlgItem(hDlg, IDC_DBG_MEMINPUT2);
+ SendMessage(hwnd, EM_LIMITTEXT, 8, 0);
+ oldproc = (WNDPROC)SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)MemInputProc);
+ SetWindowLongPtr(hwnd, GWL_USERDATA, (LONG_PTR)oldproc);
+ return TRUE;
+ }
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ addrinputdialogactive = -1;
+ DestroyWindow (hDlg);
+ return TRUE;
+ case IDCANCEL:
+ addrinputdialogactive = 0;
+ DestroyWindow (hDlg);
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static void ShowAddrInputDialog(HWND hparent)
+{
+ HWND hwnd;
+ char addrstr[11];
+ uae_u32 addr;
+
+ addrinputdialogactive = 1;
+ sprintf(addrstr, "0x");
+ hwnd = CustomCreateDialog (IDD_DBGMEMINPUT, hparent, (DLGPROC)AddrInputDialogProc);
+ if (hwnd == NULL)
+ return;
+ SetFocus(GetDlgItem(hwnd, IDC_DBG_MEMINPUT2));
+ while (addrinputdialogactive == 1) {
+ MSG msg;
+ int ret;
+ WaitMessage();
+ while ((ret = GetMessage (&msg, NULL, 0, 0))) {
+ if (ret == -1)
+ break;
+ if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ SendMessage(GetDlgItem(hwnd, IDC_DBG_MEMINPUT2), WM_GETTEXT, 9, (LPARAM)addrstr + 2);
+ }
+ if (addrinputdialogactive == -1) {
+ if (addrstr[2] != 0) {
+ addr = strtoul(addrstr, NULL, 0);
+ dbgpage[currpage].memaddr = addr;
+ ShowMem(0);
+ }
+ SetFocus(hDbgWnd);
+ return;
+ }
+ }
+ return;
+
+}
+
+static void CopyListboxText(HWND hwnd, BOOL all)
+{
+ HANDLE hdata;
+ LPTSTR lptstr;
+ int i, count, start, end, size = 0;
+
+ if (!OpenClipboard(hwnd))
+ return;
+ EmptyClipboard();
+ if ((count = SendMessage(hwnd, LB_GETCOUNT, 0, 0)) < 1)
+ return;
+ if (all) {
+ start = 0;
+ end = count;
+ }
+ else {
+ int id = GetDlgCtrlID(hwnd);
+ if (id == IDC_DBG_MEM || id == IDC_DBG_MEM2)
+ start = dbgpage[currpage].memsel;
+ else
+ start = dbgpage[currpage].dasmsel;
+ end = start + 1;
+ }
+ for (i = start; i < end; i++)
+ size += (SendMessage(hwnd, LB_GETTEXTLEN, i, 0) + 2);
+ size++;
+ hdata = GlobalAlloc(GMEM_MOVEABLE, size);
+ if (hdata) {
+ int pos = 0;
+ lptstr = GlobalLock(hdata);
+ lptstr[size - 1] = '\0';
+ for (i = start; i < end; i++) {
+ int len = SendMessage(hwnd, LB_GETTEXTLEN, i, 0);
+ SendMessage(hwnd, LB_GETTEXT, i, (LPARAM)lptstr);
+ lptstr[len] = '\r';
+ lptstr[len + 1] = '\n';
+ lptstr += (len + 2);
+ }
+ GlobalUnlock(hdata);
+ SetClipboardData(CF_TEXT, hdata);
+ }
+ CloseClipboard();
+}
+
+static void ToggleBreakpoint(HWND hwnd)
+{
+ char addrstr[MAX_LINEWIDTH + 1], *ptr;
+ int index = dbgpage[currpage].dasmsel;
+ SendMessage(hwnd, LB_GETTEXT, index, (LPARAM)addrstr);
+ addrstr[8] = '\0';
+ ptr = addrstr;
+ console_out("\nf %s\n", addrstr);
+ instruction_breakpoint(&ptr);
+ RedrawWindow(hwnd, 0, 0, RDW_INVALIDATE);
+}
+
+static void DeleteBreakpoints(HWND hwnd)
+{
+ char *cmd = "d";
+ console_out("\nfd\n");
+ instruction_breakpoint(&cmd);
+ RedrawWindow(hwnd, 0, 0, RDW_INVALIDATE);
+}
+
static LRESULT CALLBACK ListboxProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldproc;
DeleteDC(compdc);
EndPaint(hWnd, &ps);
return TRUE;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)) {
+ case ID_DBG_SETTOA0:
+ case ID_DBG_SETTOA1:
+ case ID_DBG_SETTOA2:
+ case ID_DBG_SETTOA3:
+ case ID_DBG_SETTOA4:
+ case ID_DBG_SETTOA5:
+ case ID_DBG_SETTOA6:
+ case ID_DBG_SETTOA7:
+ dbgpage[currpage].memaddr = m68k_areg(®s, LOWORD(wParam) - ID_DBG_SETTOA0);
+ ShowMem(0);
+ return TRUE;
+ case ID_DBG_ENTERADDR:
+ ShowAddrInputDialog(hWnd);
+ return TRUE;
+ case ID_DBG_COPYLBLINE:
+ CopyListboxText(hWnd, FALSE);
+ return TRUE;
+ case ID_DBG_COPYLB:
+ CopyListboxText(hWnd, TRUE);
+ return TRUE;
+ case ID_DBG_TOGGLEBP:
+ ToggleBreakpoint(hWnd);
+ return TRUE;
+ case ID_DBG_DELETEBPS:
+ DeleteBreakpoints(hWnd);
+ return TRUE;
+ }
}
oldproc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_USERDATA);
return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
static void moveupdown(int dir)
{
- if (pagetype == IDC_DBG_MEM) {
+ if (pagetype == IDC_DBG_MEM || pagetype == IDC_DBG_MEM2) {
if (dir > 1 || dir < -1)
dir *= 4;
ShowMem(dir * 16);
MoveWindow(hwnd, r->left, r->top, r->right, r->bottom, TRUE);
}
+static int randidx;
static BOOL CALLBACK childenumproc (HWND hwnd, LPARAM lParam)
{
- int id1y[] = { IDC_DBG_OUTPUT1, IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_DASM, IDC_DBG_BRKPTS, IDC_DBG_MISC, IDC_DBG_CUSTOM, -1 };
+ int id1y[] = { IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_DASM, IDC_DBG_BRKPTS, IDC_DBG_MISC, IDC_DBG_CUSTOM, -1 };
int id2y[] = { IDC_DBG_INPUT, IDC_DBG_HELP, IDC_DBG_STATUS, -1 };
+ int id3y[] = { IDC_DBG_DASM2, IDC_DBG_MEM2, IDC_DBG_OUTPUT1, -1 };
- int id1x[] = { IDC_DBG_OUTPUT1, IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_DASM,
+ int id1x[] = { IDC_DBG_OUTPUT1, IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_MEM2, IDC_DBG_DASM, IDC_DBG_DASM2,
IDC_DBG_AMEM, IDC_DBG_PREFETCH, IDC_DBG_INPUT, IDC_DBG_STATUS, IDC_DBG_BRKPTS, IDC_DBG_MISC, IDC_DBG_CUSTOM, -1 };
int id2x[] = { IDC_DBG_HELP, IDC_DBG_CCR, IDC_DBG_SP_VBR, IDC_DBG_MMISC,
IDC_DBG_FPREG, IDC_DBG_FPSR, IDC_DBG_MCUSTOM, IDC_DBG_MISCCPU, -1 };
- int dlgid, j;
-
+ int dlgid, j, count, adjust, remainder, starty;
dlgid = GetDlgCtrlID(hwnd);
j = 0;
adjustitem(hwnd, 0, height_adjust, 0, 0);
j++;
}
+ j = 0;
+ count = sizeof(id3y) / sizeof(int) - 1;
+ adjust = height_adjust / count;
+ remainder = height_adjust % count;
+ if (randidx < 0) {
+ srand(time(NULL));
+ randidx = rand() % count;
+ }
+ while (id3y[j] >= 0) {
+ if (id3y[j] == dlgid) {
+ starty = j * adjust;
+ if (j < randidx)
+ adjustitem(hwnd, 0, starty, 0, adjust);
+ else if (j == randidx)
+ adjustitem(hwnd, 0, starty, 0, adjust + remainder);
+ else
+ adjustitem(hwnd, 0, starty + remainder, 0, adjust);
+ }
+ j++;
+ }
j = 0;
while (id1x[j] >= 0) {
if (id1x[j] == dlgid)
AdjustWindowRect(&r2, WS_POPUP | WS_CAPTION | WS_THICKFRAME, FALSE);
dlgRect.left -= r2.left;
dlgRect.top -= r2.top;
+ randidx = -1;
EnumChildWindows (hDlg, childenumproc, 0);
dlgRect = r;
RedrawWindow(hDlg, 0, 0, RDW_INVALIDATE);
return TRUE;
}
+static void step(BOOL over)
+{
+ if (over)
+ strcpy(internalcmd, "z");
+ else
+ strcpy(internalcmd, "t");
+ useinternalcmd = TRUE;
+ inputfinished = 1;
+}
+
+static void ShowContextMenu(HWND hwnd, int x, int y)
+{
+ POINT pt = { x, y };
+ HMENU hmenu, hsubmenu;
+ int id = GetDlgCtrlID(hwnd);
+ if (x == 65535 && y == 65535) {
+ DWORD msgpos = GetMessagePos();
+ pt.x = LOWORD(msgpos);
+ pt.y = HIWORD(msgpos);
+ }
+ hmenu = LoadMenu(hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE(IDM_DBGCONTEXTMENU));
+ if (!hmenu)
+ return;
+
+ if (id == IDC_DBG_MEM || id == IDC_DBG_MEM2)
+ hsubmenu = GetSubMenu(hmenu, 0);
+ else if (id == IDC_DBG_DASM || id == IDC_DBG_DASM2)
+ hsubmenu = GetSubMenu(hmenu, 1);
+ TrackPopupMenu(hsubmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
+ DestroyMenu(hmenu);
+ SendMessage(hwnd, LB_SETCURSEL, -1, 0);
+}
+
+static void SelectListboxLine(HWND hwnd, int x, int y)
+{
+ POINT pt = { x, y };
+ int index;
+ int size = GetTextSize(hwnd, NULL, 0);
+ int id = GetDlgCtrlID(hwnd);
+ ScreenToClient(hwnd, &pt);
+ index = pt.y /size;
+ SendMessage(hwnd, LB_SETCURSEL, index, 0);
+ if (id == IDC_DBG_MEM || id == IDC_DBG_MEM2)
+ dbgpage[currpage].memsel = index;
+ else if (id == IDC_DBG_DASM || id == IDC_DBG_DASM2)
+ dbgpage[currpage].dasmsel = index;
+}
+
static LRESULT CALLBACK DebuggerProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hwnd;
- DRAWITEMSTRUCT *pdis;
- HDC hdc;
- RECT rc;
- char text[MAX_LINEWIDTH + 1];
-
switch (message) {
case WM_INITDIALOG:
{
int newpos = 0;
LONG x, y, w, h;
RECT rw;
+ HFONT hfont;
+ LOGFONT lf;
GetWindowRect(hDlg, &rw);
dbgwnd_minx = rw.right - rw.left;
dbgwnd_miny = rw.bottom - rw.top;
histcount = 0;
inputfinished = 0;
AdjustDialog(hDlg);
+ hfont = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
+ GetObject(hfont, sizeof(LOGFONT), &lf);
+ lf.lfEscapement = lf.lfOrientation = 1800;
+ udfont = CreateFontIndirect(&lf);
return TRUE;
}
case WM_CLOSE:
hDbgWnd = 0;
PostQuitMessage(0);
DeleteFromHistory(histcount);
+ DeleteObject(udfont);
consoleopen = 0;
return TRUE;
}
return TRUE;
}
case WM_CTLCOLORSTATIC:
- SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
- return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
+ {
+ int id = GetDlgCtrlID((HWND)lParam);
+ if (id == IDC_DBG_OUTPUT1 || id == IDC_DBG_OUTPUT2) {
+ SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
+ return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
+ }
+ return FALSE;
+ }
case WM_CTLCOLORLISTBOX:
hwnd = (HWND)lParam;
if (!IsWindowEnabled(hwnd)) {
// IDs have to be consecutive and in order of page order for this to work
ShowPage(LOWORD(wParam) - ID_DBG_PAGE1, FALSE);
return TRUE;
+ case ID_DBG_STEP_OVER:
+ step(TRUE);
+ return TRUE;
+ case ID_DBG_STEP_INTO:
+ step(FALSE);
+ return TRUE;
case IDC_DBG_MEMUP:
moveupdown(-1);
return TRUE;
SetFocus(hmeminput);
return TRUE;
}
+ case IDC_DBG_AUTOSET:
+ {
+ if (pagetype == IDC_DBG_DASM) {
+ HWND hctrl;
+ dbgpage[currpage].autoset = 1 - dbgpage[currpage].autoset;
+ hctrl = GetDlgItem(hDbgWnd, IDC_DBG_AUTOSET);
+ SendMessage(hctrl, BM_SETCHECK, dbgpage[currpage].autoset ? BST_CHECKED : BST_UNCHECKED, 0);
+ hctrl = GetDlgItem(hDbgWnd, IDC_DBG_MEMINPUT);
+ SetFocus(hctrl);
+ }
+ return TRUE;
+ }
}
break;
+ case WM_CONTEXTMENU:
+ {
+ int id = GetDlgCtrlID((HWND)wParam);
+ if (id == IDC_DBG_MEM || id == IDC_DBG_MEM2 || id == IDC_DBG_DASM || id == IDC_DBG_DASM2) {
+ SelectListboxLine((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
+ ShowContextMenu((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
+ return TRUE;
+ }
+ break;
+ }
case WM_MEASUREITEM:
((MEASUREITEMSTRUCT*)(lParam))->itemHeight = GetTextSize(hDlg, NULL, FALSE);
return TRUE;
case WM_DRAWITEM:
- pdis = (DRAWITEMSTRUCT *)lParam;
- hdc = pdis->hDC;
- rc = pdis->rcItem;
+ {
+ DRAWITEMSTRUCT *pdis = (DRAWITEMSTRUCT *)lParam;
+ HDC hdc = pdis->hDC;
+ RECT rc = pdis->rcItem;
+ char text[MAX_LINEWIDTH + 1];
+ uae_u32 addr;
SetBkMode(hdc, TRANSPARENT);
if (wParam == IDC_DBG_STATUS) {
SetTextColor(hdc, GetSysColor(pstatuscolor[pdis->itemID]));
DrawText(hdc, pname[pdis->itemID], lstrlen(pname[pdis->itemID]), &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
+ return TRUE;
}
else {
if (pdis->itemID < 0) {
SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
}
SetTextColor(hdc, pdis->itemData);
- TextOut(hdc, rc.left, rc.top, text, strlen(text));
+ if (wParam == IDC_DBG_DASM || wParam == IDC_DBG_DASM2) {
+ char addrstr[11] = { '0', 'x', '\0'}, *btemp;
+ int i, j, size = rc.bottom - rc.top;
+ strncpy(addrstr + 2, text, 8);
+ addrstr[10] = 0;
+ addr = strtoul(addrstr, NULL, 0);
+ for (i = 0; i < BREAKPOINT_TOTAL; i++) {
+ if (addr == bpnodes[i].addr && bpnodes[i].enabled) {
+ int offset = 0;
+ if (size >= 9)
+ offset = 3;
+ SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT));
+ Ellipse(hdc, rc.left + offset, rc.top + offset, rc.left + size - offset, rc.bottom - offset);
+ }
+ }
+ rc.left += size;
+ i = 0;
+ btemp = NULL;
+ addrstr[2] = '\0';
+ while (ucbranch[i]) {
+ if (!strncmp(text + 34, ucbranch[i], strlen(ucbranch[i]))) {
+ btemp = strchr(text + 34, '=');
+ if (btemp)
+ strncpy(addrstr + 2, btemp + 4, 8);
+ else {
+ int pos = 34 + strlen(ucbranch[i]) + 3;
+ if (text[pos] == '$') //absolute addressing
+ strncpy(addrstr + 2, text + pos + 1, 8);
+ else if (text[pos] == '(' && isdigit(text[pos + 2])) { //address register indirect
+ int reg = atoi(text + pos + 2);
+ uae_u32 loc = m68k_areg (®s, reg);
+ sprintf(addrstr + 2, "%08lx", loc);
+ }
+ }
+ break;
+ }
+ i++;
+ }
+ i = 0;
+ while (addrstr[2] == '\0' && cbranch[i]) {
+ if (!strncmp(text + 34, cbranch[i], strlen(cbranch[i]))) {
+ j = 0;
+ while (ccode[j]) {
+ if (!strncmp(text + 34 + strlen(cbranch[i]), ccode[j], strlen(ccode[j]))) {
+ btemp = strchr(text + 34, '=');
+ if (btemp)
+ strncpy(addrstr + 2, btemp + 4, 8);
+ break;
+ }
+ j++;
+ }
+ }
+ i++;
+ }
+ if (addrstr[2] != '\0') {
+ uae_u32 branchaddr = strtoul(addrstr, NULL, 0);
+ if (branchaddr < addr)
+ TextOut(hdc, rc.left, rc.top, "^", 1);
+ else if (branchaddr > addr) {
+ HFONT hfontold = (HFONT)SelectObject(hdc, udfont);
+ int width = GetTextSize(hDlg, "^", TRUE);
+ TextOut(hdc, rc.left + width, rc.bottom, "^", 1);
+ SelectObject(hdc, hfontold);
+ }
+ else
+ TextOut(hdc, rc.left, rc.top, "=", 1);
+ }
+ rc.left += size;
+ if (addr == m68k_getpc(®s)) {
+ FillRect(hdc, &rc, GetSysColorBrush(COLOR_HIGHLIGHT));
+ SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
+ SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+ }
+ TextOut(hdc, rc.left, rc.top, text, strlen(text));
+ if ((pdis->itemState) & (ODS_SELECTED))
+ DrawFocusRect(hdc, &rc);
+ }
+ else if (wParam == IDC_DBG_MEM || wParam == IDC_DBG_MEM2) {
+ if ((pdis->itemState) & (ODS_SELECTED))
+ DrawFocusRect(hdc, &rc);
+ TextOut(hdc, rc.left, rc.top, text, strlen(text));
+ }
+ else
+ TextOut(hdc, rc.left, rc.top, text, strlen(text));
return TRUE;
}
break;
+ }
}
return FALSE;
}
if (hDbgWnd)
return 0;
+ debuggerinitializing = TRUE;
reopen = 0;
dbgaccel = LoadAccelerators(hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDR_DBGACCEL));
nr = getresource(IDD_DEBUGGER);
hDbgWnd = CreateDialogIndirect (nr->inst, nr->resource, NULL, DebuggerProc);
freescaleresource(nr);
}
+ debuggerinitializing = FALSE;
if (!hDbgWnd)
return 0;
InitPages();
while ((ret = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (!debugger_active || ret == -1) {
return -1;
- } else if (!IsWindow(hDbgWnd) || !TranslateAccelerator(hDbgWnd, dbgaccel, &msg) || !IsDialogMessage(hDbgWnd, &msg)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
+ } else if (!TranslateAccelerator(hDbgWnd, dbgaccel, &msg)) {
+ if (!IsWindow(hDbgWnd) || !IsDialogMessage(hDbgWnd, &msg)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+ if (inputfinished) {
+ inputfinished = 0;
+ if (useinternalcmd) {
+ useinternalcmd = FALSE;
+ console_out("\n");
+ console_out(internalcmd);
+ console_out("\n");
+ strncpy(out, internalcmd, maxlen);
+ return strlen(out);
+ }
+ else
+ return GetInput(out, maxlen);
}
- if (inputfinished)
- return GetInput(out, maxlen);
}
return 0;
}
did->buttons = 3;
if (did->buttons > 5)
did->buttons = 5; /* no non-direcinput support for >5 buttons */
- if (did->buttons > 3 && !os_winnt)
- did->buttons = 3; /* Windows 98/ME support max 3 non-DI buttons */
for (j = 0; j < did->buttons; j++) {
did->buttonsort[j] = j;
sprintf (tmp, "Button %d", j + 1);
if (ledkeystate[VK_SCROLL] & 1)
led |= KBLED_SCROLLLOCK;
- if (currprefs.win32_kbledmode && os_winnt) {
+ if (currprefs.win32_kbledmode) {
oldusbleds = led;
- } else if (!currprefs.win32_kbledmode && os_winnt && kbhandle != INVALID_HANDLE_VALUE) {
+ } else if (!currprefs.win32_kbledmode && kbhandle != INVALID_HANDLE_VALUE) {
#ifdef WINDDK
KEYBOARD_INDICATOR_PARAMETERS InputBuffer;
KEYBOARD_INDICATOR_PARAMETERS OutputBuffer;
static void set_leds (uae_u32 led)
{
- if (os_winnt && currprefs.win32_kbledmode) {
+ if (currprefs.win32_kbledmode) {
if((oldusbleds & KBLED_NUMLOCK) != (led & KBLED_NUMLOCK))
kbevt (VK_NUMLOCK, 0x45);
if((oldusbleds & KBLED_CAPSLOCK) != (led & KBLED_CAPSLOCK))
if((oldusbleds & KBLED_SCROLLLOCK) != (led & KBLED_SCROLLLOCK))
kbevt (VK_SCROLL, 0x46);
oldusbleds = led;
- } else if (os_winnt && kbhandle != INVALID_HANDLE_VALUE) {
+ } else if (kbhandle != INVALID_HANDLE_VALUE) {
#ifdef WINDDK
KEYBOARD_INDICATOR_PARAMETERS InputBuffer;
ULONG DataLength = sizeof(KEYBOARD_INDICATOR_PARAMETERS);
&InputBuffer, DataLength, NULL, 0, &ReturnedLength, NULL))
write_log ("kbleds: DeviceIoControl() failed %d\n", GetLastError());
#endif
- } else if (!os_winnt) {
- ledkeystate[VK_NUMLOCK] &= ~1;
- if (led & KBLED_NUMLOCK)
- ledkeystate[VK_NUMLOCK] = 1;
- ledkeystate[VK_CAPITAL] &= ~1;
- if (led & KBLED_CAPSLOCK)
- ledkeystate[VK_CAPITAL] = 1;
- ledkeystate[VK_SCROLL] &= ~1;
- if (led & KBLED_SCROLLLOCK)
- ledkeystate[VK_SCROLL] = 1;
- SetKeyboardState (ledkeystate);
- }
+ }
}
static void update_leds (void)
unacquire (lpdi, "keyboard");
if (currprefs.keyboard_leds_in_use) {
#ifdef WINDDK
- if (os_winnt && !currprefs.win32_kbledmode) {
+ if (!currprefs.win32_kbledmode) {
if (DefineDosDevice (DDD_RAW_TARGET_PATH, "Kbd","\\Device\\KeyboardClass0")) {
kbhandle = CreateFile("\\\\.\\Kbd", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (kbhandle == INVALID_HANDLE_VALUE) {
if (v & FILE_ATTRIBUTE_READONLY)
ret |= MYVOLUMEINFO_READONLY;
*/
- if (!os_winnt)
- return ret;
pGetVolumePathName = (GETVOLUMEPATHNAME)GetProcAddress(
GetModuleHandle("kernel32.dll"), "GetVolumePathNameA");
if (pGetVolumePathName && pGetVolumePathName (root, volume, sizeof (volume))) {
>
</File>
<File
- RelativePath="..\..\gencomp.c"
+ RelativePath="..\..\jit\gencomp.c"
>
</File>
<File
#include "resource.h"
#include "threaddep/thread.h"
+#include "options.h"
#include "filesys.h"
#include "blkdev.h"
#include "registry.h"
cnt++;
}
+#define CA "Commodore\0Amiga\0"
static int safetycheck (HANDLE *h, uae_u64 offset, uae_u8 *buf, int blocksize)
{
int i, j, blocks = 63, empty = 1;
write_log ("hd accepted (rdb detected at block %d)\n", j);
return -1;
}
+
+ if (!memcmp (buf + 2, "CIS@", 4) && !memcmp (buf + 16, CA, strlen (CA))) {
+ write_log ("hd accepted (PCMCIA RAM)\n");
+ return -2;
+ }
if (j == 0) {
for (i = 0; i < blocksize; i++) {
if (buf[i])
return 0;
}
write_log ("hd accepted (empty)\n");
- return -2;
+ return -9;
}
interfaceDetailDataSize = reqSize;
interfaceDetailData = malloc (interfaceDetailDataSize);
- if ( interfaceDetailData == NULL ) {
+ if (interfaceDetailData == NULL) {
write_log ("Unable to allocate memory to get the interface detail data.\n");
ret = 0;
goto end;
&reqSize, // Buffer size required to get the detail data
NULL); // Interface device info
- if ( status == FALSE ) {
+ if (status == FALSE) {
write_log ("Error in SetupDiGetDeviceInterfaceDetail failed with error: %d\n", GetLastError());
ret = 0;
goto end;
}
SetupDiDestroyDeviceInfoList(hIntDevInfo);
}
+#if 0
+ hIntDevInfo = SetupDiGetClassDevs (&GUID_DEVCLASS_MTD, NULL, NULL, DIGCF_PRESENT);
+ if (hIntDevInfo != INVALID_HANDLE_VALUE) {
+ while (index < MAX_FILESYSTEM_UNITS) {
+ memset (uae_drives + index2, 0, sizeof (struct uae_driveinfo));
+ index++;
+ num_drives = index2;
+ }
+ SetupDiDestroyDeviceInfoList(hIntDevInfo);
+ }
+#endif
VirtualFree (buffer, 0, MEM_RELEASE);
}
num_drives = index2;
switch (uae_drives[index].dangerous)
{
- case -2:
+ case -9:
dang = "Empty";
break;
+ case -2:
+ dang = "SRAM";
+ break;
case -1:
dang = "RDB";
break;
return uae_drives[index].device_name;
}
-static int hmc (struct hardfiledata *hfd, int nr)
+static int hmc (struct hardfiledata *hfd)
{
uae_u8 *buf = xmalloc (hfd->blocksize);
DWORD ret, got, err, status;
int hardfile_remount (int nr);
+
+static void hmc_check (struct hardfiledata *hfd, struct uaedev_config_info *uci, int *rescanned, int *reopen, int *gotinsert)
+{
+ int ret;
+
+ if (!hfd->emptyname)
+ return;
+ if (*rescanned == 0) {
+ hdf_init2 (1);
+ *rescanned = 1;
+ }
+ if (hfd->drive_empty < 0 || !hfd->handle_valid) {
+ int empty = hfd->drive_empty;
+ int r;
+ //write_log ("trying to open '%s' de=%d hv=%d\n", hfd->emptyname, hfd->drive_empty, hfd->handle_valid);
+ r = hdf_open (hfd, hfd->emptyname);
+ //write_log ("=%d\n", r);
+ if (!r)
+ return;
+ *reopen = 1;
+ if (hfd->drive_empty < 0)
+ return;
+ hfd->drive_empty = empty ? 1 : 0;
+ }
+ ret = hmc (hfd);
+ if (!ret)
+ return;
+ if (ret > 0) {
+ if (*reopen == 0) {
+ hdf_open (hfd, hfd->emptyname);
+ if (!hfd->handle_valid)
+ return;
+ }
+ *gotinsert = 1;
+ //hardfile_remount (uci);
+ }
+ hardfile_do_disk_change (uci, ret < 0 ? 0 : 1);
+}
+
int win32_hardfile_media_change (void)
{
int gotinsert = 0, rescanned = 0;
for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
struct hardfiledata *hfd = get_hardfile_data (i);
- int ret, reopen = 0;
+ int reopen = 0;
if (!hfd || !(hfd->flags & HFD_FLAGS_REALDRIVE))
continue;
- if (!hfd->emptyname)
- continue;
- if (!rescanned) {
- hdf_init2 (1);
- rescanned = 1;
- }
- if (hfd->drive_empty < 0 || !hfd->handle_valid) {
- int empty = hfd->drive_empty;
- int r;
- //write_log ("trying to open '%s' de=%d hv=%d\n", hfd->emptyname, hfd->drive_empty, hfd->handle_valid);
- r = hdf_open (hfd, hfd->emptyname);
- //write_log ("=%d\n", r);
- if (!r)
- continue;
- reopen = 1;
- if (hfd->drive_empty < 0)
- continue;
- hfd->drive_empty = empty ? 1 : 0;
- }
- ret = hmc (hfd, i);
- if (!ret)
- continue;
- if (ret > 0) {
- if (!reopen) {
- hdf_open (hfd, hfd->emptyname);
- if (!hfd->handle_valid)
- continue;
- }
- gotinsert = 1;
- hardfile_remount (i);
+ hmc_check (hfd, &currprefs.mountconfig[i], &rescanned, &reopen, &gotinsert);
+ }
+ for (i = 0; i < currprefs.mountitems; i++) {
+ extern struct hd_hardfiledata *pcmcia_sram;
+ int reopen = 0;
+ struct uaedev_config_info *uci = &currprefs.mountconfig[i];
+ if (uci->controller == HD_CONTROLLER_PCMCIA_SRAM) {
+ hmc_check (&pcmcia_sram->hfd, uci, &rescanned, &reopen, &gotinsert);
}
- hardfile_do_disk_change (i, ret < 0 ? 0 : 1);
}
+
//write_log ("win32_hardfile_media_change returned %d\n", gotinsert);
return gotinsert;
}
int x = crd[0], y = crd[1], w = crd[2], h = crd[3];
for (yy = y; yy < y + h; yy++) {
for (xx = x; xx < x + w; xx++) {
- uae_u8 b = origbitmap[yy * desc.Width + xx];
+ uae_u8 b = origbitmap[yy * desc.Width + xx];
if (inv)
b = b == 0 ? 0xff : 0;
bitmap[yy * desc.Width + xx] = b;
static void *virtualallocwithlock(LPVOID addr, SIZE_T size, DWORD allocationtype, DWORD protect)
{
void *p = VirtualAlloc (addr, size, allocationtype, protect);
- if (p && memorylocking && os_winnt)
+ if (p && memorylocking)
VirtualLock(p, size);
return p;
}
static void virtualfreewithlock(LPVOID addr, SIZE_T size, DWORD freetype)
{
- if (memorylocking && os_winnt)
+ if (memorylocking)
VirtualUnlock(addr, size);
VirtualFree(addr, size, freetype);
}
static uae_u32 max_allowed_mman;
static uae_u64 size64;
+ typedef BOOL (CALLBACK* GLOBALMEMORYSTATUSEX)(LPMEMORYSTATUSEX);
void preinit_shm (void)
{
uae_u64 total64;
uae_u64 totalphys64;
MEMORYSTATUS memstats;
+ GLOBALMEMORYSTATUSEX pGlobalMemoryStatusEx;
+ MEMORYSTATUSEX memstatsex;
- max_allowed_mman = 768;
- if (os_winnt) {
- max_allowed_mman = 1536;
- if (os_64bit)
- max_allowed_mman = 2048;
- }
+ max_allowed_mman = 1536;
+ if (os_64bit)
+ max_allowed_mman = 2048;
memstats.dwLength = sizeof(memstats);
GlobalMemoryStatus(&memstats);
totalphys64 = memstats.dwTotalPhys;
total64 = (uae_u64)memstats.dwAvailPageFile + (uae_u64)memstats.dwAvailPhys;
- if (os_winnt) {
- typedef BOOL (CALLBACK* GLOBALMEMORYSTATUSEX)(LPMEMORYSTATUSEX);
- GLOBALMEMORYSTATUSEX pGlobalMemoryStatusEx;
- MEMORYSTATUSEX memstatsex;
- pGlobalMemoryStatusEx = (GLOBALMEMORYSTATUSEX)GetProcAddress(GetModuleHandle("kernel32.dll"), "GlobalMemoryStatusEx");
- if (pGlobalMemoryStatusEx) {
- memstatsex.dwLength = sizeof (MEMORYSTATUSEX);
- if (pGlobalMemoryStatusEx(&memstatsex)) {
- totalphys64 = memstatsex.ullTotalPhys;
- total64 = memstatsex.ullAvailPageFile + memstatsex.ullAvailPhys;
- }
+ pGlobalMemoryStatusEx = (GLOBALMEMORYSTATUSEX)GetProcAddress(GetModuleHandle("kernel32.dll"), "GlobalMemoryStatusEx");
+ if (pGlobalMemoryStatusEx) {
+ memstatsex.dwLength = sizeof (MEMORYSTATUSEX);
+ if (pGlobalMemoryStatusEx(&memstatsex)) {
+ totalphys64 = memstatsex.ullTotalPhys;
+ total64 = memstatsex.ullAvailPageFile + memstatsex.ullAvailPhys;
}
}
size64 = total64 - (total64 >> 3);
- if (size64 > 0x7f000000)
- size64 = 0x7f000000;
+ if (os_64bit) {
+ if (size64 > 0x7f000000)
+ size64 = 0x7f000000;
+ } else {
+ if (size64 > 0x7f000000)
+ size64 = 0x7f000000;
+ }
if (size64 < 8 * 1024 * 1024)
size64 = 8 * 1024 * 1024;
if (max_allowed_mman * 1024 * 1024 > size64)
{
int i;
LPVOID blah = NULL;
- // Letting the system decide doesn't seem to work on some systems (Win9x..)
- LPBYTE address = (LPBYTE)0x10000000;
- uae_u32 size;
- uae_u32 add = 0x10000000;
- uae_u32 inc = 0x100000;
+ uae_u32 size, totalsize, z3size, natmemsize;
- if (natmem_offset && os_winnt)
+ if (natmem_offset)
VirtualFree(natmem_offset, 0, MEM_RELEASE);
natmem_offset = NULL;
canbang = 0;
size = 0x1000000;
if (currprefs.cpu_model >= 68020)
size = 0x10000000;
- if (currprefs.z3fastmem_size || currprefs.gfxmem_size) {
- size = currprefs.z3fastmem_size + (currprefs.z3fastmem_start - 0x10000000);
- size += currprefs.gfxmem_size;
- size += 16 * 1024 * 1024;
+ if (currprefs.z3fastmem_size) {
+ z3size = currprefs.z3fastmem_size + (currprefs.z3fastmem_start - 0x10000000);
+ if (currprefs.gfxmem_size)
+ size += 16 * 1024 * 1024;
}
- while (size > size64) {
+ totalsize = size + z3size + currprefs.gfxmem_size;
+ while (totalsize > size64) {
int change = lowmem ();
if (!change)
return 0;
- size -= change;
+ totalsize -= change;
}
shm_start = 0;
shmids[i].addr = NULL;
shmids[i].name[0] = 0;
}
+ natmemsize = p96mode ? size + z3size : totalsize;
for (;;) {
int change;
- blah = VirtualAlloc(NULL, size + add, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
+ blah = VirtualAlloc(NULL, natmemsize, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (blah)
break;
- write_log ("NATMEM: %dM area failed to allocate, err=%d\n", (size + add) >> 20, GetLastError());
+ write_log ("NATMEM: %dM area failed to allocate, err=%d\n", natmemsize >> 20, GetLastError());
change = lowmem ();
- size -= change;
- if (change == 0 || size < 0x10000000) {
+ totalsize -= change;
+ if (change == 0 || totalsize < 0x10000000) {
write_log ("NATMEM: No special area could be allocated (2)!\n");
return 0;
}
}
- if (os_winnt) {
- natmem_offset = blah;
- if (p96mode) {
- p96mem_offset = VirtualAlloc(natmem_offset + size + add, 128 * 1024 * 1024, MEM_RESERVE | MEM_WRITE_WATCH, PAGE_EXECUTE_READWRITE);
- if (!p96mem_offset) {
- write_log ("NATMEM: failed to allocate special Picasso96 GFX RAM\n");
- p96mode = 0;
- }
- }
- } else {
- VirtualFree(blah, 0, MEM_RELEASE);
- while (address < (LPBYTE)0xa0000000) {
- blah = VirtualAlloc(address, size + add, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- if (blah == NULL) {
- address += inc;
- } else {
- VirtualFree (blah, 0, MEM_RELEASE);
- address += inc * 32;
- natmem_offset = address;
- break;
- }
+ natmem_offset = blah;
+ if (p96mode) {
+ p96mem_offset = VirtualAlloc(natmem_offset + size + z3size, currprefs.gfxmem_size + 4096, MEM_RESERVE | MEM_WRITE_WATCH, PAGE_EXECUTE_READWRITE);
+ if (!p96mem_offset) {
+ write_log ("NATMEM: failed to allocate special Picasso96 GFX RAM\n");
+ p96mode = 0;
}
}
write_log ("NATMEM: No special area could be allocated! (1)\n");
} else {
write_log ("NATMEM: Our special area: 0x%p-0x%p (%08x %dM)\n",
- natmem_offset, (uae_u8*)natmem_offset + size + add,
- size + add,
- (size + add) >> 20);
+ natmem_offset, (uae_u8*)natmem_offset + natmemsize,
+ natmemsize, natmemsize >> 20);
+ if (p96mode)
+ write_log ("NATMEM: P96 special area: 0x%p-0x%p (%08x %dM)\n",
+ p96mem_offset, (uae_u8*)p96mem_offset + currprefs.gfxmem_size,
+ currprefs.gfxmem_size, currprefs.gfxmem_size >> 20);
canbang = 1;
}
extern void p96memstart(void);
p96memstart();
shmaddr = natmem_offset + p96ram_start;
- virtualfreewithlock(shmaddr, os_winnt ? size : 0, os_winnt ? MEM_DECOMMIT : MEM_RELEASE);
+ virtualfreewithlock(shmaddr, size, MEM_DECOMMIT);
xfree(p96fakeram);
result = p96fakeram = xcalloc (size + 4096, 1);
shmids[shmid].attached = result;
got = FALSE;
if (got == FALSE) {
if (shmaddr)
- virtualfreewithlock(shmaddr, os_winnt ? size : 0, os_winnt ? MEM_DECOMMIT : MEM_RELEASE);
- result = virtualallocwithlock(shmaddr, size, os_winnt ? MEM_COMMIT : (MEM_RESERVE | MEM_COMMIT | (p96special ? MEM_WRITE_WATCH : 0)),
- PAGE_EXECUTE_READWRITE);
+ virtualfreewithlock(shmaddr, size, MEM_DECOMMIT);
+ result = virtualallocwithlock(shmaddr, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (result == NULL) {
result = (void*)-1;
write_log ("VirtualAlloc %08.8X - %08.8X %x (%dk) failed %d\n",
(uae_u8*)shmaddr - natmem_offset, (uae_u8*)shmaddr - natmem_offset + size,
size, size >> 10, GetLastError());
} else {
- if (memorylocking && os_winnt)
+ if (memorylocking)
VirtualLock(shmaddr, size);
shmids[shmid].attached = result;
write_log ("VirtualAlloc %08.8X - %08.8X %x (%dk) ok%s\n",
result = 0;
break;
case IPC_RMID:
- VirtualFree(shmids[shmid].attached, os_winnt ? shmids[shmid].size : 0,
- os_winnt ? MEM_DECOMMIT : MEM_RELEASE);
+ VirtualFree(shmids[shmid].attached, shmids[shmid].size, MEM_DECOMMIT);
shmids[shmid].key = -1;
shmids[shmid].name[0] = '\0';
shmids[shmid].size = 0;
char devname[1000];
write_log ("Serial port enumeration..\n");
- cnt = 0;
- if (os_winnt)
- cnt = enumserialports_2();
+ cnt = enumserialports_2();
for (i = 0; i < 10; i++) {
sprintf(name, "COM%d", i);
if (!QueryDosDevice(name, devname, sizeof devname))
cnt++;
}
}
- if (cnt == 0 && !os_winnt) {
- /* windows 98 hack */
- for (i = 0; i < 8; i++) {
- COMMCONFIG cc;
- DWORD size = sizeof(COMMCONFIG);
- sprintf(name, "COM%d", i);
- if(GetDefaultCommConfig (name, &cc, &size)) {
- j = cnt;
- comports[j].dev = xmalloc(100);
- sprintf(comports[cnt].dev, "\\.\\\\%s", name);
- comports[j].cfgname = my_strdup (name);
- comports[j].name = my_strdup (name);
- write_log ("W98SERPORT: %d:'%s'\n", cnt, comports[j].name);
- cnt++;
- }
- }
- }
write_log ("Serial port enumeration end\n");
return cnt;
}
#include "picasso96_win.h"
#include "win32gfx.h"
+extern int p96mode;
+#define P96TRACING_ENABLED 1
+
int p96hack_vpos, p96hack_vpos2, p96refresh_active;
int have_done_picasso; /* For the JIT compiler */
-static int vsyncgfxwrite = 0;
+static int vsyncgfxwrite = -1;
static int p96syncrate, vsyncgfxcount;
int p96hsync_counter, palette_changed;
#if defined(X86_MSVC_ASSEMBLY)
#define PIXEL_LOCK //and scrollable screens
#define MAXFLUSHPIXEL 2000 //pixel draw in a lock
static void flushpixels(void);
+static void flushpixels_lock(void);
#ifdef P96TRACING_ENABLED
#define P96TRACE(x) do { write_log x; } while(0)
#else
#define GetBytesPerPixel(x) GetBytesPerPixel2(x,__FILE__,__LINE__)
#if defined(JIT)
-#define P96_SM_RW special_mem |= PIC_READ | PIC_WRITE;
+#define P96_SM_RW if (p96mode == 0) special_mem |= PIC_READ | PIC_WRITE;
#define P96_SM_R special_mem |= PIC_READ;
#define P96_SM_W special_mem |= PIC_WRITE;
#else
#define P96_SM_W
#endif
-static uae_u32 REGPARAM2 gfxmem_lget (uaecptr) REGPARAM;
-static uae_u32 REGPARAM2 gfxmem_wget (uaecptr) REGPARAM;
-static uae_u32 REGPARAM2 gfxmem_bget (uaecptr) REGPARAM;
static void REGPARAM2 gfxmem_lput (uaecptr, uae_u32) REGPARAM;
static void REGPARAM2 gfxmem_wput (uaecptr, uae_u32) REGPARAM;
static void REGPARAM2 gfxmem_bput (uaecptr, uae_u32) REGPARAM;
-static int REGPARAM2 gfxmem_check (uaecptr addr, uae_u32 size) REGPARAM;
-static uae_u8 *REGPARAM2 gfxmem_xlate (uaecptr addr) REGPARAM;
+static void REGPARAM2 gfxmem_lputx (uaecptr, uae_u32) REGPARAM;
+static void REGPARAM2 gfxmem_wputx (uaecptr, uae_u32) REGPARAM;
+static void REGPARAM2 gfxmem_bputx (uaecptr, uae_u32) REGPARAM;
static uae_u8 all_ones_bitmap, all_zeros_bitmap; /* yuk */
if(picasso_on)
{
#ifdef PIXEL_LOCK
- flushpixels();
+ flushpixels_lock();
#endif
gfx_unlock_picasso ();
}
write_log ("Line->Xorigin = %d\n", line->Xorigin);
write_log ("Line->Yorigin = %d\n", line->Yorigin);
}
+}
#endif
static void ShowSupportedResolutions (void)
* filled rectangle in the frame buffer; it can be used as a memcpy source if
* there is no OS specific function to fill the rectangle.
*/
-static void do_fillrect(uae_u8 *src, unsigned int x, unsigned int y,
+static void do_fillrect (uae_u8 *src, unsigned int x, unsigned int y,
unsigned int width, unsigned int height,
uae_u32 pen, int Bpp, RGBFTYPE rgbtype)
{
flushpixels();
#endif
- if(picasso_vidinfo.rgbformat == picasso96_state.RGBFormat)
- {
+ if(picasso_vidinfo.rgbformat == picasso96_state.RGBFormat) {
if(DX_Fill(x, y, width, height, pen, rgbtype))
return;
- }
- else
- {
+ } else {
if(DX_Fill(x, y, width, height, picasso_vidinfo.clut[src[0]], rgbtype))
return;
}
width *= Bpp;
dst += y * picasso_vidinfo.rowbytes + x * picasso_vidinfo.pixbytes;
- if (picasso_vidinfo.rgbformat == picasso96_state.RGBFormat)
- {
- if(Bpp == 1)
- {
- while (height-- > 0)
- {
+ if (picasso_vidinfo.rgbformat == picasso96_state.RGBFormat) {
+ if(Bpp == 1) {
+ while (height-- > 0) {
memset(dst, pen, width);
dst += picasso_vidinfo.rowbytes;
}
- }
- else
- {
- while (height-- > 0)
- {
+ } else {
+ while (height-- > 0) {
memcpy (dst, src, width);
dst += picasso_vidinfo.rowbytes;
}
}
- }
- else
- {
+ } else {
int psiz = GetBytesPerPixel (picasso_vidinfo.rgbformat);
- if (picasso96_state.RGBFormat != RGBFB_CHUNKY)
- {
+ if (picasso96_state.RGBFormat != RGBFB_CHUNKY) {
write_log ("ERROR - do_fillrect() failure1 (%d)\n", picasso96_state.RGBFormat);
goto out;
}
- while (height-- > 0)
- {
+ while (height-- > 0) {
unsigned int i;
switch (psiz)
{
#ifndef LOCK_UNLOCK_MADNESS
gfx_unlock_picasso ();
#else
- PICASSO96_Unlock();
+ PICASSO96_Unlock();
#endif
}
flushpixels();
#endif
#endif
+
/* Is our x/y origin on-screen? */
if(dsty >= picasso_vidinfo.height)
return;
if(dstx + width >= picasso_vidinfo.width)
width = picasso_vidinfo.width - dstx;
- if (can_do_blit)
- {
+ if (can_do_blit) {
//
// Call OS blitting function that can do it in video memory.
// Should return if it was successful
srcp = ri->Memory + srcx * Bpp + srcy * ri->BytesPerRow;
DX_Invalidate (dstx, dsty, width, height);
- if (! picasso_vidinfo.extra_mem)
- {
+ if (! picasso_vidinfo.extra_mem) {
#ifdef LOCK_UNLOCK_MADNESS
goto out;
#else
#else
dstp = gfx_lock_picasso ();
#endif
- if (dstp == 0)
- {
+ if (dstp == 0) {
write_log ("WARNING: do_blit() couldn't lock\n");
goto out;
}
srcp, dstp, picasso_vidinfo.rowbytes, srcx, srcy, dstx, dsty, width, height, picasso_vidinfo.pixbytes));
P96TRACE(("gfxmem is at 0x%x\n",gfxmemory));
- if (picasso_vidinfo.rgbformat == picasso96_state.RGBFormat)
- {
+ if (picasso_vidinfo.rgbformat == picasso96_state.RGBFormat) {
P96TRACE(("do_blit type-a\n"));
width *= Bpp;
while (height-- > 0)
dstp += picasso_vidinfo.rowbytes;
}
- }
- else
- {
+ } else {
int psiz = GetBytesPerPixel (picasso_vidinfo.rgbformat);
P96TRACE(("do_blit type-b\n"));
- if (picasso96_state.RGBFormat != RGBFB_CHUNKY)
- {
+ if (picasso96_state.RGBFormat != RGBFB_CHUNKY) {
write_log ("ERROR: do_blit() failure, %d!\n", picasso96_state.RGBFormat);
goto out;
}
- while (height-- > 0)
- {
+ while (height-- > 0) {
unsigned int i;
switch (psiz)
{
#endif
src = gfxmemory + wgfx_min;
- if(picasso_vidinfo.rgbformat == picasso96_state.RGBFormat)
- {
+ if(picasso_vidinfo.rgbformat == picasso96_state.RGBFormat) {
#if P96TRACING_LEVEL > 0
P96TRACE(("flushing type-a\n"));
#endif
dstp += wgfx_y * picasso_vidinfo.rowbytes + wgfx_min - wgfx_linestart;
memcpy (dstp, src, wgfx_max - wgfx_min);
- }
- else
- {
+ } else {
int width = wgfx_max - wgfx_min;
int i;
int psiz = GetBytesPerPixel (picasso_vidinfo.rgbformat);
P96TRACE(("flushing type-b\n"));
- if (picasso96_state.RGBFormat != RGBFB_CHUNKY)
- {
+ if (picasso96_state.RGBFormat != RGBFB_CHUNKY) {
write_log ("ERROR - wgfx_do_flushline() failure, %d!\n", picasso96_state.RGBFormat);
goto out;
}
return 0;
if (ri->Memory != gfxmemory + (picasso96_state.Address - gfxmem_start))
return 0;
-
return 1;
}
memset (start, Pen, Width);
break;
case 2:
- for (cols = 0; cols < Width; cols++)
- {
+ for (cols = 0; cols < Width; cols++) {
do_put_mem_word ((uae_u16 *)start, (uae_u16)Pen);
start += 2;
}
break;
case 3:
- for (cols = 0; cols < Width; cols++)
- {
+ for (cols = 0; cols < Width; cols++) {
do_put_mem_byte (start, (uae_u8)Pen);
start++;
*(uae_u16 *)(start) = (Pen & 0x00FFFF00) >> 8;
}
break;
case 4:
- for (cols = 0; cols < Width; cols++)
- {
- /**start = Pen; */
+ for (cols = 0; cols < Width; cols++) {
do_put_mem_long ((uae_u32 *)start, Pen);
start += 4;
}
src = oldstart;
dst = src + ri->BytesPerRow;
/* next, we do the remaining line fills via memcpy() for > 1 BPP, otherwise some more memset() calls */
- if(Bpp > 1)
- {
+ if(Bpp > 1) {
for (lines = 0; lines < Height - 1; lines++, dst += ri->BytesPerRow)
memcpy (dst, src, Width * Bpp);
- }
- else
- {
+ } else {
for (lines = 0; lines < Height - 1; lines++, dst += ri->BytesPerRow)
memset(dst, Pen, Width);
}
DX_Fill(0, 0, picasso96_state.Width, picasso96_state.Height, 0,
picasso96_state.RGBFormat);
}
- }
- else
- {
+ } else {
width = picasso96_state.Width;
height = picasso96_state.Height;
}
do_blit(&ri, picasso96_state.BytesPerPixel, 0, 0, 0, 0, width, height, BLIT_SRC, 0);
- }
- else
- {
+ } else {
write_log ("ERROR - picasso_refresh() can't refresh!\n");
}
}
src = ri->Memory + srcx * Bpp + srcy * ri->BytesPerRow;
dst = dstri->Memory + dstx * Bpp + dsty * dstri->BytesPerRow;
- if (mask != 0xFF && Bpp > 1)
- {
+ if (mask != 0xFF && Bpp > 1) {
write_log ("WARNING - BlitRect() has mask 0x%x with Bpp %d.\n", mask, Bpp);
}
- if (mask == 0xFF || Bpp > 1)
- {
- if(opcode == BLIT_SRC)
- {
+ if (mask == 0xFF || Bpp > 1) {
+ if(opcode == BLIT_SRC) {
/* handle normal case efficiently */
- if (ri->Memory == dstri->Memory && dsty == srcy)
- {
+ if (ri->Memory == dstri->Memory && dsty == srcy) {
unsigned long i;
for (i = 0; i < height; i++, src += ri->BytesPerRow, dst += dstri->BytesPerRow)
memmove (dst, src, total_width);
- }
- else if (dsty < srcy)
- {
+ } else if (dsty < srcy) {
unsigned long i;
for (i = 0; i < height; i++, src += ri->BytesPerRow, dst += dstri->BytesPerRow)
memcpy (dst, src, total_width);
- }
- else
- {
+ } else {
unsigned long i;
- src += (height-1) * ri->BytesPerRow;
- dst += (height-1) * dstri->BytesPerRow;
+ src += (height - 1) * ri->BytesPerRow;
+ dst += (height - 1) * dstri->BytesPerRow;
for (i = 0; i < height; i++, src -= ri->BytesPerRow, dst -= dstri->BytesPerRow)
memcpy (dst, src, total_width);
}
return;
- }
- else
- {
- uae_u8 *src2 = src;
- uae_u8 *dst2 = dst;
- uae_u32 *src2_32 = (uae_u32*)src;
- uae_u32 *dst2_32 = (uae_u32*)dst;
- unsigned int y;
- for(y = 0; y < height; y++) /* Vertical lines */
- {
- uae_u8 *bound = src + total_width - 4;
- //copy now the longs
- for(src2_32 = (uae_u32*)src, dst2_32 = (uae_u32*)dst; src2_32 < (uae_u32*)bound; src2_32++, dst2_32++) /* Horizontal bytes */
- {
- switch(opcode)
- {
- case BLIT_FALSE:
- *dst2_32 = 0;
- break;
- case BLIT_NOR:
- *dst2_32 = ~(*src2_32 | *dst2_32);
- break;
- case BLIT_ONLYDST:
- *dst2_32 = *dst2_32 & ~(*src2_32);
- break;
- case BLIT_NOTSRC:
- *dst2_32 = ~(*src2_32);
- break;
- case BLIT_ONLYSRC:
- *dst2_32 = *src2_32 & ~(*dst2_32);
- break;
- case BLIT_NOTDST:
- *dst2_32 = ~(*dst2_32);
- break;
- case BLIT_EOR:
- *dst2_32 = *src2_32 ^ *dst2_32;
- break;
- case BLIT_NAND:
- *dst2_32 = ~(*src2_32 & *dst2_32);
- break;
- case BLIT_AND:
- *dst2_32 = *src2_32 & *dst2_32;
- break;
- case BLIT_NEOR:
- *dst2_32 = ~(*src2_32 ^ *dst2_32);
- break;
- case BLIT_DST:
- write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_DST!\n");
- break;
- case BLIT_NOTONLYSRC:
- *dst2_32 = ~(*src2_32) | *dst2_32;
- break;
- case BLIT_SRC:
- write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_SRC!\n");
- break;
- case BLIT_NOTONLYDST:
- *dst2_32 = ~(*dst2_32) | *src2_32;
- break;
- case BLIT_OR:
- *dst2_32 = *src2_32 | *dst2_32;
- break;
- case BLIT_TRUE:
- *dst2_32 = 0xFFFFFFFF;
- break;
- case 30: //code for swap source with dest in byte
- {
- uae_u32 temp;
- temp = *src2_32;
- *src2_32 = *dst2_32;
- *dst2_32 = temp;
- }
- break;
- case BLIT_LAST:
- write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_LAST!\n");
- break;
- } /* switch opcode */
- }// for end
- //now copy the rest few bytes
- for(src2 = (uae_u8*)src2_32, dst2 = (uae_u8*)dst2_32; src2 < src + total_width; src2++, dst2++) /* Horizontal bytes */
- {
- switch( opcode )
+ } else {
+
+ uae_u8 *src2 = src;
+ uae_u8 *dst2 = dst;
+ uae_u32 *src2_32 = (uae_u32*)src;
+ uae_u32 *dst2_32 = (uae_u32*)dst;
+ unsigned int y;
+
+ for(y = 0; y < height; y++) {/* Vertical lines */
+ uae_u8 *bound = src + total_width - 4;
+ //copy now the longs
+ for(src2_32 = (uae_u32*)src, dst2_32 = (uae_u32*)dst; src2_32 < (uae_u32*)bound; src2_32++, dst2_32++) { /* Horizontal bytes */
+ switch (opcode)
+ {
+ case BLIT_FALSE:
+ *dst2_32 = 0;
+ break;
+ case BLIT_NOR:
+ *dst2_32 = ~(*src2_32 | *dst2_32);
+ break;
+ case BLIT_ONLYDST:
+ *dst2_32 = *dst2_32 & ~(*src2_32);
+ break;
+ case BLIT_NOTSRC:
+ *dst2_32 = ~(*src2_32);
+ break;
+ case BLIT_ONLYSRC:
+ *dst2_32 = *src2_32 & ~(*dst2_32);
+ break;
+ case BLIT_NOTDST:
+ *dst2_32 = ~(*dst2_32);
+ break;
+ case BLIT_EOR:
+ *dst2_32 = *src2_32 ^ *dst2_32;
+ break;
+ case BLIT_NAND:
+ *dst2_32 = ~(*src2_32 & *dst2_32);
+ break;
+ case BLIT_AND:
+ *dst2_32 = *src2_32 & *dst2_32;
+ break;
+ case BLIT_NEOR:
+ *dst2_32 = ~(*src2_32 ^ *dst2_32);
+ break;
+ case BLIT_DST:
+ write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_DST!\n");
+ break;
+ case BLIT_NOTONLYSRC:
+ *dst2_32 = ~(*src2_32) | *dst2_32;
+ break;
+ case BLIT_SRC:
+ write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_SRC!\n");
+ break;
+ case BLIT_NOTONLYDST:
+ *dst2_32 = ~(*dst2_32) | *src2_32;
+ break;
+ case BLIT_OR:
+ *dst2_32 = *src2_32 | *dst2_32;
+ break;
+ case BLIT_TRUE:
+ *dst2_32 = 0xFFFFFFFF;
+ break;
+ case 30: //code for swap source with dest in byte
+ {
+ uae_u32 temp;
+ temp = *src2_32;
+ *src2_32 = *dst2_32;
+ *dst2_32 = temp;
+ }
+ break;
+ case BLIT_LAST:
+ write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_LAST!\n");
+ break;
+ } /* switch opcode */
+ }// for end
+ //now copy the rest few bytes
+ for(src2 = (uae_u8*)src2_32, dst2 = (uae_u8*)dst2_32; src2 < src + total_width; src2++, dst2++) /* Horizontal bytes */
{
- case BLIT_FALSE:
- *dst2 = 0;
- break;
- case BLIT_NOR:
- *dst2 = ~(*src2 | *dst2);
- break;
- case BLIT_ONLYDST:
- *dst2 = *dst2 & ~(*src2);
- break;
- case BLIT_NOTSRC:
- *dst2 = ~(*src2);
- break;
- case BLIT_ONLYSRC:
- *dst2 = *src2 & ~(*dst2);
- break;
- case BLIT_NOTDST:
- *dst2 = ~(*dst2);
- break;
- case BLIT_EOR:
- *dst2 = *src2 ^ *dst2;
- break;
- case BLIT_NAND:
- *dst2 = ~(*src2 & *dst2);
- break;
- case BLIT_AND:
- *dst2 = *src2 & *dst2;
- break;
- case BLIT_NEOR:
- *dst2 = ~(*src2 ^ *dst2);
- break;
- case BLIT_DST:
- write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_DST!\n");
- break;
- case BLIT_NOTONLYSRC:
- *dst2 = ~(*src2) | *dst2;
- break;
- case BLIT_SRC:
- write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_SRC!\n");
- break;
- case BLIT_NOTONLYDST:
- *dst2 = ~(*dst2) | *src2;
- break;
- case BLIT_OR:
- *dst2 = *src2 | *dst2;
- break;
- case BLIT_TRUE:
- *dst2 = 0xFF;
- break;
- case BLIT_LAST:
- write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_LAST!\n");
- break;
- case 30: //code for swap source with dest in long
+ switch(opcode)
{
- uae_u8 temp;
- temp = *src2;
- *src2 = *dst2;
- *dst2 = temp;
+ case BLIT_FALSE:
+ *dst2 = 0;
+ break;
+ case BLIT_NOR:
+ *dst2 = ~(*src2 | *dst2);
+ break;
+ case BLIT_ONLYDST:
+ *dst2 = *dst2 & ~(*src2);
+ break;
+ case BLIT_NOTSRC:
+ *dst2 = ~(*src2);
+ break;
+ case BLIT_ONLYSRC:
+ *dst2 = *src2 & ~(*dst2);
+ break;
+ case BLIT_NOTDST:
+ *dst2 = ~(*dst2);
+ break;
+ case BLIT_EOR:
+ *dst2 = *src2 ^ *dst2;
+ break;
+ case BLIT_NAND:
+ *dst2 = ~(*src2 & *dst2);
+ break;
+ case BLIT_AND:
+ *dst2 = *src2 & *dst2;
+ break;
+ case BLIT_NEOR:
+ *dst2 = ~(*src2 ^ *dst2);
+ break;
+ case BLIT_DST:
+ write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_DST!\n");
+ break;
+ case BLIT_NOTONLYSRC:
+ *dst2 = ~(*src2) | *dst2;
+ break;
+ case BLIT_SRC:
+ write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_SRC!\n");
+ break;
+ case BLIT_NOTONLYDST:
+ *dst2 = ~(*dst2) | *src2;
+ break;
+ case BLIT_OR:
+ *dst2 = *src2 | *dst2;
+ break;
+ case BLIT_TRUE:
+ *dst2 = 0xFF;
+ break;
+ case BLIT_LAST:
+ write_log ( "do_blitrect_frame_buffer shouldn't get BLIT_LAST!\n");
+ break;
+ case 30: //code for swap source with dest in long
+ {
+ uae_u8 temp;
+ temp = *src2;
+ *src2 = *dst2;
+ *dst2 = temp;
}
- break;
- } /* switch opcode */
- } /* for width */
- src += ri->BytesPerRow;
- dst += dstri->BytesPerRow;
+ break;
+ } /* switch opcode */
+ } /* for width */
+ src += ri->BytesPerRow;
+ dst += dstri->BytesPerRow;
} /* for height */
}
return;
}
- tmp3 = tmp2 = tmp = xmalloc (linewidth * height); /* allocate enough memory for the src-rect */
+ tmp3 = tmp2 = tmp = xmalloc (linewidth * height); /* allocate enough memory for the src-rect */
if (!tmp)
return;
/* copy the src-rect into our temporary buffer space */
- for (lines = 0; lines < height; lines++, src += ri->BytesPerRow, tmp2 += linewidth)
- {
+ for (lines = 0; lines < height; lines++, src += ri->BytesPerRow, tmp2 += linewidth) {
memcpy (tmp2, src, total_width);
}
/* copy the temporary buffer to the destination */
- for (lines = 0; lines < height; lines++, dst += dstri->BytesPerRow, tmp += linewidth)
- {
+ for (lines = 0; lines < height; lines++, dst += dstri->BytesPerRow, tmp += linewidth) {
unsigned long cols;
- for (cols = 0; cols < width; cols++)
- {
+ for (cols = 0; cols < width; cols++) {
dst[cols] &= ~mask;
dst[cols] |= tmp[cols] & mask;
}
unsigned long width_in_bytes;
uae_u32 result = 0;
-
#ifndef LOCK_UNLOCK_MADNESS
wgfx_flushline ();
#endif
- if (CopyRenderInfoStructureA2U (renderinfo, &ri))
- {
+ if (CopyRenderInfoStructureA2U (renderinfo, &ri)) {
P96TRACE(("InvertRect %dbpp 0x%lx\n", Bpp, (long)mask));
if (mask != 0xFF && Bpp > 1)
- {
mask = 0xFF;
- }
xorval = 0x01010101 * (mask & 0xFF);
width_in_bytes = Bpp * Width;
uae_u32 Pen = m68k_dreg (regs, 4);
uae_u8 Mask = (uae_u8)m68k_dreg (regs, 5);
RGBFTYPE RGBFormat = m68k_dreg (regs, 7);
-
uae_u8 *src;
uae_u8 *oldstart;
int Bpp;
wgfx_flushline ();
#endif
- if (CopyRenderInfoStructureA2U (renderinfo, &ri) && Y != 0xFFFF)
- {
+ if (CopyRenderInfoStructureA2U (renderinfo, &ri) && Y != 0xFFFF) {
if (ri.RGBFormat != RGBFormat)
write_log ("Weird Stuff!\n");
if(Bpp > 1)
Mask = 0xFF;
- if (Mask == 0xFF)
- {
- if(Width == 1 || Height == 1)
- {
+ if (Mask == 0xFF) {
+ if(Width == 1 || Height == 1) {
int i;
uaecptr addr;
- if(renderinfo_is_current_screen(&ri))
- {
+ if(renderinfo_is_current_screen(&ri)) {
uae_u32 diff = gfxmem_start - (uae_u32)gfxmemory;
addr = ri.Memory + X * Bpp + Y * ri.BytesPerRow + diff;
- if(Width == 1)
- {
- for(i = 0; i < Height; i++)
- {
- if(Bpp == 4)
- gfxmem_lput(addr + (i * picasso96_state.BytesPerRow), Pen);
- else if(Bpp == 2)
- gfxmem_wput(addr + (i * picasso96_state.BytesPerRow), Pen);
- else
- gfxmem_bput(addr + (i * picasso96_state.BytesPerRow), Pen);
+ if(Width == 1) {
+ for(i = 0; i < Height; i++) {
+ if (p96mode) {
+ if(Bpp == 4)
+ gfxmem_lputx(addr + (i * picasso96_state.BytesPerRow), Pen);
+ else if(Bpp == 2)
+ gfxmem_wputx(addr + (i * picasso96_state.BytesPerRow), Pen);
+ else
+ gfxmem_bputx(addr + (i * picasso96_state.BytesPerRow), Pen);
+ } else {
+ if(Bpp == 4)
+ gfxmem_lput(addr + (i * picasso96_state.BytesPerRow), Pen);
+ else if(Bpp == 2)
+ gfxmem_wput(addr + (i * picasso96_state.BytesPerRow), Pen);
+ else
+ gfxmem_bput(addr + (i * picasso96_state.BytesPerRow), Pen);
+ }
}
- }
- else if(Height == 1)
- {
- for(i = 0; i < Width; i++)
- {
- if( Bpp == 4 )
- gfxmem_lput(addr + (i * Bpp), Pen);
- else if( Bpp == 2 )
- gfxmem_wput(addr + (i * Bpp), Pen);
- else
- gfxmem_bput(addr + (i * Bpp), Pen);
+ } else if(Height == 1) {
+ for(i = 0; i < Width; i++) {
+ if (p96mode) {
+ if(Bpp == 4)
+ gfxmem_lputx(addr + (i * Bpp), Pen);
+ else if(Bpp == 2)
+ gfxmem_wputx(addr + (i * Bpp), Pen);
+ else
+ gfxmem_bputx(addr + (i * Bpp), Pen);
+ } else {
+ if(Bpp == 4)
+ gfxmem_lput(addr + (i * Bpp), Pen);
+ else if(Bpp == 2)
+ gfxmem_wput(addr + (i * Bpp), Pen);
+ else
+ gfxmem_bput(addr + (i * Bpp), Pen);
+ }
}
}
return 1;
}
/* Do the fill-rect in the frame-buffer */
- do_fillrect_frame_buffer(&ri, X, Y, Width, Height, Pen, Bpp, RGBFormat);
+ do_fillrect_frame_buffer (&ri, X, Y, Width, Height, Pen, Bpp, RGBFormat);
/* Now we do the on-screen display, if renderinfo points to it */
- if (renderinfo_is_current_screen (&ri))
- {
+ if (renderinfo_is_current_screen (&ri)) {
src = ri.Memory + X * Bpp + Y * ri.BytesPerRow;
X = X - picasso96_state.XOffset;
Y = Y - picasso96_state.YOffset;
if((int)Y < 0) { Height = Height + Y; Y = 0; }
if((int)Height < 1) return 1;
/* Argh - why does P96Speed do this to me, with FillRect only?! */
- if((X < picasso96_state.Width) &&
- (Y < picasso96_state.Height))
- {
+ if(X < picasso96_state.Width && Y < picasso96_state.Height) {
if(X + Width > picasso96_state.Width)
Width = picasso96_state.Width - X;
if(Y + Height > picasso96_state.Height)
Height = picasso96_state.Height - Y;
-
if (vsyncgfxwrite == 0)
do_fillrect(src, X, Y, Width, Height, Pen, Bpp, RGBFormat);
}
}
result = 1;
- }
- else
- {
+ } else {
/* We get here only if Mask != 0xFF */
- if (Bpp != 1)
- {
- write_log ( "WARNING - FillRect() has unhandled mask 0x%x with Bpp %d. Using fall-back routine.\n", Mask, Bpp );
- }
- else
- {
+ if (Bpp != 1) {
+ write_log ("WARNING - FillRect() has unhandled mask 0x%x with Bpp %d. Using fall-back routine.\n", Mask, Bpp);
+ } else {
Pen &= Mask;
Mask = ~Mask;
oldstart = ri.Memory + Y * ri.BytesPerRow + X * Bpp;
{
uae_u8 *start = oldstart;
uae_u8 *end = start + Height * ri.BytesPerRow;
- for (; start != end; start += ri.BytesPerRow)
- {
+ for (; start != end; start += ri.BytesPerRow) {
uae_u8 *p = start;
unsigned long cols;
- for (cols = 0; cols < Width; cols++)
- {
+ for (cols = 0; cols < Width; cols++) {
uae_u32 tmpval = do_get_mem_byte (p + cols) & Mask;
do_put_mem_byte (p + cols, (uae_u8)(Pen | tmpval));
}
}
}
}
+ flushpixels();
return result;
}
BLIT_OPCODE opcode;
} blitrectdata;
-STATIC_INLINE int BlitRectHelper( void )
+STATIC_INLINE int BlitRectHelper (void)
{
struct RenderInfo *ri = blitrectdata.ri;
struct RenderInfo *dstri = blitrectdata.dstri;
unsigned long linewidth = (total_width + 15) & ~15;
int can_do_visible_blit = 0;
- if(opcode == BLIT_DST)
- {
+ if(opcode == BLIT_DST) {
write_log ( "WARNING: BlitRect() being called with opcode of BLIT_DST\n" );
return 1;
}
* If we have a destination RenderInfo, then we've been called from picasso_BlitRectNoMaskComplete()
* and we need to put the results on the screen from the frame-buffer.
*/
- //if (dstri->Memory == ri->Memory)
- if (dstri == NULL || dstri->Memory == ri->Memory)
- {
+ if (dstri == NULL || dstri->Memory == ri->Memory) {
if(mask != 0xFF && Bpp > 1)
- {
mask = 0xFF;
- }
dstri = ri;
can_do_visible_blit = 1;
}
/* Do our virtual frame-buffer memory first */
- do_blitrect_frame_buffer(ri, dstri, srcx, srcy, dstx, dsty, width, height, mask, opcode);
+ do_blitrect_frame_buffer (ri, dstri, srcx, srcy, dstx, dsty, width, height, mask, opcode);
/* Now we do the on-screen display, if renderinfo points to it */
- if (vsyncgfxwrite == 1)
+ if (vsyncgfxwrite != 0)
return 1;
- if (renderinfo_is_current_screen (dstri))
- {
+ if (renderinfo_is_current_screen (dstri)) {
if (mask == 0xFF || Bpp > 1) {
if(can_do_visible_blit)
do_blit(dstri, Bpp, srcx, srcy, dstx, dsty, width, height, opcode, 1);
do_blit(dstri, Bpp, dstx, dsty, dstx, dsty, width, height, opcode, 0);
}
P96TRACE(("Did do_blit 1 in BlitRect()\n"));
- }
- else
- {
+ } else {
P96TRACE(("Did not do_blit 1 in BlitRect()\n"));
}
/* Set up the params */
CopyRenderInfoStructureA2U(ri, &blitrectdata.ri_struct);
blitrectdata.ri = &blitrectdata.ri_struct;
- if(dstri)
- {
+ if(dstri) {
CopyRenderInfoStructureA2U(dstri, &blitrectdata.dstri_struct);
blitrectdata.dstri = &blitrectdata.dstri_struct;
- }
- else
- {
+ } else {
blitrectdata.dstri = NULL;
}
blitrectdata.srcx = srcx;
wgfx_flushline ();
#endif
- P96TRACE(("BlitRectNoMaskComplete() op 0x%2x, xy(%4d,%4d) --> xy(%4d,%4d), wh(%4d,%4d)\n",
- OpCode, srcx, srcy, dstx, dsty, width, height));
+ P96TRACE(("BlitRectNoMaskComplete() op 0x%02x, %08x:(%4d,%4d) --> %08x:(%4d,%4d), wh(%4d,%4d)\n",
+ OpCode, get_long (srcri + PSSO_RenderInfo_Memory), srcx, srcy, get_long (dstri + PSSO_RenderInfo_Memory), dstx, dsty, width, height));
result = BlitRect(srcri, dstri, srcx, srcy, dstx, dsty, width, height, 0xFF, OpCode);
if (minterm != 0x0C) {
write_log ("ERROR - BlitPlanar2Chunky() has minterm 0x%x, which I don't handle. Using fall-back routine.\n",
minterm);
- }
- else if(CopyRenderInfoStructureA2U (ri, &local_ri) &&
- CopyBitMapStructureA2U (bm, &local_bm))
- {
+ } else if(CopyRenderInfoStructureA2U (ri, &local_ri) && CopyBitMapStructureA2U (bm, &local_bm)) {
P96TRACE(("BlitPlanar2Chunky(%d, %d, %d, %d, %d, %d) Minterm 0x%x, Mask 0x%x, Depth %d\n",
srcx, srcy, dstx, dsty, width, height, minterm, mask, local_bm.Depth));
P96TRACE(("P2C - BitMap has %d BPR, %d rows\n", local_bm.BytesPerRow, local_bm.Rows));
PlanarToChunky (&local_ri, &local_bm, srcx, srcy, dstx, dsty, width, height, mask);
- if (renderinfo_is_current_screen (&local_ri))
- {
- if (!vsyncgfxwrite)
+ if (renderinfo_is_current_screen (&local_ri)) {
+ if (vsyncgfxwrite == 0)
do_blit(&local_ri, GetBytesPerPixel(local_ri.RGBFormat), dstx, dsty, dstx, dsty, width, height, BLIT_SRC, 0);
}
result = 1;
srcx, srcy, dstx, dsty, width, height, minterm, Mask, local_bm.Depth));
PlanarToDirect (&local_ri, &local_bm, srcx, srcy, dstx, dsty, width, height, Mask, &local_cim);
if (renderinfo_is_current_screen (&local_ri))
- if (!vsyncgfxwrite)
+ if (vsyncgfxwrite == 0)
do_blit(&local_ri, GetBytesPerPixel(local_ri.RGBFormat), dstx, dsty, dstx, dsty, width, height, BLIT_SRC, 0);
result = 1;
}
static void **gwwbuf;
static int gwwbufsize;
extern uae_u8 *natmem_offset;
-extern int p96mode;
-static void flushpixels_rgbx(uae_u8 *dst)
+static void flushpixels_rgbx (uae_u8 *dst)
{
- int i, j, off;
+ int i, j;
int rowwidth_src = picasso_vidinfo.width * picasso_vidinfo.pixbytes;
int rowwidth_dst = picasso96_state.Width * picasso96_state.BytesPerPixel;
ULONG ps;
ULONG_PTR gwwcnt;
uae_u8 *src = p96ram_start + natmem_offset;
+ int off = picasso96_state.XYOffset - gfxmem_start;
+ uae_u8 *src_start = src + off - (4096 - 1);
+ uae_u8 *src_end = src + off + rowwidth_dst * picasso96_state.Height + (4096 - 1);
if (!picasso_vidinfo.extra_mem)
return;
return;
if (gwwcnt == 0)
return;
- off = picasso96_state.XYOffset - gfxmem_start;
for (i = 0; i < gwwcnt; i++) {
+ int pscnt = ps;
uae_u8 *p = gwwbuf[i];
- uaecptr addr = (p - src) - off;
- int y = addr / picasso96_state.BytesPerRow;
- int yend = (addr + ps + picasso96_state.BytesPerRow - 1) / picasso96_state.BytesPerRow;
- uae_u8 *src2 = src + y * picasso96_state.BytesPerRow + off;
- uae_u8 *dst2 = dst + y * picasso_vidinfo.rowbytes;
- while (y <= yend && y < picasso96_state.Height) {
-#if 0
- for (j = 0; j < rowwidth_dst; j++)
- dst2[j] = src2[j] ^ 0xff;
-#else
- memcpy (dst2, src2, rowwidth_dst);
-#endif
- src2 += picasso96_state.BytesPerRow;
- dst2 += picasso_vidinfo.rowbytes;
- y++;
+ if (p >= src_start && p < src_end) {
+ uaecptr addr = (p - src) - off;
+ int y = addr / picasso96_state.BytesPerRow;
+ uae_u8 *src2 = src + y * picasso96_state.BytesPerRow + off;
+ uae_u8 *dst2 = dst + y * picasso_vidinfo.rowbytes;
+ int yend;
+
+ /* merge nearby pieces */
+ while (i + 1 < gwwcnt && (uae_u8*)gwwbuf[i + 1] <= p + 2 * ps) {
+ pscnt += ps;
+ p += ps;
+ i++;
+ }
+
+ yend = (addr + pscnt + picasso96_state.BytesPerRow - 1) / picasso96_state.BytesPerRow;
+ while (y <= yend && y < picasso96_state.Height) {
+ #if 0
+ for (j = 0; j < rowwidth_dst; j+=4) {
+ dst2[j] = src2[j];
+ dst2[j + 1] = src2[j + 1];
+ dst2[j + 2] = src2[j + 2] ^ 0xff;
+ dst2[j + 3] = src2[j + 3];
+ }
+ #else
+ memcpy (dst2, src2, rowwidth_dst);
+ #endif
+ src2 += picasso96_state.BytesPerRow;
+ dst2 += picasso_vidinfo.rowbytes;
+ y++;
+ }
}
#if 0
}
#endif
+static void flushpixels_lock (void)
+{
+ flushpixels();
+}
+
STATIC_INLINE void write_gfx_x (uaecptr addr, uae_u32 value, int size)
{
#ifndef PIXEL_LOCK
addrbank gfxmem_bank = {
gfxmem_lget, gfxmem_wget, gfxmem_bget,
gfxmem_lput, gfxmem_wput, gfxmem_bput,
- gfxmem_xlate, gfxmem_check, NULL, "RTG RAM",
+ gfxmem_xlate, gfxmem_check, NULL, "RTG RAM (Indirect)",
dummy_lgeti, dummy_wgeti, ABFLAG_RAM
};
addrbank gfxmem_bankx = {
gfxmem_lgetx, gfxmem_wgetx, gfxmem_bgetx,
gfxmem_lputx, gfxmem_wputx, gfxmem_bputx,
- gfxmem_xlate, gfxmem_check, NULL, "RTG RAM",
+ gfxmem_xlate, gfxmem_check, NULL, "RTG RAM (Direct)",
dummy_lgeti, dummy_wgeti, ABFLAG_RAM
};
+
/* Call this function first, near the beginning of code flow
* Place in InitGraphics() which seems reasonable...
* Also put it in reset_drawing() for safe-keeping. */
#define IDS_NUMSG_KS68030 331
#define IDS_NUMSG_EXPROMNEED 332
#define IDS_HARDDRIVESAFETYWARNING2 333
+#define IDM_DBGCONTEXTMENU 334
+#define IDD_DBGMEMINPUT 335
#define IDS_QS_MODELS 1000
#define IDS_QS_MODEL_A500 1001
#define IDS_QS_MODEL_A500P 1002
#define IDC_DF3ENABLE 1778
#define IDC_HDF_RW 1778
#define IDC_HDFINFO 1779
+#define IDC_DBG_AUTOSET 1780
+#define IDC_DBG_DASM2 1781
+#define IDC_DBG_MEM2 1782
+#define IDC_DBG_MEMINPUT2 1783
+#define IDC_DBG_ADDRINPUTTXT 1784
#define ID__FLOPPYDRIVES 40004
#define ID_FLOPPYDRIVES_DF0 40005
#define ID_ST_CONFIGURATION 40010
#define ID_DBG_PAGE7 40026
#define ID_DBG_PAGE8 40027
#define ID_DBG_PAGE9 40028
+#define ID_DBG_STEP_OVER 40029
+#define ID_DBG_STEP_INTO 40030
+#define ID_DBG_SETTOA0 40031
+#define ID_DBG_SETTOA1 40032
+#define ID_DBG_SETTOA2 40033
+#define ID_DBG_SETTOA3 40034
+#define ID_DBG_SETTOA4 40035
+#define ID_DBG_SETTOA5 40036
+#define ID_DBG_SETTOA6 40037
+#define ID_DBG_SETTOA7 40038
+#define ID_DBG_ENTERADDR 40039
+#define ID_DBG_COPYLBLINE 40040
+#define ID_DBG_COPYLB 40041
+#define ID_DBG_TOGGLEBP 40042
+#define ID_DBG_DELETEBPS 40043
// Next default values for new objects
//
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_3D_CONTROLS 1
-#define _APS_NEXT_RESOURCE_VALUE 334
-#define _APS_NEXT_COMMAND_VALUE 40029
-#define _APS_NEXT_CONTROL_VALUE 1779
+#define _APS_NEXT_RESOURCE_VALUE 336
+#define _APS_NEXT_COMMAND_VALUE 40044
+#define _APS_NEXT_CONTROL_VALUE 1785
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
-// Microsoft Visual C++ generated resource script.\r
-//\r
-#include "resource."\r
-\r
-#define APSTUDIO_READONLY_SYMBOLS\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Generated from the TEXTINCLUDE 2 resource.\r
-//\r
-#include "afxres.h"\r\r
-/////////////////////////////////////////////////////////////////////////////\r
-#undef APSTUDIO_READONLY_SYMBOLS\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// English (U.S.) resources\r
-\r
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
-#ifdef _WIN32\r
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
-#pragma code_page(1252)\r
-#endif //_WIN32\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Accelerator\r
-//\r
-\r
-IDR_DBGACCEL ACCELERATORS \r
-BEGIN\r
- VK_F1, ID_DBG_PAGE1, VIRTKEY, NOINVERT\r
- VK_F2, ID_DBG_PAGE2, VIRTKEY, NOINVERT\r
- VK_F3, ID_DBG_PAGE3, VIRTKEY, NOINVERT\r
- VK_F4, ID_DBG_PAGE4, VIRTKEY, NOINVERT\r
- VK_F5, ID_DBG_PAGE5, VIRTKEY, NOINVERT\r
- VK_F6, ID_DBG_PAGE6, VIRTKEY, NOINVERT\r
- VK_F7, ID_DBG_PAGE7, VIRTKEY, NOINVERT\r
- VK_F8, ID_DBG_PAGE8, VIRTKEY, NOINVERT\r
- VK_F9, ID_DBG_PAGE9, VIRTKEY, NOINVERT\r
- VK_DOWN, IDC_DBG_MEMDOWN, VIRTKEY, ALT, NOINVERT\r
- VK_RIGHT, IDC_DBG_MEMDOWNFAST, VIRTKEY, ALT, NOINVERT\r
- VK_UP, IDC_DBG_MEMUP, VIRTKEY, ALT, NOINVERT\r
- VK_LEFT, IDC_DBG_MEMUPFAST, VIRTKEY, ALT, NOINVERT\r
- "H", IDC_DBG_HELP, VIRTKEY, ALT, NOINVERT\r
- "P", IDC_DBG_MEMTOPC, VIRTKEY, ALT, NOINVERT\r
-END\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Dialog\r
-//\r
-\r
-IDD_KICKSTART DIALOGEX 0, 0, 300, 176\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-EXSTYLE WS_EX_CONTEXTHELP\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "System ROM Settings",-1,5,0,290,74\r
- RTEXT "Main ROM file:",IDC_ROMTEXT,10,15,75,10\r
- COMBOBOX IDC_ROMFILE,89,12,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "...",IDC_KICKCHOOSER,280,11,10,15\r
- RTEXT "Extended ROM file:",IDC_ROMFILE2TEXT,10,35,75,10\r
- COMBOBOX IDC_ROMFILE2,89,32,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "...",IDC_ROMCHOOSER2,280,31,10,15\r
- CONTROL "MapROM emulation [] Creates a BlizKick-compatible memory area.",IDC_MAPROM,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,95,54,87,10\r
- CONTROL "ShapeShifter support [] Patches the system ROM for ShapeShifter compatibility.",IDC_KICKSHIFTER,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,54,87,10\r
- GROUPBOX "Miscellaneous",-1,5,76,290,57\r
- RTEXT "Cartridge ROM file:",IDC_FLASHTEXT2,8,93,75,10\r
- COMBOBOX IDC_CARTFILE,89,90,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "...",IDC_CARTCHOOSER,280,89,10,15\r
- RTEXT "Flash RAM file:",IDC_FLASHTEXT,8,112,75,10\r
- EDITTEXT IDC_FLASHFILE,89,110,185,13,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_FLASHCHOOSER,280,109,10,15\r
-END\r
-\r
-IDD_DISPLAY DIALOGEX 0, 0, 300, 235\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Screen",IDC_SCREENRESTEXT,12,0,270,67,BS_LEFT\r
- RTEXT "Full screen:",IDC_SELECTRESTEXT,15,17,40,15,SS_CENTERIMAGE\r
- COMBOBOX IDC_DISPLAYSELECT,59,10,215,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_RESOLUTION,59,27,68,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_REFRESHRATE,187,27,87,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- EDITTEXT IDC_XSIZE,59,48,48,12,ES_NUMBER\r
- EDITTEXT IDC_YSIZE,114,48,47,12,ES_NUMBER\r
- GROUPBOX "Settings",IDC_SETTINGSTEXT,12,73,199,125\r
- CONTROL "Correct aspect ratio",IDC_ASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,126,92,10\r
- LTEXT "Refresh:",IDC_REFRESHTEXT,18,162,28,8\r
- CONTROL "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,157,75,20\r
- EDITTEXT IDC_RATETEXT,124,161,77,12,ES_CENTER | ES_READONLY\r
- GROUPBOX "Centering",IDC_STATIC,221,73,61,49\r
- CONTROL "Horizontal",IDC_XCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,87,49,10\r
- CONTROL "Vertical",IDC_YCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,103,49,10\r
- GROUPBOX "Line Mode",IDC_LINEMODE,222,126,61,73\r
- CONTROL "Normal",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,231,142,44,10\r
- CONTROL "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,231,158,45,10\r
- CONTROL "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,231,174,46,10\r
- COMBOBOX IDC_DA_MODE,20,211,58,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,84,207,101,20\r
- LTEXT "FPS adj.:",IDC_REFRESH2TEXT,16,182,32,8\r
- CONTROL "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,177,127,20\r
- EDITTEXT IDC_RATE2TEXT,175,181,26,12,ES_CENTER | ES_READONLY\r
- COMBOBOX IDC_RESOLUTIONDEPTH,134,27,46,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,126,89,10\r
- COMBOBOX IDC_SCREENMODE_NATIVE,100,85,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_SCREENMODE_RTG,100,103,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Native mode:",IDC_STATIC,19,85,59,15,SS_CENTERIMAGE\r
- RTEXT "Windowed:",IDC_WINDOWEDTEXT,15,51,40,8\r
- RTEXT "RTG mode:",IDC_STATIC,19,101,59,15,SS_CENTERIMAGE\r
- PUSHBUTTON "Reset to defaults",IDC_DA_RESET,212,211,73,14\r
- RTEXT "Resolution:",IDC_STATIC,27,140,59,15,SS_CENTERIMAGE\r
- COMBOBOX IDC_LORES,100,140,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
-END\r
-\r
-IDD_MEMORY DIALOGEX 0, 0, 300, 175\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-EXSTYLE WS_EX_CONTEXTHELP\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Memory Settings",-1,14,7,274,91\r
- RTEXT "Chip:",-1,24,26,20,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,22,50,20\r
- EDITTEXT IDC_CHIPRAM,105,25,30,12,ES_CENTER | ES_READONLY\r
- RTEXT "Slow:",-1,149,26,20,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_SLOWMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,22,60,20\r
- EDITTEXT IDC_SLOWRAM,243,25,30,12,ES_CENTER | ES_READONLY\r
- RTEXT "Fast:",IDC_FASTTEXT,24,51,20,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,47,50,20\r
- EDITTEXT IDC_FASTRAM,105,50,30,12,ES_CENTER | ES_READONLY\r
- RTEXT "Z3 Fast:",IDC_Z3TEXT,139,51,30,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_Z3FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,47,60,20\r
- EDITTEXT IDC_Z3FASTRAM,243,50,30,12,ES_CENTER | ES_READONLY\r
- RTEXT "RTG: [] Graphics card memory. Required for RTG (Picasso96) emulation.",IDC_GFXCARDTEXT,79,76,90,10,SS_NOTIFY | SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_P96MEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,72,60,20\r
- EDITTEXT IDC_P96RAM,243,75,30,12,ES_CENTER | ES_READONLY\r
- GROUPBOX "Advanced Memory Settings",-1,13,104,275,65\r
- RTEXT "Motherboard RAM (Low area):",-1,39,123,129,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,119,59,20\r
- EDITTEXT IDC_MBRAM1,243,122,30,12,ES_CENTER | ES_READONLY\r
- RTEXT "Motherboard RAM (High area):",-1,39,148,129,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,144,59,20\r
- EDITTEXT IDC_MBRAM2,243,147,30,12,ES_CENTER | ES_READONLY\r
-END\r
-\r
-IDD_CPU DIALOGEX 0, 0, 300, 226\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- GROUPBOX "CPU",IDC_STATIC,5,3,81,139,BS_LEFT\r
- CONTROL "68000",IDC_CPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,13,16,63,10\r
- CONTROL "68010",IDC_CPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,30,65,10\r
- CONTROL "68020",IDC_CPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,44,63,10\r
- CONTROL "68030",IDC_CPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,58,64,10\r
- CONTROL "68040",IDC_CPU4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,72,66,10\r
- CONTROL "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,86,66,10\r
- CONTROL "More compatible [] Emulate 68000's prefetch registers. More compatible but slower.",IDC_COMPATIBLE,\r
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,114,73,8\r
- CONTROL "JIT [] Enable just-in-time CPU emulator. Significantly increases the speed of the CPU emulation. Requires 68020 or higher CPU.",IDC_JITENABLE,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,127,73,10\r
- GROUPBOX "CPU Emulation Speed",IDC_STATIC,90,3,205,90\r
- CONTROL "Fastest possible, but maintain chipset timing",IDC_CS_HOST,\r
- "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,95,18,195,10\r
- CONTROL "Match A500 speed",IDC_CS_68000,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,32,195,10\r
- CONTROL "Adjustable between CPU and chipset",IDC_CS_ADJUSTABLE,\r
- "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,46,195,10\r
- RTEXT "CPU",IDC_CS_CPU_TEXT,96,73,15,10,SS_CENTERIMAGE | WS_TABSTOP\r
- CONTROL "Slider1",IDC_SPEED,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,114,68,67,20\r
- LTEXT "Chipset",IDC_CS_CHIPSET_TEXT,182,73,25,10,SS_CENTERIMAGE | NOT WS_GROUP | WS_TABSTOP\r
- RTEXT "CPU idle",IDC_CS_CPU_TEXT2,236,56,32,10,SS_CENTERIMAGE | WS_TABSTOP\r
- CONTROL "",IDC_CPUIDLE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,219,68,69,20\r
- GROUPBOX "Advanced JIT Settings",IDC_STATIC,90,94,205,93\r
- RTEXT "Cache size:",IDC_CS_CACHE_TEXT,95,113,45,10,SS_CENTERIMAGE | WS_TABSTOP\r
- CONTROL "Slider1",IDC_CACHE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,140,108,115,20\r
- EDITTEXT IDC_CACHETEXT,255,113,30,12,ES_CENTER | ES_READONLY\r
- CONTROL "Hard flush",IDC_HARDFLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,141,63,10\r
- CONTROL "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,155,63,10\r
- CONTROL "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,169,62,10\r
- CONTROL "Force settings",IDC_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,141,62,10\r
- CONTROL "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,155,62,10\r
- CONTROL "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,235,141,52,10\r
- CONTROL "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,155,52,10\r
- CONTROL "After RTG",IDC_TRUST2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,169,52,10\r
- CONTROL "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU,\r
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,210,73,10\r
- GROUPBOX "FPU",IDC_STATIC,6,146,81,80,BS_LEFT\r
- CONTROL "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,100,73,8\r
- CONTROL "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,157,63,10\r
- CONTROL "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,171,63,10\r
- CONTROL "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,185,63,10\r
- CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,199,63,10\r
-END\r
-\r
-IDD_FLOPPY DIALOGEX 0, 0, 300, 240\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- COMBOBOX IDC_DF0TEXT,2,22,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_DF0TYPE,115,6,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Write-protected",IDC_STATIC,174,8,59,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_DF0WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,4,10,15\r
- PUSHBUTTON "Eject",IDC_EJECT0,253,4,30,15\r
- PUSHBUTTON "...",IDC_DF0,287,4,10,15\r
- COMBOBOX IDC_DF1TEXT,2,58,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_DF1TYPE,115,42,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Write-protected",IDC_STATIC,174,43,59,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_DF1WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,40,10,15\r
- PUSHBUTTON "Eject",IDC_EJECT1,253,40,30,15\r
- PUSHBUTTON "...",IDC_DF1,287,40,10,15\r
- COMBOBOX IDC_DF2TEXT,2,93,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_DF2TYPE,115,77,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Write-protected",IDC_STATIC,174,77,59,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_DF2WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,75,9,15\r
- PUSHBUTTON "Eject",IDC_EJECT2,253,75,30,15\r
- PUSHBUTTON "...",IDC_DF2,287,75,10,15\r
- COMBOBOX IDC_DF3TEXT,2,128,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_DF3TYPE,115,112,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Write-protected",IDC_STATIC,174,113,59,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_DF3WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,111,9,15\r
- PUSHBUTTON "Eject",IDC_EJECT3,253,110,30,15\r
- PUSHBUTTON "...",IDC_DF3,287,109,10,15\r
- GROUPBOX "New Floppy Disk Image",IDC_SETTINGSTEXT,5,183,289,49\r
- COMBOBOX IDC_FLOPPYTYPE,16,197,51,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Create Standard Disk [] Creates a standard 880 or 1760 KB ADF disk image.",IDC_CREATE,77,196,97,15\r
- PUSHBUTTON "Create Custom Disk [] Creates a low level (MFM) ADF disk image (about 2MB). Useful for programs that use non-standard disk formats (for example some save disks or DOS-formatted floppies)",IDC_CREATE_RAW,183,196,101,15\r
- GROUPBOX "Floppy Drive Emulation Speed",IDC_SETTINGSTEXT2,5,144,289,35\r
- CONTROL "",IDC_FLOPPYSPD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,32,154,116,20\r
- EDITTEXT IDC_FLOPPYSPDTEXT,183,157,101,12,ES_CENTER | ES_READONLY\r
- PUSHBUTTON "Delete save image",IDC_SAVEIMAGE0,43,5,70,15,NOT WS_VISIBLE\r
- PUSHBUTTON "Delete save image",IDC_SAVEIMAGE1,43,40,70,15,NOT WS_VISIBLE\r
- PUSHBUTTON "Delete save image",IDC_SAVEIMAGE2,43,75,70,15,NOT WS_VISIBLE\r
- PUSHBUTTON "Delete save image",IDC_SAVEIMAGE3,43,110,70,15,NOT WS_VISIBLE\r
- EDITTEXT IDC_CREATE_NAME,77,215,97,13,ES_AUTOHSCROLL\r
- RTEXT "Disk label:",IDC_STATIC,15,216,52,10,SS_CENTERIMAGE\r
- CONTROL "DF0:",IDC_DF0ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,6,34,15\r
- CONTROL "DF1:",IDC_DF1ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,41,34,15\r
- CONTROL "DF2:",IDC_DF2ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,76,34,15\r
- CONTROL "DF3:",IDC_DF3ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,111,34,15\r
-END\r
-\r
-IDD_HARDDISK DIALOGEX 0, 0, 300, 237\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-EXSTYLE WS_EX_CONTEXTHELP\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- CONTROL "List1",IDC_VOLUMELIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,0,290,176\r
- PUSHBUTTON "Add &Directory or Archive...",IDC_NEW_FS,10,179,103,15\r
- PUSHBUTTON "Add &Hardfile...",IDC_NEW_HF,130,179,74,15\r
- PUSHBUTTON "Add Ha&rd Drive...",IDC_NEW_HD,220,179,75,15\r
- PUSHBUTTON "Remove",IDC_REMOVE,235,203,60,15\r
- PUSHBUTTON "&Properties",IDC_EDIT,235,220,60,15\r
- CONTROL "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,202,100,10\r
- CONTROL "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,202,119,10\r
- CONTROL "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,213,121,10\r
- CONTROL "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,225,101,10\r
- CONTROL "Include CD/DVD drives..",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,213,100,10\r
- CONTROL "Automount removable drives",IDC_MAPDRIVES_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,225,115,10\r
-END\r
-\r
-IDD_SOUND DIALOGEX 0, 0, 300, 231\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- RTEXT "Sound device:",IDC_SOUNDCARD,8,9,51,13,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDCARDLIST,64,9,229,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Sound Emulation",IDC_SOUNDSETTINGS,5,30,120,81\r
- CONTROL "Disabled",IDC_SOUND0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,13,45,101,10\r
- CONTROL "Disabled, but emulated",IDC_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,57,102,10\r
- CONTROL "Enabled",IDC_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,69,102,10\r
- CONTROL "Enabled, 100% accurate",IDC_SOUND3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,81,101,10\r
- GROUPBOX "Volume",IDC_STATIC,132,36,164,31\r
- CONTROL "",IDC_SOUNDVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,137,44,105,20\r
- EDITTEXT IDC_SOUNDVOLUME2,247,47,40,12,ES_CENTER | ES_READONLY\r
- GROUPBOX "Sound Buffer Size",IDC_STATIC,132,73,164,31\r
- CONTROL "Slider1",IDC_SOUNDBUFFERRAM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,137,81,105,19\r
- EDITTEXT IDC_SOUNDBUFFERMEM,247,84,40,12,ES_CENTER | ES_READONLY\r
- GROUPBOX "Settings",IDC_SOUNDINTERPOLATION2,6,114,290,60\r
- LTEXT "Frequency:",IDC_SOUNDFREQTXT,11,148,53,8,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDFREQ,13,157,51,75,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Audio filter:",IDC_SOUNDFILTERTXT,209,148,77,8,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDFILTER,209,157,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Channel mode:",IDC_SOUNDSTEREOTXT,11,124,57,8,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDSTEREO,13,133,122,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Interpolation:",IDC_SOUNDINTERPOLATIONTXT,209,124,75,8,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDINTERPOLATION,209,133,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Stereo separation:",IDC_SOUNDSTEREOSEPTXT,141,124,63,8,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDSTEREOSEP,142,133,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Stereo delay:",IDC_SOUNDSTEREOMIXTXT,141,148,63,8,SS_CENTERIMAGE\r
- COMBOBOX IDC_SOUNDSTEREOMIX,142,157,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Floppy Drive Sound Emulation",IDC_STATIC,6,177,290,46\r
- CONTROL "",IDC_SOUNDDRIVEVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,14,185,107,19\r
- EDITTEXT IDC_SOUNDDRIVEVOLUME2,124,187,40,12,ES_CENTER | ES_READONLY\r
- COMBOBOX IDC_SOUNDDRIVE,237,187,46,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_SOUNDDRIVESELECT,18,205,265,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_SOUNDSWAP,73,157,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- LTEXT "Swap channels:",IDC_SOUNDSWAPTXT,74,148,61,8,SS_CENTERIMAGE\r
- CONTROL "Automatic switching",IDC_SOUND_AUTO,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,95,103,10\r
-END\r
-\r
-IDD_LOADSAVE DIALOGEX 0, 0, 302, 241\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- CONTROL "",IDC_CONFIGTREE,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,6,3,289,153,WS_EX_CLIENTEDGE\r
- RTEXT "Name:",IDC_STATIC,4,161,40,15,SS_CENTERIMAGE\r
- EDITTEXT IDC_EDITNAME,48,162,146,13,ES_AUTOHSCROLL\r
- RTEXT "Description:",IDC_STATIC,2,182,41,15,SS_CENTERIMAGE\r
- EDITTEXT IDC_EDITDESCRIPTION,48,183,146,13,ES_AUTOHSCROLL\r
- RTEXT "Link:",IDC_STATIC,4,204,40,15,SS_CENTERIMAGE\r
- COMBOBOX IDC_CONFIGLINK,48,205,93,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Ignore link",IDC_CONFIGNOLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,207,48,10\r
- EDITTEXT IDC_EDITPATH,199,161,49,15,ES_AUTOHSCROLL | WS_DISABLED\r
- CONTROL "Autoload",IDC_CONFIGAUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,253,163,42,10\r
- GROUPBOX "Additional Information",IDC_STATIC,199,179,96,38,BS_LEFT\r
- PUSHBUTTON "View",IDC_VIEWINFO,208,195,37,15\r
- PUSHBUTTON "Set",IDC_SETINFO,250,195,37,15\r
- PUSHBUTTON "Load",IDC_QUICKLOAD,5,225,44,15\r
- PUSHBUTTON "Save",IDC_QUICKSAVE,54,225,44,15\r
- PUSHBUTTON "Load From...",IDC_LOAD,121,225,49,15\r
- PUSHBUTTON "Delete",IDC_DELETE,251,225,44,15\r
- PUSHBUTTON "Save As...",IDC_SAVE,175,225,44,15\r
-END\r
-\r
-IDD_PORTS DIALOGEX 0, 0, 300, 238\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Parallel Port",IDC_SERPARFRAME,5,2,291,68\r
- RTEXT "Printer:",IDC_STATIC,12,15,25,15,SS_CENTERIMAGE\r
- COMBOBOX IDC_PRINTERLIST,49,15,153,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Flush print job",IDC_FLUSHPRINTER,220,15,58,12\r
- CONTROL "PostScript detection",IDC_PSPRINTERDETECT,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,11,33,79,12\r
- CONTROL "PostScript printer emulation",IDC_PSPRINTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,95,33,110,12\r
- RTEXT "Autoflush [] Time in seconds after a pending print job is automatically flushed.",IDC_PRINTERAUTOFLUSHTXT,202,32,57,15,SS_NOTIFY | SS_CENTERIMAGE\r
- EDITTEXT IDC_PRINTERAUTOFLUSH,263,33,25,12,ES_NUMBER\r
- RTEXT "Ghostscript extra parameters:",IDC_STATIC,12,49,102,15,SS_CENTERIMAGE\r
- EDITTEXT IDC_PS_PARAMS,124,50,165,12,ES_AUTOHSCROLL\r
- GROUPBOX "Serial Port",IDC_SERIALFRAME,4,72,292,48\r
- COMBOBOX IDC_SERIAL,49,84,232,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,15,103,48,12\r
- CONTROL "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,75,103,55,12\r
- GROUPBOX "MIDI",IDC_MIDIFRAME,4,123,292,33\r
- RTEXT "Out:",IDC_MIDI,10,134,34,15,SS_CENTERIMAGE\r
- COMBOBOX IDC_MIDIOUTLIST,50,134,95,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "In:",IDC_MIDI2,150,134,29,15,SS_CENTERIMAGE\r
- COMBOBOX IDC_MIDIINLIST,185,134,95,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Mouse/Joystick Ports",IDC_PORT0,4,158,292,75\r
- COMBOBOX IDC_PORT0_JOYS,45,174,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_PORT1_JOYS,45,195,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Swap ports",IDC_SWAP,211,214,75,14\r
- RTEXT "Port 0:",IDC_STATIC,11,173,25,15,SS_CENTERIMAGE\r
- RTEXT "Port 1:",IDC_STATIC,11,194,25,15,SS_CENTERIMAGE\r
- LTEXT "X-Arcade layout information []#1",IDC_STATIC,16,213,106,15,SS_NOTIFY | SS_CENTERIMAGE\r
- CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT,\r
- "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,135,103,65,12\r
- CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,200,103,78,12\r
-END\r
-\r
-IDD_CONTRIBUTORS DIALOGEX 0, 0, 411, 242\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION\r
-CAPTION "UAE Authors and Contributors..."\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- DEFPUSHBUTTON "Ok",ID_OK,177,219,53,14\r
- CONTROL "",IDC_CONTRIBUTORS,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_RAGGEDRIGHT | TCS_OWNERDRAWFIXED | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,5,404,206\r
-END\r
-\r
-IDD_ABOUT DIALOGEX 0, 0, 300, 191\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- CONTROL "",IDC_RICHEDIT1,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,45,10,210,15\r
- CONTROL "",IDC_RICHEDIT2,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,30,260,13\r
- PUSHBUTTON "Contributors",IDC_CONTRIBUTORS,110,55,80,15\r
- CONTROL "",IDC_UAEHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,120,80,15\r
- CONTROL "",IDC_PICASSOHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,200,90,80,20\r
- CONTROL "",IDC_AMIGAHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,109,90,80,20\r
- CONTROL "",IDC_WINUAEHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,200,120,80,15\r
- CONTROL "",IDC_AIABHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,110,120,80,15\r
- CONTROL "",IDC_THEROOTS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,145,80,15\r
- CONTROL "",IDC_CAPS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,200,145,80,15\r
- CONTROL "",IDC_ABIME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,110,145,80,15\r
- CONTROL "",IDC_CLOANTOHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,90,80,20\r
- CONTROL "",IDC_AMIGASYS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,63,169,80,15\r
- CONTROL "",IDC_AMIKIT,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,157,169,80,15\r
-END\r
-\r
-IDD_MISC1 DIALOGEX 0, 0, 300, 237\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Advanced",IDC_STATIC,8,2,285,110\r
- CONTROL "Untrap mouse with middle button",IDC_JULIAN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,15,129,10\r
- CONTROL "Show GUI on startup",IDC_SHOWGUI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,27,120,10\r
- CONTROL "On-screen LEDs",IDC_SHOWLEDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,40,115,10\r
- CONTROL "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,53,63,10\r
- CONTROL "Don't show taskbar button",IDC_NOTASKBARBUTTON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,66,117,10\r
- CONTROL "bsdsocket.library emulation",IDC_SOCKETS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,15,120,10\r
- CONTROL "Use CTRL-F11 to quit",IDC_CTRLF11,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,27,120,10\r
- CONTROL "Don't use RGB overlays",IDC_NOOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,40,120,10\r
- CONTROL "Synchronize clock",IDC_CLOCKSYNC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,53,115,10\r
- GROUPBOX "Keyboard LEDs",IDC_STATIC,7,140,85,94\r
- COMBOBOX IDC_KBLED1,22,154,56,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_KBLED2,22,173,56,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_KBLED3,22,193,56,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Logging",IDC_STATIC,97,140,195,25\r
- CONTROL "Create log file",IDC_CREATELOGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,107,151,72,10\r
- CONTROL "Illegal memory accesses",IDC_ILLEGAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,151,95,10\r
- GROUPBOX "State Files",IDC_STATIC,98,167,195,68\r
- PUSHBUTTON "Load state...",IDC_DOLOADSTATE,105,180,49,14\r
- PUSHBUTTON "Save state...",IDC_DOSAVESTATE,105,208,49,14\r
- CONTROL "Enable state recording",IDC_STATE_CAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,182,88,10\r
- RTEXT "Recording rate (seconds):",IDC_STATIC,157,199,86,10,SS_CENTERIMAGE | WS_TABSTOP\r
- COMBOBOX IDC_STATE_RATE,248,197,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Recording buffer (MB):",IDC_STATIC,160,219,83,10,SS_CENTERIMAGE | WS_TABSTOP\r
- COMBOBOX IDC_STATE_BUFFERSIZE,248,217,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Always on top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,79,117,10\r
- CONTROL "Catweasel",IDC_CATWEASEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,66,115,10\r
- CONTROL "USB mode",IDC_KBLED_USB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,216,64,10\r
- COMBOBOX IDC_SCSIMODE,92,51,64,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_LANGUAGE,103,121,179,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Language",IDC_STATIC,7,113,285,25\r
- CONTROL "Disable powersaving features",IDC_POWERSAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,92,120,10\r
- CONTROL "Magic Mouse",IDC_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,79,119,10\r
- CONTROL "uaenet.device",IDC_SANA2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,92,94,10\r
-END\r
-\r
-IDD_HARDFILE DIALOGEX 0, 0, 299, 249\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Hardfile Settings"\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- GROUPBOX "Settings",IDC_STATIC,10,5,280,146\r
- RTEXT "Path:",IDC_HARDFILE_DIR_TEXT,25,18,22,10\r
- EDITTEXT IDC_PATH_NAME,52,15,213,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_SELECTOR,271,15,11,15\r
- RTEXT "FileSys:",IDC_HARDFILE_FILESYS_TEXT,13,38,34,10\r
- EDITTEXT IDC_PATH_FILESYS,52,35,213,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_FILESYS_SELECTOR,271,35,11,15\r
- RTEXT "Device:",IDC_HARDFILE_DEVICE_TEXT,16,58,31,10\r
- EDITTEXT IDC_HARDFILE_DEVICE,52,55,66,15,ES_AUTOHSCROLL\r
- RTEXT "Boot priority:",IDC_HARDFILE_BOOTPRI_TEXT,24,94,44,8\r
- EDITTEXT IDC_HARDFILE_BOOTPRI,73,90,40,15\r
- CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,74,64,10\r
- PUSHBUTTON "Enable RDB mode",IDC_HDF_RDB,174,55,92,14\r
- RTEXT "Surfaces:",IDC_SURFACES_TEXT,118,94,32,10\r
- EDITTEXT IDC_HEADS,155,90,40,15,ES_NUMBER\r
- RTEXT "Reserved:",IDC_RESERVED_TEXT,197,94,35,10\r
- EDITTEXT IDC_RESERVED,237,90,40,15,ES_NUMBER\r
- RTEXT "Sectors:",IDC_SECTORS_TEXT,120,113,30,10\r
- EDITTEXT IDC_SECTORS,155,111,40,15,ES_NUMBER\r
- RTEXT "Block size:",IDC_BLOCKSIZE_TEXT,197,113,35,10\r
- EDITTEXT IDC_BLOCKSIZE,237,111,40,15,ES_NUMBER\r
- GROUPBOX "New hard disk image file",IDC_STATIC,10,156,280,62\r
- PUSHBUTTON "Create",IDC_HF_CREATE,60,171,80,14\r
- EDITTEXT IDC_HF_SIZE,156,171,61,15,ES_NUMBER\r
- PUSHBUTTON "OK",IDOK,102,226,50,14\r
- PUSHBUTTON "Cancel",IDCANCEL,158,226,50,14\r
- EDITTEXT IDC_HF_DOSTYPE,156,194,61,15\r
- COMBOBOX IDC_HF_TYPE,60,195,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_HDF_CONTROLLER,73,112,40,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "DOS type",IDC_STATIC,224,196,32,10,SS_CENTERIMAGE\r
- RTEXT "MB",IDC_STATIC,222,174,13,10,SS_CENTERIMAGE\r
- RTEXT "Type:",IDC_STATIC,28,183,25,10,SS_CENTERIMAGE\r
- RTEXT "HD Controller:",IDC_STATIC,16,113,52,10,SS_CENTERIMAGE\r
- CONTROL "Bootable",IDC_HDF_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,74,53,10\r
- CONTROL "Do not mount",IDC_HDF_DONOTMOUNT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,74,67,10\r
- EDITTEXT IDC_HDFINFO,16,131,268,12,ES_CENTER | ES_READONLY\r
-END\r
-\r
-IDD_FILESYS DIALOGEX 15, 25, 299, 111\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Volume Settings"\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- LTEXT "Device name:",-1,11,7,54,10\r
- EDITTEXT IDC_VOLUME_DEVICE,65,5,104,15,ES_AUTOHSCROLL\r
- LTEXT "Volume label:",-1,13,28,54,10\r
- EDITTEXT IDC_VOLUME_NAME,65,25,104,15,ES_AUTOHSCROLL\r
- LTEXT "Path:",-1,38,49,44,10\r
- EDITTEXT IDC_PATH_NAME,65,46,227,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "Select Directory",IDC_FS_SELECT_DIR,65,66,103,15\r
- CONTROL "Read/write",IDC_FS_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,7,55,10\r
- RTEXT "Boot priority:",IDC_VOLUME_BOOTPRI_TEXT,178,28,49,8\r
- EDITTEXT IDC_VOLUME_BOOTPRI,236,25,30,15\r
- PUSHBUTTON "OK",IDOK,65,91,48,15\r
- PUSHBUTTON "Cancel",IDCANCEL,120,91,48,15\r
- PUSHBUTTON "Select Archive or Plain File",IDC_FS_SELECT_FILE,190,66,103,15\r
- PUSHBUTTON "Eject",IDC_FS_SELECT_EJECT,230,91,62,15\r
- CONTROL "Bootable",IDC_FS_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,236,7,53,10\r
-END\r
-\r
-IDD_SETINFO DIALOGEX 0, 0, 229, 85\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Additional Information Settings"\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- RTEXT "Path:",-1,5,20,24,15,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATH_NAME,35,20,169,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_SELECTOR,210,20,10,15\r
- PUSHBUTTON "OK",IDOK,120,65,48,15\r
- PUSHBUTTON "Cancel",IDCANCEL,175,65,48,15\r
-END\r
-\r
-IDD_CHIPSET DIALOGEX 0, 65490, 300, 229\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- GROUPBOX "Chipset",IDC_STATIC,14,11,145,90\r
- CONTROL "OCS [] Original chipset. A1000 and most A500s.",IDC_OCS,\r
- "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,26,51,10\r
- CONTROL "ECS Agnus [] Enhanced chipset (ECS Agnus chip only). CDTV and later A500 and A2000 hardware revisions.",IDC_ECS_AGNUS,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,42,55,10\r
- CONTROL "ECS Denise [] Enhanced chipset (ECS Denise chip only). Normally paired with ECS Agnus.",IDC_ECS_DENISE,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,42,55,10\r
- CONTROL "Full ECS [] Full ECS chipset (ECS Agnus and ECS Denise chips). A500+, A600 and A3000.",IDC_ECS,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,58,52,10\r
- CONTROL "AGA [] Advanced Graphics Architecture chipset. A1200, A4000 and CD32.",IDC_AGA,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,26,51,10\r
- CONTROL "NTSC [] North American and Japanese display standard, 60Hz refresh rate. Other countries use PAL (50Hz. display refresh rate)",IDC_NTSC,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,58,50,10\r
- GROUPBOX "Options",IDC_STATIC,168,11,114,89\r
- CONTROL "Immediate Blitter [] Faster but less compatible blitter emulation.",IDC_BLITIMM,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,179,33,96,10\r
- CONTROL "Cycle-exact [] The most compatible A500 emulation mode. Very fast PC recommended.",IDC_CYCLEEXACT,\r
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,46,100,10\r
- GROUPBOX "Collision Level",IDC_STATIC,14,105,267,48\r
- CONTROL "None [] Collision hardware emulation disabled.",IDC_COLLISION0,\r
- "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,121,59,10\r
- CONTROL "Sprites only [] Emulate only sprite vs. sprite collisions.",IDC_COLLISION1,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,137,62,10\r
- CONTROL "Sprites and Sprites vs. Playfield [] Recommended collision emulation level.",IDC_COLLISION2,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,121,161,10\r
- CONTROL "Full [] 100% collision hardware emulation. Only very few games need this option. Slowest.",IDC_COLLISION3,\r
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,137,119,10\r
- GROUPBOX "Sound Emulation",IDC_STATIC,13,159,268,65\r
- CONTROL "Disabled",IDC_CS_SOUND0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,175,102,10\r
- CONTROL "Emulated",IDC_CS_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,190,91,10\r
- CONTROL "Emulated, 100% accurate",IDC_CS_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,205,95,10\r
- CONTROL "Genlock connected [] Allow boot sequence to detect genlock. Genlock is not emulated.",IDC_GENLOCK,\r
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,59,100,10\r
- CONTROL "Faster RTG [] Enables less accurate custom chipset emulation mode when Picasso96 is enabled.",IDC_FASTERRTG,\r
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,72,100,10\r
- COMBOBOX IDC_CS_EXT,100,80,49,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Chipset Extra",IDC_STATIC,25,79,52,15,SS_CENTERIMAGE\r
-END\r
-\r
-IDD_CHIPSET2 DIALOGEX 0, 65490, 300, 247\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- GROUPBOX "Battery Backed Up Real Time Clock",IDC_STATIC,11,24,275,29\r
- CONTROL "None",IDC_CS_RTC1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,36,55,10\r
- CONTROL "MSM6242B",IDC_CS_RTC2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,36,52,10\r
- CONTROL "RF5C01A",IDC_CS_RTC3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,159,36,46,10\r
- EDITTEXT IDC_CS_RTCADJUST,215,34,64,13,ES_AUTOHSCROLL\r
- GROUPBOX "CIA-A TOD Clock Source",IDC_STATIC,11,56,275,29\r
- CONTROL "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,68,63,10\r
- CONTROL "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,68,85,10\r
- CONTROL "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,186,68,88,10\r
- CONTROL "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,146,80,10\r
- CONTROL "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,95,88,10\r
- CONTROL "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,108,76,10\r
- CONTROL "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,108,87,10\r
- CONTROL "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,108,84,10\r
- CONTROL "CDTV CD",IDC_CS_CDTVCD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,121,47,10\r
- CONTROL "CDTV SRAM",IDC_CS_CDTVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,120,87,10\r
- CONTROL "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,120,90,10\r
- CONTROL "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,133,79,10\r
- CONTROL "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,133,88,10\r
- CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,71,10\r
- EDITTEXT IDC_CS_RAMSEYREV,91,214,45,13,ES_AUTOHSCROLL\r
- CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,71,10\r
- EDITTEXT IDC_CS_FATGARYREV,91,228,45,13,ES_AUTOHSCROLL\r
- CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,188,76,10\r
- CONTROL "Compatible Settings",IDC_CS_COMPATIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,8,234,10\r
- CONTROL "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,95,92,10\r
- CONTROL "Agnus/Alice revision:",IDC_CS_AGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,216,81,10\r
- EDITTEXT IDC_CS_AGNUSREV,232,214,45,13,ES_AUTOHSCROLL\r
- CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,229,81,10\r
- EDITTEXT IDC_CS_DENISEREV,232,228,45,13,ES_AUTOHSCROLL\r
- CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,188,76,10\r
- CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,188,88,10\r
- LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,22,174,224,8,SS_CENTERIMAGE\r
- CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,133,92,10\r
- CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,200,76,10\r
- CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,200,76,10\r
- CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,200,101,10\r
- CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,146,92,10\r
- CONTROL "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,146,80,10\r
- CONTROL "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,95,80,10\r
- CONTROL "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,159,80,10\r
- CONTROL "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,159,80,10\r
- CONTROL "Blitter Busy Bug",IDC_CS_BLITTERBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,159,80,10\r
-END\r
-\r
-IDD_AVIOUTPUT DIALOGEX 0, 0, 288, 203\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Output Properties",IDC_STATIC,5,0,274,126\r
- EDITTEXT IDC_AVIOUTPUT_FILETEXT,15,15,226,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE\r
- PUSHBUTTON "...",IDC_AVIOUTPUT_FILE,249,15,19,12\r
- CONTROL "Audio",IDC_AVIOUTPUT_AUDIO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,33,39,14\r
- CONTROL "",IDC_AVIOUTPUT_AUDIO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,34,209,13\r
- CONTROL "Video",IDC_AVIOUTPUT_VIDEO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,50,39,14\r
- CONTROL "",IDC_AVIOUTPUT_VIDEO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,51,209,13\r
- CONTROL "Disable frame rate limit while recording",IDC_AVIOUTPUT_FRAMELIMITER,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,68,158,10\r
- CONTROL "AVI output enabled",IDC_AVIOUTPUT_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,15,103,108,14\r
- CONTROL "PAL",IDC_AVIOUTPUT_PAL,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,131,103,66,14\r
- CONTROL "NTSC",IDC_AVIOUTPUT_NTSC,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,204,103,66,14\r
- CONTROL "Slider1",IDC_AVIOUTPUT_FPS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_ENABLESELRANGE | WS_TABSTOP,166,84,87,11\r
- LTEXT "fps",IDC_AVIOUTPUT_FPS_STATIC,255,84,19,8\r
- PUSHBUTTON "Save screenshot",IDC_SCREENSHOT,16,141,77,14\r
- GROUPBOX "Ripper",IDC_STATIC,5,127,274,38\r
- PUSHBUTTON "Pro Wizard 1.62",IDC_PROWIZARD,104,141,77,14,WS_DISABLED\r
- CONTROL "Sample ripper",IDC_SAMPLERIPPER_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,192,141,77,14\r
- GROUPBOX "Input Recorder",IDC_STATIC,5,166,274,33\r
- CONTROL "Record",IDC_INPREC_RECORD,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,192,178,77,14\r
- CONTROL "Playback",IDC_INPREC_PLAY,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,16,178,77,14\r
- CONTROL "Alt. playback mode",IDC_INPREC_PLAYMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,103,180,78,10\r
- CONTROL "Disable sound output while recording",IDC_AVIOUTPUT_NOSOUNDOUTPUT,\r
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,85,148,10\r
-END\r
-\r
-IDD_INPUT DIALOGEX 0, 0, 300, 242\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- COMBOBOX IDC_INPUTTYPE,5,5,98,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_INPUTDEVICE,109,5,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "",IDC_INPUTDEVICEDISABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,282,8,9,8\r
- CONTROL "List1",IDC_INPUTLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,22,290,146\r
- COMBOBOX IDC_INPUTAMIGACNT,5,174,24,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_INPUTAMIGA,33,174,262,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Joystick dead zone (%):",-1,7,196,79,10,SS_CENTERIMAGE\r
- EDITTEXT IDC_INPUTDEADZONE,92,195,25,12,ES_NUMBER\r
- RTEXT "Autofire rate (frames):",-1,10,212,76,10,SS_CENTERIMAGE\r
- EDITTEXT IDC_INPUTAUTOFIRERATE,92,210,25,12,ES_NUMBER\r
- RTEXT "Digital joy-mouse speed:",-1,124,196,84,10,SS_CENTERIMAGE\r
- EDITTEXT IDC_INPUTSPEEDD,215,195,25,12,ES_NUMBER\r
- RTEXT "Analog joy-mouse speed:",-1,120,212,88,10,SS_CENTERIMAGE\r
- EDITTEXT IDC_INPUTSPEEDA,215,211,25,12,ES_NUMBER\r
- RTEXT "Mouse speed:",-1,132,228,76,10,SS_CENTERIMAGE\r
- EDITTEXT IDC_INPUTSPEEDM,215,227,25,12,ES_NUMBER\r
- PUSHBUTTON "Copy from:",IDC_INPUTCOPY,249,195,45,14\r
- COMBOBOX IDC_INPUTCOPYFROM,249,211,45,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Swap 1<>2",IDC_INPUTSWAP,249,226,45,14\r
-END\r
-\r
-IDD_FILTER DIALOGEX 0, 0, 296, 224\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Filter Settings",-1,0,0,294,186\r
- CONTROL "Enable",IDC_FILTERENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,17,46,10\r
- COMBOBOX IDC_FILTERMODE,62,15,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_FILTERFILTER,128,15,81,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,213,15,73,14\r
- RTEXT "Horiz. size:",-1,7,44,54,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,37,152,19\r
- EDITTEXT IDC_FILTERHZV,253,39,34,12,ES_CENTER | ES_READONLY\r
- RTEXT "Vert. size:",-1,7,64,54,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,57,152,19\r
- EDITTEXT IDC_FILTERVZV,253,59,34,12,ES_CENTER | ES_READONLY\r
- RTEXT "Horiz. position:",-1,5,84,55,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,77,151,19\r
- EDITTEXT IDC_FILTERHOV,253,79,34,12,ES_CENTER | ES_READONLY\r
- RTEXT "Vert. position:",-1,5,103,55,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,97,151,19\r
- EDITTEXT IDC_FILTERVOV,253,99,34,12,ES_CENTER | ES_READONLY\r
- RTEXT "Extra settings:",-1,27,133,57,10,SS_CENTERIMAGE\r
- CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,157,151,19\r
- EDITTEXT IDC_FILTERXLV,253,159,34,12,ES_CENTER | ES_READONLY\r
- COMBOBOX IDC_FILTERSLR,253,130,33,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Presets",-1,0,187,296,36\r
- COMBOBOX IDC_FILTERPRESETS,8,201,119,150,CBS_DROPDOWN | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Load",IDC_FILTERPRESETLOAD,132,200,47,14\r
- PUSHBUTTON "Save",IDC_FILTERPRESETSAVE,184,200,47,14\r
- PUSHBUTTON "Delete",IDC_FILTERPRESETDELETE,236,200,47,14\r
- COMBOBOX IDC_FILTERHZMULT,67,43,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- COMBOBOX IDC_FILTERVZMULT,67,63,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Autoscale",IDC_FILTERAUTORES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,168,63,10\r
- COMBOBOX IDC_FILTERXTRA,105,130,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Full screen filter",IDC_FILTERUPSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,153,87,10\r
-END\r
-\r
-IDD_HARDDRIVE DIALOGEX 0, 0, 380, 76\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Harddrive Settings"\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- LTEXT "Hard drive:",IDC_STATIC,7,11,80,10\r
- COMBOBOX IDC_HARDDRIVE,49,9,325,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,51,55,10\r
- DEFPUSHBUTTON "Add hard drive",IDOK,231,48,65,14\r
- PUSHBUTTON "Cancel",IDCANCEL,319,48,54,14\r
- DEFPUSHBUTTON "Create hard disk image file",IDC_HARDDRIVE_IMAGE,49,30,115,14\r
- EDITTEXT IDC_PATH_NAME,183,27,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE\r
- COMBOBOX IDC_HDF_CONTROLLER,102,50,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "HD Controller:",IDC_STATIC,42,51,52,10,SS_CENTERIMAGE\r
-END\r
-\r
-IDD_MISC2 DIALOGEX 0, 0, 300, 92\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "When Active",IDC_STATIC,8,7,88,73\r
- RTEXT "Run at priority:",IDC_ACTIVE_PRI,14,17,52,10,SS_CENTERIMAGE | WS_TABSTOP\r
- COMBOBOX IDC_ACTIVE_PRIORITY,14,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "When Inactive",IDC_STATIC,102,7,92,73\r
- RTEXT "Run at priority:",IDC_INACTIVE_PRI,109,17,51,10,SS_CENTERIMAGE | WS_TABSTOP\r
- COMBOBOX IDC_INACTIVE_PRIORITY,109,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Pause emulation",IDC_INACTIVE_PAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,50,69,10\r
- CONTROL "Disable sound",IDC_INACTIVE_NOSOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,63,79,10\r
- GROUPBOX "When Minimized",IDC_STATIC,199,7,92,73\r
- RTEXT "Run at priority:",IDC_MINIMIZED_PRI,207,18,51,10,SS_CENTERIMAGE | WS_TABSTOP\r
- COMBOBOX IDC_MINIMIZED_PRIORITY,207,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Pause emulation",IDC_MINIMIZED_PAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,50,69,10\r
- CONTROL "Disable sound",IDC_MINIMIZED_NOSOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,63,79,10\r
-END\r
-\r
-IDD_DISK DIALOGEX 0, 0, 300, 242\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_CONTROL | DS_CENTER | DS_CENTERMOUSE | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- CONTROL "",IDC_DISKLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,6,292,196\r
- PUSHBUTTON "Remove floppy disk image",IDC_DISKLISTREMOVE,156,223,101,15\r
- COMBOBOX IDC_DISKTEXT,3,205,293,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Insert floppy disk image",IDC_DISKLISTINSERT,41,223,101,15\r
-END\r
-\r
-IDD_PANEL DIALOGEX 0, 0, 420, 278\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
-EXSTYLE WS_EX_ACCEPTFILES | WS_EX_CONTROLPARENT\r
-CAPTION "WinUAE Properties"\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- GROUPBOX "",IDC_PANEL_FRAME,112,4,303,247,NOT WS_VISIBLE\r
- CONTROL "",IDC_PANELTREE,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_NOSCROLL | WS_BORDER | WS_HSCROLL | WS_TABSTOP,5,5,101,248,WS_EX_CLIENTEDGE\r
- GROUPBOX "",IDC_PANEL_FRAME_OUTER,110,2,307,251\r
- PUSHBUTTON "Reset",IDC_RESETAMIGA,6,259,47,14\r
- PUSHBUTTON "Quit",IDC_QUITEMU,57,259,47,14\r
- DEFPUSHBUTTON "OK",IDOK,260,259,50,14\r
- PUSHBUTTON "Cancel",IDCANCEL,313,259,50,14\r
- PUSHBUTTON "Help",IDHELP,366,259,50,14,WS_DISABLED\r
- PUSHBUTTON "Restart",IDC_RESTARTEMU,109,259,47,14,NOT WS_VISIBLE\r
-END\r
-\r
-IDD_PATHS DIALOGEX 0, 0, 300, 237\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- LTEXT "System ROMs:",IDC_PATHS_ROML,14,9,260,8,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATHS_ROM,14,22,261,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_PATHS_ROMS,281,22,11,15\r
- LTEXT "Configuration files:",IDC_PATHS_CONFIGL,14,40,260,8,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATHS_CONFIG,14,52,261,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_PATHS_CONFIGS,281,52,11,15\r
- LTEXT "Screenshots:",IDC_PATHS_SCREENSHOTL,14,71,260,8,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATHS_SCREENSHOT,14,83,261,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_PATHS_SCREENSHOTS,281,83,11,15\r
- LTEXT "State files:",IDC_PATHS_STATEFILEL,14,102,260,8,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATHS_SAVESTATE,14,114,261,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_PATHS_SAVESTATES,281,114,11,15\r
- LTEXT "Videos:",IDC_PATHS_AVIOUTPUTL,14,132,260,8,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATHS_AVIOUTPUT,14,144,261,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_PATHS_AVIOUTPUTS,281,144,11,15\r
- LTEXT "Saveimages:",IDC_PATHS_SAVEIMAGEL,14,163,260,8,SS_CENTERIMAGE\r
- EDITTEXT IDC_PATHS_SAVEIMAGE,14,175,261,15,ES_AUTOHSCROLL\r
- PUSHBUTTON "...",IDC_PATHS_SAVEIMAGES,281,175,11,15\r
- PUSHBUTTON "Reset to defaults",IDC_PATHS_DEFAULT,14,199,92,14\r
- PUSHBUTTON "Rescan ROMs",IDC_ROM_RESCAN,14,218,92,14\r
- PUSHBUTTON "Clear registry",IDC_RESETREGISTRY,112,218,77,14\r
- COMBOBOX IDC_PATHS_DEFAULTTYPE,112,199,163,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Clear disk history",IDC_RESETDISKHISTORY,198,218,77,14\r
-END\r
-\r
-IDD_QUICKSTART DIALOGEX 0, 0, 300, 242\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- GROUPBOX "Emulated Hardware",IDC_QUICKSTART_CONFIG,3,0,294,54\r
- RTEXT "Model:",IDC_STATIC,5,14,50,10,SS_CENTERIMAGE\r
- COMBOBOX IDC_QUICKSTART_MODEL,59,12,233,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- RTEXT "Configuration:",IDC_STATIC,5,33,50,10,SS_CENTERIMAGE\r
- COMBOBOX IDC_QUICKSTART_CONFIGURATION,59,31,233,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Compatibility vs Required CPU Power ",IDC_QUICKSTART_COMPA,3,56,294,33\r
- RTEXT "Best compatibility",IDC_STATIC,13,70,67,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_QUICKSTART_COMPATIBILITY,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,95,65,115,21\r
- RTEXT "Low compatibility",IDC_STATIC,215,70,63,10,SS_CENTERIMAGE\r
- GROUPBOX "Host Configuration",IDC_QUICKSTART_HOST,3,91,294,33\r
- RTEXT "Configuration:",IDC_STATIC,5,105,55,10,SS_CENTERIMAGE\r
- COMBOBOX IDC_QUICKSTART_HOSTCONFIG,65,103,225,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
- GROUPBOX "Emulated Floppy Drives",IDC_QUICKSTART_DF,3,126,294,84\r
- CONTROL "Floppy drive DF0:",IDC_DF0QENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,10,136,72,15\r
- PUSHBUTTON "Select disk image",IDC_DF0QQ,85,136,98,15\r
- RTEXT "Write-protected",IDC_STATIC,185,139,56,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_DF0WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,246,137,10,15\r
- PUSHBUTTON "Eject",IDC_EJECT0Q,261,136,30,15\r
- COMBOBOX IDC_DF0TEXTQ,9,154,282,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "Floppy drive DF1:",IDC_DF1QENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,172,71,15\r
- PUSHBUTTON "Select disk image",IDC_DF1QQ,85,172,98,15\r
- RTEXT "Write-protected",IDC_STATIC,185,175,55,10,SS_CENTERIMAGE\r
- CONTROL "",IDC_DF1WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,246,173,10,15\r
- PUSHBUTTON "Eject",IDC_EJECT1Q,261,172,30,15\r
- COMBOBOX IDC_DF1TEXTQ,9,190,282,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP\r
- PUSHBUTTON "Set configuration",IDC_QUICKSTART_SETCONFIG,9,219,72,15,NOT WS_VISIBLE\r
- GROUPBOX "Mode",IDC_STATIC,190,211,107,27,BS_LEFT\r
- CONTROL "Start in Quickstart mode",IDC_QUICKSTARTMODE,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,197,222,94,10\r
-END\r
-\r
-IDD_FRONTEND DIALOGEX 0, 0, 420, 242\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD\r
-FONT 8, "MS Sans Serif", 0, 0, 0x1\r
-BEGIN\r
- CONTROL "",IDC_FE_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,6,9,235,124\r
- GROUPBOX "",IDC_FE_INFO,249,140,160,95\r
- GROUPBOX "",IDC_FE_SCREENSHOT,249,7,160,128\r
-END\r
-\r
-IDD_PROGRESSBAR DIALOGEX 0, 0, 229, 58\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Processing..."\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- PUSHBUTTON "Cancel",IDCANCEL,88,40,50,14\r
- CONTROL "",IDC_PROGRESSBAR,"msctls_progress32",PBS_SMOOTH | WS_BORDER,7,19,215,14\r
- CTEXT "x",IDC_PROGRESSBAR_TEXT,23,5,187,10,SS_CENTERIMAGE | WS_TABSTOP\r
-END\r
-\r
-IDD_STRINGBOX DIALOGEX 0, 0, 229, 58\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
-CAPTION "Enter text..."\r
-FONT 8, "MS Sans Serif", 0, 0, 0x0\r
-BEGIN\r
- DEFPUSHBUTTON "OK",IDOK,48,39,50,14\r
- PUSHBUTTON "Cancel",IDCANCEL,151,39,50,14\r
- EDITTEXT IDC_STRINGBOXEDIT,7,17,214,14,ES_AUTOHSCROLL | ES_WANTRETURN\r
- CTEXT "Custom input event",IDC_STRINGBOX_TEXT,23,5,187,10,SS_CENTERIMAGE | WS_TABSTOP\r
-END\r
-\r
-IDD_DEBUGGER DIALOGEX 0, 0, 454, 368\r
-STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_THICKFRAME\r
-EXSTYLE WS_EX_CONTROLPARENT\r
-CAPTION "WinUAE Debugger"\r
-FONT 8, "Courier New", 0, 0, 0x0\r
-BEGIN\r
- EDITTEXT IDC_DBG_OUTPUT1,1,79,370,262,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP\r
- EDITTEXT IDC_DBG_OUTPUT2,1,79,370,262,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP\r
- LISTBOX IDC_DBG_MEM,1,92,370,249,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_DASM,1,92,370,249,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- EDITTEXT IDC_DBG_MEMINPUT,1,79,36,12,ES_AUTOHSCROLL | ES_WANTRETURN\r
- EDITTEXT IDC_DBG_INPUT,1,342,354,12,ES_AUTOHSCROLL | ES_WANTRETURN\r
- PUSHBUTTON "?",IDC_DBG_HELP,356,342,15,12,NOT WS_TABSTOP\r
- PUSHBUTTON "Set to PC",IDC_DBG_MEMTOPC,38,79,45,12,NOT WS_TABSTOP\r
- LISTBOX IDC_DBG_DREG,1,1,52,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_AREG,54,1,52,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_AMEM,106,1,231,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_CCR,338,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_SP_VBR,338,44,115,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_MMISC,396,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_PC,1,68,52,10,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_PREFETCH,54,68,283,10,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_FPREG,372,218,81,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_FPSR,372,285,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_MISCCPU,372,320,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- CONTROL "",IDC_DBG_STATUS,"msctls_statusbar32",0x103,0,355,453,12\r
- LISTBOX IDC_DBG_BRKPTS,1,79,370,262,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL\r
- LISTBOX IDC_DBG_MCUSTOM,372,79,81,138,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT\r
- LISTBOX IDC_DBG_MISC,1,79,370,262,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL\r
- LISTBOX IDC_DBG_CUSTOM,1,79,370,262,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL\r
-END\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Icon\r
-//\r
-\r
-// Icon with lowest ID value placed first to ensure application icon\r
-// remains consistent on all systems.\r
-IDI_APPICON ICON "winuae.ico"\r
-IDI_FLOPPY ICON "35floppy.ico"\r
-IDI_ABOUT ICON "amigainfo.ico"\r
-IDI_HARDDISK ICON "Drive.ico"\r
-IDI_CPU ICON "cpu.ico"\r
-IDI_PORTS ICON "joystick.ico"\r
-IDI_INPUT ICON "joystick.ico"\r
-IDI_MISC1 ICON "misc.ico"\r
-IDI_MISC2 ICON "misc.ico"\r
-IDI_MOVE_UP ICON "move_up.ico"\r
-IDI_MOVE_DOWN ICON "move_dow.ico"\r
-IDI_AVIOUTPUT ICON "avioutput.ico"\r
-IDI_DISK ICON "Drive.ico"\r
-IDI_CONFIGFILE ICON "file.ico"\r
-IDI_FOLDER ICON "folder.ico"\r
-IDI_SOUND ICON "sound.ico"\r
-IDI_DISPLAY ICON "screen.ico"\r
-IDI_ROOT ICON "root.ico"\r
-IDI_MEMORY ICON "chip.ico"\r
-IDI_QUICKSTART ICON "quickstart.ico"\r
-IDI_PATHS ICON "paths.ico"\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Version\r
-//\r
-\r
-VS_VERSION_INFO VERSIONINFO\r
- FILEVERSION 1,4,6,0\r
- PRODUCTVERSION 1,4,6,0\r
- FILEFLAGSMASK 0x3fL\r
-#ifdef _DEBUG\r
- FILEFLAGS 0x1L\r
-#else\r
- FILEFLAGS 0x0L\r
-#endif\r
- FILEOS 0x40004L\r
- FILETYPE 0x1L\r
- FILESUBTYPE 0x0L\r
-BEGIN\r
- BLOCK "StringFileInfo"\r
- BEGIN\r
- BLOCK "040904b0"\r
- BEGIN\r
- VALUE "FileDescription", "WinUAE"\r
- VALUE "FileVersion", "1.4.6"\r
- VALUE "InternalName", "WinUAE"\r
- VALUE "LegalCopyright", "© 1996-2008 under the GNU Public License (GPL)"\r
- VALUE "OriginalFilename", "WinUAE.exe"\r
- VALUE "ProductName", "WinUAE"\r
- VALUE "ProductVersion", "1.4.6"\r
- END\r
- END\r
- BLOCK "VarFileInfo"\r
- BEGIN\r
- VALUE "Translation", 0x409, 1200\r
- END\r
-END\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Cursor\r
-//\r
-\r
-IDC_MYHAND CURSOR "H_arrow.cur"\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Menu\r
-//\r
-\r
-IDM_SYSTRAY MENU \r
-BEGIN\r
- POPUP "Menu"\r
- BEGIN\r
- MENUITEM "Configuration", ID_ST_CONFIGURATION\r
- POPUP "Floppy drives"\r
- BEGIN\r
- MENUITEM "Eject all drives", ID_ST_EJECTALL\r
- MENUITEM "DF0:", ID_ST_DF0\r
- MENUITEM "DF1:", ID_ST_DF1\r
- MENUITEM "DF2:", ID_ST_DF2\r
- MENUITEM "DF3:", ID_ST_DF3\r
- END\r
- MENUITEM "Reset", ID_ST_RESET\r
- MENUITEM "Help", ID_ST_HELP\r
- MENUITEM "Quit WinUAE", ID_ST_QUIT\r
- END\r
-END\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// WAVE\r
-//\r
-\r
-IDR_DRIVE_STARTUP_A500_1 WAVE "drive_startup.wav"\r
-IDR_DRIVE_CLICK_A500_1 WAVE "drive_click.wav"\r
-IDR_DRIVE_SPIN_A500_1 WAVE "drive_spin.wav"\r
-IDR_DRIVE_SNATCH_A500_1 WAVE "drive_snatch.wav"\r
-IDR_DRIVE_SPINND_A500_1 WAVE "drive_spinnd.wav"\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Bitmap\r
-//\r
-\r
-IDB_XARCADE BITMAP "xarcade-winuae.bmp"\r
-IDB_LCD160X43 BITMAP "lcd.bmp"\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// String Table\r
-//\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_KICKSTART "ROM"\r
- IDS_DISK "Disk swapper"\r
- IDS_DISPLAY "Display"\r
- IDS_HARDDISK "Hard drives"\r
- IDS_FLOPPY "Floppy drives"\r
- IDS_ABOUT "About"\r
- IDS_LOADSAVE "Configurations"\r
- IDS_AVIOUTPUT "Output"\r
- IDS_PORTS "Game & I/O ports"\r
- IDS_MISC1 "Misc"\r
- IDS_MEMORY "RAM"\r
- IDS_CPU "CPU and FPU"\r
- IDS_CHIPSET "Chipset"\r
- IDS_INPUT "Input"\r
- IDS_FILTER "Filter"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_MISC2 "Priority"\r
- IDS_PATHS "Paths"\r
- IDS_QUICKSTART "Quickstart"\r
- IDS_FRONTEND "Frontend"\r
- IDS_CHIPSET2 "Adv. Chipset"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_EXTTEXT "Floppy disk image files"\r
- IDS_EXTACTUAL "ADF"\r
- IDS_SOUND "Sound"\r
- IDS_CDROM "CD-ROM"\r
- IDS_FRAMERATE "Every %1Frame"\r
- IDS_SECOND "second "\r
- IDS_THIRD "third "\r
- IDS_FOURTH "fourth "\r
- IDS_FIFTH "fifth "\r
- IDS_SIXTH "sixth "\r
- IDS_SEVENTH "seventh "\r
- IDS_EIGHTH "eighth "\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_NINTH "ninth "\r
- IDS_TENTH "tenth "\r
- IDS_SELECTADF "Select a floppy disk image file..."\r
- IDS_ADF "Floppy disk image files"\r
- IDS_CHOOSEBLANK "Choose a blank floppy disk image file..."\r
- IDS_SELECTHDF "Select a hard disk image file..."\r
- IDS_HDF "Hard disk image files"\r
- IDS_SELECTUAE "Select a WinUAE configuration file..."\r
- IDS_UAE "WinUAE configuration files"\r
- IDS_SELECTROM "Select a system ROM file..."\r
- IDS_ROM "System ROM files"\r
- IDS_SELECTKEY "Select a system ROM key file..."\r
- IDS_KEY "System ROM key files"\r
- IDS_SELECTINFO "Select information for your configuration..."\r
- IDS_NONE "none"\r
- IDS_VOLUME "Volume"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_SELECTFILESYSROOT "Please select the root directory of the file system..."\r
- IDS_DEFAULTMIDIOUT "Default MIDI-Out Device"\r
- IDS_CONTRIBUTORS1 "Bernd Schmidt - The Grand-Master\nSam Jordan - Custom-chip, floppy-DMA, etc.\nMathias Ortmann - Original WinUAE Main Guy, BSD Socket support\nBrian King - Picasso96 Support, Integrated GUI for WinUAE, previous WinUAE Main Guy\nToni Wilen - Core updates, WinUAE Main Guy\nGustavo Goedert/Peter Remmers/Michael Sontheimer/Tomi Hakala/Tim Gunn/Nemo Pohle - DOS Port Stuff\nSamuel Devulder/Olaf Barthel/Sam Jordan - Amiga Ports\nKrister Bergman - XFree86 and OS/2 Port\nA. Blanchard/Ernesto Corvi - MacOS Port\nChristian Bauer - BeOS Port\nIan Stephenson - NextStep Port\nPeter Teichmann - Acorn/RiscOS Port\nStefan Reinauer - ZorroII/III AutoConfig, Serial Support\nChristian Schmitt/Chris Hames - Serial Support\nHerman ten Brugge - 68020/68881 Emulation Code\nTauno Taipaleenmaki - Various UAE-Control/UAE-Library Support\nBrett Eden/Tim Gunn/Paolo Besser/Nemo Pohle - Various Docs and Web-Sites\nGeorg Veichtlbauer - Help File coordinator, German GUI\nFulvio Leonardi - Italian translator for WinUAE\n"\r
- IDS_CONTRIBUTORS2 "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing.\nPéter Tóth /Balázs Rátkai/Iván Herczeg/András Arató - Hungarian translation.\nKarsten Bock, Gavin Fance, Dirk Trowe, Christoph Meier and Christian Schindler - Freezer cartridge hardware support."\r
- IDS_INVALIDPRTPORT "The printer you have in this configuration is not valid on this machine.\n"\r
- IDS_RESTOREUSS "Restore a WinUAE snapshot file"\r
- IDS_USS "WinUAE snapshot files"\r
- IDS_WRONGOSVERSION "WinUAE is no longer supported on Windows NT. Please upgrade to either Windows 2000 or Windows XP or a later version."\r
- IDS_SELECTFLASH "Select a flash or battery-backed RAM file..."\r
- IDS_FLASH "WinUAE flash or battery-backed RAM file"\r
- IDS_INPUTHOSTWIDGET "Input source"\r
- IDS_INPUTAMIGAEVENT "Input target"\r
- IDS_INPUTAUTOFIRE "Autofire"\r
- IDS_SAVEUSS "Save a WinUAE snapshot file"\r
- IDS_MIDIOVERFLOW "Sysexbuffer overflow. Should not happen. Please report this to\nberndroesch1@compuserve.de"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_PATH "Path"\r
- IDS_RW "R/W"\r
- IDS_SECTORS "Sectors"\r
- IDS_SURFACES "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing.\nHungarian translation - Péter Tóth , Balázs Rátkai , Iván Herczeg , András Arató"\r
- IDS_RESERVED "Reserved"\r
- IDS_BLOCKSIZE "Block size"\r
- IDS_NAME "Name"\r
- IDS_DESCRIPTION "Description"\r
- IDS_COULDNOTLOADCONFIG "Could not load the selected configuration!\n"\r
- IDS_NOHELP "Online help is disabled because the HTML Help functionality is not installed on this system. HTML Help is available from http://www.microsoft.com/downloads/.\n"\r
- IDS_MUSTSELECTCONFIG "You must select a configuration or enter a name before selecting Load...\n"\r
- IDS_INVALIDCOMPORT "The serial port you have in this configuration is not valid on this machine.\n"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_HFDSIZE "Size"\r
- IDS_DEVICE "Device"\r
- IDS_BOOTPRI "BootPri"\r
- IDS_FLOPPY_COMPATIBLE " (compatible)"\r
- IDS_FLOPPY_TURBO "Turbo"\r
- IDS_YES "yes"\r
- IDS_NO "no"\r
- IDS_PRI_ABOVENORMAL "Above Normal"\r
- IDS_PRI_NORMAL "Normal"\r
- IDS_PRI_BELOWNORMAL "Below Normal"\r
- IDS_PRI_LOW "Low"\r
- IDS_OLDRTGLIBRARY "The installed LIBS:Picasso96/rtg.library (%d.%d) should be updated.\nA newer version is included in the ""Amiga Programs"" directory\n of the WinUAE distribution archive.\n\nNewer library version fixes graphics problems and increases performance."\r
- IDS_DEFAULT_AF2005 "Amiga Forever 2005+"\r
- IDS_DEFAULT_AF "Amiga Forever"\r
- IDS_DEFAULT_WINUAE "WinUAE default (old)"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_SOUND_STEREO2 "Cloned Stereo (4 Channels)"\r
- IDS_INPUT_CUSTOMEVENT "<Custom event>"\r
- IDS_DEFAULT_NEWWINUAE "WinUAE default (new)"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_UNSUPPORTEDPIXELFORMAT \r
- "Error: unsupported pixel format. Please use a different screen mode.\n"\r
- IDS_MUSTENTERNAME "You must select a configuration or enter a name before selecting Save...\n"\r
- IDS_MUSTSELECTCONFIGFORDELETE \r
- "You must select a configuration or enter a name before selecting Delete...\n"\r
- IDS_DELETECONFIGCONFIRMATION \r
- "Are you sure you want to Delete this configuration?\n"\r
- IDS_DELETECONFIGTITLE "Confirm Delete"\r
- IDS_MUSTSELECTPATH "You must select a path!"\r
- IDS_SETTINGSERROR "Settings error"\r
- IDS_MUSTSELECTNAME "You must select a name for the volume!"\r
- IDS_MUSTSELECTFILE "You must select a file!"\r
- IDS_FAILEDHARDFILECREATION "Failed to create hard disk image file..."\r
- IDS_CREATIONERROR "Creation error"\r
- IDS_ERRORTITLE "WinUAE message"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_INP "WinUAE Input Recording"\r
- IDS_RESTOREINP "Playback a WinUAE input recording"\r
- IDS_SAVEINP "Record a WinUAE input recording"\r
- IDS_SCREEN_WINDOWED "Windowed"\r
- IDS_SCREEN_FULLSCREEN "Fullscreen"\r
- IDS_SCREEN_FULLWINDOW "Full-window"\r
- IDS_SCREEN_VSYNC "VSync"\r
- IDS_SOUND_MONO "Mono"\r
- IDS_SOUND_MIXED "Mixed"\r
- IDS_SOUND_STEREO "Stereo"\r
- IDS_SOUND_INTERPOL_DISABLED "Disabled"\r
- IDS_SOUND_FILTER_OFF "Always off"\r
- IDS_SOUND_FILTER_EMULATED "Emulated (A500)"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_SOUND_FILTER_EMULATED_E "Emulated (A1200)"\r
- IDS_INPUT_COMPATIBILITY "Compatibility mode"\r
- IDS_INPUT_CUSTOM "Configuration #%d"\r
- IDS_INPUT_COPY_DEFAULT "Default"\r
- IDS_INPUT_COPY_CUSTOM "Config #%d"\r
- IDS_3D_NO_FILTER "Point (%d-bit)"\r
- IDS_3D_BILINEAR "Bilinear (%d-bit)"\r
- IDS_VSYNC_DEFAULT "Default"\r
- IDS_DRIVESOUND_NONE "No sound"\r
- IDS_DRIVESOUND_DEFAULT_A500 "A500 (WinUAE built-in)"\r
- IDS_AVIOUTPUT_NOCODEC "no codec selected"\r
- IDS_DISK_IMAGENAME "Disk image"\r
- IDS_DISK_DRIVENAME "Drive"\r
- IDS_AGA8BIT "AGA emulation requires a 16-bit or higher display depth.\nSwitching from 8-bit to 16-bit."\r
- IDS_UNSUPPORTEDSCREENMODE \r
- "The selected screen mode can't be displayed in a window, because %s\nSwitching to full-screen display."\r
- IDS_UNSUPPORTEDSCREENMODE_1 \r
- "the desktop is running in an unknown color mode."\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_UNSUPPORTEDSCREENMODE_2 \r
- "the desktop is running in 8-bit color depth, which WinUAE can't use in windowed mode."\r
- IDS_UNSUPPORTEDSCREENMODE_3 \r
- "the desktop is too small for the specified window size."\r
- IDS_UNSUPPORTEDSCREENMODE_4 \r
- "you selected an RTG (Picasso96) display with a color depth different from that of the desktop and an overlay was unavailable."\r
- IDS_FLOPPYTYPE35DD "3.5"" DD"\r
- IDS_FLOPPYTYPE35HD "3.5"" HD"\r
- IDS_FLOPPYTYPE525SD "5.25"" SD"\r
- IDS_FLOPPYTYPEDISABLED "Disabled"\r
- IDS_STMENUNOFLOPPY "No floppy disk inserted"\r
- IDS_TREEVIEW_HARDWARE "Hardware"\r
- IDS_TREEVIEW_HOST "Host"\r
- IDS_TREEVIEW_MISC "Miscellaneous"\r
- IDS_TREEVIEW_SETTINGS "Settings"\r
- IDS_WINUAETITLE_MMB "[Mouse active - press ALT+TAB or middle mouse button to cancel]"\r
- IDS_WINUAETITLE_NORMAL "[Mouse active - press ALT+TAB to cancel]"\r
- IDS_STARTEMULATION "Start"\r
- IDS_TREEVIEW_ABOUT "About"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_NOHARDDRIVES "No hard disks detected that were either empty or RDB-partitioned."\r
- IDS_DEFAULT_HOST "Default Configuration"\r
- IDS_SOUND_4CHANNEL "4 Channels"\r
- IDS_HF_FS_CUSTOM "Custom"\r
- IDS_SELECTFS "Select file system handler (FastFileSystem, SmartFilesystem, etc.)"\r
- IDS_KEYJOY "Keyboard Layout A (Numeric keypad, 0 and 5 = Fire)\nKeyboard Layout B (Cursor keys, Right CTRL and ALT = Fire)\nKeyboard Layout C (W=Up S=Down A=Left D=Right, Left ALT = Fire)\nX-Arcade (Left)\nX-Arcade (Right)"\r
- IDS_STATEFILE_UNCOMPRESSED "Uncompressed"\r
- IDS_STATEFILE_RAMDUMP "RAM dump"\r
- IDS_STATEFILE_WAVE "Wave audio dump"\r
- IDS_SOUND_SWAP_PAULA "Paula only"\r
- IDS_SOUND_SWAP_AHI "AHI only"\r
- IDS_SOUND_SWAP_BOTH "Both"\r
- IDS_SOUND_FILTER_ON_AGA "Always on (A500)"\r
- IDS_SOUND_FILTER_ON_A500 "Always on (A1200)"\r
- IDS_DRIVESOUND_PC_FLOPPY "PC floppy drive %c"\r
- IDS_FLOPPYTYPE35DDESCOM "3.5"" ESCOM"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_NUMSG_NEEDEXT2 "The software uses a non-standard floppy disk format. You may need to use a custom floppy disk image file instead of a standard one. This message will not appear again."\r
- IDS_NUMSG_NOROMKEY "Could not find system ROM key file."\r
- IDS_NUMSG_KSROMCRCERROR "System ROM checksum incorrect. The system ROM image file may be corrupt."\r
- IDS_NUMSG_KSROMREADERROR "Error while reading system ROM."\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_NUMSG_NOEXTROM "No extended ROM found."\r
- IDS_NUMSG_MODRIP_NOTFOUND "No music modules or packed data found."\r
- IDS_NUMSG_MODRIP_FINISHED "Scan finished."\r
- IDS_NUMSG_MODRIP_SAVE "Module/packed data found\n%s\nStart address %08.8X, Size %d bytes\nWould you like to save it?"\r
- IDS_NUMSG_KS68020 "The selected system ROM requires a 68020 with 32-bit addressing or 68030 or higher CPU."\r
- IDS_NUMSG_ROMNEED "One of the following system ROMs is required:\n\n%s\n\nCheck the System ROM path in the Paths panel and click Rescan ROMs."\r
- IDS_NUMSG_STATEHD "WARNING: Current configuration is not fully compatible with state saves.\nThis message will not appear again."\r
- IDS_NUMSG_NOCAPS "Selected disk image needs the SPS plugin\nwhich is available from\nhttp//www.softpres.org/"\r
- IDS_NUMSG_OLDCAPS "You need an updated SPS plugin\nwhich is available from\nhttp//www.softpres.org/"\r
- IDS_IMGCHK_BOOTBLOCKCRCERROR \r
- "The selected floppy disk image is not bootable (boot block checksum error)"\r
- IDS_IMGCHK_BOOTBLOCKNO "The selected floppy disk image is not bootable (no boot block)"\r
- IDS_IMGCHK_DAMAGED "The selected floppy disk image is damaged or unformatted"\r
- IDS_IMGCHK_KS2 "The selected floppy disk image requires a 2.04 or later system ROM.\nThe configuration has been updated."\r
- IDS_IMGCHK_KS3 "The selected floppy disk image requires a 3.0 or later system ROM.\nThe configuration has been updated."\r
- IDS_ROMSCANEND "Scan of ROMs finished"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_ROM_AVAILABLE "available"\r
- IDS_ROM_UNAVAILABLE "unavailable"\r
- IDS_HARDDRIVESAFETYWARNING1 \r
- "Warning: The drive safety check is active. Selected drive is not empty and non-RDB partitioned."\r
- IDS_NUMSG_KS68EC020 "The selected system ROM requires a 68020 with 24-bit addressing or higher CPU."\r
- IDS_ROMSCANNOROMS "No supported system ROMs detected."\r
- IDS_NUMSG_KICKREP "You need to have a floppy disk (image file) in DF0: to use the system ROM replacement."\r
- IDS_NUMSG_KICKREPNO "The floppy disk (image file) in DF0: is not compatible with the system ROM replacement functionality."\r
- IDS_NUMSG_NOROM "Could not load system ROM, trying system ROM replacement."\r
- IDS_HDCLONE_OK "Hard drive image file created succesfully."\r
- IDS_HDCLONE_FAIL "Hard drive image file creation failed.\nError code %d:%d."\r
- IDS_NUMSG_KS68030 "The selected system ROM requires a 68030 CPU."\r
- IDS_NUMSG_EXPROMNEED "One of the following expansion boot ROMs is required:\n\n%s\n\nCheck the System ROM path in the Paths panel and click Rescan ROMs."\r
- IDS_HARDDRIVESAFETYWARNING2 \r
- "Warning: The drive safety check has been disabled, and non-empty and non-RDB partitioned hard disk(s) were detected."\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_QS_MODELS "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nArcadia Multi Select system\nExpanded WinUAE example configuration"\r
- IDS_QS_MODEL_A500 "1.3 ROM, OCS, 512 KB Chip + 512 KB Slow RAM (most common)\nThis configuration is capable of running most games and demos produced for first-generation hardware. Only few exceptions need a different configuration (e.g. the oldest games tend to be incompatible with this configuration).\n1.3 ROM, ECS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nLater hardware revision of the A500. Nearly 100% compatible with the previous configuration.\n1.3 ROM, ECS Agnus, 1 MB Chip RAM\nFew newer games and demos require this configuration.\n1.3 ROM, OCS Agnus, 512 KB Chip RAM\nVery old (e.g. pre-1988) games and demos may require this configuration.\n1.2 ROM, OCS Agnus, 512 KB Chip RAM\nAs available for the A1000, and installed on the first A500 and A2000 series. Some very old programs only work correctly with this configuration. Note: This system ROM version can only boot from floppy disk (no hard disk boot support).\n1.2 ROM, OCS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nThis configuration adds expansion memory to the first A500 produced. Try this if your game does not work with newer configurations, but works with the previous one. It could add some features to the game, including faster loading times. Note: This system ROM version can only boot from floppy disk (no hard disk boot support)."\r
- IDS_QS_MODEL_A500P "Basic non-expanded configuration\nThe A500+ adds an ECS Agnus chip, 1 MB of Chip RAM and a 2.0 ROM to the A500. Many A500 games and demos don't work properly on an A500+.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n"\r
- IDS_QS_MODEL_A600 "Basic non-expanded configuration\nThe A600 is smaller than the A500+ and has an updated 2.0 ROM.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n"\r
- IDS_QS_MODEL_A1000 "512 KB Chip RAM\nThe A1000 was the first model produced, with a configuration equivalent to that of an A500 with OCS chipset. You normally don't need to use this configuration, unless you are nostalgic and would like to hear the short A1000 boot tune\n""ICS"" Denise without EHB support\nVery first A1000 models had Denise without EHB capability.\n256 KB Chip RAM\n Unexpanded A1000. All later A1000 models were sold with a 256 KB RAM expansion built-in."\r
- IDS_QS_MODEL_A1200 "Basic non-expanded configuration\nUse this configuration to run most AGA demos and games\n4 MB Fast RAM expanded configuration\nSome newer AGA games and demos need an expanded A1200 to run."\r
- IDS_QS_MODEL_CD32 "CD32\nThe CD32 was one the first 32-bit consoles on the market. It is basically an A1200 with a built-in CD-ROM drive. Insert your CD32 or CDTV CD-ROM into a free CD-ROM drive before starting the emulation."\r
- IDS_QS_MODEL_CDTV "CDTV\nThe CDTV was the first model with a built-in CD-ROM drive. Looking like a black CD player, it featured a configuration equivalent to that of an A500 with 1 MB RAM and an ECS chipset.\nFloppy drive and 64KB SRAM card expanded CDTV\n"\r
-END\r
-\r
-STRINGTABLE \r
-BEGIN\r
- IDS_QS_MODEL_UAE "High-end expanded configuration"\r
- IDS_QS_MODEL_ARCADIA "Arcadia\nArcadia Multi Select system is arcade platform developed by Arcadia and Mastertronic. It is based on an A500 mainboard with ROM cage attached to expansion port. Arcadia ROM files go to ""Cartridge ROM File"" in ROM-panel."\r
- IDS_QS_MODEL_A3000 "1.4 ROM, 2MB Chip + 8MB Fast\n\n2.04 ROM, 2MB Chip + 8MB Fast\n\n3.1 ROM, 2MB Chip + 8MB Fast\n"\r
- IDS_QS_MODEL_A4000 "68030, 3.1 ROM, 2MB Chip + 8MB Fast\n\n68040, 3.1 ROM, 2MB Chip + 8MB Fast\n"\r
- IDS_QS_MODEL_A4000T "A4000T (test)\nA4000T"\r
-END\r
-\r
-#endif // English (U.S.) resources\r
-/////////////////////////////////////////////////////////////////////////////\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// Finnish resources\r
-\r
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN)\r
-#ifdef _WIN32\r
-LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT\r
-#pragma code_page(1252)\r
-#endif //_WIN32\r
-\r
-#ifdef APSTUDIO_INVOKED\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// TEXTINCLUDE\r
-//\r
-\r
-1 TEXTINCLUDE \r
-BEGIN\r
- "resource.\0"\r
-END\r
-\r
-3 TEXTINCLUDE \r
-BEGIN\r
- "\r\0"\r
-END\r
-\r
-2 TEXTINCLUDE \r
-BEGIN\r
- "#include ""afxres.h""\r\0"\r
-END\r
-\r
-#endif // APSTUDIO_INVOKED\r
-\r
-#endif // Finnish resources\r
-/////////////////////////////////////////////////////////////////////////////\r
-\r
-\r
-\r
-#ifndef APSTUDIO_INVOKED\r
-/////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Generated from the TEXTINCLUDE 3 resource.\r
-//\r
-\r\r
-/////////////////////////////////////////////////////////////////////////////\r
-#endif // not APSTUDIO_INVOKED\r
-\r
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDR_DBGACCEL ACCELERATORS
+BEGIN
+ VK_F1, ID_DBG_PAGE1, VIRTKEY, NOINVERT
+ VK_F2, ID_DBG_PAGE2, VIRTKEY, NOINVERT
+ VK_F3, ID_DBG_PAGE3, VIRTKEY, NOINVERT
+ VK_F4, ID_DBG_PAGE4, VIRTKEY, NOINVERT
+ VK_F5, ID_DBG_PAGE5, VIRTKEY, NOINVERT
+ VK_F6, ID_DBG_PAGE6, VIRTKEY, NOINVERT
+ VK_F7, ID_DBG_PAGE7, VIRTKEY, NOINVERT
+ VK_F8, ID_DBG_PAGE8, VIRTKEY, NOINVERT
+ VK_F9, ID_DBG_PAGE9, VIRTKEY, NOINVERT
+ VK_F11, ID_DBG_STEP_OVER, VIRTKEY, NOINVERT
+ VK_F12, ID_DBG_STEP_INTO, VIRTKEY, NOINVERT
+ VK_DOWN, IDC_DBG_MEMDOWN, VIRTKEY, ALT, NOINVERT
+ VK_RIGHT, IDC_DBG_MEMDOWNFAST, VIRTKEY, ALT, NOINVERT
+ VK_UP, IDC_DBG_MEMUP, VIRTKEY, ALT, NOINVERT
+ VK_LEFT, IDC_DBG_MEMUPFAST, VIRTKEY, ALT, NOINVERT
+ "H", IDC_DBG_HELP, VIRTKEY, ALT, NOINVERT
+ "P", IDC_DBG_MEMTOPC, VIRTKEY, ALT, NOINVERT
+ "A", IDC_DBG_AUTOSET, VIRTKEY, ALT, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_KICKSTART DIALOGEX 0, 0, 300, 176
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTEXTHELP
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "System ROM Settings",-1,5,0,290,74
+ RTEXT "Main ROM file:",IDC_ROMTEXT,10,15,75,10
+ COMBOBOX IDC_ROMFILE,89,12,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "...",IDC_KICKCHOOSER,280,11,10,15
+ RTEXT "Extended ROM file:",IDC_ROMFILE2TEXT,10,35,75,10
+ COMBOBOX IDC_ROMFILE2,89,32,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "...",IDC_ROMCHOOSER2,280,31,10,15
+ CONTROL "MapROM emulation [] Creates a BlizKick-compatible memory area.",IDC_MAPROM,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,95,54,87,10
+ CONTROL "ShapeShifter support [] Patches the system ROM for ShapeShifter compatibility.",IDC_KICKSHIFTER,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,54,87,10
+ GROUPBOX "Miscellaneous",-1,5,76,290,57
+ RTEXT "Cartridge ROM file:",IDC_FLASHTEXT2,8,93,75,10
+ COMBOBOX IDC_CARTFILE,89,90,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "...",IDC_CARTCHOOSER,280,89,10,15
+ RTEXT "Flash RAM file:",IDC_FLASHTEXT,8,112,75,10
+ EDITTEXT IDC_FLASHFILE,89,110,185,13,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_FLASHCHOOSER,280,109,10,15
+END
+
+IDD_DISPLAY DIALOGEX 0, 0, 300, 235
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Screen",IDC_SCREENRESTEXT,12,0,270,67,BS_LEFT
+ RTEXT "Full screen:",IDC_SELECTRESTEXT,15,17,40,15,SS_CENTERIMAGE
+ COMBOBOX IDC_DISPLAYSELECT,59,10,215,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_RESOLUTION,59,27,68,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_REFRESHRATE,187,27,87,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_XSIZE,59,48,48,12,ES_NUMBER
+ EDITTEXT IDC_YSIZE,114,48,47,12,ES_NUMBER
+ GROUPBOX "Settings",IDC_SETTINGSTEXT,12,73,199,125
+ CONTROL "Correct aspect ratio",IDC_ASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,126,92,10
+ LTEXT "Refresh:",IDC_REFRESHTEXT,18,162,28,8
+ CONTROL "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,157,75,20
+ EDITTEXT IDC_RATETEXT,124,161,77,12,ES_CENTER | ES_READONLY
+ GROUPBOX "Centering",IDC_STATIC,221,73,61,49
+ CONTROL "Horizontal",IDC_XCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,87,49,10
+ CONTROL "Vertical",IDC_YCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,103,49,10
+ GROUPBOX "Line Mode",IDC_LINEMODE,222,126,61,73
+ CONTROL "Normal",IDC_LM_NORMAL,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,231,142,44,10
+ CONTROL "Double",IDC_LM_DOUBLED,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,231,158,45,10
+ CONTROL "Scanlines",IDC_LM_SCANLINES,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,231,174,46,10
+ COMBOBOX IDC_DA_MODE,20,211,58,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,84,207,101,20
+ LTEXT "FPS adj.:",IDC_REFRESH2TEXT,16,182,32,8
+ CONTROL "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,177,127,20
+ EDITTEXT IDC_RATE2TEXT,175,181,26,12,ES_CENTER | ES_READONLY
+ COMBOBOX IDC_RESOLUTIONDEPTH,134,27,46,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,126,89,10
+ COMBOBOX IDC_SCREENMODE_NATIVE,100,85,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SCREENMODE_RTG,100,103,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Native mode:",IDC_STATIC,19,85,59,15,SS_CENTERIMAGE
+ RTEXT "Windowed:",IDC_WINDOWEDTEXT,15,51,40,8
+ RTEXT "RTG mode:",IDC_STATIC,19,101,59,15,SS_CENTERIMAGE
+ PUSHBUTTON "Reset to defaults",IDC_DA_RESET,212,211,73,14
+ RTEXT "Resolution:",IDC_STATIC,27,140,59,15,SS_CENTERIMAGE
+ COMBOBOX IDC_LORES,100,140,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_MEMORY DIALOGEX 0, 0, 300, 175
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTEXTHELP
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Memory Settings",-1,14,7,274,91
+ RTEXT "Chip:",-1,24,26,20,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,22,50,20
+ EDITTEXT IDC_CHIPRAM,105,25,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Slow:",-1,149,26,20,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_SLOWMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,22,60,20
+ EDITTEXT IDC_SLOWRAM,243,25,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Fast:",IDC_FASTTEXT,24,51,20,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,47,50,20
+ EDITTEXT IDC_FASTRAM,105,50,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Z3 Fast:",IDC_Z3TEXT,139,51,30,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_Z3FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,47,60,20
+ EDITTEXT IDC_Z3FASTRAM,243,50,30,12,ES_CENTER | ES_READONLY
+ RTEXT "RTG: [] Graphics card memory. Required for RTG (Picasso96) emulation.",IDC_GFXCARDTEXT,79,76,90,10,SS_NOTIFY | SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_P96MEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,72,60,20
+ EDITTEXT IDC_P96RAM,243,75,30,12,ES_CENTER | ES_READONLY
+ GROUPBOX "Advanced Memory Settings",-1,13,104,275,65
+ RTEXT "Motherboard RAM (Low area):",-1,39,123,129,10,SS_CENTERIMAGE
+ CONTROL "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,119,59,20
+ EDITTEXT IDC_MBRAM1,243,122,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Motherboard RAM (High area):",-1,39,148,129,10,SS_CENTERIMAGE
+ CONTROL "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,144,59,20
+ EDITTEXT IDC_MBRAM2,243,147,30,12,ES_CENTER | ES_READONLY
+END
+
+IDD_CPU DIALOGEX 0, 0, 300, 226
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ GROUPBOX "CPU",IDC_STATIC,5,3,81,139,BS_LEFT
+ CONTROL "68000",IDC_CPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,13,16,63,10
+ CONTROL "68010",IDC_CPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,30,65,10
+ CONTROL "68020",IDC_CPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,44,63,10
+ CONTROL "68030",IDC_CPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,58,64,10
+ CONTROL "68040",IDC_CPU4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,72,66,10
+ CONTROL "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,86,66,10
+ CONTROL "More compatible [] Emulate 68000's prefetch registers. More compatible but slower.",IDC_COMPATIBLE,
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,114,73,8
+ CONTROL "JIT [] Enable just-in-time CPU emulator. Significantly increases the speed of the CPU emulation. Requires 68020 or higher CPU.",IDC_JITENABLE,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,127,73,10
+ GROUPBOX "CPU Emulation Speed",IDC_STATIC,90,3,205,90
+ CONTROL "Fastest possible, but maintain chipset timing",IDC_CS_HOST,
+ "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,95,18,195,10
+ CONTROL "Match A500 speed",IDC_CS_68000,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,32,195,10
+ CONTROL "Adjustable between CPU and chipset",IDC_CS_ADJUSTABLE,
+ "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,46,195,10
+ RTEXT "CPU",IDC_CS_CPU_TEXT,96,73,15,10,SS_CENTERIMAGE | WS_TABSTOP
+ CONTROL "Slider1",IDC_SPEED,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,114,68,67,20
+ LTEXT "Chipset",IDC_CS_CHIPSET_TEXT,182,73,25,10,SS_CENTERIMAGE | NOT WS_GROUP | WS_TABSTOP
+ RTEXT "CPU idle",IDC_CS_CPU_TEXT2,236,56,32,10,SS_CENTERIMAGE | WS_TABSTOP
+ CONTROL "",IDC_CPUIDLE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,219,68,69,20
+ GROUPBOX "Advanced JIT Settings",IDC_STATIC,90,94,205,93
+ RTEXT "Cache size:",IDC_CS_CACHE_TEXT,95,113,45,10,SS_CENTERIMAGE | WS_TABSTOP
+ CONTROL "Slider1",IDC_CACHE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,140,108,115,20
+ EDITTEXT IDC_CACHETEXT,255,113,30,12,ES_CENTER | ES_READONLY
+ CONTROL "Hard flush",IDC_HARDFLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,141,63,10
+ CONTROL "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,155,63,10
+ CONTROL "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,169,62,10
+ CONTROL "Force settings",IDC_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,141,62,10
+ CONTROL "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,155,62,10
+ CONTROL "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,235,141,52,10
+ CONTROL "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,155,52,10
+ CONTROL "After RTG",IDC_TRUST2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,169,52,10
+ CONTROL "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU,
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,210,73,10
+ GROUPBOX "FPU",IDC_STATIC,6,146,81,80,BS_LEFT
+ CONTROL "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,100,73,8
+ CONTROL "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,157,63,10
+ CONTROL "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,171,63,10
+ CONTROL "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,185,63,10
+ CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,199,63,10
+END
+
+IDD_FLOPPY DIALOGEX 0, 0, 300, 240
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ COMBOBOX IDC_DF0TEXT,2,22,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF0TYPE,115,6,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Write-protected",IDC_STATIC,174,8,59,10,SS_CENTERIMAGE
+ CONTROL "",IDC_DF0WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,4,10,15
+ PUSHBUTTON "Eject",IDC_EJECT0,253,4,30,15
+ PUSHBUTTON "...",IDC_DF0,287,4,10,15
+ COMBOBOX IDC_DF1TEXT,2,58,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF1TYPE,115,42,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Write-protected",IDC_STATIC,174,43,59,10,SS_CENTERIMAGE
+ CONTROL "",IDC_DF1WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,40,10,15
+ PUSHBUTTON "Eject",IDC_EJECT1,253,40,30,15
+ PUSHBUTTON "...",IDC_DF1,287,40,10,15
+ COMBOBOX IDC_DF2TEXT,2,93,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF2TYPE,115,77,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Write-protected",IDC_STATIC,174,77,59,10,SS_CENTERIMAGE
+ CONTROL "",IDC_DF2WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,75,9,15
+ PUSHBUTTON "Eject",IDC_EJECT2,253,75,30,15
+ PUSHBUTTON "...",IDC_DF2,287,75,10,15
+ COMBOBOX IDC_DF3TEXT,2,128,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF3TYPE,115,112,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Write-protected",IDC_STATIC,174,113,59,10,SS_CENTERIMAGE
+ CONTROL "",IDC_DF3WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,111,9,15
+ PUSHBUTTON "Eject",IDC_EJECT3,253,110,30,15
+ PUSHBUTTON "...",IDC_DF3,287,109,10,15
+ GROUPBOX "New Floppy Disk Image",IDC_SETTINGSTEXT,5,183,289,49
+ COMBOBOX IDC_FLOPPYTYPE,16,197,51,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Create Standard Disk [] Creates a standard 880 or 1760 KB ADF disk image.",IDC_CREATE,77,196,97,15
+ PUSHBUTTON "Create Custom Disk [] Creates a low level (MFM) ADF disk image (about 2MB). Useful for programs that use non-standard disk formats (for example some save disks or DOS-formatted floppies)",IDC_CREATE_RAW,183,196,101,15
+ GROUPBOX "Floppy Drive Emulation Speed",IDC_SETTINGSTEXT2,5,144,289,35
+ CONTROL "",IDC_FLOPPYSPD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,32,154,116,20
+ EDITTEXT IDC_FLOPPYSPDTEXT,183,157,101,12,ES_CENTER | ES_READONLY
+ PUSHBUTTON "Delete save image",IDC_SAVEIMAGE0,43,5,70,15,NOT WS_VISIBLE
+ PUSHBUTTON "Delete save image",IDC_SAVEIMAGE1,43,40,70,15,NOT WS_VISIBLE
+ PUSHBUTTON "Delete save image",IDC_SAVEIMAGE2,43,75,70,15,NOT WS_VISIBLE
+ PUSHBUTTON "Delete save image",IDC_SAVEIMAGE3,43,110,70,15,NOT WS_VISIBLE
+ EDITTEXT IDC_CREATE_NAME,77,215,97,13,ES_AUTOHSCROLL
+ RTEXT "Disk label:",IDC_STATIC,15,216,52,10,SS_CENTERIMAGE
+ CONTROL "DF0:",IDC_DF0ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,6,34,15
+ CONTROL "DF1:",IDC_DF1ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,41,34,15
+ CONTROL "DF2:",IDC_DF2ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,76,34,15
+ CONTROL "DF3:",IDC_DF3ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,111,34,15
+END
+
+IDD_HARDDISK DIALOGEX 0, 0, 300, 237
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+EXSTYLE WS_EX_CONTEXTHELP
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "List1",IDC_VOLUMELIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,0,290,176
+ PUSHBUTTON "Add &Directory or Archive...",IDC_NEW_FS,10,179,103,15
+ PUSHBUTTON "Add &Hardfile...",IDC_NEW_HF,130,179,74,15
+ PUSHBUTTON "Add Ha&rd Drive...",IDC_NEW_HD,220,179,75,15
+ PUSHBUTTON "Remove",IDC_REMOVE,235,203,60,15
+ PUSHBUTTON "&Properties",IDC_EDIT,235,220,60,15
+ CONTROL "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,202,100,10
+ CONTROL "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,202,119,10
+ CONTROL "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,213,121,10
+ CONTROL "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,225,101,10
+ CONTROL "Include CD/DVD drives..",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,213,100,10
+ CONTROL "Automount removable drives",IDC_MAPDRIVES_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,225,115,10
+END
+
+IDD_SOUND DIALOGEX 0, 0, 300, 231
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ RTEXT "Sound device:",IDC_SOUNDCARD,8,9,51,13,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDCARDLIST,64,9,229,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Sound Emulation",IDC_SOUNDSETTINGS,5,30,120,81
+ CONTROL "Disabled",IDC_SOUND0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,13,45,101,10
+ CONTROL "Disabled, but emulated",IDC_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,57,102,10
+ CONTROL "Enabled",IDC_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,69,102,10
+ CONTROL "Enabled, 100% accurate",IDC_SOUND3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,81,101,10
+ GROUPBOX "Volume",IDC_STATIC,132,36,164,31
+ CONTROL "",IDC_SOUNDVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,137,44,105,20
+ EDITTEXT IDC_SOUNDVOLUME2,247,47,40,12,ES_CENTER | ES_READONLY
+ GROUPBOX "Sound Buffer Size",IDC_STATIC,132,73,164,31
+ CONTROL "Slider1",IDC_SOUNDBUFFERRAM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,137,81,105,19
+ EDITTEXT IDC_SOUNDBUFFERMEM,247,84,40,12,ES_CENTER | ES_READONLY
+ GROUPBOX "Settings",IDC_SOUNDINTERPOLATION2,6,114,290,60
+ LTEXT "Frequency:",IDC_SOUNDFREQTXT,11,148,53,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDFREQ,13,157,51,75,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Audio filter:",IDC_SOUNDFILTERTXT,209,148,77,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDFILTER,209,157,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Channel mode:",IDC_SOUNDSTEREOTXT,11,124,57,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDSTEREO,13,133,122,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Interpolation:",IDC_SOUNDINTERPOLATIONTXT,209,124,75,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDINTERPOLATION,209,133,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Stereo separation:",IDC_SOUNDSTEREOSEPTXT,141,124,63,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDSTEREOSEP,142,133,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Stereo delay:",IDC_SOUNDSTEREOMIXTXT,141,148,63,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDSTEREOMIX,142,157,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Floppy Drive Sound Emulation",IDC_STATIC,6,177,290,46
+ CONTROL "",IDC_SOUNDDRIVEVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,14,185,107,19
+ EDITTEXT IDC_SOUNDDRIVEVOLUME2,124,187,40,12,ES_CENTER | ES_READONLY
+ COMBOBOX IDC_SOUNDDRIVE,237,187,46,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SOUNDDRIVESELECT,18,205,265,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SOUNDSWAP,73,157,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Swap channels:",IDC_SOUNDSWAPTXT,74,148,61,8,SS_CENTERIMAGE
+ CONTROL "Automatic switching",IDC_SOUND_AUTO,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,14,95,103,10
+END
+
+IDD_LOADSAVE DIALOGEX 0, 0, 302, 241
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "",IDC_CONFIGTREE,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,6,3,289,153,WS_EX_CLIENTEDGE
+ RTEXT "Name:",IDC_STATIC,4,161,40,15,SS_CENTERIMAGE
+ EDITTEXT IDC_EDITNAME,48,162,146,13,ES_AUTOHSCROLL
+ RTEXT "Description:",IDC_STATIC,2,182,41,15,SS_CENTERIMAGE
+ EDITTEXT IDC_EDITDESCRIPTION,48,183,146,13,ES_AUTOHSCROLL
+ RTEXT "Link:",IDC_STATIC,4,204,40,15,SS_CENTERIMAGE
+ COMBOBOX IDC_CONFIGLINK,48,205,93,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Ignore link",IDC_CONFIGNOLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,207,48,10
+ EDITTEXT IDC_EDITPATH,199,161,49,15,ES_AUTOHSCROLL | WS_DISABLED
+ CONTROL "Autoload",IDC_CONFIGAUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,253,163,42,10
+ GROUPBOX "Additional Information",IDC_STATIC,199,179,96,38,BS_LEFT
+ PUSHBUTTON "View",IDC_VIEWINFO,208,195,37,15
+ PUSHBUTTON "Set",IDC_SETINFO,250,195,37,15
+ PUSHBUTTON "Load",IDC_QUICKLOAD,5,225,44,15
+ PUSHBUTTON "Save",IDC_QUICKSAVE,54,225,44,15
+ PUSHBUTTON "Load From...",IDC_LOAD,121,225,49,15
+ PUSHBUTTON "Delete",IDC_DELETE,251,225,44,15
+ PUSHBUTTON "Save As...",IDC_SAVE,175,225,44,15
+END
+
+IDD_PORTS DIALOGEX 0, 0, 300, 238
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Parallel Port",IDC_SERPARFRAME,5,2,291,68
+ RTEXT "Printer:",IDC_STATIC,12,15,25,15,SS_CENTERIMAGE
+ COMBOBOX IDC_PRINTERLIST,49,15,153,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Flush print job",IDC_FLUSHPRINTER,220,15,58,12
+ CONTROL "PostScript detection",IDC_PSPRINTERDETECT,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,11,33,79,12
+ CONTROL "PostScript printer emulation",IDC_PSPRINTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,95,33,110,12
+ RTEXT "Autoflush [] Time in seconds after a pending print job is automatically flushed.",IDC_PRINTERAUTOFLUSHTXT,202,32,57,15,SS_NOTIFY | SS_CENTERIMAGE
+ EDITTEXT IDC_PRINTERAUTOFLUSH,263,33,25,12,ES_NUMBER
+ RTEXT "Ghostscript extra parameters:",IDC_STATIC,12,49,102,15,SS_CENTERIMAGE
+ EDITTEXT IDC_PS_PARAMS,124,50,165,12,ES_AUTOHSCROLL
+ GROUPBOX "Serial Port",IDC_SERIALFRAME,4,72,292,48
+ COMBOBOX IDC_SERIAL,49,84,232,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,15,103,48,12
+ CONTROL "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,75,103,55,12
+ GROUPBOX "MIDI",IDC_MIDIFRAME,4,123,292,33
+ RTEXT "Out:",IDC_MIDI,10,134,34,15,SS_CENTERIMAGE
+ COMBOBOX IDC_MIDIOUTLIST,50,134,95,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "In:",IDC_MIDI2,150,134,29,15,SS_CENTERIMAGE
+ COMBOBOX IDC_MIDIINLIST,185,134,95,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Mouse/Joystick Ports",IDC_PORT0,4,158,292,75
+ COMBOBOX IDC_PORT0_JOYS,45,174,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_PORT1_JOYS,45,195,241,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Swap ports",IDC_SWAP,211,214,75,14
+ RTEXT "Port 0:",IDC_STATIC,11,173,25,15,SS_CENTERIMAGE
+ RTEXT "Port 1:",IDC_STATIC,11,194,25,15,SS_CENTERIMAGE
+ LTEXT "X-Arcade layout information []#1",IDC_STATIC,16,213,106,15,SS_NOTIFY | SS_CENTERIMAGE
+ CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT,
+ "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,135,103,65,12
+ CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,200,103,78,12
+END
+
+IDD_CONTRIBUTORS DIALOGEX 0, 0, 411, 242
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION
+CAPTION "UAE Authors and Contributors..."
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ DEFPUSHBUTTON "Ok",ID_OK,177,219,53,14
+ CONTROL "",IDC_CONTRIBUTORS,"RICHEDIT",TCS_HOTTRACK | TCS_VERTICAL | TCS_RAGGEDRIGHT | TCS_OWNERDRAWFIXED | TCS_MULTISELECT | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,5,404,206
+END
+
+IDD_ABOUT DIALOGEX 0, 0, 300, 191
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ CONTROL "",IDC_RICHEDIT1,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,45,10,210,15
+ CONTROL "",IDC_RICHEDIT2,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,30,260,13
+ PUSHBUTTON "Contributors",IDC_CONTRIBUTORS,110,55,80,15
+ CONTROL "",IDC_UAEHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,120,80,15
+ CONTROL "",IDC_PICASSOHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,200,90,80,20
+ CONTROL "",IDC_AMIGAHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,109,90,80,20
+ CONTROL "",IDC_WINUAEHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,200,120,80,15
+ CONTROL "",IDC_AIABHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,110,120,80,15
+ CONTROL "",IDC_THEROOTS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,145,80,15
+ CONTROL "",IDC_CAPS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,200,145,80,15
+ CONTROL "",IDC_ABIME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,110,145,80,15
+ CONTROL "",IDC_CLOANTOHOME,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,20,90,80,20
+ CONTROL "",IDC_AMIGASYS,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,63,169,80,15
+ CONTROL "",IDC_AMIKIT,"RICHEDIT",TCS_SCROLLOPPOSITE | TCS_RAGGEDRIGHT | TCS_MULTISELECT | WS_DISABLED,157,169,80,15
+END
+
+IDD_MISC1 DIALOGEX 0, 0, 300, 237
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Advanced",IDC_STATIC,8,2,285,110
+ CONTROL "Untrap mouse with middle button",IDC_JULIAN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,15,129,10
+ CONTROL "Show GUI on startup",IDC_SHOWGUI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,27,120,10
+ CONTROL "On-screen LEDs",IDC_SHOWLEDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,40,115,10
+ CONTROL "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,53,63,10
+ CONTROL "Don't show taskbar button",IDC_NOTASKBARBUTTON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,66,117,10
+ CONTROL "bsdsocket.library emulation",IDC_SOCKETS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,15,120,10
+ CONTROL "Use CTRL-F11 to quit",IDC_CTRLF11,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,27,120,10
+ CONTROL "Don't use RGB overlays",IDC_NOOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,40,120,10
+ CONTROL "Synchronize clock",IDC_CLOCKSYNC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,53,115,10
+ GROUPBOX "Keyboard LEDs",IDC_STATIC,7,140,85,94
+ COMBOBOX IDC_KBLED1,22,154,56,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_KBLED2,22,173,56,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_KBLED3,22,193,56,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Logging",IDC_STATIC,97,140,195,25
+ CONTROL "Create log file",IDC_CREATELOGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,107,151,72,10
+ CONTROL "Illegal memory accesses",IDC_ILLEGAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,151,95,10
+ GROUPBOX "State Files",IDC_STATIC,98,167,195,68
+ PUSHBUTTON "Load state...",IDC_DOLOADSTATE,105,180,49,14
+ PUSHBUTTON "Save state...",IDC_DOSAVESTATE,105,208,49,14
+ CONTROL "Enable state recording",IDC_STATE_CAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,182,88,10
+ RTEXT "Recording rate (seconds):",IDC_STATIC,157,199,86,10,SS_CENTERIMAGE | WS_TABSTOP
+ COMBOBOX IDC_STATE_RATE,248,197,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Recording buffer (MB):",IDC_STATIC,160,219,83,10,SS_CENTERIMAGE | WS_TABSTOP
+ COMBOBOX IDC_STATE_BUFFERSIZE,248,217,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Always on top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,79,117,10
+ CONTROL "Catweasel",IDC_CATWEASEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,66,115,10
+ CONTROL "USB mode",IDC_KBLED_USB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,216,64,10
+ COMBOBOX IDC_SCSIMODE,92,51,64,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_LANGUAGE,103,121,179,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Language",IDC_STATIC,7,113,285,25
+ CONTROL "Disable powersaving features",IDC_POWERSAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,92,120,10
+ CONTROL "Magic Mouse",IDC_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,79,119,10
+ CONTROL "uaenet.device",IDC_SANA2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,92,94,10
+END
+
+IDD_HARDFILE DIALOGEX 0, 0, 299, 249
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Hardfile Settings"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ GROUPBOX "Settings",IDC_STATIC,10,5,280,146
+ RTEXT "Path:",IDC_HARDFILE_DIR_TEXT,25,18,22,10
+ EDITTEXT IDC_PATH_NAME,52,15,213,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_SELECTOR,271,15,11,15
+ RTEXT "FileSys:",IDC_HARDFILE_FILESYS_TEXT,13,38,34,10
+ EDITTEXT IDC_PATH_FILESYS,52,35,213,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_FILESYS_SELECTOR,271,35,11,15
+ RTEXT "Device:",IDC_HARDFILE_DEVICE_TEXT,16,58,31,10
+ EDITTEXT IDC_HARDFILE_DEVICE,52,55,66,15,ES_AUTOHSCROLL
+ RTEXT "Boot priority:",IDC_HARDFILE_BOOTPRI_TEXT,20,94,48,8
+ EDITTEXT IDC_HARDFILE_BOOTPRI,73,90,44,15
+ CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,74,64,10
+ PUSHBUTTON "Enable RDB mode",IDC_HDF_RDB,174,55,92,14
+ RTEXT "Surfaces:",IDC_SURFACES_TEXT,118,94,32,10
+ EDITTEXT IDC_HEADS,155,90,40,15,ES_NUMBER
+ RTEXT "Reserved:",IDC_RESERVED_TEXT,197,94,35,10
+ EDITTEXT IDC_RESERVED,237,90,40,15,ES_NUMBER
+ RTEXT "Sectors:",IDC_SECTORS_TEXT,120,113,30,10
+ EDITTEXT IDC_SECTORS,155,111,40,15,ES_NUMBER
+ RTEXT "Block size:",IDC_BLOCKSIZE_TEXT,197,113,35,10
+ EDITTEXT IDC_BLOCKSIZE,237,111,40,15,ES_NUMBER
+ GROUPBOX "New hard disk image file",IDC_STATIC,10,156,280,62
+ PUSHBUTTON "Create",IDC_HF_CREATE,60,171,80,14
+ EDITTEXT IDC_HF_SIZE,156,171,61,15,ES_NUMBER
+ PUSHBUTTON "OK",IDOK,102,226,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,158,226,50,14
+ EDITTEXT IDC_HF_DOSTYPE,156,194,61,15
+ COMBOBOX IDC_HF_TYPE,60,195,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_HDF_CONTROLLER,73,112,44,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ RTEXT "DOS type",IDC_STATIC,224,196,32,10,SS_CENTERIMAGE
+ RTEXT "MB",IDC_STATIC,222,174,13,10,SS_CENTERIMAGE
+ RTEXT "Type:",IDC_STATIC,28,183,25,10,SS_CENTERIMAGE
+ RTEXT "HD Controller:",IDC_STATIC,16,113,52,10,SS_CENTERIMAGE
+ CONTROL "Bootable",IDC_HDF_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,74,53,10
+ CONTROL "Do not mount",IDC_HDF_DONOTMOUNT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,74,67,10
+ EDITTEXT IDC_HDFINFO,16,131,268,12,ES_CENTER | ES_READONLY
+END
+
+IDD_FILESYS DIALOGEX 15, 25, 299, 111
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Volume Settings"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ LTEXT "Device name:",-1,11,7,54,10
+ EDITTEXT IDC_VOLUME_DEVICE,65,5,104,15,ES_AUTOHSCROLL
+ LTEXT "Volume label:",-1,13,28,54,10
+ EDITTEXT IDC_VOLUME_NAME,65,25,104,15,ES_AUTOHSCROLL
+ LTEXT "Path:",-1,38,49,44,10
+ EDITTEXT IDC_PATH_NAME,65,46,227,15,ES_AUTOHSCROLL
+ PUSHBUTTON "Select Directory",IDC_FS_SELECT_DIR,65,66,103,15
+ CONTROL "Read/write",IDC_FS_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,7,55,10
+ RTEXT "Boot priority:",IDC_VOLUME_BOOTPRI_TEXT,178,28,49,8
+ EDITTEXT IDC_VOLUME_BOOTPRI,236,25,30,15
+ PUSHBUTTON "OK",IDOK,65,91,48,15
+ PUSHBUTTON "Cancel",IDCANCEL,120,91,48,15
+ PUSHBUTTON "Select Archive or Plain File",IDC_FS_SELECT_FILE,190,66,103,15
+ PUSHBUTTON "Eject",IDC_FS_SELECT_EJECT,230,91,62,15
+ CONTROL "Bootable",IDC_FS_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,236,7,53,10
+END
+
+IDD_SETINFO DIALOGEX 0, 0, 229, 85
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Additional Information Settings"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ RTEXT "Path:",-1,5,20,24,15,SS_CENTERIMAGE
+ EDITTEXT IDC_PATH_NAME,35,20,169,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_SELECTOR,210,20,10,15
+ PUSHBUTTON "OK",IDOK,120,65,48,15
+ PUSHBUTTON "Cancel",IDCANCEL,175,65,48,15
+END
+
+IDD_CHIPSET DIALOGEX 0, 65490, 300, 229
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ GROUPBOX "Chipset",IDC_STATIC,14,11,145,90
+ CONTROL "OCS [] Original chipset. A1000 and most A500s.",IDC_OCS,
+ "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,26,51,10
+ CONTROL "ECS Agnus [] Enhanced chipset (ECS Agnus chip only). CDTV and later A500 and A2000 hardware revisions.",IDC_ECS_AGNUS,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,42,55,10
+ CONTROL "ECS Denise [] Enhanced chipset (ECS Denise chip only). Normally paired with ECS Agnus.",IDC_ECS_DENISE,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,42,55,10
+ CONTROL "Full ECS [] Full ECS chipset (ECS Agnus and ECS Denise chips). A500+, A600 and A3000.",IDC_ECS,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,58,52,10
+ CONTROL "AGA [] Advanced Graphics Architecture chipset. A1200, A4000 and CD32.",IDC_AGA,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,26,51,10
+ CONTROL "NTSC [] North American and Japanese display standard, 60Hz refresh rate. Other countries use PAL (50Hz. display refresh rate)",IDC_NTSC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,58,50,10
+ GROUPBOX "Options",IDC_STATIC,168,11,114,89
+ CONTROL "Immediate Blitter [] Faster but less compatible blitter emulation.",IDC_BLITIMM,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,179,33,96,10
+ CONTROL "Cycle-exact [] The most compatible A500 emulation mode. Very fast PC recommended.",IDC_CYCLEEXACT,
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,46,100,10
+ GROUPBOX "Collision Level",IDC_STATIC,14,105,267,48
+ CONTROL "None [] Collision hardware emulation disabled.",IDC_COLLISION0,
+ "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,121,59,10
+ CONTROL "Sprites only [] Emulate only sprite vs. sprite collisions.",IDC_COLLISION1,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,137,62,10
+ CONTROL "Sprites and Sprites vs. Playfield [] Recommended collision emulation level.",IDC_COLLISION2,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,121,161,10
+ CONTROL "Full [] 100% collision hardware emulation. Only very few games need this option. Slowest.",IDC_COLLISION3,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,137,119,10
+ GROUPBOX "Sound Emulation",IDC_STATIC,13,159,268,65
+ CONTROL "Disabled",IDC_CS_SOUND0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,175,102,10
+ CONTROL "Emulated",IDC_CS_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,190,91,10
+ CONTROL "Emulated, 100% accurate",IDC_CS_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,205,95,10
+ CONTROL "Genlock connected [] Allow boot sequence to detect genlock. Genlock is not emulated.",IDC_GENLOCK,
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,59,100,10
+ CONTROL "Faster RTG [] Enables less accurate custom chipset emulation mode when Picasso96 is enabled.",IDC_FASTERRTG,
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,72,100,10
+ COMBOBOX IDC_CS_EXT,100,80,49,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Chipset Extra",IDC_STATIC,25,79,52,15,SS_CENTERIMAGE
+END
+
+IDD_CHIPSET2 DIALOGEX 0, 65490, 300, 247
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ GROUPBOX "Battery Backed Up Real Time Clock",IDC_STATIC,11,24,275,29
+ CONTROL "None",IDC_CS_RTC1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,36,55,10
+ CONTROL "MSM6242B",IDC_CS_RTC2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,36,52,10
+ CONTROL "RF5C01A",IDC_CS_RTC3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,159,36,46,10
+ EDITTEXT IDC_CS_RTCADJUST,215,34,64,13,ES_AUTOHSCROLL
+ GROUPBOX "CIA-A TOD Clock Source",IDC_STATIC,11,56,275,29
+ CONTROL "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,68,63,10
+ CONTROL "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,68,85,10
+ CONTROL "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,186,68,88,10
+ CONTROL "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,146,80,10
+ CONTROL "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,95,88,10
+ CONTROL "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,108,76,10
+ CONTROL "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,108,87,10
+ CONTROL "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,108,84,10
+ CONTROL "CDTV CD",IDC_CS_CDTVCD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,121,47,10
+ CONTROL "CDTV SRAM",IDC_CS_CDTVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,120,87,10
+ CONTROL "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,120,90,10
+ CONTROL "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,133,79,10
+ CONTROL "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,133,88,10
+ CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,71,10
+ EDITTEXT IDC_CS_RAMSEYREV,91,214,45,13,ES_AUTOHSCROLL
+ CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,71,10
+ EDITTEXT IDC_CS_FATGARYREV,91,228,45,13,ES_AUTOHSCROLL
+ CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,188,76,10
+ CONTROL "Compatible Settings",IDC_CS_COMPATIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,8,234,10
+ CONTROL "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,95,92,10
+ CONTROL "Agnus/Alice revision:",IDC_CS_AGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,216,81,10
+ EDITTEXT IDC_CS_AGNUSREV,232,214,45,13,ES_AUTOHSCROLL
+ CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,229,81,10
+ EDITTEXT IDC_CS_DENISEREV,232,228,45,13,ES_AUTOHSCROLL
+ CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,188,76,10
+ CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,188,88,10
+ LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,22,174,224,8,SS_CENTERIMAGE
+ CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,133,92,10
+ CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,200,76,10
+ CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,200,76,10
+ CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,200,101,10
+ CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,146,92,10
+ CONTROL "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,146,80,10
+ CONTROL "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,95,80,10
+ CONTROL "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,159,80,10
+ CONTROL "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,159,80,10
+ CONTROL "Blitter Busy Bug",IDC_CS_BLITTERBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,159,80,10
+END
+
+IDD_AVIOUTPUT DIALOGEX 0, 0, 288, 203
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Output Properties",IDC_STATIC,5,0,274,126
+ EDITTEXT IDC_AVIOUTPUT_FILETEXT,15,15,226,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE
+ PUSHBUTTON "...",IDC_AVIOUTPUT_FILE,249,15,19,12
+ CONTROL "Audio",IDC_AVIOUTPUT_AUDIO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,33,39,14
+ CONTROL "",IDC_AVIOUTPUT_AUDIO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,34,209,13
+ CONTROL "Video",IDC_AVIOUTPUT_VIDEO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,50,39,14
+ CONTROL "",IDC_AVIOUTPUT_VIDEO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,51,209,13
+ CONTROL "Disable frame rate limit while recording",IDC_AVIOUTPUT_FRAMELIMITER,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,68,158,10
+ CONTROL "AVI output enabled",IDC_AVIOUTPUT_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,15,103,108,14
+ CONTROL "PAL",IDC_AVIOUTPUT_PAL,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,131,103,66,14
+ CONTROL "NTSC",IDC_AVIOUTPUT_NTSC,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,204,103,66,14
+ CONTROL "Slider1",IDC_AVIOUTPUT_FPS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_ENABLESELRANGE | WS_TABSTOP,166,84,87,11
+ LTEXT "fps",IDC_AVIOUTPUT_FPS_STATIC,255,84,19,8
+ PUSHBUTTON "Save screenshot",IDC_SCREENSHOT,16,141,77,14
+ GROUPBOX "Ripper",IDC_STATIC,5,127,274,38
+ PUSHBUTTON "Pro Wizard 1.62",IDC_PROWIZARD,104,141,77,14,WS_DISABLED
+ CONTROL "Sample ripper",IDC_SAMPLERIPPER_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,192,141,77,14
+ GROUPBOX "Input Recorder",IDC_STATIC,5,166,274,33
+ CONTROL "Record",IDC_INPREC_RECORD,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,192,178,77,14
+ CONTROL "Playback",IDC_INPREC_PLAY,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,16,178,77,14
+ CONTROL "Alt. playback mode",IDC_INPREC_PLAYMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,103,180,78,10
+ CONTROL "Disable sound output while recording",IDC_AVIOUTPUT_NOSOUNDOUTPUT,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,85,148,10
+END
+
+IDD_INPUT DIALOGEX 0, 0, 300, 242
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ COMBOBOX IDC_INPUTTYPE,5,5,98,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_INPUTDEVICE,109,5,167,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "",IDC_INPUTDEVICEDISABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,282,8,9,8
+ CONTROL "List1",IDC_INPUTLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,22,290,146
+ COMBOBOX IDC_INPUTAMIGACNT,5,174,24,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_INPUTAMIGA,33,174,262,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Joystick dead zone (%):",-1,7,196,79,10,SS_CENTERIMAGE
+ EDITTEXT IDC_INPUTDEADZONE,92,195,25,12,ES_NUMBER
+ RTEXT "Autofire rate (frames):",-1,10,212,76,10,SS_CENTERIMAGE
+ EDITTEXT IDC_INPUTAUTOFIRERATE,92,210,25,12,ES_NUMBER
+ RTEXT "Digital joy-mouse speed:",-1,124,196,84,10,SS_CENTERIMAGE
+ EDITTEXT IDC_INPUTSPEEDD,215,195,25,12,ES_NUMBER
+ RTEXT "Analog joy-mouse speed:",-1,120,212,88,10,SS_CENTERIMAGE
+ EDITTEXT IDC_INPUTSPEEDA,215,211,25,12,ES_NUMBER
+ RTEXT "Mouse speed:",-1,132,228,76,10,SS_CENTERIMAGE
+ EDITTEXT IDC_INPUTSPEEDM,215,227,25,12,ES_NUMBER
+ PUSHBUTTON "Copy from:",IDC_INPUTCOPY,249,195,45,14
+ COMBOBOX IDC_INPUTCOPYFROM,249,211,45,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Swap 1<>2",IDC_INPUTSWAP,249,226,45,14
+END
+
+IDD_FILTER DIALOGEX 0, 0, 296, 224
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Filter Settings",-1,0,0,294,186
+ CONTROL "Enable",IDC_FILTERENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,17,46,10
+ COMBOBOX IDC_FILTERMODE,62,15,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_FILTERFILTER,128,15,81,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,213,15,73,14
+ RTEXT "Horiz. size:",-1,7,44,54,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,37,152,19
+ EDITTEXT IDC_FILTERHZV,253,39,34,12,ES_CENTER | ES_READONLY
+ RTEXT "Vert. size:",-1,7,64,54,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,57,152,19
+ EDITTEXT IDC_FILTERVZV,253,59,34,12,ES_CENTER | ES_READONLY
+ RTEXT "Horiz. position:",-1,5,84,55,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,77,151,19
+ EDITTEXT IDC_FILTERHOV,253,79,34,12,ES_CENTER | ES_READONLY
+ RTEXT "Vert. position:",-1,5,103,55,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,97,151,19
+ EDITTEXT IDC_FILTERVOV,253,99,34,12,ES_CENTER | ES_READONLY
+ RTEXT "Extra settings:",-1,27,133,57,10,SS_CENTERIMAGE
+ CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,157,151,19
+ EDITTEXT IDC_FILTERXLV,253,159,34,12,ES_CENTER | ES_READONLY
+ COMBOBOX IDC_FILTERSLR,253,130,33,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Presets",-1,0,187,296,36
+ COMBOBOX IDC_FILTERPRESETS,8,201,119,150,CBS_DROPDOWN | CBS_SORT | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Load",IDC_FILTERPRESETLOAD,132,200,47,14
+ PUSHBUTTON "Save",IDC_FILTERPRESETSAVE,184,200,47,14
+ PUSHBUTTON "Delete",IDC_FILTERPRESETDELETE,236,200,47,14
+ COMBOBOX IDC_FILTERHZMULT,67,43,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_FILTERVZMULT,67,63,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Autoscale",IDC_FILTERAUTORES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,168,63,10
+ COMBOBOX IDC_FILTERXTRA,105,130,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Full screen filter",IDC_FILTERUPSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,153,87,10
+END
+
+IDD_HARDDRIVE DIALOGEX 0, 0, 380, 76
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Harddrive Settings"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ LTEXT "Hard drive:",IDC_STATIC,7,11,80,10
+ COMBOBOX IDC_HARDDRIVE,49,9,325,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,51,55,10
+ DEFPUSHBUTTON "Add hard drive",IDOK,231,48,65,14
+ PUSHBUTTON "Cancel",IDCANCEL,319,48,54,14
+ DEFPUSHBUTTON "Create hard disk image file",IDC_HARDDRIVE_IMAGE,49,30,115,14
+ EDITTEXT IDC_PATH_NAME,183,27,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
+ COMBOBOX IDC_HDF_CONTROLLER,102,50,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ RTEXT "HD Controller:",IDC_STATIC,42,51,52,10,SS_CENTERIMAGE
+END
+
+IDD_MISC2 DIALOGEX 0, 0, 300, 92
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "When Active",IDC_STATIC,8,7,88,73
+ RTEXT "Run at priority:",IDC_ACTIVE_PRI,14,17,52,10,SS_CENTERIMAGE | WS_TABSTOP
+ COMBOBOX IDC_ACTIVE_PRIORITY,14,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "When Inactive",IDC_STATIC,102,7,92,73
+ RTEXT "Run at priority:",IDC_INACTIVE_PRI,109,17,51,10,SS_CENTERIMAGE | WS_TABSTOP
+ COMBOBOX IDC_INACTIVE_PRIORITY,109,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Pause emulation",IDC_INACTIVE_PAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,50,69,10
+ CONTROL "Disable sound",IDC_INACTIVE_NOSOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,63,79,10
+ GROUPBOX "When Minimized",IDC_STATIC,199,7,92,73
+ RTEXT "Run at priority:",IDC_MINIMIZED_PRI,207,18,51,10,SS_CENTERIMAGE | WS_TABSTOP
+ COMBOBOX IDC_MINIMIZED_PRIORITY,207,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Pause emulation",IDC_MINIMIZED_PAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,50,69,10
+ CONTROL "Disable sound",IDC_MINIMIZED_NOSOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,63,79,10
+END
+
+IDD_DISK DIALOGEX 0, 0, 300, 242
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_CONTROL | DS_CENTER | DS_CENTERMOUSE | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ CONTROL "",IDC_DISKLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,6,292,196
+ PUSHBUTTON "Remove floppy disk image",IDC_DISKLISTREMOVE,156,223,101,15
+ COMBOBOX IDC_DISKTEXT,3,205,293,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Insert floppy disk image",IDC_DISKLISTINSERT,41,223,101,15
+END
+
+IDD_PANEL DIALOGEX 0, 0, 420, 278
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_ACCEPTFILES | WS_EX_CONTROLPARENT
+CAPTION "WinUAE Properties"
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ GROUPBOX "",IDC_PANEL_FRAME,112,4,303,247,NOT WS_VISIBLE
+ CONTROL "",IDC_PANELTREE,"SysTreeView32",TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_NOSCROLL | WS_BORDER | WS_HSCROLL | WS_TABSTOP,5,5,101,248,WS_EX_CLIENTEDGE
+ GROUPBOX "",IDC_PANEL_FRAME_OUTER,110,2,307,251
+ PUSHBUTTON "Reset",IDC_RESETAMIGA,6,259,47,14
+ PUSHBUTTON "Quit",IDC_QUITEMU,57,259,47,14
+ DEFPUSHBUTTON "OK",IDOK,260,259,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,313,259,50,14
+ PUSHBUTTON "Help",IDHELP,366,259,50,14,WS_DISABLED
+ PUSHBUTTON "Restart",IDC_RESTARTEMU,109,259,47,14,NOT WS_VISIBLE
+END
+
+IDD_PATHS DIALOGEX 0, 0, 300, 237
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "System ROMs:",IDC_PATHS_ROML,14,9,260,8,SS_CENTERIMAGE
+ EDITTEXT IDC_PATHS_ROM,14,22,261,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PATHS_ROMS,281,22,11,15
+ LTEXT "Configuration files:",IDC_PATHS_CONFIGL,14,40,260,8,SS_CENTERIMAGE
+ EDITTEXT IDC_PATHS_CONFIG,14,52,261,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PATHS_CONFIGS,281,52,11,15
+ LTEXT "Screenshots:",IDC_PATHS_SCREENSHOTL,14,71,260,8,SS_CENTERIMAGE
+ EDITTEXT IDC_PATHS_SCREENSHOT,14,83,261,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PATHS_SCREENSHOTS,281,83,11,15
+ LTEXT "State files:",IDC_PATHS_STATEFILEL,14,102,260,8,SS_CENTERIMAGE
+ EDITTEXT IDC_PATHS_SAVESTATE,14,114,261,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PATHS_SAVESTATES,281,114,11,15
+ LTEXT "Videos:",IDC_PATHS_AVIOUTPUTL,14,132,260,8,SS_CENTERIMAGE
+ EDITTEXT IDC_PATHS_AVIOUTPUT,14,144,261,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PATHS_AVIOUTPUTS,281,144,11,15
+ LTEXT "Saveimages:",IDC_PATHS_SAVEIMAGEL,14,163,260,8,SS_CENTERIMAGE
+ EDITTEXT IDC_PATHS_SAVEIMAGE,14,175,261,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_PATHS_SAVEIMAGES,281,175,11,15
+ PUSHBUTTON "Reset to defaults",IDC_PATHS_DEFAULT,14,199,92,14
+ PUSHBUTTON "Rescan ROMs",IDC_ROM_RESCAN,14,218,92,14
+ PUSHBUTTON "Clear registry",IDC_RESETREGISTRY,112,218,77,14
+ COMBOBOX IDC_PATHS_DEFAULTTYPE,112,199,163,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Clear disk history",IDC_RESETDISKHISTORY,198,218,77,14
+END
+
+IDD_QUICKSTART DIALOGEX 0, 0, 300, 242
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ GROUPBOX "Emulated Hardware",IDC_QUICKSTART_CONFIG,3,0,294,54
+ RTEXT "Model:",IDC_STATIC,5,14,50,10,SS_CENTERIMAGE
+ COMBOBOX IDC_QUICKSTART_MODEL,59,12,233,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Configuration:",IDC_STATIC,5,33,50,10,SS_CENTERIMAGE
+ COMBOBOX IDC_QUICKSTART_CONFIGURATION,59,31,233,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Compatibility vs Required CPU Power ",IDC_QUICKSTART_COMPA,3,56,294,33
+ RTEXT "Best compatibility",IDC_STATIC,13,70,67,10,SS_CENTERIMAGE
+ CONTROL "",IDC_QUICKSTART_COMPATIBILITY,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,95,65,115,21
+ RTEXT "Low compatibility",IDC_STATIC,215,70,63,10,SS_CENTERIMAGE
+ GROUPBOX "Host Configuration",IDC_QUICKSTART_HOST,3,91,294,33
+ RTEXT "Configuration:",IDC_STATIC,5,105,55,10,SS_CENTERIMAGE
+ COMBOBOX IDC_QUICKSTART_HOSTCONFIG,65,103,225,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Emulated Floppy Drives",IDC_QUICKSTART_DF,3,126,294,84
+ CONTROL "Floppy drive DF0:",IDC_DF0QENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,10,136,72,15
+ PUSHBUTTON "Select disk image",IDC_DF0QQ,85,136,98,15
+ RTEXT "Write-protected",IDC_STATIC,185,139,56,10,SS_CENTERIMAGE
+ CONTROL "",IDC_DF0WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,246,137,10,15
+ PUSHBUTTON "Eject",IDC_EJECT0Q,261,136,30,15
+ COMBOBOX IDC_DF0TEXTQ,9,154,282,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Floppy drive DF1:",IDC_DF1QENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,172,71,15
+ PUSHBUTTON "Select disk image",IDC_DF1QQ,85,172,98,15
+ RTEXT "Write-protected",IDC_STATIC,185,175,55,10,SS_CENTERIMAGE
+ CONTROL "",IDC_DF1WPQ,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,246,173,10,15
+ PUSHBUTTON "Eject",IDC_EJECT1Q,261,172,30,15
+ COMBOBOX IDC_DF1TEXTQ,9,190,282,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Set configuration",IDC_QUICKSTART_SETCONFIG,9,219,72,15,NOT WS_VISIBLE
+ GROUPBOX "Mode",IDC_STATIC,190,211,107,27,BS_LEFT
+ CONTROL "Start in Quickstart mode",IDC_QUICKSTARTMODE,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,197,222,94,10
+END
+
+IDD_FRONTEND DIALOGEX 0, 0, 420, 242
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "",IDC_FE_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,6,9,235,124
+ GROUPBOX "",IDC_FE_INFO,249,140,160,95
+ GROUPBOX "",IDC_FE_SCREENSHOT,249,7,160,128
+END
+
+IDD_PROGRESSBAR DIALOGEX 0, 0, 229, 58
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Processing..."
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ PUSHBUTTON "Cancel",IDCANCEL,88,40,50,14
+ CONTROL "",IDC_PROGRESSBAR,"msctls_progress32",PBS_SMOOTH | WS_BORDER,7,19,215,14
+ CTEXT "x",IDC_PROGRESSBAR_TEXT,23,5,187,10,SS_CENTERIMAGE | WS_TABSTOP
+END
+
+IDD_STRINGBOX DIALOGEX 0, 0, 229, 58
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Enter text..."
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,48,39,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,151,39,50,14
+ EDITTEXT IDC_STRINGBOXEDIT,7,17,214,14,ES_AUTOHSCROLL | ES_WANTRETURN
+ CTEXT "Custom input event",IDC_STRINGBOX_TEXT,23,5,187,10,SS_CENTERIMAGE | WS_TABSTOP
+END
+
+IDD_DEBUGGER DIALOGEX 0, 0, 454, 368
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_THICKFRAME
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "WinUAE Debugger"
+FONT 8, "Courier New", 0, 0, 0x0
+BEGIN
+ EDITTEXT IDC_DBG_OUTPUT1,1,255,370,86,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP
+ EDITTEXT IDC_DBG_OUTPUT2,1,79,370,262,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP
+ LISTBOX IDC_DBG_MEM,1,92,370,249,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_DASM,1,92,370,249,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ EDITTEXT IDC_DBG_MEMINPUT,1,79,36,12,ES_AUTOHSCROLL | ES_WANTRETURN
+ EDITTEXT IDC_DBG_INPUT,1,342,354,12,ES_AUTOHSCROLL | ES_WANTRETURN
+ PUSHBUTTON "?",IDC_DBG_HELP,356,342,15,12,NOT WS_TABSTOP
+ PUSHBUTTON "Set to PC",IDC_DBG_MEMTOPC,38,79,45,12,NOT WS_TABSTOP
+ LISTBOX IDC_DBG_DREG,1,1,52,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_AREG,54,1,52,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_AMEM,106,1,231,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_CCR,338,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_SP_VBR,338,44,115,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_MMISC,396,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_PC,1,68,52,10,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_PREFETCH,54,68,283,10,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_FPREG,372,218,81,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_FPSR,372,285,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_MISCCPU,372,320,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ CONTROL "",IDC_DBG_STATUS,"msctls_statusbar32",0x103,0,355,453,12
+ LISTBOX IDC_DBG_BRKPTS,1,79,370,262,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL
+ LISTBOX IDC_DBG_MCUSTOM,372,79,81,138,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_MISC,1,79,370,262,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL
+ LISTBOX IDC_DBG_CUSTOM,1,79,370,262,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL
+ CONTROL "Auto set",IDC_DBG_AUTOSET,"Button",BS_AUTOCHECKBOX | NOT WS_TABSTOP,84,79,50,12
+ LISTBOX IDC_DBG_DASM2,1,79,370,87,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+ LISTBOX IDC_DBG_MEM2,1,167,370,87,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+END
+
+IDD_DBGMEMINPUT DIALOGEX 0, 0, 150, 58
+STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Enter address..."
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,15,39,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,75,39,50,14
+ EDITTEXT IDC_DBG_MEMINPUT2,20,12,100,14,ES_AUTOHSCROLL | ES_WANTRETURN
+ CTEXT "Enter address",IDC_DBG_ADDRINPUTTXT,20,1,100,10,SS_CENTERIMAGE | WS_TABSTOP
+END
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APPICON ICON "winuae.ico"
+IDI_FLOPPY ICON "35floppy.ico"
+IDI_ABOUT ICON "amigainfo.ico"
+IDI_HARDDISK ICON "Drive.ico"
+IDI_CPU ICON "cpu.ico"
+IDI_PORTS ICON "joystick.ico"
+IDI_INPUT ICON "joystick.ico"
+IDI_MISC1 ICON "misc.ico"
+IDI_MISC2 ICON "misc.ico"
+IDI_MOVE_UP ICON "move_up.ico"
+IDI_MOVE_DOWN ICON "move_dow.ico"
+IDI_AVIOUTPUT ICON "avioutput.ico"
+IDI_DISK ICON "Drive.ico"
+IDI_CONFIGFILE ICON "file.ico"
+IDI_FOLDER ICON "folder.ico"
+IDI_SOUND ICON "sound.ico"
+IDI_DISPLAY ICON "screen.ico"
+IDI_ROOT ICON "root.ico"
+IDI_MEMORY ICON "chip.ico"
+IDI_QUICKSTART ICON "quickstart.ico"
+IDI_PATHS ICON "paths.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,5,0,0
+ PRODUCTVERSION 1,5,0,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "FileDescription", "WinUAE"
+ VALUE "FileVersion", "1.5.0"
+ VALUE "InternalName", "WinUAE"
+ VALUE "LegalCopyright", "© 1996-2008 under the GNU Public License (GPL)"
+ VALUE "OriginalFilename", "WinUAE.exe"
+ VALUE "ProductName", "WinUAE"
+ VALUE "ProductVersion", "1.5.0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+
+IDC_MYHAND CURSOR "H_arrow.cur"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_SYSTRAY MENU
+BEGIN
+ POPUP "Menu"
+ BEGIN
+ MENUITEM "Configuration", ID_ST_CONFIGURATION
+ POPUP "Floppy drives"
+ BEGIN
+ MENUITEM "Eject all drives", ID_ST_EJECTALL
+ MENUITEM "DF0:", ID_ST_DF0
+ MENUITEM "DF1:", ID_ST_DF1
+ MENUITEM "DF2:", ID_ST_DF2
+ MENUITEM "DF3:", ID_ST_DF3
+ END
+ MENUITEM "Reset", ID_ST_RESET
+ MENUITEM "Help", ID_ST_HELP
+ MENUITEM "Quit WinUAE", ID_ST_QUIT
+ END
+END
+
+IDM_DBGCONTEXTMENU MENU
+BEGIN
+ POPUP "Memory"
+ BEGIN
+ POPUP "Copy"
+ BEGIN
+ MENUITEM "Copy line" ID_DBG_COPYLBLINE
+ MENUITEM "Copy all" ID_DBG_COPYLB
+ END
+ POPUP "Set top address"
+ BEGIN
+ MENUITEM "Set to A0", ID_DBG_SETTOA0
+ MENUITEM "Set to A1", ID_DBG_SETTOA1
+ MENUITEM "Set to A2", ID_DBG_SETTOA2
+ MENUITEM "Set to A3", ID_DBG_SETTOA3
+ MENUITEM "Set to A4", ID_DBG_SETTOA4
+ MENUITEM "Set to A5", ID_DBG_SETTOA5
+ MENUITEM "Set to A6", ID_DBG_SETTOA6
+ MENUITEM "Set to A7", ID_DBG_SETTOA7
+ MENUITEM "Enter address", ID_DBG_ENTERADDR
+ END
+ END
+ POPUP "Disassembly"
+ BEGIN
+ POPUP "Copy"
+ BEGIN
+ MENUITEM "Copy line" ID_DBG_COPYLBLINE
+ MENUITEM "Copy all" ID_DBG_COPYLB
+ END
+ POPUP "Breakpoints"
+ BEGIN
+ MENUITEM "Toggle breakpoint" ID_DBG_TOGGLEBP
+ MENUITEM "Clear all breakpoints" ID_DBG_DELETEBPS
+ END
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// WAVE
+//
+
+IDR_DRIVE_STARTUP_A500_1 WAVE "drive_startup.wav"
+IDR_DRIVE_CLICK_A500_1 WAVE "drive_click.wav"
+IDR_DRIVE_SPIN_A500_1 WAVE "drive_spin.wav"
+IDR_DRIVE_SNATCH_A500_1 WAVE "drive_snatch.wav"
+IDR_DRIVE_SPINND_A500_1 WAVE "drive_spinnd.wav"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDB_XARCADE BITMAP "xarcade-winuae.bmp"
+IDB_LCD160X43 BITMAP "lcd.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_KICKSTART "ROM"
+ IDS_DISK "Disk swapper"
+ IDS_DISPLAY "Display"
+ IDS_HARDDISK "Hard drives"
+ IDS_FLOPPY "Floppy drives"
+ IDS_ABOUT "About"
+ IDS_LOADSAVE "Configurations"
+ IDS_AVIOUTPUT "Output"
+ IDS_PORTS "Game & I/O ports"
+ IDS_MISC1 "Misc"
+ IDS_MEMORY "RAM"
+ IDS_CPU "CPU and FPU"
+ IDS_CHIPSET "Chipset"
+ IDS_INPUT "Input"
+ IDS_FILTER "Filter"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_MISC2 "Priority"
+ IDS_PATHS "Paths"
+ IDS_QUICKSTART "Quickstart"
+ IDS_FRONTEND "Frontend"
+ IDS_CHIPSET2 "Adv. Chipset"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_EXTTEXT "Floppy disk image files"
+ IDS_EXTACTUAL "ADF"
+ IDS_SOUND "Sound"
+ IDS_CDROM "CD-ROM"
+ IDS_FRAMERATE "Every %1Frame"
+ IDS_SECOND "second "
+ IDS_THIRD "third "
+ IDS_FOURTH "fourth "
+ IDS_FIFTH "fifth "
+ IDS_SIXTH "sixth "
+ IDS_SEVENTH "seventh "
+ IDS_EIGHTH "eighth "
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NINTH "ninth "
+ IDS_TENTH "tenth "
+ IDS_SELECTADF "Select a floppy disk image file..."
+ IDS_ADF "Floppy disk image files"
+ IDS_CHOOSEBLANK "Choose a blank floppy disk image file..."
+ IDS_SELECTHDF "Select a hard disk image file..."
+ IDS_HDF "Hard disk image files"
+ IDS_SELECTUAE "Select a WinUAE configuration file..."
+ IDS_UAE "WinUAE configuration files"
+ IDS_SELECTROM "Select a system ROM file..."
+ IDS_ROM "System ROM files"
+ IDS_SELECTKEY "Select a system ROM key file..."
+ IDS_KEY "System ROM key files"
+ IDS_SELECTINFO "Select information for your configuration..."
+ IDS_NONE "none"
+ IDS_VOLUME "Volume"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_SELECTFILESYSROOT "Please select the root directory of the file system..."
+ IDS_DEFAULTMIDIOUT "Default MIDI-Out Device"
+ IDS_CONTRIBUTORS1 "Bernd Schmidt - The Grand-Master\nSam Jordan - Custom-chip, floppy-DMA, etc.\nMathias Ortmann - Original WinUAE Main Guy, BSD Socket support\nBrian King - Picasso96 Support, Integrated GUI for WinUAE, previous WinUAE Main Guy\nToni Wilen - Core updates, WinUAE Main Guy\nGustavo Goedert/Peter Remmers/Michael Sontheimer/Tomi Hakala/Tim Gunn/Nemo Pohle - DOS Port Stuff\nSamuel Devulder/Olaf Barthel/Sam Jordan - Amiga Ports\nKrister Bergman - XFree86 and OS/2 Port\nA. Blanchard/Ernesto Corvi - MacOS Port\nChristian Bauer - BeOS Port\nIan Stephenson - NextStep Port\nPeter Teichmann - Acorn/RiscOS Port\nStefan Reinauer - ZorroII/III AutoConfig, Serial Support\nChristian Schmitt/Chris Hames - Serial Support\nHerman ten Brugge - 68020/68881 Emulation Code\nTauno Taipaleenmaki - Various UAE-Control/UAE-Library Support\nBrett Eden/Tim Gunn/Paolo Besser/Nemo Pohle - Various Docs and Web-Sites\nGeorg Veichtlbauer - Help File coordinator, German GUI\nFulvio Leonardi - Italian translator for WinUAE\n"
+ IDS_CONTRIBUTORS2 "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing.\nPéter Tóth /Balázs Rátkai/Iván Herczeg/András Arató - Hungarian translation.\nKarsten Bock, Gavin Fance, Dirk Trowe, Christoph Meier and Christian Schindler - Freezer cartridge hardware support."
+ IDS_INVALIDPRTPORT "The printer you have in this configuration is not valid on this machine.\n"
+ IDS_RESTOREUSS "Restore a WinUAE snapshot file"
+ IDS_USS "WinUAE snapshot files"
+ IDS_WRONGOSVERSION "WinUAE is no longer supported on Windows NT. Please upgrade to either Windows 2000 or Windows XP or a later version."
+ IDS_SELECTFLASH "Select a flash or battery-backed RAM file..."
+ IDS_FLASH "WinUAE flash or battery-backed RAM file"
+ IDS_INPUTHOSTWIDGET "Input source"
+ IDS_INPUTAMIGAEVENT "Input target"
+ IDS_INPUTAUTOFIRE "Autofire"
+ IDS_SAVEUSS "Save a WinUAE snapshot file"
+ IDS_MIDIOVERFLOW "Sysexbuffer overflow. Should not happen. Please report this to\nberndroesch1@compuserve.de"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_PATH "Path"
+ IDS_RW "R/W"
+ IDS_SECTORS "Sectors"
+ IDS_SURFACES "Bill Panagouleas - Hardware support\nSpecial thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)\nSteven Weiser - Postscript printing emulation idea and testing.\nHungarian translation - Péter Tóth , Balázs Rátkai , Iván Herczeg , András Arató"
+ IDS_RESERVED "Reserved"
+ IDS_BLOCKSIZE "Block size"
+ IDS_NAME "Name"
+ IDS_DESCRIPTION "Description"
+ IDS_COULDNOTLOADCONFIG "Could not load the selected configuration!\n"
+ IDS_NOHELP "Online help is disabled because the HTML Help functionality is not installed on this system. HTML Help is available from http://www.microsoft.com/downloads/.\n"
+ IDS_MUSTSELECTCONFIG "You must select a configuration or enter a name before selecting Load...\n"
+ IDS_INVALIDCOMPORT "The serial port you have in this configuration is not valid on this machine.\n"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_HFDSIZE "Size"
+ IDS_DEVICE "Device"
+ IDS_BOOTPRI "BootPri"
+ IDS_FLOPPY_COMPATIBLE " (compatible)"
+ IDS_FLOPPY_TURBO "Turbo"
+ IDS_YES "yes"
+ IDS_NO "no"
+ IDS_PRI_ABOVENORMAL "Above Normal"
+ IDS_PRI_NORMAL "Normal"
+ IDS_PRI_BELOWNORMAL "Below Normal"
+ IDS_PRI_LOW "Low"
+ IDS_OLDRTGLIBRARY "The installed LIBS:Picasso96/rtg.library (%d.%d) should be updated.\nA newer version is included in the ""Amiga Programs"" directory\n of the WinUAE distribution archive.\n\nNewer library version fixes graphics problems and increases performance."
+ IDS_DEFAULT_AF2005 "Amiga Forever 2005+"
+ IDS_DEFAULT_AF "Amiga Forever"
+ IDS_DEFAULT_WINUAE "WinUAE default (old)"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_SOUND_STEREO2 "Cloned Stereo (4 Channels)"
+ IDS_INPUT_CUSTOMEVENT "<Custom event>"
+ IDS_DEFAULT_NEWWINUAE "WinUAE default (new)"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_UNSUPPORTEDPIXELFORMAT
+ "Error: unsupported pixel format. Please use a different screen mode.\n"
+ IDS_MUSTENTERNAME "You must select a configuration or enter a name before selecting Save...\n"
+ IDS_MUSTSELECTCONFIGFORDELETE
+ "You must select a configuration or enter a name before selecting Delete...\n"
+ IDS_DELETECONFIGCONFIRMATION
+ "Are you sure you want to Delete this configuration?\n"
+ IDS_DELETECONFIGTITLE "Confirm Delete"
+ IDS_MUSTSELECTPATH "You must select a path!"
+ IDS_SETTINGSERROR "Settings error"
+ IDS_MUSTSELECTNAME "You must select a name for the volume!"
+ IDS_MUSTSELECTFILE "You must select a file!"
+ IDS_FAILEDHARDFILECREATION "Failed to create hard disk image file..."
+ IDS_CREATIONERROR "Creation error"
+ IDS_ERRORTITLE "WinUAE message"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_INP "WinUAE Input Recording"
+ IDS_RESTOREINP "Playback a WinUAE input recording"
+ IDS_SAVEINP "Record a WinUAE input recording"
+ IDS_SCREEN_WINDOWED "Windowed"
+ IDS_SCREEN_FULLSCREEN "Fullscreen"
+ IDS_SCREEN_FULLWINDOW "Full-window"
+ IDS_SCREEN_VSYNC "VSync"
+ IDS_SOUND_MONO "Mono"
+ IDS_SOUND_MIXED "Mixed"
+ IDS_SOUND_STEREO "Stereo"
+ IDS_SOUND_INTERPOL_DISABLED "Disabled"
+ IDS_SOUND_FILTER_OFF "Always off"
+ IDS_SOUND_FILTER_EMULATED "Emulated (A500)"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_SOUND_FILTER_EMULATED_E "Emulated (A1200)"
+ IDS_INPUT_COMPATIBILITY "Compatibility mode"
+ IDS_INPUT_CUSTOM "Configuration #%d"
+ IDS_INPUT_COPY_DEFAULT "Default"
+ IDS_INPUT_COPY_CUSTOM "Config #%d"
+ IDS_3D_NO_FILTER "Point (%d-bit)"
+ IDS_3D_BILINEAR "Bilinear (%d-bit)"
+ IDS_VSYNC_DEFAULT "Default"
+ IDS_DRIVESOUND_NONE "No sound"
+ IDS_DRIVESOUND_DEFAULT_A500 "A500 (WinUAE built-in)"
+ IDS_AVIOUTPUT_NOCODEC "no codec selected"
+ IDS_DISK_IMAGENAME "Disk image"
+ IDS_DISK_DRIVENAME "Drive"
+ IDS_AGA8BIT "AGA emulation requires a 16-bit or higher display depth.\nSwitching from 8-bit to 16-bit."
+ IDS_UNSUPPORTEDSCREENMODE
+ "The selected screen mode can't be displayed in a window, because %s\nSwitching to full-screen display."
+ IDS_UNSUPPORTEDSCREENMODE_1
+ "the desktop is running in an unknown color mode."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_UNSUPPORTEDSCREENMODE_2
+ "the desktop is running in 8-bit color depth, which WinUAE can't use in windowed mode."
+ IDS_UNSUPPORTEDSCREENMODE_3
+ "the desktop is too small for the specified window size."
+ IDS_UNSUPPORTEDSCREENMODE_4
+ "you selected an RTG (Picasso96) display with a color depth different from that of the desktop and an overlay was unavailable."
+ IDS_FLOPPYTYPE35DD "3.5"" DD"
+ IDS_FLOPPYTYPE35HD "3.5"" HD"
+ IDS_FLOPPYTYPE525SD "5.25"" SD"
+ IDS_FLOPPYTYPEDISABLED "Disabled"
+ IDS_STMENUNOFLOPPY "No floppy disk inserted"
+ IDS_TREEVIEW_HARDWARE "Hardware"
+ IDS_TREEVIEW_HOST "Host"
+ IDS_TREEVIEW_MISC "Miscellaneous"
+ IDS_TREEVIEW_SETTINGS "Settings"
+ IDS_WINUAETITLE_MMB "[Mouse active - press ALT+TAB or middle mouse button to cancel]"
+ IDS_WINUAETITLE_NORMAL "[Mouse active - press ALT+TAB to cancel]"
+ IDS_STARTEMULATION "Start"
+ IDS_TREEVIEW_ABOUT "About"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NOHARDDRIVES "No hard disks detected that were either empty or RDB-partitioned."
+ IDS_DEFAULT_HOST "Default Configuration"
+ IDS_SOUND_4CHANNEL "4 Channels"
+ IDS_HF_FS_CUSTOM "Custom"
+ IDS_SELECTFS "Select file system handler (FastFileSystem, SmartFilesystem, etc.)"
+ IDS_KEYJOY "Keyboard Layout A (Numeric keypad, 0 and 5 = Fire)\nKeyboard Layout B (Cursor keys, Right CTRL and ALT = Fire)\nKeyboard Layout C (W=Up S=Down A=Left D=Right, Left ALT = Fire)\nX-Arcade (Left)\nX-Arcade (Right)"
+ IDS_STATEFILE_UNCOMPRESSED "Uncompressed"
+ IDS_STATEFILE_RAMDUMP "RAM dump"
+ IDS_STATEFILE_WAVE "Wave audio dump"
+ IDS_SOUND_SWAP_PAULA "Paula only"
+ IDS_SOUND_SWAP_AHI "AHI only"
+ IDS_SOUND_SWAP_BOTH "Both"
+ IDS_SOUND_FILTER_ON_AGA "Always on (A500)"
+ IDS_SOUND_FILTER_ON_A500 "Always on (A1200)"
+ IDS_DRIVESOUND_PC_FLOPPY "PC floppy drive %c"
+ IDS_FLOPPYTYPE35DDESCOM "3.5"" ESCOM"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NUMSG_NEEDEXT2 "The software uses a non-standard floppy disk format. You may need to use a custom floppy disk image file instead of a standard one. This message will not appear again."
+ IDS_NUMSG_NOROMKEY "Could not find system ROM key file."
+ IDS_NUMSG_KSROMCRCERROR "System ROM checksum incorrect. The system ROM image file may be corrupt."
+ IDS_NUMSG_KSROMREADERROR "Error while reading system ROM."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NUMSG_NOEXTROM "No extended ROM found."
+ IDS_NUMSG_MODRIP_NOTFOUND "No music modules or packed data found."
+ IDS_NUMSG_MODRIP_FINISHED "Scan finished."
+ IDS_NUMSG_MODRIP_SAVE "Module/packed data found\n%s\nStart address %08.8X, Size %d bytes\nWould you like to save it?"
+ IDS_NUMSG_KS68020 "The selected system ROM requires a 68020 with 32-bit addressing or 68030 or higher CPU."
+ IDS_NUMSG_ROMNEED "One of the following system ROMs is required:\n\n%s\n\nCheck the System ROM path in the Paths panel and click Rescan ROMs."
+ IDS_NUMSG_STATEHD "WARNING: Current configuration is not fully compatible with state saves.\nThis message will not appear again."
+ IDS_NUMSG_NOCAPS "Selected disk image needs the SPS plugin\nwhich is available from\nhttp//www.softpres.org/"
+ IDS_NUMSG_OLDCAPS "You need an updated SPS plugin\nwhich is available from\nhttp//www.softpres.org/"
+ IDS_IMGCHK_BOOTBLOCKCRCERROR
+ "The selected floppy disk image is not bootable (boot block checksum error)"
+ IDS_IMGCHK_BOOTBLOCKNO "The selected floppy disk image is not bootable (no boot block)"
+ IDS_IMGCHK_DAMAGED "The selected floppy disk image is damaged or unformatted"
+ IDS_IMGCHK_KS2 "The selected floppy disk image requires a 2.04 or later system ROM.\nThe configuration has been updated."
+ IDS_IMGCHK_KS3 "The selected floppy disk image requires a 3.0 or later system ROM.\nThe configuration has been updated."
+ IDS_ROMSCANEND "Scan of ROMs finished"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_ROM_AVAILABLE "available"
+ IDS_ROM_UNAVAILABLE "unavailable"
+ IDS_HARDDRIVESAFETYWARNING1
+ "Warning: The drive safety check is active. Selected drive is not empty and non-RDB partitioned."
+ IDS_NUMSG_KS68EC020 "The selected system ROM requires a 68020 with 24-bit addressing or higher CPU."
+ IDS_ROMSCANNOROMS "No supported system ROMs detected."
+ IDS_NUMSG_KICKREP "You need to have a floppy disk (image file) in DF0: to use the system ROM replacement."
+ IDS_NUMSG_KICKREPNO "The floppy disk (image file) in DF0: is not compatible with the system ROM replacement functionality."
+ IDS_NUMSG_NOROM "Could not load system ROM, trying system ROM replacement."
+ IDS_HDCLONE_OK "Hard drive image file created succesfully."
+ IDS_HDCLONE_FAIL "Hard drive image file creation failed.\nError code %d:%d."
+ IDS_NUMSG_KS68030 "The selected system ROM requires a 68030 CPU."
+ IDS_NUMSG_EXPROMNEED "One of the following expansion boot ROMs is required:\n\n%s\n\nCheck the System ROM path in the Paths panel and click Rescan ROMs."
+ IDS_HARDDRIVESAFETYWARNING2
+ "Warning: The drive safety check has been disabled, and non-empty and non-RDB partitioned hard disk(s) were detected."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_QS_MODELS "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nArcadia Multi Select system\nExpanded WinUAE example configuration"
+ IDS_QS_MODEL_A500 "1.3 ROM, OCS, 512 KB Chip + 512 KB Slow RAM (most common)\nThis configuration is capable of running most games and demos produced for first-generation hardware. Only few exceptions need a different configuration (e.g. the oldest games tend to be incompatible with this configuration).\n1.3 ROM, ECS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nLater hardware revision of the A500. Nearly 100% compatible with the previous configuration.\n1.3 ROM, ECS Agnus, 1 MB Chip RAM\nFew newer games and demos require this configuration.\n1.3 ROM, OCS Agnus, 512 KB Chip RAM\nVery old (e.g. pre-1988) games and demos may require this configuration.\n1.2 ROM, OCS Agnus, 512 KB Chip RAM\nAs available for the A1000, and installed on the first A500 and A2000 series. Some very old programs only work correctly with this configuration. Note: This system ROM version can only boot from floppy disk (no hard disk boot support).\n1.2 ROM, OCS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nThis configuration adds expansion memory to the first A500 produced. Try this if your game does not work with newer configurations, but works with the previous one. It could add some features to the game, including faster loading times. Note: This system ROM version can only boot from floppy disk (no hard disk boot support)."
+ IDS_QS_MODEL_A500P "Basic non-expanded configuration\nThe A500+ adds an ECS Agnus chip, 1 MB of Chip RAM and a 2.0 ROM to the A500. Many A500 games and demos don't work properly on an A500+.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n"
+ IDS_QS_MODEL_A600 "Basic non-expanded configuration\nThe A600 is smaller than the A500+ and has an updated 2.0 ROM.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n"
+ IDS_QS_MODEL_A1000 "512 KB Chip RAM\nThe A1000 was the first model produced, with a configuration equivalent to that of an A500 with OCS chipset. You normally don't need to use this configuration, unless you are nostalgic and would like to hear the short A1000 boot tune\n""ICS"" Denise without EHB support\nVery first A1000 models had Denise without EHB capability.\n256 KB Chip RAM\n Unexpanded A1000. All later A1000 models were sold with a 256 KB RAM expansion built-in."
+ IDS_QS_MODEL_A1200 "Basic non-expanded configuration\nUse this configuration to run most AGA demos and games\n4 MB Fast RAM expanded configuration\nSome newer AGA games and demos need an expanded A1200 to run."
+ IDS_QS_MODEL_CD32 "CD32\nThe CD32 was one the first 32-bit consoles on the market. It is basically an A1200 with a built-in CD-ROM drive. Insert your CD32 or CDTV CD-ROM into a free CD-ROM drive before starting the emulation."
+ IDS_QS_MODEL_CDTV "CDTV\nThe CDTV was the first model with a built-in CD-ROM drive. Looking like a black CD player, it featured a configuration equivalent to that of an A500 with 1 MB RAM and an ECS chipset.\nFloppy drive and 64KB SRAM card expanded CDTV\n"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_QS_MODEL_UAE "High-end expanded configuration"
+ IDS_QS_MODEL_ARCADIA "Arcadia\nArcadia Multi Select system is arcade platform developed by Arcadia and Mastertronic. It is based on an A500 mainboard with ROM cage attached to expansion port. Arcadia ROM files go to ""Cartridge ROM File"" in ROM-panel."
+ IDS_QS_MODEL_A3000 "1.4 ROM, 2MB Chip + 8MB Fast\n\n2.04 ROM, 2MB Chip + 8MB Fast\n\n3.1 ROM, 2MB Chip + 8MB Fast\n"
+ IDS_QS_MODEL_A4000 "68030, 3.1 ROM, 2MB Chip + 8MB Fast\n\n68040, 3.1 ROM, 2MB Chip + 8MB Fast\n"
+ IDS_QS_MODEL_A4000T "A4000T (test)\nA4000T"
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Finnish resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN)
+#ifdef _WIN32
+LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // Finnish resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
-
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
GROUPBOX "System ROM Settings",-1,5,0,290,74
RTEXT "Main ROM file:",IDC_ROMTEXT,10,15,75,10
COMBOBOX IDC_ROMFILE,89,12,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "...",IDC_KICKCHOOSER,280,10,10,15
+ PUSHBUTTON "...",IDC_KICKCHOOSER,280,11,10,15
RTEXT "Extended ROM file:",IDC_ROMFILE2TEXT,10,35,75,10
- COMBOBOX IDC_ROMFILE2,89,31,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "...",IDC_ROMCHOOSER2,280,30,10,15
+ COMBOBOX IDC_ROMFILE2,89,32,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "...",IDC_ROMCHOOSER2,280,31,10,15
CONTROL "MapROM emulation [] Creates a BlizKick-compatible memory area.",IDC_MAPROM,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,95,54,87,10
CONTROL "ShapeShifter support [] Patches the system ROM for ShapeShifter compatibility.",IDC_KICKSHIFTER,
GROUPBOX "Miscellaneous",-1,5,76,290,57
RTEXT "Cartridge ROM file:",IDC_FLASHTEXT2,8,93,75,10
COMBOBOX IDC_CARTFILE,89,90,186,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "...",IDC_CARTCHOOSER,280,90,10,15
+ PUSHBUTTON "...",IDC_CARTCHOOSER,280,89,10,15
RTEXT "Flash RAM file:",IDC_FLASHTEXT,8,112,75,10
EDITTEXT IDC_FLASHFILE,89,110,185,13,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_FLASHCHOOSER,280,110,10,15
+ PUSHBUTTON "...",IDC_FLASHCHOOSER,280,109,10,15
END
IDD_DISPLAY DIALOGEX 0, 0, 300, 235
CONTROL "Correct aspect ratio",IDC_ASPECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,126,92,10
LTEXT "Refresh:",IDC_REFRESHTEXT,18,162,28,8
CONTROL "Slider1",IDC_FRAMERATE,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,157,75,20
- EDITTEXT IDC_RATETEXT,127,161,77,12,ES_CENTER | ES_READONLY
+ EDITTEXT IDC_RATETEXT,124,161,77,12,ES_CENTER | ES_READONLY
GROUPBOX "Centering",IDC_STATIC,221,73,61,49
CONTROL "Horizontal",IDC_XCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,87,49,10
CONTROL "Vertical",IDC_YCENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,229,103,49,10
CONTROL "",IDC_DA_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,84,207,101,20
LTEXT "FPS adj.:",IDC_REFRESH2TEXT,16,182,32,8
CONTROL "",IDC_FRAMERATE2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,47,177,127,20
- EDITTEXT IDC_RATE2TEXT,178,181,26,12,ES_CENTER | ES_READONLY
- COMBOBOX IDC_RESOLUTIONDEPTH,135,27,46,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_RATE2TEXT,175,181,26,12,ES_CENTER | ES_READONLY
+ COMBOBOX IDC_RESOLUTIONDEPTH,134,27,46,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
CONTROL "Filtered low resolution",IDC_LORES_SMOOTHED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,126,89,10
COMBOBOX IDC_SCREENMODE_NATIVE,100,85,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SCREENMODE_RTG,100,103,102,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
GROUPBOX "Memory Settings",-1,14,7,274,91
- RTEXT "Chip:",-1,24,31,20,10,SS_CENTERIMAGE
+ RTEXT "Chip:",-1,24,26,20,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_CHIPMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,22,50,20
- EDITTEXT IDC_CHIPRAM,105,26,30,12,ES_CENTER | ES_READONLY
- RTEXT "Slow:",-1,149,31,20,10,SS_CENTERIMAGE
+ EDITTEXT IDC_CHIPRAM,105,25,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Slow:",-1,149,26,20,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_SLOWMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,22,60,20
EDITTEXT IDC_SLOWRAM,243,25,30,12,ES_CENTER | ES_READONLY
- RTEXT "Fast:",IDC_FASTTEXT,24,52,20,10,SS_CENTERIMAGE
+ RTEXT "Fast:",IDC_FASTTEXT,24,51,20,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,54,47,50,20
- EDITTEXT IDC_FASTRAM,105,53,30,12,ES_CENTER | ES_READONLY
- RTEXT "Z3 Fast:",IDC_Z3TEXT,139,52,30,10,SS_CENTERIMAGE
+ EDITTEXT IDC_FASTRAM,105,50,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Z3 Fast:",IDC_Z3TEXT,139,51,30,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_Z3FASTMEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,47,60,20
- EDITTEXT IDC_Z3FASTRAM,243,52,30,12,ES_CENTER | ES_READONLY
- RTEXT "RTG: [] Graphics card memory. Required for RTG (Picasso96) emulation.",IDC_GFXCARDTEXT,81,77,90,10,SS_NOTIFY | SS_CENTERIMAGE
+ EDITTEXT IDC_Z3FASTRAM,243,50,30,12,ES_CENTER | ES_READONLY
+ RTEXT "RTG: [] Graphics card memory. Required for RTG (Picasso96) emulation.",IDC_GFXCARDTEXT,79,76,90,10,SS_NOTIFY | SS_CENTERIMAGE
CONTROL "Slider1",IDC_P96MEM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,179,72,60,20
EDITTEXT IDC_P96RAM,243,75,30,12,ES_CENTER | ES_READONLY
GROUPBOX "Advanced Memory Settings",-1,13,104,275,65
- RTEXT "Motherboard RAM (Low area):",-1,39,122,129,10,SS_CENTERIMAGE
- CONTROL "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,117,59,20
- EDITTEXT IDC_MBRAM1,243,121,30,12,ES_CENTER | ES_READONLY
- RTEXT "Motherboard RAM (High area):",-1,39,144,127,10,SS_CENTERIMAGE
- CONTROL "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,139,59,20
- EDITTEXT IDC_MBRAM2,243,142,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Motherboard RAM (Low area):",-1,39,123,129,10,SS_CENTERIMAGE
+ CONTROL "",IDC_MBMEM1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,119,59,20
+ EDITTEXT IDC_MBRAM1,243,122,30,12,ES_CENTER | ES_READONLY
+ RTEXT "Motherboard RAM (High area):",-1,39,148,129,10,SS_CENTERIMAGE
+ CONTROL "",IDC_MBMEM2,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,180,144,59,20
+ EDITTEXT IDC_MBRAM2,243,147,30,12,ES_CENTER | ES_READONLY
END
IDD_CPU DIALOGEX 0, 0, 300, 226
CONTROL "68020",IDC_CPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,44,63,10
CONTROL "68030",IDC_CPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,58,64,10
CONTROL "68040",IDC_CPU4,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,72,66,10
- CONTROL "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,85,66,10
+ CONTROL "68060",IDC_CPU5,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,86,66,10
CONTROL "More compatible [] Emulate 68000's prefetch registers. More compatible but slower.",IDC_COMPATIBLE,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,114,73,8
CONTROL "JIT [] Enable just-in-time CPU emulator. Significantly increases the speed of the CPU emulation. Requires 68020 or higher CPU.",IDC_JITENABLE,
"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_GROUP | WS_TABSTOP,95,18,195,10
CONTROL "Match A500 speed",IDC_CS_68000,"Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,32,195,10
CONTROL "Adjustable between CPU and chipset",IDC_CS_ADJUSTABLE,
- "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,47,195,10
+ "Button",BS_AUTORADIOBUTTON | BS_LEFT | WS_TABSTOP,95,46,195,10
RTEXT "CPU",IDC_CS_CPU_TEXT,96,73,15,10,SS_CENTERIMAGE | WS_TABSTOP
CONTROL "Slider1",IDC_SPEED,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,114,68,67,20
LTEXT "Chipset",IDC_CS_CHIPSET_TEXT,182,73,25,10,SS_CENTERIMAGE | NOT WS_GROUP | WS_TABSTOP
EDITTEXT IDC_CACHETEXT,255,113,30,12,ES_CENTER | ES_READONLY
CONTROL "Hard flush",IDC_HARDFLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,141,63,10
CONTROL "Constant jump",IDC_CONSTJUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,155,63,10
- CONTROL "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,168,62,10
+ CONTROL "FPU support",IDC_JITFPU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,169,62,10
CONTROL "Force settings",IDC_FORCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,141,62,10
CONTROL "No flags",IDC_NOFLAGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,155,62,10
CONTROL "Direct",IDC_TRUST0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,235,141,52,10
CONTROL "Indirect",IDC_TRUST1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,155,52,10
- CONTROL "After RTG",IDC_TRUST2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,168,52,10
+ CONTROL "After RTG",IDC_TRUST2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,235,169,52,10
CONTROL "More compatible [] More compatible but slower FPU emulation.",IDC_COMPATIBLE_FPU,
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,206,73,10
- GROUPBOX "FPU",IDC_STATIC,6,144,81,76,BS_LEFT
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,210,73,10
+ GROUPBOX "FPU",IDC_STATIC,6,146,81,80,BS_LEFT
CONTROL "24-bit addressing",IDC_COMPATIBLE24,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,10,100,73,8
- CONTROL "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,154,63,10
- CONTROL "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,166,63,10
- CONTROL "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,179,63,10
- CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,192,63,10
+ CONTROL "None",IDC_FPU0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,157,63,10
+ CONTROL "68881",IDC_FPU1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,171,63,10
+ CONTROL "68882",IDC_FPU2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,185,63,10
+ CONTROL "CPU internal",IDC_FPU3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,14,199,63,10
END
IDD_FLOPPY DIALOGEX 0, 0, 300, 240
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
COMBOBOX IDC_DF0TEXT,2,22,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- COMBOBOX IDC_DF0TYPE,123,6,49,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF0TYPE,115,6,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Write-protected",IDC_STATIC,174,8,59,10,SS_CENTERIMAGE
CONTROL "",IDC_DF0WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,4,10,15
PUSHBUTTON "Eject",IDC_EJECT0,253,4,30,15
PUSHBUTTON "...",IDC_DF0,287,4,10,15
COMBOBOX IDC_DF1TEXT,2,58,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- COMBOBOX IDC_DF1TYPE,123,42,49,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF1TYPE,115,42,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Write-protected",IDC_STATIC,174,43,59,10,SS_CENTERIMAGE
CONTROL "",IDC_DF1WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,40,10,15
PUSHBUTTON "Eject",IDC_EJECT1,253,40,30,15
PUSHBUTTON "...",IDC_DF1,287,40,10,15
COMBOBOX IDC_DF2TEXT,2,93,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- COMBOBOX IDC_DF2TYPE,123,77,49,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF2TYPE,115,77,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Write-protected",IDC_STATIC,174,77,59,10,SS_CENTERIMAGE
CONTROL "",IDC_DF2WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,75,9,15
PUSHBUTTON "Eject",IDC_EJECT2,253,75,30,15
PUSHBUTTON "...",IDC_DF2,287,75,10,15
COMBOBOX IDC_DF3TEXT,2,128,296,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- COMBOBOX IDC_DF3TYPE,123,112,49,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_DF3TYPE,115,112,57,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Write-protected",IDC_STATIC,174,113,59,10,SS_CENTERIMAGE
CONTROL "",IDC_DF3WP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,238,111,9,15
PUSHBUTTON "Eject",IDC_EJECT3,253,110,30,15
PUSHBUTTON "...",IDC_DF3,287,109,10,15
GROUPBOX "New Floppy Disk Image",IDC_SETTINGSTEXT,5,183,289,49
- COMBOBOX IDC_FLOPPYTYPE,16,196,51,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "Create Standard Disk [] Creates a standard 880 or 1760 KB ADF disk image.",IDC_CREATE,76,196,97,15
+ COMBOBOX IDC_FLOPPYTYPE,16,197,51,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "Create Standard Disk [] Creates a standard 880 or 1760 KB ADF disk image.",IDC_CREATE,77,196,97,15
PUSHBUTTON "Create Custom Disk [] Creates a low level (MFM) ADF disk image (about 2MB). Useful for programs that use non-standard disk formats (for example some save disks or DOS-formatted floppies)",IDC_CREATE_RAW,183,196,101,15
GROUPBOX "Floppy Drive Emulation Speed",IDC_SETTINGSTEXT2,5,144,289,35
- CONTROL "",IDC_FLOPPYSPD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,32,152,116,20
- EDITTEXT IDC_FLOPPYSPDTEXT,169,155,107,12,ES_CENTER | ES_READONLY
+ CONTROL "",IDC_FLOPPYSPD,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,32,154,116,20
+ EDITTEXT IDC_FLOPPYSPDTEXT,183,157,101,12,ES_CENTER | ES_READONLY
PUSHBUTTON "Delete save image",IDC_SAVEIMAGE0,43,5,70,15,NOT WS_VISIBLE
PUSHBUTTON "Delete save image",IDC_SAVEIMAGE1,43,40,70,15,NOT WS_VISIBLE
PUSHBUTTON "Delete save image",IDC_SAVEIMAGE2,43,75,70,15,NOT WS_VISIBLE
PUSHBUTTON "Delete save image",IDC_SAVEIMAGE3,43,110,70,15,NOT WS_VISIBLE
- EDITTEXT IDC_CREATE_NAME,75,215,98,13,ES_AUTOHSCROLL
- RTEXT "Disk label:",IDC_STATIC,14,216,52,10,SS_CENTERIMAGE
+ EDITTEXT IDC_CREATE_NAME,77,215,97,13,ES_AUTOHSCROLL
+ RTEXT "Disk label:",IDC_STATIC,15,216,52,10,SS_CENTERIMAGE
CONTROL "DF0:",IDC_DF0ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,6,34,15
CONTROL "DF1:",IDC_DF1ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,41,34,15
CONTROL "DF2:",IDC_DF2ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,76,34,15
CONTROL "DF3:",IDC_DF3ENABLE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,3,111,34,15
END
-IDD_HARDDISK DIALOGEX 0, 0, 300, 245
+IDD_HARDDISK DIALOGEX 0, 0, 300, 237
STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
EXSTYLE WS_EX_CONTEXTHELP
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
- CONTROL "List1",IDC_VOLUMELIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,0,290,182
- PUSHBUTTON "Add &Directory or Archive...",IDC_NEW_FS,10,186,103,15
- PUSHBUTTON "Add &Hardfile...",IDC_NEW_HF,130,186,74,15
- PUSHBUTTON "Add Ha&rd Drive...",IDC_NEW_HD,220,186,75,15
- PUSHBUTTON "Remove",IDC_REMOVE,232,207,60,15
- PUSHBUTTON "&Properties",IDC_EDIT,232,230,60,15
- CONTROL "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,209,100,10
- CONTROL "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,209,119,10
- CONTROL "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,220,121,10
- CONTROL "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,232,101,10
- CONTROL "Include CD/DVD drives..",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,220,100,10
- CONTROL "Automount removable drives",IDC_MAPDRIVES_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,232,115,10
+ CONTROL "List1",IDC_VOLUMELIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,0,290,176
+ PUSHBUTTON "Add &Directory or Archive...",IDC_NEW_FS,10,179,103,15
+ PUSHBUTTON "Add &Hardfile...",IDC_NEW_HF,130,179,74,15
+ PUSHBUTTON "Add Ha&rd Drive...",IDC_NEW_HD,220,179,75,15
+ PUSHBUTTON "Remove",IDC_REMOVE,235,203,60,15
+ PUSHBUTTON "&Properties",IDC_EDIT,235,220,60,15
+ CONTROL "Add PC drives at startup",IDC_MAPDRIVES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,202,100,10
+ CONTROL "Disable UAEFSDB-support",IDC_NOUAEFSDB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,202,119,10
+ CONTROL "Don't use Windows Recycle Bin",IDC_NORECYCLEBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,213,121,10
+ CONTROL "Include network drives..",IDC_MAPDRIVES_NET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,225,101,10
+ CONTROL "Include CD/DVD drives..",IDC_MAPDRIVES_CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,213,100,10
+ CONTROL "Automount removable drives",IDC_MAPDRIVES_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,110,225,115,10
END
IDD_SOUND DIALOGEX 0, 0, 300, 231
CONTROL "Disabled, but emulated",IDC_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,57,102,10
CONTROL "Enabled",IDC_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,69,102,10
CONTROL "Enabled, 100% accurate",IDC_SOUND3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,13,81,101,10
- GROUPBOX "Volume",IDC_STATIC,131,36,164,31
+ GROUPBOX "Volume",IDC_STATIC,132,36,164,31
CONTROL "",IDC_SOUNDVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,137,44,105,20
EDITTEXT IDC_SOUNDVOLUME2,247,47,40,12,ES_CENTER | ES_READONLY
GROUPBOX "Sound Buffer Size",IDC_STATIC,132,73,164,31
- CONTROL "Slider1",IDC_SOUNDBUFFERRAM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,138,81,106,19
- EDITTEXT IDC_SOUNDBUFFERMEM,248,84,40,12,ES_CENTER | ES_READONLY
+ CONTROL "Slider1",IDC_SOUNDBUFFERRAM,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,137,81,105,19
+ EDITTEXT IDC_SOUNDBUFFERMEM,247,84,40,12,ES_CENTER | ES_READONLY
GROUPBOX "Settings",IDC_SOUNDINTERPOLATION2,6,114,290,60
- LTEXT "Frequency:",IDC_SOUNDFREQTXT,11,147,53,8,SS_CENTERIMAGE
- COMBOBOX IDC_SOUNDFREQ,13,156,51,75,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Frequency:",IDC_SOUNDFREQTXT,11,148,53,8,SS_CENTERIMAGE
+ COMBOBOX IDC_SOUNDFREQ,13,157,51,75,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
LTEXT "Audio filter:",IDC_SOUNDFILTERTXT,209,148,77,8,SS_CENTERIMAGE
COMBOBOX IDC_SOUNDFILTER,209,157,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Channel mode:",IDC_SOUNDSTEREOTXT,11,124,57,8,SS_CENTERIMAGE
COMBOBOX IDC_SOUNDSTEREO,13,133,122,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Interpolation:",IDC_SOUNDINTERPOLATIONTXT,209,124,75,8,SS_CENTERIMAGE
- COMBOBOX IDC_SOUNDINTERPOLATION,209,132,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_SOUNDINTERPOLATION,209,133,80,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Stereo separation:",IDC_SOUNDSTEREOSEPTXT,141,124,63,8,SS_CENTERIMAGE
COMBOBOX IDC_SOUNDSTEREOSEP,142,133,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Stereo delay:",IDC_SOUNDSTEREOMIXTXT,141,148,63,8,SS_CENTERIMAGE
COMBOBOX IDC_SOUNDSTEREOMIX,142,157,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Floppy Drive Sound Emulation",IDC_STATIC,6,177,290,46
CONTROL "",IDC_SOUNDDRIVEVOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,14,185,107,19
- EDITTEXT IDC_SOUNDDRIVEVOLUME2,124,191,40,12,ES_CENTER | ES_READONLY
+ EDITTEXT IDC_SOUNDDRIVEVOLUME2,124,187,40,12,ES_CENTER | ES_READONLY
COMBOBOX IDC_SOUNDDRIVE,237,187,46,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SOUNDDRIVESELECT,18,205,265,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SOUNDSWAP,73,157,62,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_CONFIGTREE,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,6,3,289,153,WS_EX_CLIENTEDGE
RTEXT "Name:",IDC_STATIC,4,161,40,15,SS_CENTERIMAGE
EDITTEXT IDC_EDITNAME,48,162,146,13,ES_AUTOHSCROLL
- RTEXT "Description:",IDC_STATIC,4,183,41,15,SS_CENTERIMAGE
+ RTEXT "Description:",IDC_STATIC,2,182,41,15,SS_CENTERIMAGE
EDITTEXT IDC_EDITDESCRIPTION,48,183,146,13,ES_AUTOHSCROLL
RTEXT "Link:",IDC_STATIC,4,204,40,15,SS_CENTERIMAGE
COMBOBOX IDC_CONFIGLINK,48,205,93,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
- CONTROL "Ignore link",IDC_CONFIGNOLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,206,48,10
+ CONTROL "Ignore link",IDC_CONFIGNOLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,207,48,10
EDITTEXT IDC_EDITPATH,199,161,49,15,ES_AUTOHSCROLL | WS_DISABLED
CONTROL "Autoload",IDC_CONFIGAUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,253,163,42,10
GROUPBOX "Additional Information",IDC_STATIC,199,179,96,38,BS_LEFT
GROUPBOX "Parallel Port",IDC_SERPARFRAME,5,2,291,68
RTEXT "Printer:",IDC_STATIC,12,15,25,15,SS_CENTERIMAGE
COMBOBOX IDC_PRINTERLIST,49,15,153,134,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "Flush print job",IDC_FLUSHPRINTER,220,14,58,12
+ PUSHBUTTON "Flush print job",IDC_FLUSHPRINTER,220,15,58,12
CONTROL "PostScript detection",IDC_PSPRINTERDETECT,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,11,33,79,12
CONTROL "PostScript printer emulation",IDC_PSPRINTER,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,95,33,110,12
RTEXT "Autoflush [] Time in seconds after a pending print job is automatically flushed.",IDC_PRINTERAUTOFLUSHTXT,202,32,57,15,SS_NOTIFY | SS_CENTERIMAGE
EDITTEXT IDC_PS_PARAMS,124,50,165,12,ES_AUTOHSCROLL
GROUPBOX "Serial Port",IDC_SERIALFRAME,4,72,292,48
COMBOBOX IDC_SERIAL,49,84,232,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,11,102,48,13
- CONTROL "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,65,102,55,12
+ CONTROL "Shared",IDC_SER_SHARED,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,15,103,48,12
+ CONTROL "RTS/CTS",IDC_SER_CTSRTS,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,75,103,55,12
GROUPBOX "MIDI",IDC_MIDIFRAME,4,123,292,33
RTEXT "Out:",IDC_MIDI,10,134,34,15,SS_CENTERIMAGE
COMBOBOX IDC_MIDIOUTLIST,50,134,95,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Port 1:",IDC_STATIC,11,194,25,15,SS_CENTERIMAGE
LTEXT "X-Arcade layout information []#1",IDC_STATIC,16,213,106,15,SS_NOTIFY | SS_CENTERIMAGE
CONTROL "Direct []Use when emulating serial-link games on two PCs running WinUAE",IDC_SER_DIRECT,
- "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,132,103,65,12
- CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,207,103,78,13
+ "Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,135,103,65,12
+ CONTROL "uaeserial.device",IDC_UAESERIAL,"Button",BS_AUTOCHECKBOX | BS_VCENTER | WS_TABSTOP,200,103,78,12
END
IDD_CONTRIBUTORS DIALOGEX 0, 0, 411, 242
GROUPBOX "Logging",IDC_STATIC,97,140,195,25
CONTROL "Create log file",IDC_CREATELOGFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,107,151,72,10
CONTROL "Illegal memory accesses",IDC_ILLEGAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,151,95,10
- GROUPBOX "State Files",IDC_STATIC,98,165,195,69
- PUSHBUTTON "Load state...",IDC_DOLOADSTATE,105,182,49,14
+ GROUPBOX "State Files",IDC_STATIC,98,167,195,68
+ PUSHBUTTON "Load state...",IDC_DOLOADSTATE,105,180,49,14
PUSHBUTTON "Save state...",IDC_DOSAVESTATE,105,208,49,14
- CONTROL "Enable state recording",IDC_STATE_CAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,181,88,10
+ CONTROL "Enable state recording",IDC_STATE_CAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,200,182,88,10
RTEXT "Recording rate (seconds):",IDC_STATIC,157,199,86,10,SS_CENTERIMAGE | WS_TABSTOP
COMBOBOX IDC_STATE_RATE,248,197,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
- RTEXT "Recording buffer (MB):",IDC_STATIC,157,219,83,10,SS_CENTERIMAGE | WS_TABSTOP
+ RTEXT "Recording buffer (MB):",IDC_STATIC,160,219,83,10,SS_CENTERIMAGE | WS_TABSTOP
COMBOBOX IDC_STATE_BUFFERSIZE,248,217,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
CONTROL "Always on top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,79,117,10
CONTROL "Catweasel",IDC_CATWEASEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,66,115,10
CONTROL "USB mode",IDC_KBLED_USB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,216,64,10
COMBOBOX IDC_SCSIMODE,92,51,64,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_LANGUAGE,103,121,179,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- GROUPBOX "Language",IDC_STATIC,7,112,285,25
+ GROUPBOX "Language",IDC_STATIC,7,113,285,25
CONTROL "Disable powersaving features",IDC_POWERSAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,92,120,10
CONTROL "Magic Mouse",IDC_MOUSETRICK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,79,119,10
CONTROL "uaenet.device",IDC_SANA2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,92,94,10
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
GROUPBOX "Settings",IDC_STATIC,10,5,280,146
- RTEXT "Path:",IDC_HARDFILE_DIR_TEXT,26,18,22,10
+ RTEXT "Path:",IDC_HARDFILE_DIR_TEXT,25,18,22,10
EDITTEXT IDC_PATH_NAME,52,15,213,15,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_SELECTOR,271,15,11,15
- RTEXT "FileSys:",IDC_HARDFILE_FILESYS_TEXT,14,37,34,10
- EDITTEXT IDC_PATH_FILESYS,52,34,213,15,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_FILESYS_SELECTOR,271,34,11,15
- RTEXT "Device:",IDC_HARDFILE_DEVICE_TEXT,17,58,31,10
- EDITTEXT IDC_HARDFILE_DEVICE,52,54,66,15,ES_AUTOHSCROLL
+ RTEXT "FileSys:",IDC_HARDFILE_FILESYS_TEXT,13,38,34,10
+ EDITTEXT IDC_PATH_FILESYS,52,35,213,15,ES_AUTOHSCROLL
+ PUSHBUTTON "...",IDC_FILESYS_SELECTOR,271,35,11,15
+ RTEXT "Device:",IDC_HARDFILE_DEVICE_TEXT,16,58,31,10
+ EDITTEXT IDC_HARDFILE_DEVICE,52,55,66,15,ES_AUTOHSCROLL
RTEXT "Boot priority:",IDC_HARDFILE_BOOTPRI_TEXT,24,94,44,8
- EDITTEXT IDC_HARDFILE_BOOTPRI,74,90,40,15
+ EDITTEXT IDC_HARDFILE_BOOTPRI,73,90,40,15
CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,74,64,10
PUSHBUTTON "Enable RDB mode",IDC_HDF_RDB,174,55,92,14
- RTEXT "Surfaces:",IDC_SURFACES_TEXT,120,94,30,10
- EDITTEXT IDC_HEADS,155,90,35,15,ES_NUMBER
+ RTEXT "Surfaces:",IDC_SURFACES_TEXT,118,94,32,10
+ EDITTEXT IDC_HEADS,155,90,40,15,ES_NUMBER
RTEXT "Reserved:",IDC_RESERVED_TEXT,197,94,35,10
- EDITTEXT IDC_RESERVED,237,90,35,15,ES_NUMBER
- RTEXT "Sectors:",IDC_SECTORS_TEXT,120,116,30,10
- EDITTEXT IDC_SECTORS,155,111,35,15,ES_NUMBER
- RTEXT "Block size:",IDC_BLOCKSIZE_TEXT,197,116,35,10
- EDITTEXT IDC_BLOCKSIZE,237,111,35,15,ES_NUMBER
+ EDITTEXT IDC_RESERVED,237,90,40,15,ES_NUMBER
+ RTEXT "Sectors:",IDC_SECTORS_TEXT,120,113,30,10
+ EDITTEXT IDC_SECTORS,155,111,40,15,ES_NUMBER
+ RTEXT "Block size:",IDC_BLOCKSIZE_TEXT,197,113,35,10
+ EDITTEXT IDC_BLOCKSIZE,237,111,40,15,ES_NUMBER
GROUPBOX "New hard disk image file",IDC_STATIC,10,156,280,62
- PUSHBUTTON "Create",IDC_HF_CREATE,50,171,80,14
- EDITTEXT IDC_HF_SIZE,146,171,61,15,ES_NUMBER
+ PUSHBUTTON "Create",IDC_HF_CREATE,60,171,80,14
+ EDITTEXT IDC_HF_SIZE,156,171,61,15,ES_NUMBER
PUSHBUTTON "OK",IDOK,102,226,50,14
PUSHBUTTON "Cancel",IDCANCEL,158,226,50,14
- EDITTEXT IDC_HF_DOSTYPE,146,194,61,15
- COMBOBOX IDC_HF_TYPE,50,194,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
- COMBOBOX IDC_HDF_CONTROLLER,73,112,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
- RTEXT "DOS type",IDC_STATIC,214,196,32,10,SS_CENTERIMAGE
- RTEXT "MB",IDC_STATIC,214,174,13,10,SS_CENTERIMAGE
- RTEXT "Type:",IDC_STATIC,18,182,25,10,SS_CENTERIMAGE
- RTEXT "HD Controller:",IDC_STATIC,13,113,52,10,SS_CENTERIMAGE
- CONTROL "Autoboot",IDC_HDF_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,73,53,10
+ EDITTEXT IDC_HF_DOSTYPE,156,194,61,15
+ COMBOBOX IDC_HF_TYPE,60,195,80,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_HDF_CONTROLLER,73,112,40,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ RTEXT "DOS type",IDC_STATIC,224,196,32,10,SS_CENTERIMAGE
+ RTEXT "MB",IDC_STATIC,222,174,13,10,SS_CENTERIMAGE
+ RTEXT "Type:",IDC_STATIC,28,183,25,10,SS_CENTERIMAGE
+ RTEXT "HD Controller:",IDC_STATIC,16,113,52,10,SS_CENTERIMAGE
+ CONTROL "Bootable",IDC_HDF_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,74,53,10
CONTROL "Do not mount",IDC_HDF_DONOTMOUNT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,74,67,10
EDITTEXT IDC_HDFINFO,16,131,268,12,ES_CENTER | ES_READONLY
END
CAPTION "Volume Settings"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
- LTEXT "Device name:",-1,5,9,54,10
+ LTEXT "Device name:",-1,11,7,54,10
EDITTEXT IDC_VOLUME_DEVICE,65,5,104,15,ES_AUTOHSCROLL
- LTEXT "Volume label:",-1,5,31,54,10
- EDITTEXT IDC_VOLUME_NAME,65,25,103,15,ES_AUTOHSCROLL
- LTEXT "Path:",-1,5,51,44,10
+ LTEXT "Volume label:",-1,13,28,54,10
+ EDITTEXT IDC_VOLUME_NAME,65,25,104,15,ES_AUTOHSCROLL
+ LTEXT "Path:",-1,38,49,44,10
EDITTEXT IDC_PATH_NAME,65,46,227,15,ES_AUTOHSCROLL
- PUSHBUTTON "Select Directory",IDC_FS_SELECT_DIR,64,66,103,15
+ PUSHBUTTON "Select Directory",IDC_FS_SELECT_DIR,65,66,103,15
CONTROL "Read/write",IDC_FS_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,7,55,10
RTEXT "Boot priority:",IDC_VOLUME_BOOTPRI_TEXT,178,28,49,8
- EDITTEXT IDC_VOLUME_BOOTPRI,237,24,30,15
+ EDITTEXT IDC_VOLUME_BOOTPRI,236,25,30,15
PUSHBUTTON "OK",IDOK,65,91,48,15
PUSHBUTTON "Cancel",IDCANCEL,120,91,48,15
- PUSHBUTTON "Select Archive or Plain File",IDC_FS_SELECT_FILE,189,66,103,15
+ PUSHBUTTON "Select Archive or Plain File",IDC_FS_SELECT_FILE,190,66,103,15
PUSHBUTTON "Eject",IDC_FS_SELECT_EJECT,230,91,62,15
- CONTROL "Autoboot",IDC_FS_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,236,7,53,10
+ CONTROL "Bootable",IDC_FS_AUTOBOOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,236,7,53,10
END
IDD_SETINFO DIALOGEX 0, 0, 229, 85
GROUPBOX "Chipset",IDC_STATIC,14,11,145,90
CONTROL "OCS [] Original chipset. A1000 and most A500s.",IDC_OCS,
"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,26,51,10
- CONTROL "ECS Agnus [] Enhanced chipset (ECS Agnus chip only). Later A500 and A2000 hardware revisions.",IDC_ECS_AGNUS,
+ CONTROL "ECS Agnus [] Enhanced chipset (ECS Agnus chip only). CDTV and later A500 and A2000 hardware revisions.",IDC_ECS_AGNUS,
"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,42,55,10
+ CONTROL "ECS Denise [] Enhanced chipset (ECS Denise chip only). Normally paired with ECS Agnus.",IDC_ECS_DENISE,
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,42,55,10
CONTROL "Full ECS [] Full ECS chipset (ECS Agnus and ECS Denise chips). A500+, A600 and A3000.",IDC_ECS,
"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,58,52,10
CONTROL "AGA [] Advanced Graphics Architecture chipset. A1200, A4000 and CD32.",IDC_AGA,
"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,26,51,10
CONTROL "NTSC [] North American and Japanese display standard, 60Hz refresh rate. Other countries use PAL (50Hz. display refresh rate)",IDC_NTSC,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,101,58,50,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,58,50,10
GROUPBOX "Options",IDC_STATIC,168,11,114,89
CONTROL "Immediate Blitter [] Faster but less compatible blitter emulation.",IDC_BLITIMM,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,30,96,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,179,33,96,10
CONTROL "Cycle-exact [] The most compatible A500 emulation mode. Very fast PC recommended.",IDC_CYCLEEXACT,
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,174,43,100,10
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,46,100,10
GROUPBOX "Collision Level",IDC_STATIC,14,105,267,48
CONTROL "None [] Collision hardware emulation disabled.",IDC_COLLISION0,
- "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,40,121,59,10
+ "Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,121,59,10
CONTROL "Sprites only [] Emulate only sprite vs. sprite collisions.",IDC_COLLISION1,
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,39,137,62,10
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,137,62,10
CONTROL "Sprites and Sprites vs. Playfield [] Recommended collision emulation level.",IDC_COLLISION2,
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,109,121,161,10
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,121,161,10
CONTROL "Full [] 100% collision hardware emulation. Only very few games need this option. Slowest.",IDC_COLLISION3,
- "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,109,137,119,10
+ "Button",BS_AUTORADIOBUTTON | WS_TABSTOP,100,137,119,10
GROUPBOX "Sound Emulation",IDC_STATIC,13,159,268,65
- CONTROL "Disabled",IDC_CS_SOUND0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,39,175,102,10
- CONTROL "Emulated",IDC_CS_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,39,190,91,10
- CONTROL "Emulated, 100% accurate",IDC_CS_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,39,205,95,10
+ CONTROL "Disabled",IDC_CS_SOUND0,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,37,175,102,10
+ CONTROL "Emulated",IDC_CS_SOUND1,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,190,91,10
+ CONTROL "Emulated, 100% accurate",IDC_CS_SOUND2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,37,205,95,10
CONTROL "Genlock connected [] Allow boot sequence to detect genlock. Genlock is not emulated.",IDC_GENLOCK,
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,174,56,100,10
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,59,100,10
CONTROL "Faster RTG [] Enables less accurate custom chipset emulation mode when Picasso96 is enabled.",IDC_FASTERRTG,
- "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,174,68,100,10
- COMBOBOX IDC_CS_EXT,101,80,49,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ "Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,179,72,100,10
+ COMBOBOX IDC_CS_EXT,100,80,49,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Chipset Extra",IDC_STATIC,25,79,52,15,SS_CENTERIMAGE
END
BEGIN
GROUPBOX "Battery Backed Up Real Time Clock",IDC_STATIC,11,24,275,29
CONTROL "None",IDC_CS_RTC1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,36,55,10
- CONTROL "MSM6242B",IDC_CS_RTC2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,88,36,52,10
- CONTROL "RF5C01A",IDC_CS_RTC3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,157,36,46,10
+ CONTROL "MSM6242B",IDC_CS_RTC2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,36,52,10
+ CONTROL "RF5C01A",IDC_CS_RTC3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,159,36,46,10
EDITTEXT IDC_CS_RTCADJUST,215,34,64,13,ES_AUTOHSCROLL
- GROUPBOX "CIA-A TOD Clock Source",IDC_STATIC,9,56,275,29
- CONTROL "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,22,68,63,10
- CONTROL "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,92,68,85,10
- CONTROL "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,189,68,88,10
- CONTROL "Boot ROM Mirror",IDC_CS_KSMIRROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,95,80,10
+ GROUPBOX "CIA-A TOD Clock Source",IDC_STATIC,11,56,275,29
+ CONTROL "Vertical Sync",IDC_CS_CIAA_TOD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,19,68,63,10
+ CONTROL "Power Supply 50Hz",IDC_CS_CIAA_TOD2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,90,68,85,10
+ CONTROL "Power Supply 60Hz",IDC_CS_CIAA_TOD3,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,186,68,88,10
+ CONTROL "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,146,80,10
CONTROL "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,95,88,10
CONTROL "CD32 CD",IDC_CS_CD32CD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,108,76,10
CONTROL "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,108,87,10
CONTROL "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,120,90,10
CONTROL "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,133,79,10
CONTROL "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,133,88,10
- CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,210,71,10
- EDITTEXT IDC_CS_RAMSEYREV,91,208,45,13,ES_AUTOHSCROLL
- CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,223,71,10
- EDITTEXT IDC_CS_FATGARYREV,91,222,45,13,ES_AUTOHSCROLL
- CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,174,76,10
+ CONTROL "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,71,10
+ EDITTEXT IDC_CS_RAMSEYREV,91,214,45,13,ES_AUTOHSCROLL
+ CONTROL "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,71,10
+ EDITTEXT IDC_CS_FATGARYREV,91,228,45,13,ES_AUTOHSCROLL
+ CONTROL "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,188,76,10
CONTROL "Compatible Settings",IDC_CS_COMPATIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,8,234,10
CONTROL "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,95,92,10
- CONTROL "Agnus/Alice revision:",IDC_CS_AGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,210,81,10
- EDITTEXT IDC_CS_AGNUSREV,232,208,45,13,ES_AUTOHSCROLL
- CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,226,81,10
- EDITTEXT IDC_CS_DENISEREV,232,225,45,13,ES_AUTOHSCROLL
- CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,174,76,10
- CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,174,88,10
- LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,22,160,224,8,SS_CENTERIMAGE
+ CONTROL "Agnus/Alice revision:",IDC_CS_AGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,216,81,10
+ EDITTEXT IDC_CS_AGNUSREV,232,214,45,13,ES_AUTOHSCROLL
+ CONTROL "Denise/Lisa revision:",IDC_CS_DENISE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,229,81,10
+ EDITTEXT IDC_CS_DENISEREV,232,228,45,13,ES_AUTOHSCROLL
+ CONTROL "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,188,76,10
+ CONTROL "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,188,88,10
+ LTEXT "A4091/A4000T SCSI not yet implemented.",IDC_STATIC,22,174,224,8,SS_CENTERIMAGE
CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,133,92,10
- CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,186,76,10
- CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,186,76,10
- CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,186,101,10
+ CONTROL "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,200,76,10
+ CONTROL "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,200,76,10
+ CONTROL "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,200,101,10
CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,146,92,10
+ CONTROL "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,146,80,10
+ CONTROL "CIA ROM Overlay",IDC_CS_CIAOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,95,80,10
+ CONTROL "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,159,80,10
+ CONTROL "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,159,80,10
+ CONTROL "Blitter Busy Bug",IDC_CS_BLITTERBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,187,159,80,10
END
IDD_AVIOUTPUT DIALOGEX 0, 0, 288, 203
STYLE DS_LOCALEDIT | DS_SETFONT | DS_CONTROL | WS_CHILD
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
- GROUPBOX "Output Properties",IDC_STATIC,5,8,274,118
- EDITTEXT IDC_AVIOUTPUT_FILETEXT,15,21,226,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE
- PUSHBUTTON "...",IDC_AVIOUTPUT_FILE,249,20,19,12
- CONTROL "Audio",IDC_AVIOUTPUT_AUDIO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,36,39,11
- CONTROL "",IDC_AVIOUTPUT_AUDIO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,36,209,11
- CONTROL "Video",IDC_AVIOUTPUT_VIDEO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,50,39,11
- CONTROL "",IDC_AVIOUTPUT_VIDEO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,50,209,11
+ GROUPBOX "Output Properties",IDC_STATIC,5,0,274,126
+ EDITTEXT IDC_AVIOUTPUT_FILETEXT,15,15,226,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_CLIENTEDGE
+ PUSHBUTTON "...",IDC_AVIOUTPUT_FILE,249,15,19,12
+ CONTROL "Audio",IDC_AVIOUTPUT_AUDIO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,33,39,14
+ CONTROL "",IDC_AVIOUTPUT_AUDIO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,34,209,13
+ CONTROL "Video",IDC_AVIOUTPUT_VIDEO,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_FLAT | WS_TABSTOP,15,50,39,14
+ CONTROL "",IDC_AVIOUTPUT_VIDEO_STATIC,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_SUNKEN | WS_GROUP,59,51,209,13
CONTROL "Disable frame rate limit while recording",IDC_AVIOUTPUT_FRAMELIMITER,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,68,158,10
CONTROL "AVI output enabled",IDC_AVIOUTPUT_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,15,103,108,14
- CONTROL "PAL",IDC_AVIOUTPUT_PAL,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,133,103,66,14
+ CONTROL "PAL",IDC_AVIOUTPUT_PAL,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,131,103,66,14
CONTROL "NTSC",IDC_AVIOUTPUT_NTSC,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,204,103,66,14
CONTROL "Slider1",IDC_AVIOUTPUT_FPS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_ENABLESELRANGE | WS_TABSTOP,166,84,87,11
LTEXT "fps",IDC_AVIOUTPUT_FPS_STATIC,255,84,19,8
- PUSHBUTTON "Save screenshot",IDC_SCREENSHOT,16,141,76,14
+ PUSHBUTTON "Save screenshot",IDC_SCREENSHOT,16,141,77,14
GROUPBOX "Ripper",IDC_STATIC,5,127,274,38
- PUSHBUTTON "Pro Wizard 1.62",IDC_PROWIZARD,100,141,76,14,WS_DISABLED
+ PUSHBUTTON "Pro Wizard 1.62",IDC_PROWIZARD,104,141,77,14,WS_DISABLED
CONTROL "Sample ripper",IDC_SAMPLERIPPER_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,192,141,77,14
GROUPBOX "Input Recorder",IDC_STATIC,5,166,274,33
- CONTROL "Record",IDC_INPREC_RECORD,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,191,177,77,14
+ CONTROL "Record",IDC_INPREC_RECORD,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,192,178,77,14
CONTROL "Playback",IDC_INPREC_PLAY,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,16,178,77,14
CONTROL "Alt. playback mode",IDC_INPREC_PLAYMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,103,180,78,10
CONTROL "Disable sound output while recording",IDC_AVIOUTPUT_NOSOUNDOUTPUT,
COMBOBOX IDC_FILTERMODE,62,15,61,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_FILTERFILTER,128,15,81,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Reset to defaults",IDC_FILTERDEFAULT,213,15,73,14
- RTEXT "Horiz. size:",-1,4,44,54,10,SS_CENTERIMAGE
+ RTEXT "Horiz. size:",-1,7,44,54,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_FILTERHZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,37,152,19
- EDITTEXT IDC_FILTERHZV,253,40,34,12,ES_CENTER | ES_READONLY
- RTEXT "Vert. size:",-1,5,64,54,10,SS_CENTERIMAGE
+ EDITTEXT IDC_FILTERHZV,253,39,34,12,ES_CENTER | ES_READONLY
+ RTEXT "Vert. size:",-1,7,64,54,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_FILTERVZ,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,57,152,19
EDITTEXT IDC_FILTERVZV,253,59,34,12,ES_CENTER | ES_READONLY
RTEXT "Horiz. position:",-1,5,84,55,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_FILTERHO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,77,151,19
EDITTEXT IDC_FILTERHOV,253,79,34,12,ES_CENTER | ES_READONLY
RTEXT "Vert. position:",-1,5,103,55,10,SS_CENTERIMAGE
- CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,99,151,19
- EDITTEXT IDC_FILTERVOV,253,101,34,12,ES_CENTER | ES_READONLY
+ CONTROL "Slider1",IDC_FILTERVO,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,97,151,19
+ EDITTEXT IDC_FILTERVOV,253,99,34,12,ES_CENTER | ES_READONLY
RTEXT "Extra settings:",-1,27,133,57,10,SS_CENTERIMAGE
CONTROL "Slider1",IDC_FILTERXL,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,99,157,151,19
EDITTEXT IDC_FILTERXLV,253,159,34,12,ES_CENTER | ES_READONLY
PUSHBUTTON "Delete",IDC_FILTERPRESETDELETE,236,200,47,14
COMBOBOX IDC_FILTERHZMULT,67,43,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_FILTERVZMULT,67,63,27,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
- CONTROL "Autoscale",IDC_FILTERAUTORES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,26,168,63,10
+ CONTROL "Autoscale",IDC_FILTERAUTORES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_GROUP | WS_TABSTOP,9,168,63,10
COMBOBOX IDC_FILTERXTRA,105,130,138,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Full screen filter",IDC_FILTERUPSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,153,87,10
END
-IDD_HARDDRIVE DIALOGEX 0, 0, 380, 66
+IDD_HARDDRIVE DIALOGEX 0, 0, 380, 76
STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | DS_CENTERMOUSE | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Harddrive Settings"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
- LTEXT "Hard drive:",IDC_STATIC,7,11,35,10
+ LTEXT "Hard drive:",IDC_STATIC,7,11,80,10
COMBOBOX IDC_HARDDRIVE,49,9,325,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
CONTROL "Read/write",IDC_HDF_RW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,51,55,10
DEFPUSHBUTTON "Add hard drive",IDOK,231,48,65,14
DEFPUSHBUTTON "Create hard disk image file",IDC_HARDDRIVE_IMAGE,49,30,115,14
EDITTEXT IDC_PATH_NAME,183,27,97,15,ES_AUTOHSCROLL | NOT WS_VISIBLE
COMBOBOX IDC_HDF_CONTROLLER,102,50,41,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
- RTEXT "HD Controller:",IDC_STATIC,42,52,52,10,SS_CENTERIMAGE
+ RTEXT "HD Controller:",IDC_STATIC,42,51,52,10,SS_CENTERIMAGE
END
IDD_MISC2 DIALOGEX 0, 0, 300, 92
CONTROL "Disable sound",IDC_INACTIVE_NOSOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,63,79,10
GROUPBOX "When Minimized",IDC_STATIC,199,7,92,73
RTEXT "Run at priority:",IDC_MINIMIZED_PRI,207,18,51,10,SS_CENTERIMAGE | WS_TABSTOP
- COMBOBOX IDC_MINIMIZED_PRIORITY,207,30,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_MINIMIZED_PRIORITY,207,29,76,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "Pause emulation",IDC_MINIMIZED_PAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,50,69,10
CONTROL "Disable sound",IDC_MINIMIZED_NOSOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,207,63,79,10
END
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
CONTROL "",IDC_DISKLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,6,292,196
- PUSHBUTTON "Remove floppy disk image",IDC_DISKLISTREMOVE,149,223,101,15
+ PUSHBUTTON "Remove floppy disk image",IDC_DISKLISTREMOVE,156,223,101,15
COMBOBOX IDC_DISKTEXT,3,205,293,75,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "Insert floppy disk image",IDC_DISKLISTINSERT,34,223,101,15
+ PUSHBUTTON "Insert floppy disk image",IDC_DISKLISTINSERT,41,223,101,15
END
IDD_PANEL DIALOGEX 0, 0, 420, 278
PUSHBUTTON "...",IDC_PATHS_SAVESTATES,281,114,11,15
LTEXT "Videos:",IDC_PATHS_AVIOUTPUTL,14,132,260,8,SS_CENTERIMAGE
EDITTEXT IDC_PATHS_AVIOUTPUT,14,144,261,15,ES_AUTOHSCROLL
- PUSHBUTTON "...",IDC_PATHS_AVIOUTPUTS,282,144,11,15
+ PUSHBUTTON "...",IDC_PATHS_AVIOUTPUTS,281,144,11,15
LTEXT "Saveimages:",IDC_PATHS_SAVEIMAGEL,14,163,260,8,SS_CENTERIMAGE
EDITTEXT IDC_PATHS_SAVEIMAGE,14,175,261,15,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_PATHS_SAVEIMAGES,281,175,11,15
COMBOBOX IDC_QUICKSTART_CONFIGURATION,59,31,233,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Compatibility vs Required CPU Power ",IDC_QUICKSTART_COMPA,3,56,294,33
RTEXT "Best compatibility",IDC_STATIC,13,70,67,10,SS_CENTERIMAGE
- CONTROL "",IDC_QUICKSTART_COMPATIBILITY,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,88,65,115,21
+ CONTROL "",IDC_QUICKSTART_COMPATIBILITY,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,95,65,115,21
RTEXT "Low compatibility",IDC_STATIC,215,70,63,10,SS_CENTERIMAGE
GROUPBOX "Host Configuration",IDC_QUICKSTART_HOST,3,91,294,33
RTEXT "Configuration:",IDC_STATIC,5,105,55,10,SS_CENTERIMAGE
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,4,5,0
- PRODUCTVERSION 1,4,5,0
+ FILEVERSION 1,4,6,0
+ PRODUCTVERSION 1,4,6,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", "WinUAE"
- VALUE "FileVersion", "1.4.5"
+ VALUE "FileVersion", "1.4.6"
VALUE "InternalName", "WinUAE"
- VALUE "LegalCopyright", "© 1996-2007 under the GNU Public License (GPL)"
+ VALUE "LegalCopyright", "© 1996-2008 under the GNU Public License (GPL)"
VALUE "OriginalFilename", "WinUAE.exe"
VALUE "ProductName", "WinUAE"
- VALUE "ProductVersion", "1.4.5"
+ VALUE "ProductVersion", "1.4.6"
END
END
BLOCK "VarFileInfo"
END
END
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO
-BEGIN
- IDD_HARDFILE, DIALOG
- BEGIN
- BOTTOMMARGIN, 224
- END
-END
-#endif // APSTUDIO_INVOKED
-
/////////////////////////////////////////////////////////////////////////////
//
BEGIN
IDS_QS_MODEL_UAE "High-end expanded configuration"
IDS_QS_MODEL_ARCADIA "Arcadia\nArcadia Multi Select system is arcade platform developed by Arcadia and Mastertronic. It is based on an A500 mainboard with ROM cage attached to expansion port. Arcadia ROM files go to ""Cartridge ROM File"" in ROM-panel."
- IDS_QS_MODEL_A3000 "1.4 ROM, 2MB Chip + 8MB Fast\n\n3.1 ROM, 2MB Chip + 8MB Fast\n"
+ IDS_QS_MODEL_A3000 "1.4 ROM, 2MB Chip + 8MB Fast\n\n2.04 ROM, 2MB Chip + 8MB Fast\n\n3.1 ROM, 2MB Chip + 8MB Fast\n"
IDS_QS_MODEL_A4000 "68030, 3.1 ROM, 2MB Chip + 8MB Fast\n\n68040, 3.1 ROM, 2MB Chip + 8MB Fast\n"
IDS_QS_MODEL_A4000T "A4000T (test)\nA4000T"
END
// Generated from the TEXTINCLUDE 3 resource.
//
-
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
static int minimized;
static DWORD hd_mask, cd_mask;
+static int recursive_device;
+
static char *ua (const WCHAR *s)
{
WideCharToMultiByte (CP_ACP, 0, s, -1, d, len, 0, FALSE);
return d;
}
+static WCHAR *au (const char *s)
+{
+ WCHAR *d;
+ int len = MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, s, -1, NULL, 0);
+ if (!len)
+ return xcalloc (2, 1);
+ d = xmalloc ((len + 1) * sizeof (WCHAR));
+ MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, s, -1, d, len);
+ return d;
+}
static const char *getmsg (int msg)
{
case RPIPCGM_CLOSED: return "RPIPCGM_CLOSED";
case RPIPCGM_ACTIVATED: return "RPIPCGM_ACTIVATED";
case RPIPCGM_DEACTIVATED: return "RPIPCGM_DEACTIVATED";
+ case RPIPCGM_PARENT: return "RPIPCGM_PARENT";
+#if 0
case RPIPCGM_ZORDER: return "RPIPCGM_ZORDER";
case RPIPCGM_MINIMIZED: return "RPIPCGM_MINIMIZED";
case RPIPCGM_RESTORED: return "RPIPCGM_RESTORED";
case RPIPCGM_MOVED: return "RPIPCGM_MOVED";
+ case RPIPCGM_DEVICEIMAGE: return "RPIPCGM_DEVICEIMAGE";
+ case RPIPCGM_INPUTMODE: return "RPIPCGM_INPUTMODE";
+ case RPIPCHM_MINIMIZE: return "RPIPCHM_MINIMIZE";
+ case RPIPCHM_DEVICEIMAGE: return "RPIPCHM_DEVICEIMAGE";
+ case RPIPCHM_INPUTMODE: return "RPIPCHM_INPUTMODE";
+#endif
case RPIPCGM_SCREENMODE: return "RPIPCGM_SCREENMODE";
case RPIPCGM_POWERLED: return "RPIPCGM_POWERLED";
case RPIPCGM_DEVICES: return "RPIPCGM_DEVICES";
case RPIPCGM_MOUSECAPTURE: return "RPIPCGM_MOUSECAPTURE";
case RPIPCGM_HOSTAPIVERSION: return "RPIPCGM_HOSTAPIVERSION";
case RPIPCGM_PAUSE: return "RPIPCGM_PAUSE";
- case RPIPCGM_DEVICEIMAGE: return "RPIPCGM_DEVICEIMAGE";
case RPIPCGM_TURBO: return "RPIPCGM_TURBO";
- case RPIPCGM_INPUTMODE: return "RPIPCGM_INPUTMODE";
case RPIPCGM_VOLUME: return "RPIPCGM_VOLUME";
+ case RPIPCGM_DEVICECONTENT: return "RPIPCGM_DEVICECONTENT";
case RPIPCHM_CLOSE: return "RPIPCHM_CLOSE";
- case RPIPCHM_MINIMIZE: return "RPIPCHM_MINIMIZE";
case RPIPCHM_SCREENMODE: return "RPIPCHM_SCREENMODE";
case RPIPCHM_SCREENCAPTURE: return "RPIPCHM_SCREENCAPTURE";
case RPIPCHM_PAUSE: return "RPIPCHM_PAUSE";
- case RPIPCHM_DEVICEIMAGE: return "RPIPCHM_DEVICEIMAGE";
case RPIPCHM_RESET: return "RPIPCHM_RESET";
case RPIPCHM_TURBO: return "RPIPCHM_TURBO";
- case RPIPCHM_INPUTMODE: return "RPIPCHM_INPUTMODE";
case RPIPCHM_VOLUME: return "RPIPCHM_VOLUME";
case RPIPCHM_EVENT: return "RPIPCHM_EVENT";
case RPIPCHM_ESCAPEKEY: return "RPIPCHM_ESCAPEKEY";
case RPIPCHM_MOUSECAPTURE: return "RPIPCHM_MOUSECAPTURE";
+ case RPIPCHM_DEVICECONTENT: return "RPIPCHM_DEVICECONTENT";
+ case RPIPCHM_PING: return "RPIPCHM_PING";
default: return "UNKNOWN";
}
}
+static int port_insert (int num, const char *name)
+{
+ char tmp1[100], tmp2[200];
+ int i;
+
+ if (num < 0 || num > 1)
+ return FALSE;
+ if (strlen (name) == 0) {
+ inputdevice_joyport_config (&changed_prefs, "none", num, 0);
+ return TRUE;
+ }
+ if (strlen (name) >= sizeof (tmp2) - 1)
+ return FALSE;
+ strcpy (tmp2, name);
+ for (i = 1; i <= 4; i++) {
+ sprintf (tmp1, "Mouse%d", i);
+ if (!strcmp (name, tmp1))
+ sprintf (tmp2, "mouse%d", i - 1);
+ sprintf (tmp1, "Joystick%d", i);
+ if (!strcmp (name, tmp1))
+ sprintf (tmp2, "joy%d", i - 1);
+ sprintf (tmp1, "KeyboardLayout%d", i);
+ if (!strcmp (name, tmp1))
+ sprintf (tmp2, "kbd%d", i);
+ }
+ inputdevice_joyport_config (&changed_prefs, tmp2, num, 1);
+ return TRUE;
+}
+
BOOL RPSendMessagex(UINT uMessage, WPARAM wParam, LPARAM lParam,
LPCVOID pData, DWORD dwDataSize, const RPGUESTINFO *pInfo, LRESULT *plResult)
{
}
v = RPSendMessage (uMessage, wParam, lParam, pData, dwDataSize, pInfo, plResult);
if (log_rp) {
- write_log ("RPSEND(%s [%d], %08x, %08x, %08x, %d\n",
+ write_log ("RPSEND(%s [%d], %08x, %08x, %08x, %d)\n",
getmsg (uMessage), uMessage - WM_APP, wParam, lParam, pData, dwDataSize);
if (v == FALSE)
write_log("ERROR %d\n", GetLastError ());
return RP_SCREENMODE_4X;
}
-static LRESULT CALLBACK RPHostMsgFunction(UINT uMessage, WPARAM wParam, LPARAM lParam,
+static LRESULT CALLBACK RPHostMsgFunction2 (UINT uMessage, WPARAM wParam, LPARAM lParam,
LPCVOID pData, DWORD dwDataSize, LPARAM lMsgFunctionParam)
{
if (log_rp)
default:
write_log ("RP: Unknown or unsupported command %x\n", uMessage);
break;
+ case RPIPCHM_PING:
+ return TRUE;
case RPIPCHM_CLOSE:
uae_quit ();
return TRUE;
currprefs.sound_volume = changed_prefs.sound_volume = wParam;
set_volume (currprefs.sound_volume, 0);
return TRUE;
- case RPIPCHM_MINIMIZE:
- minimized = 1;
- if (ShowWindow (hAmigaWnd, SW_MINIMIZE))
- return TRUE;
- break;
case RPIPCHM_ESCAPEKEY:
rp_rpescapekey = wParam;
rp_rpescapeholdtime = lParam;
else
setmouseactive (0);
return TRUE;
+#if 0
+ case RPIPCHM_MINIMIZE:
+ minimized = 1;
+ if (ShowWindow (hAmigaWnd, SW_MINIMIZE))
+ return TRUE;
+ break;
case RPIPCHM_DEVICEIMAGE:
{
RPDEVICEIMAGE *di = (RPDEVICEIMAGE*)pData;
}
return TRUE;
}
+#endif
+ case RPIPCHM_DEVICECONTENT:
+ {
+ struct RPDeviceContent *dc = (struct RPDeviceContent*)pData;
+ char *n = ua (dc->szContent);
+ int num = dc->btDeviceNumber;
+ int ok = FALSE;
+ switch (dc->btDeviceCategory)
+ {
+ case RP_DEVICE_FLOPPY:
+ disk_insert (num, n);
+ ok = TRUE;
+ break;
+ case RP_DEVICE_INPUTPORT:
+ ok = port_insert (num, n);
+ break;
+
+ }
+ xfree (n);
+ return ok;
+ }
case RPIPCHM_SCREENMODE:
{
int res = (BYTE)wParam;
return FALSE;
}
+static LRESULT CALLBACK RPHostMsgFunction (UINT uMessage, WPARAM wParam, LPARAM lParam,
+ LPCVOID pData, DWORD dwDataSize, LPARAM lMsgFunctionParam)
+{
+ LRESULT lr;
+ recursive_device++;
+ lr = RPHostMsgFunction2 (uMessage, wParam, lParam, pData, dwDataSize, lMsgFunctionParam);
+ recursive_device--;
+ return lr;
+}
+
HRESULT rp_init (void)
{
HRESULT hr;
RPUninitializeGuest (&guestinfo);
}
+HWND rp_getparent (void)
+{
+ LRESULT lr;
+ if (!initialized)
+ return 0;
+ RPSendMessagex(RPIPCGM_PARENT, 0, 0, NULL, 0, &guestinfo, &lr);
+ return (HWND)lr;
+}
+
void rp_fixup_options (struct uae_prefs *p)
{
+ DWORD feat;
int i, v;
int res;
+ int p96;
if (!initialized)
return;
write_log ("rp_fixup_options(rpescapekey=%d,rpescapeholdtime=%d,screenmode=%d,inputmode=%d)\n",
rp_rpescapekey, rp_rpescapeholdtime, rp_screenmode, rp_inputmode);
+ p96 = WIN32GFX_IsPicassoScreen ();
res = 1 << currprefs.gfx_resolution;
default_width = currprefs.gfx_size_win.width / res;
default_height = currprefs.gfx_size_win.height / res;
- p->win32_borderless = 1;
+ p->win32_borderless = -1;
p->gfx_afullscreen = p->gfx_pfullscreen = 0;
res = rp_screenmode;
if (res >= RP_SCREENMODE_FULLSCREEN) {
- p->gfx_afullscreen = 1;
+ if (p96)
+ p->gfx_pfullscreen = 1;
+ else
+ p->gfx_afullscreen = 1;
res = 1;
} else {
int xres = 1 << res;
else
p->gfx_linedbl = 1;
- RPSendMessagex(RPIPCGM_FEATURES,
- RP_FEATURE_POWERLED | RP_FEATURE_SCREEN1X | RP_FEATURE_SCREEN2X | RP_FEATURE_FULLSCREEN |
- RP_FEATURE_PAUSE | RP_FEATURE_TURBO | RP_FEATURE_INPUTMODE | RP_FEATURE_VOLUME | RP_FEATURE_SCREENCAPTURE,
- 0, NULL, 0, &guestinfo, NULL);
+ feat = RP_FEATURE_POWERLED | RP_FEATURE_SCREEN1X | RP_FEATURE_FULLSCREEN;
+ feat |= RP_FEATURE_PAUSE | RP_FEATURE_TURBO | RP_FEATURE_VOLUME | RP_FEATURE_SCREENCAPTURE;
+ if (!p96)
+ feat |= RP_FEATURE_SCREEN2X;
+ RPSendMessagex(RPIPCGM_FEATURES, feat, 0, NULL, 0, &guestinfo, NULL);
+
/* floppy drives */
v = 0;
for (i = 0; i < 4; i++) {
v |= 1 << i;
}
RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_FLOPPY, v, NULL, 0, &guestinfo, NULL);
+
+ RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_INPUTPORT, 3, NULL, 0, &guestinfo, NULL);
+
cd_mask = 0;
for (i = 0; i < currprefs.mountitems; i++) {
struct uaedev_config_info *uci = &currprefs.mountconfig[i];
RPSendMessagex(RPIPCGM_DEVICES, RP_DEVICE_HD, hd_mask, NULL, 0, &guestinfo, NULL);
}
+static void rp_device_change (int dev, int num, const char *name)
+{
+ struct RPDeviceContent *dc;
+ int dc_size;
+ char np[MAX_DPATH];
+
+ if (!initialized)
+ return;
+ if (recursive_device)
+ return;
+ np[0] = 0;
+ if (name != NULL)
+ strcpy (np, name);
+ dc_size = sizeof (struct RPDeviceContent) + (strlen (np) + 1) * sizeof (WCHAR);
+ dc = xcalloc (dc_size, 1);
+ dc->btDeviceCategory = dev;
+ dc->btDeviceNumber = num;
+ wcscpy (dc->szContent, au (np));
+ RPSendMessagex(RPIPCGM_DEVICECONTENT, 0, 0, dc, dc_size, &guestinfo, NULL);
+ xfree (dc);
+}
+
+void rp_disk_change (int num, const char *name)
+{
+ rp_device_change (RP_DEVICE_FLOPPY, num, name);
+}
+void rp_input_change (int num, const char *name)
+{
+ rp_device_change (RP_DEVICE_INPUTPORT, num, name);
+}
+
void rp_hd_change (int num, int removed)
{
if (removed)
RPSendMessagex(active ? RPIPCGM_ACTIVATED : RPIPCGM_DEACTIVATED, 0, lParam, NULL, 0, &guestinfo, NULL);
}
+#if 0
void rp_minimize (int minimize)
{
if (!initialized)
return;
RPSendMessagex(minimize ? RPIPCGM_MINIMIZED : RPIPCGM_RESTORED, 0, 0, NULL, 0, &guestinfo, NULL);
}
+#endif
void rp_turbo (int active)
{
RPSendMessagex(RPIPCGM_SCREENMODE, rx, (LPARAM)hWnd, NULL, 0, &guestinfo, NULL);
}
+#if 0
void rp_moved (int zorder)
{
if (!winok())
return;
RPSendMessagex(zorder ? RPIPCGM_ZORDER : RPIPCGM_MOVED, 0, 0, NULL, 0, &guestinfo, NULL);
}
+#endif
static uae_u64 esctime;
static int ignorerelease;
extern void rp_cd_activity (int, int);
extern void rp_cd_change (int, int);
extern void rp_activate (int, LPARAM);
-extern void rp_minimize (int);
extern void rp_mousecapture (int);
extern void rp_turbo (int);
extern void rp_set_hwnd (HWND);
-extern void rp_moved (int);
extern int rp_checkesc (int, uae_u8*, int, int);
extern int rp_isactive (void);
extern void rp_hsync (void);
+extern HWND rp_getparent (void);
extern char *rp_param;
extern int rp_rpescapekey;
extern int rp_rpescapeholdtime;
extern int rp_screenmode;
extern int rp_inputmode;
+
+extern void rp_disk_change (int num, const char *name);
+extern void rp_input_change (int num, const char *name);
\ No newline at end of file
cd c:\projects\winuae_bak
rm -rf bak
mkdir bak
-copy /s c:\projects\winuae\src\*.* c:\projects\winuae_bak\bak\
+cp -r c:\projects\winuae\src\. c:\projects\winuae_bak\bak\
copy d:\amiga\text\winuaechangelog.txt c:\projects\winuae_bak\bak\od-win32
cd bak
del *.obj *.ilk *.exe *.pdb *.pch *.idb /s
del cpuemu_12.c
del linetoscr.c
-cd od-win32
+cd jit
+del compemu.c
+del compstbl.h
+del compstbl.c
+cd ..
+cd od-win32
cd ipctester
rm -rf debug
rm -rf release
#define DRIVESOUND
#define GFXFILTER
#define X86_MSVC_ASSEMBLY
+#define OPTIMIZED_FLAGS
+#define __i386__
#ifndef UAE_MINI
void setpriority (struct threadpriorities *pri)
{
int err;
- if (os_winnt)
- err = SetPriorityClass (GetCurrentProcess (), pri->classvalue);
- else
- err = SetThreadPriority (GetCurrentThread (), pri->value);
+ err = SetPriorityClass (GetCurrentProcess (), pri->classvalue);
if (!err)
write_log ("priority set failed, %08.8X\n", GetLastError ());
}
mouseactive = active;
mouseposx = mouseposy = 0;
- //write_log ("setmouseactive(%d)\n", active);
+ write_log ("setmouseactive(%d)\n", active);
if (showcursor) {
ClipCursor(NULL);
ReleaseCapture();
if (focus) {
int donotfocus = 0;
HWND fw = GetForegroundWindow ();
- if (!(fw == hMainWnd || fw == hAmigaWnd)) {
- if (SetForegroundWindow (hMainWnd) == FALSE) {
- if (SetForegroundWindow (hAmigaWnd) == FALSE) {
+ HWND w1 = hAmigaWnd;
+ HWND w2 = hMainWnd;
+#ifdef RETROPLATFORM
+ if (rp_isactive ())
+ w2 = rp_getparent ();
+#endif
+ if (!(fw == w1 || fw == w2)) {
+ if (SetForegroundWindow (w2) == FALSE) {
+ if (SetForegroundWindow (w1) == FALSE) {
donotfocus = 1;
write_log ("wanted focus but SetforegroundWindow() failed\n");
}
if (isfullscreen() > 0 && !gui_active)
setmouseactive (1);
manual_palette_refresh_needed = 1;
-#ifdef RETROPLATFORM
- if (minimized)
- rp_minimize (0);
-#endif
#ifdef LOGITECHLCD
if (!minimized)
lcd_priority (1);
#ifdef FILESYS
filesys_flush_cache ();
#endif
-#ifdef RETROPLATFORM
- if (minimized)
- rp_minimize (1);
-#endif
#ifdef LOGITECHLCD
lcd_priority (0);
#endif
changed_prefs.gfx_size_win.x = amigawin_rect.left;
changed_prefs.gfx_size_win.y = amigawin_rect.top;
}
-#ifdef RETROPLATFORM
- if (!(wp->flags & SWP_NOZORDER))
- rp_moved (1);
-#endif
}
notice_screen_contents_lost ();
}
{
LRESULT lr = DefWindowProc (hWnd, message, wParam, lParam);
WIN32GFX_WindowMove();
-#ifdef RETROPLATFORM
- rp_moved (0);
-#endif
return lr;
}
case WM_MOVE:
switch (wParam & 0xfff0)
{
case SC_MINIMIZE:
- rp_minimize (1);
break;
case SC_RESTORE:
- rp_minimize (0);
break;
case SC_CLOSE:
PostQuitMessage (0);
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
if (fnIsWow64Process)
fnIsWow64Process(GetCurrentProcess(), &wow64);
- write_log ("%s (%s %d.%d %s%s[%d])", VersionStr, os_winnt ? "NT" : "W9X/ME",
+ write_log ("%s (%d.%d %s%s[%d])", VersionStr,
osVersion.dwMajorVersion, osVersion.dwMinorVersion, osVersion.szCSDVersion,
strlen(osVersion.szCSDVersion) > 0 ? " " : "", os_winnt_admin);
write_log (" %d-bit %X.%X %d", wow64 ? 64 : 32,
static get_aspi(int old)
{
- if ((old == UAESCSI_SPTI || old == UAESCSI_SPTISCAN) && os_winnt && os_winnt_admin)
+ if ((old == UAESCSI_SPTI || old == UAESCSI_SPTISCAN) && os_winnt_admin)
return old;
if (old == UAESCSI_NEROASPI && get_aspi_path(1))
return old;
return old;
if (old == UAESCSI_ADAPTECASPI && get_aspi_path(0))
return old;
- if (os_winnt && os_winnt_admin)
+ if (os_winnt_admin)
return UAESCSI_SPTI;
else if (get_aspi_path(1))
return UAESCSI_NEROASPI;
return UAESCSI_FROGASPI;
else if (get_aspi_path(0))
return UAESCSI_ADAPTECASPI;
- else if (os_winnt)
+ else
return UAESCSI_SPTI;
- return UAESCSI_ADAPTECASPI;
}
void target_quit (void)
size2 = sizeof (tmp2);
if (!regenumstr (fkey, idx, tmp, &size, tmp2, &size2))
break;
- if (strlen (tmp) == 6) {
- idx2 = atol (tmp + 3);
+ if (strlen (tmp) == 7 || strlen (tmp) == 13) {
+ int group = 0;
+ int subitem = 0;
+ idx2 = atol (tmp + 4);
+ if (strlen (tmp) == 13) {
+ group = atol (tmp + 8);
+ subitem = atol (tmp + 11);
+ }
if (idx2 >= 0 && strlen (tmp2) > 0) {
- struct romdata *rd = getromdatabyid (idx2);
- if (rd)
- romlist_add (tmp2, rd);
+ struct romdata *rd = getromdatabyidgroup (idx2, group, subitem);
+ if (rd) {
+ char *s = strchr (tmp2, '/');
+ if (s && strlen (s) > 2)
+ romlist_add (s + 2, rd);
+ else
+ romlist_add (tmp2, rd);
+ }
}
}
idx++;
}
+ romlist_add (NULL, NULL);
regclosetree (fkey);
}
rpath1[0] = rpath2[0] = rpath3[0] = 0;
rkey = HKEY_CLASSES_ROOT;
- if (os_winnt) {
- if (os_winnt_admin)
- rkey = HKEY_LOCAL_MACHINE;
- else
- rkey = HKEY_CURRENT_USER;
- strcpy(rpath1, "Software\\Classes\\");
- strcpy(rpath2, rpath1);
- strcpy(rpath3, rpath1);
- }
+ if (os_winnt_admin)
+ rkey = HKEY_LOCAL_MACHINE;
+ else
+ rkey = HKEY_CURRENT_USER;
+ strcpy(rpath1, "Software\\Classes\\");
+ strcpy(rpath2, rpath1);
+ strcpy(rpath3, rpath1);
strcat(rpath1, ".uae");
strcat(rpath2, "WinUAE\\shell\\Edit\\command");
strcat(rpath3, "WinUAE\\shell\\Open\\command");
extern int force_direct_catweasel, sound_mode_skip;
extern DWORD_PTR cpu_affinity, cpu_paffinity;
-static DWORD_PTR original_affinity;
+static DWORD_PTR original_affinity = -1;
static int getval(char *s)
{
GetProcessAffinityMask (GetCurrentProcess(), &original_affinity, &sys_aff);
thread = GetCurrentThread();
- original_affinity = SetThreadAffinityMask(thread, 1);
+ //original_affinity = SetThreadAffinityMask(thread, 1);
+
#if 0
#define MSGFLT_ADD 1
CHANGEWINDOWMESSAGEFILTER pChangeWindowMessageFilter;
WinMain2 (hInstance, hPrevInstance, lpCmdLine, nCmdShow);
} __except(WIN32_ExceptionFilter(GetExceptionInformation(), GetExceptionCode())) {
}
- SetThreadAffinityMask(thread, original_affinity);
+ //SetThreadAffinityMask(thread, original_affinity);
return FALSE;
}
#define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
#define GETBDD(x) ((x) % 100)
-#define WINUAEBETA 0
-#define WINUAEPUBLICBETA 0
-#define WINUAEDATE MAKEBD(2008, 2, 2)
+#define WINUAEBETA 1
+#define WINUAEPUBLICBETA 1
+#define WINUAEDATE MAKEBD(2008, 2, 17)
#define WINUAEEXTRA ""
#define WINUAEREV ""
extern char prtname[];
extern char VersionStr[256];
extern char BetaStr[64];
-extern int os_winnt, os_winnt_admin, os_64bit, os_vista, os_winxp;
+extern int os_winnt_admin, os_64bit, os_vista, os_winxp;
extern int paraport_mask;
extern int gui_active;
extern DWORD quickstart;
void uaenet_close (struct uaenetdatawin32 *sd)
{
+ if (!sd)
+ return;
if (sd->threadactiver) {
sd->threadactiver = -1;
}
GetMonitorInfo(hm, (LPMONITORINFO)&lpmi);
}
md->rect = lpmi.rcMonitor;
- if (os_winnt) {
- if (md->rect.left == 0 && md->rect.top == 0)
- sprintf (tmp, "%s (%d*%d)", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top);
- else
- sprintf (tmp, "%s (%d*%d) [%d*%d]", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top, md->rect.left, md->rect.top);
- } else {
- strcpy (tmp, desc);
- }
+ if (md->rect.left == 0 && md->rect.top == 0)
+ sprintf (tmp, "%s (%d*%d)", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top);
+ else
+ sprintf (tmp, "%s (%d*%d) [%d*%d]", desc, md->rect.right - md->rect.left, md->rect.bottom - md->rect.top, md->rect.left, md->rect.top);
md->name = my_strdup (tmp);
write_log ("'%s' '%s' %s\n", desc, name, outGUID(guid));
return 1;
int gap = 3;
int x, y;
- if (fsw)
+ if (fsw && !borderless)
borderless = 1;
currentmode->native_width = currentmode->current_width;
currentmode->native_height = currentmode->current_height;
}
- hAmigaWnd = CreateWindowEx (dxfs ? WS_EX_ACCEPTFILES | WS_EX_TOPMOST : WS_EX_ACCEPTFILES | exstyle | (currprefs.win32_alwaysontop ? WS_EX_TOPMOST : 0),
- "AmigaPowah", "WinUAE",
- WS_CLIPCHILDREN | WS_CLIPSIBLINGS | (hMainWnd ? WS_VISIBLE | WS_CHILD : WS_VISIBLE | WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX),
- x, y,
- currentmode->native_width, currentmode->native_height,
- borderless ? NULL : (hMainWnd ? hMainWnd : hhWnd), NULL, hInst, NULL);
-
+ if (rp_isactive ()) {
+ HWND parent = rp_getparent ();
+ hAmigaWnd = CreateWindowEx (dxfs ? WS_EX_ACCEPTFILES | WS_EX_TOPMOST : WS_EX_ACCEPTFILES | WS_EX_TOOLWINDOW | (currprefs.win32_alwaysontop ? WS_EX_TOPMOST : 0),
+ "AmigaPowah", "WinUAE",
+ WS_POPUP,
+ x, y,
+ currentmode->native_width, currentmode->native_height,
+ parent, NULL, hInst, NULL);
+ } else {
+ hAmigaWnd = CreateWindowEx (dxfs ? WS_EX_ACCEPTFILES | WS_EX_TOPMOST : WS_EX_ACCEPTFILES | exstyle | (currprefs.win32_alwaysontop ? WS_EX_TOPMOST : 0),
+ "AmigaPowah", "WinUAE",
+ WS_CLIPCHILDREN | WS_CLIPSIBLINGS | (hMainWnd ? WS_VISIBLE | WS_CHILD : WS_VISIBLE | WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX),
+ x, y,
+ currentmode->native_width, currentmode->native_height,
+ borderless ? NULL : (hMainWnd ? hMainWnd : hhWnd), NULL, hInst, NULL);
+ }
if (!hAmigaWnd) {
write_log ("creation of amiga window failed\n");
close_hwnds();
if (decode_cloanto_rom_do (rombuf, size, size))
cl = 0;
}
- if (!cl)
+ if (!cl) {
rd = getromdatabydata (rombuf, size);
+ if (!rd && (size & 65535) == 0) {
+ /* check byteswap */
+ int i;
+ for (i = 0; i < size; i+=2) {
+ uae_u8 b = rombuf[i];
+ rombuf[i] = rombuf[i + 1];
+ rombuf[i + 1] = b;
+ }
+ rd = getromdatabydata (rombuf, size);
+ }
+ }
if (!rd) {
;//write_log ("Unknown: Size=%d, Name='%s'\nCRC32=%08X SHA1=%s\n",
// size, zfile_getname(f), get_crc32(rombuf, size), get_sha1_txt(rombuf, size));
rd = scan_arcadia_rom (tmp, 0);
if (rd)
return rd;
- rd = getromdatabypath(path);
+ rd = getromdatabypath (path);
if (rd && rd->crc32 == 0xffffffff)
return rd;
z = zfile_fopen (path, "rb");
{
char tmp1[MAX_DPATH], tmp2[MAX_DPATH];
- sprintf (tmp1, "ROM%03d", rd->id);
+ sprintf (tmp1, "ROM_%03d", rd->id);
if (rd->group) {
char *p = tmp1 + strlen (tmp1);
sprintf (p, "_%02d_%02d", rd->group >> 16, rd->group & 65535);
}
if (regexists (fkey, tmp1))
return 0;
- tmp2[0] = 0;
- if (name)
- strcpy (tmp2, name);
+ getromname (rd, tmp2);
+ if (name) {
+ strcat (tmp2, " / ");
+ strcat (tmp2, name);
+ }
if (rd->crc32 == 0xffffffff) {
if (rd->configname)
sprintf(tmp2, ":%s", rd->configname);
else
- sprintf(tmp2, ":ROM%03d", rd->id);
+ sprintf(tmp2, ":ROM_%03d", rd->id);
}
if (!regsetstr (fkey, tmp1, tmp2))
return 0;
if (!stricmp (ext, "rom") || !stricmp (ext, "adf") || !stricmp (ext, "key")
|| !stricmp (ext, "a500") || !stricmp (ext, "a1200") || !stricmp (ext, "a4000"))
return 1;
+ if (strlen (ext) >= 2 && toupper(ext[0]) == 'U' && isdigit (ext[1]))
+ return 1;
for (i = 0; uae_archive_extensions[i]; i++) {
if (!stricmp (ext, uae_archive_extensions[i]))
return 1;
if (fkey2) {
id = 1;
for (;;) {
- struct romdata *rd = getromdatabyid(id);
+ struct romdata *rd = getromdatabyid (id);
if (!rd)
break;
if (rd->crc32 == 0xffffffff)
}
- openFileName.lStructSize = os_winnt ? sizeof (OPENFILENAME) : OPENFILENAME_SIZE_VERSION_400;
+ openFileName.lStructSize = sizeof (OPENFILENAME);
openFileName.hwndOwner = hDlg;
openFileName.hInstance = hInst;
CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
CharFormat.yHeight = 8 * 20; /* height in twips, where a twip is 1/20th of a point - for a pt.size of 18 */
- strcpy (CharFormat.szFaceName, os_vista ? "Segoe UI" : (os_winnt ? "Tahoma" : "Times New Roman"));
+ strcpy (CharFormat.szFaceName, os_vista ? "Segoe UI" : "Tahoma");
SendDlgItemMessage (hDlg, IDC_CONTRIBUTORS, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) & CharFormat);
return TRUE;
}
static void addromfiles (UAEREG *fkey, HWND hDlg, DWORD d, char *path, int type)
{
- int idx, idx2;
+ int idx;
char tmp[MAX_DPATH];
char tmp2[MAX_DPATH];
char seltmp[MAX_DPATH];
DWORD size2 = sizeof (tmp2);
if (!regenumstr (fkey, idx, tmp, &size, tmp2, &size2))
break;
- if (strlen (tmp) == 6) {
- idx2 = atol (tmp + 3);
+ if (strlen (tmp) == 7 || strlen (tmp) == 13) {
+ int group = 0;
+ int subitem = 0;
+ int idx2 = atol (tmp + 4);
+ if (strlen (tmp) == 13) {
+ group = atol (tmp + 8);
+ subitem = atol (tmp + 11);
+ }
if (idx2 >= 0) {
- struct romdata *rd = getromdatabyid (idx2);
+ struct romdata *rd = getromdatabyidgroup (idx2, group, subitem);
if (rd && (rd->type & type)) {
getromname (rd, tmp);
- SendDlgItemMessage(hDlg, d, CB_ADDSTRING, 0, (LPARAM)tmp);
+ if (SendDlgItemMessage (hDlg, d, CB_FINDSTRING, (WPARAM)-1, (LPARAM)tmp) < 0)
+ SendDlgItemMessage(hDlg, d, CB_ADDSTRING, 0, (LPARAM)tmp);
if (rd == rdx)
strcpy (seltmp, tmp);
}
static void misc_scsi(HWND hDlg)
{
SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_RESETCONTENT, 0, 0);
- SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)(os_winnt ? "SPTI" : "(SPTI)"));
- SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)(os_winnt ? "SPTI + SCSI SCAN" : "(SPTI + SCSI SCAN)"));
+ SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)"SPTI");
+ SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)"SPTI + SCSI SCAN");
SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)((get_aspi_path(0)) ? "AdaptecASPI" : "(AdaptecASPI)"));
SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)((get_aspi_path(1)) ? "NeroASPI" : "(NeroASPI)"));
SendDlgItemMessage (hDlg, IDC_SCSIMODE, CB_ADDSTRING, 0, (LPARAM)((get_aspi_path(2)) ? "FrogASPI" : "(FrogASPI)"));
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"SCSI4");
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"SCSI5");
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"SCSI6");
- //SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"SCSRAM");
+ SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_ADDSTRING, 0, (LPARAM)"SCSRAM");
SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_SETCURSEL, 0, 0);
}
SetDlgItemText (hDlg, IDC_HF_DOSTYPE, "");
}
-static void hardfile_testrdb (HWND hDlg)
+static void hardfile_testrdb (HWND hDlg, struct hfdlg_vals *hdf)
{
- void *f = zfile_fopen (current_hfdlg.filename, "rb");
+ void *f = zfile_fopen (hdf->filename, "rb");
char tmp[8] = { 0 };
if (!f)
return;
zfile_fread (tmp, 1, sizeof (tmp), f);
zfile_fclose (f);
- if (memcmp (tmp, "RDSK\0\0\0", 7))
- return;
- current_hfdlg.sectors = 0;
- current_hfdlg.surfaces = 0;
- current_hfdlg.reserved = 0;
- current_hfdlg.fsfilename[0] = 0;
- current_hfdlg.bootpri = 0;
- current_hfdlg.autoboot = 1;
- current_hfdlg.donotmount = 0;
- current_hfdlg.devicename[0] = 0;
+ if (!memcmp (tmp + 2, "CIS", 3))
+ hdf->controller = HD_CONTROLLER_PCMCIA_SRAM;
+ if (!memcmp (tmp, "RDSK\0\0\0", 7)) {
+ hdf->sectors = 0;
+ hdf->surfaces = 0;
+ hdf->reserved = 0;
+ hdf->fsfilename[0] = 0;
+ hdf->bootpri = 0;
+ hdf->autoboot = 1;
+ hdf->donotmount = 0;
+ hdf->devicename[0] = 0;
+ }
sethardfile (hDlg);
}
static void updatehdfinfo (HWND hDlg, int force)
{
static uae_u64 bsize;
- static uae_u8 id[4];
+ static uae_u8 id[8];
int blocks, cyls, i;
- char tmp[200], idtmp[5], tmp2[200];
+ char tmp[200], idtmp[9], tmp2[200];
if (force) {
struct zfile *zf = zfile_fopen (current_hfdlg.filename, "rb");
if (current_hfdlg.blocksize * current_hfdlg.sectors * current_hfdlg.surfaces)
cyls = bsize / (current_hfdlg.blocksize * current_hfdlg.sectors * current_hfdlg.surfaces);
blocks = cyls * (current_hfdlg.sectors * current_hfdlg.surfaces);
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < 8; i++) {
unsigned char c = id[i];
if (c < 32 || c > 126)
c = '.';
tmp[0] = 0;
if (bsize) {
- sprintf (tmp2, " %s [%02X%02X%02X%02X]", idtmp, id[0], id[1], id[2], id[3]);
- if (!cyls || !blocks)
+ sprintf (tmp2, " %s [%02X%02X%02X%02X%02X%02X%02X%02X]", idtmp, id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]);
+ if (!cyls || !blocks) {
sprintf (tmp, "%dMB", bsize / (1024 * 1024));
- else
+ } else {
sprintf (tmp, "%d cyls, %d blocks, %.1fMB/%.1fMB",
cyls, blocks,
(double)blocks * 1.0 * current_hfdlg.blocksize / (1024.0 * 1024.0),
(double)bsize / (1024.0 * 1024.0));
- if (cyls > 65535)
- strcat (tmp, " [Too many cyls]");
+ if (cyls > 65535) {
+ sprintf (tmp2, " %4.4s [%02X%02X%02X%02X]", idtmp, id[0], id[1], id[2], id[3]);
+ strcat (tmp, " [Too many cyls]");
+ }
+ }
strcat (tmp, tmp2);
}
SetDlgItemText (hDlg, IDC_HDFINFO, tmp);
}
break;
case IDC_SELECTOR:
+ {
DiskSelection (hDlg, IDC_PATH_NAME, 2, &workprefs, 0);
GetDlgItemText (hDlg, IDC_PATH_NAME, current_hfdlg.filename, sizeof current_hfdlg.filename);
- hardfile_testrdb (hDlg);
inithardfile(hDlg);
+ hardfile_testrdb (hDlg, ¤t_hfdlg);
updatehdfinfo (hDlg, 1);
break;
+ }
case IDC_FILESYS_SELECTOR:
DiskSelection (hDlg, IDC_PATH_FILESYS, 12, &workprefs, 0);
break;
ew (hDlg, IDOK, TRUE);
ew (hDlg, IDC_HDF_RW, TRUE);
ew (hDlg, IDC_HDF_CONTROLLER, TRUE);
+ hardfile_testrdb (hDlg, ¤t_hfdlg);
+ SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_SETCURSEL, current_hfdlg.controller, 0);
}
}
if (HIWORD (wParam) == BN_CLICKED) {
bp, current_hfdlg.fsfilename,
current_hfdlg.controller, 0);
if (uci)
- hardfile_do_disk_change (uci->configoffset, 1);
+ hardfile_do_disk_change (uci, 1);
}
static void new_harddrive (HWND hDlg, int entry)
current_hfdlg.filename, ! current_hfdlg.rw, 0, 0,
0, current_hfdlg.blocksize, 0, 0, current_hfdlg.controller, 0);
if (uci)
- hardfile_do_disk_change (uci->configoffset, 1);
+ hardfile_do_disk_change (uci, 1);
}
static void harddisk_remove (HWND hDlg)
clicked_entry = 0;
pages[HARDDISK_ID] = hDlg;
currentpage = HARDDISK_ID;
- EnableWindow (GetDlgItem(hDlg, IDC_NEW_HD), os_winnt && os_winnt_admin > 1 ? TRUE : FALSE);
+ EnableWindow (GetDlgItem(hDlg, IDC_NEW_HD), os_winnt_admin > 1 ? TRUE : FALSE);
case WM_USER:
CheckDlgButton (hDlg, IDC_MAPDRIVES_AUTO, workprefs.win32_automount_removable);
SendDlgItemMessage (hDlg, IDC_PRINTERLIST, CB_RESETCONTENT, 0, 0L);
SendDlgItemMessage (hDlg, IDC_PRINTERLIST, CB_ADDSTRING, 0, (LPARAM)szNone);
if(!pInfo) {
- int flags = PRINTER_ENUM_LOCAL | (os_winnt ? PRINTER_ENUM_CONNECTIONS : 0);
+ int flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;
DWORD needed = 0;
EnumPrinters(flags, NULL, 1, (LPBYTE)pInfo, 0, &needed, &dwEnumeratedPrinters);
if (needed > 0) {
PostQuitMessage (0);
return TRUE;
case WM_CLOSE:
+ stringboxdialogactive = 0;
DestroyWindow(hDlg);
return TRUE;
case WM_INITDIALOG:
}
break;
}
- return DefWindowProc(hDlg, msg, wParam, lParam);
+ return FALSE;
}
static int askinputcustom(HWND hDlg, char *custom, int maxlen)
} DLGITEMTEMPLATEEX;
#include <poppack.h>
-static int fontsdetected, font_vista_ok, font_xp_ok;
+static int font_vista_ok;
static wchar_t wfont_vista[] = L"Segoe UI";
static wchar_t wfont_xp[] = L"Tahoma";
static wchar_t wfont_old[] = L"MS Sans Serif";
if (font_vista_ok)
p = wfont_vista;
- else if (font_xp_ok)
+ else
p = wfont_xp;
if (p && !wcscmp (d2->typeface, wfont_old))
wcscpy (d2->typeface, p);
xfree (ns);
}
-static int CALLBACK effproc(const void *elfe, const void *ntme, DWORD type, LPARAM lParam)
-{
- *(int*)lParam = 1;
- return 0;
-}
-
-static void detectfonts(void)
+void scaleresource_setmaxsize(int w, int h)
{
- LOGFONT lf;
- HDC hdc;
-
- if (fontsdetected)
- return;
- memset(&lf, 0, sizeof lf);
- hdc = GetDC(NULL);
- if (hdc) {
- lf.lfCharSet = DEFAULT_CHARSET;
- lf.lfPitchAndFamily = FIXED_PITCH | VARIABLE_PITCH | FF_DONTCARE;
- strcpy(lf.lfFaceName, font_xp);
- EnumFontFamiliesEx(hdc, &lf, effproc, (LPARAM)&font_xp_ok, 0);
- ReleaseDC(NULL, hdc);
- }
if (os_vista)
font_vista_ok = 1;
- if (os_winnt)
- font_xp_ok = 1;
- fontsdetected = 1;
-}
-
-void scaleresource_setmaxsize(int w, int h)
-{
- detectfonts();
max_w = w;
max_h = h;
mult = 100;
SubSystem="2"
StackReserveSize="2621440"
StackCommitSize="2621440"
+ LargeAddressAware="0"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
/>
AdditionalLibraryDirectories=""
GenerateManifest="true"
AdditionalManifestDependencies=""
- DelayLoadDLLs="setupapi.dll;wpcap.dll;packet.dll"
+ DelayLoadDLLs="wpcap.dll;packet.dll"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\Release/winuae.pdb"
SubSystem="2"
EnableCOMDATFolding="2"
OptimizeForWindows98="0"
LinkTimeCodeGeneration="0"
- RandomizedBaseAddress="1"
+ RandomizedBaseAddress="2"
FixedBaseAddress="1"
DataExecutionPrevention="2"
TargetMachine="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
AdditionalIncludeDirectories="..\..\include,..\..,..\,..\resources,..\osdep,..\sounddep,..\..\prowizard\include"
- PreprocessorDefinitions="WINVER=0x0500;NDEBUG;_WIN32_IE=0x0500"
+ PreprocessorDefinitions="WINVER=0x0500;NDEBUG;_WIN32_IE=0x0500;WIN32"
StringPooling="true"
ExceptionHandling="0"
BasicRuntimeChecks="0"
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="opengl32.lib glu32.lib ws2_32.lib ddraw.lib dxguid.lib winmm.lib comctl32.lib version.lib vfw32.lib msacm32.lib dsound.lib dinput8.lib d3d9.lib winio.lib setupapi.lib wininet.lib dxerr8.lib shlwapi.lib zlibstat.lib libpng.lib lglcd.lib"
+ AdditionalDependencies="opengl32.lib glu32.lib ws2_32.lib ddraw.lib dxguid.lib winmm.lib comctl32.lib version.lib vfw32.lib msacm32.lib dsound.lib dinput8.lib d3d9.lib winio.lib setupapi.lib wininet.lib dxerr9.lib shlwapi.lib zlibstat.lib libpng.lib lglcd.lib wpcap.lib packet.lib"
OutputFile="d:\amiga\winuae.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
AdditionalLibraryDirectories=""
GenerateManifest="true"
AdditionalManifestDependencies=""
- DelayLoadDLLs="setupapi.dll"
+ DelayLoadDLLs="wpcap.dll;packet.dll"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\FullRelease/winuae.pdb"
SubSystem="2"
EnableCOMDATFolding="2"
OptimizeForWindows98="0"
LinkTimeCodeGeneration="1"
- RandomizedBaseAddress="1"
+ RandomizedBaseAddress="2"
+ FixedBaseAddress="1"
DataExecutionPrevention="2"
- TargetMachine="0"
+ TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
>
<File
- RelativePath="..\..\compemu.c"
+ RelativePath="..\..\jit\compemu.c"
>
</File>
<File
- RelativePath="..\..\compemu_fpp.c"
+ RelativePath="..\..\jit\compemu_fpp.c"
>
</File>
<File
- RelativePath="..\..\compemu_support.c"
+ RelativePath="..\..\jit\compemu_support.c"
>
</File>
<File
- RelativePath="..\..\compstbl.c"
+ RelativePath="..\..\jit\compstbl.c"
>
</File>
</Filter>
+Beta 2:
+
+- Weird Dreams sound problem (hospital scene when game is starting)
+
+
+Beta 1: (possible big changes in future betas)
+
+- MSVC 2008 compiled. Does not run on Windows 98/ME anymore.
+- debugger sprite dump command added (sp <addr> [<addr2>] [<size])
+- A3000 2.04 revision number fixed. It really is 37.175.
+- DOS HD floppy image crash fixed
+- PCMCIA SRAM card emulation. SCRAM "HD controller" in harddrive panel
+ (other HD parameters are ignored) Hot-swapping supported.
+ Note 1: Amiga PCMCIA slot supports max 4M of directly addressable RAM
+ and you can't have more than 4M of (non-32bit) fast RAM at the same
+ time. Note 2: real PCMCIA SRAM card in PCMCIA/CardBus slot is not
+ supported yet. I need SRAM card to implement it (or good
+ documentation)
+- rom scanner odd/even split and byteswapped rom support. Does not
+ include: AR2/3/1200 ROMs (no real rom dumps available), Arcadia ROMs
+ (not worth the trouble) or "non-rom roms" like Cloanto ROMs.
+- rom scanner data in registry changed, added human-readable names
+ NOTE: You need to manually rescan roms if you need to use 1.4.6 or
+ older WinUAE versions
+- EXTB.L was 68000+ when it should have been 68020+ (bug since the
+ beginning and more)
+- Gayle interrupt handling rewritten to match preliminary datasheet.
+ This solved remaining PCMCIA problems. This can also fix possible
+ problems with IDE emulation with specific device driver versions
+- uaenet.device NSCMD_DEVICEQUERY fixed (didn't work and/or corrupted
+ memory) S2_ADDMULTICASTADDRESSES and S2_DELMULTICASTADDRESSES had
+ wrong command number
+- uaenet.device random deadlock fixed
+- really ugly uaenet.device interrupt handler setup replaced with
+ proper exec.library AddIntServer() call
+- added NSCMD_DEVICEQUERY to uaeserial.device
+- added some sanity checks to emulated devices' open function
+- Quickstart boot disk check does not complain anymore if track zero
+ has errors but sectors 0 and 1 are ok
+- multithreaded avioutput (finally). Video/audio encoding now runs
+ in separate thread, MUCH faster encoding on 2+ core CPUs
+ Note: null filter recommended (or any other 2d filter), non-filter
+ mode requires reads from display RAM which is very slow
+- GUI debugger improvements (Karsten Bock)
+
+
+1.4.6
1.4.6 will be the last Windows 98/ME compatible version. 1.5.0
will require Windows 2000 or newer.
static int cs_init;
FILE *debugfile = NULL;
-int console_logging;
+int console_logging = 0;
static LONG debugger_type = -1;
+extern BOOL debuggerinitializing;
#define WRITE_LOG_BUF_SIZE 4096
static void openconsole(void)
{
if (debugger_active && (debugger_type < 0 || debugger_type == 2)) {
- if (consoleopen > 0)
+ if (consoleopen > 0 || debuggerinitializing)
return;
if (debugger_type < 0) {
regqueryint (NULL, "DebuggerType", &debugger_type);
#include "uae.h"
#include "sana2.h"
#include "win32_uaenet.h"
+#include "execio.h"
#define SANA2NAME "uaenet.device"
#define MAX_ASYNC_REQUESTS 200
#define MAX_OPEN_DEVICES 20
-#define CMD_READ 2
-#define CMD_WRITE 3
-#define CMD_FLUSH 8
-#define CMD_NONSTD 9
#define S2_START (CMD_NONSTD) // 9
#define S2_DEVICEQUERY (S2_START+ 0) // 9
#define S2_GETSTATIONADDRESS (S2_START+ 1) // 10
#define S2_READORPHAN (S2_START+15) // 24
#define S2_ONLINE (S2_START+16) // 25
#define S2_OFFLINE (S2_START+17) // 26
-#define S2_ADDMULTICASTADDRESSES (CMD_NONSTD + 0xc000)
-#define S2_DELMULTICASTADDRESSES (CMD_NONSTD + 0xc001)
+#define S2_ADDMULTICASTADDRESSES 0xC000
+#define S2_DELMULTICASTADDRESSES 0xC001
+#define S2_GETPEERADDRESS 0xC002
+#define S2_GETDNSADDRESS 0xC003
+#define S2_GETEXTENDEDGLOBALSTATS 0xC004
+#define S2_CONNECT 0xC005
+#define S2_DISCONNECT 0xC006
+#define S2_SAMPLE_THROUGHPUT 0xC007
#define S2WireType_Ethernet 1
#define S2WireType_IEEE802 6
#define KNOWN_EVENTS (S2EVENT_ERROR|S2EVENT_TX|S2EVENT_RX|S2EVENT_ONLINE|\
S2EVENT_OFFLINE|S2EVENT_BUFF|S2EVENT_HARDWARE|S2EVENT_SOFTWARE)
-#define DRIVE_NEWSTYLE 0x4E535459L /* 'NSTY' */
-#define NSCMD_DEVICEQUERY 0x4000
-
#define SANA2OPB_MINE 0
#define SANA2OPF_MINE (1<<SANA2OPB_MINE)
#define SANA2OPB_PROM 1
#define SANA2IOB_MCAST 5
#define SANA2IOF_MCAST (1<<SANA2IOB_MCAST)
-#define TAG_DONE 0
-#define TAG_IGNORE 1
-#define TAG_MORE 2
-#define TAG_SKIP 3
-#define TAG_USER (1 << 31)
#define S2_Dummy (TAG_USER + 0xB0000)
#define S2_CopyToBuff (S2_Dummy + 1)
#define S2_CopyFromBuff (S2_Dummy + 2)
#define S2_DMACopyToBuff32 (S2_Dummy + 8)
#define S2_DMACopyFromBuff32 (S2_Dummy + 9)
+#define SANA2_IOREQSIZE (32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4 + 4 + 4 + 4)
+
struct s2packet {
struct s2packet *next;
uae_u8 *data;
volatile int uaenet_int_requested;
volatile int uaenet_vsync_requested;
+static int uaenet_int_late;
static uaecptr timerdevname;
+static uaecptr ROM_netdev_resname = 0,
+ ROM_netdev_resid = 0,
+ ROM_netdev_init = 0;
+
static char *getdevname (void)
{
return "uaenet.device";
};
struct devstruct {
- int unitnum, unit, opencnt, exclusive, promiscuous;
+ int unit, opencnt, exclusive, promiscuous;
struct asyncreq *ar;
struct asyncreq *s2p;
struct mcast *mc;
struct netdriverdata *td;
struct s2packet *readqueue;
uae_u8 mac[ADDR_SIZE];
+ int flush_timeout;
+ int flush_timeout_cnt;
};
+#define FLUSH_TIMEOUT 20
+
struct priv_devstruct {
int inuse;
int unit;
struct priv_devstruct *pdev = getpdevstruct (request);
struct devstruct *dev;
- if (!pdev)
+ if (!pdev) {
+ write_log ("%s close with unknown request %08X!?\n", SANA2NAME, request);
return 0;
+ }
dev = getdevstruct (pdev->unit);
- if (log_net)
- write_log ("%s:%d close, req=%08.8X\n", SANA2NAME, pdev->unit, request);
- if (!dev)
+ if (!dev) {
+ write_log ("%s:%d close with unknown request %08X!?\n", SANA2NAME, pdev->unit, request);
return 0;
+ }
+ if (log_net)
+ write_log ("%s:%d close, open=%d req=%08X\n", SANA2NAME, pdev->unit, dev->opencnt, request);
put_long (request + 24, 0);
dev->opencnt--;
pdev->inuse = 0;
xfree (dev->sysdata);
dev->sysdata = NULL;
write_comm_pipe_u32 (&dev->requests, 0, 1);
- write_log ("%s: all instances closed\n", SANA2NAME);
+ write_log ("%s: opencnt == 0, all instances closed\n", SANA2NAME);
}
put_word (m68k_areg (&context->regs, 6) + 32, get_word (m68k_areg (&context->regs, 6) + 32) - 1);
return 0;
put_long (ioreq + 20, -1);
put_byte (ioreq + 31, error);
put_long (ioreq + 32, 0); /* io_device */
+ if (log_net)
+ write_log("-> failed with error %d\n", error);
return (uae_u32)-1;
}
/* AARGHHH!! */
static uae_u32 REGPARAM2 uaenet_int_handler (TrapContext *ctx);
-static void initint (TrapContext *ctx)
+static int irq_init;
+static int initint (TrapContext *ctx)
{
uae_u32 tmp1;
- static int init;
+ uaecptr p;
- if (init)
- return;
- init = 1;
+ if (irq_init)
+ return 1;
+ m68k_dreg (&ctx->regs, 0) = 26;
+ m68k_dreg (&ctx->regs, 1) = 65536 + 1;
+ p = CallLib (ctx, get_long (4), -0xC6); /* AllocMem */
+ if (!p)
+ return 0;
tmp1 = here ();
- calltrap (deftrap2 (uaenet_int_handler, TRAPFLAG_EXTRA_STACK | TRAPFLAG_NO_RETVAL, "uaenet_STUPID_int_handler"));
- dw (0x4ef9);
- dl (get_long (ctx->regs.vbr + 0x78));
- put_long (ctx->regs.vbr + 0x78, tmp1);
+ calltrap (deftrap2 (uaenet_int_handler, TRAPFLAG_EXTRA_STACK, "uaenet_int_handler"));
+ put_word (p + 8, 0x020a);
+ put_long (p + 10, ROM_netdev_resid);
+ put_long (p + 18, tmp1);
+ m68k_areg (&ctx->regs, 1) = p;
+ m68k_dreg (&ctx->regs, 0) = 13; /* EXTER */
+ dw (0x4a80); /* TST.L D0 */
+ dw (0x4e75); /* RTS */
+ CallLib (ctx, get_long (4), -168); /* AddIntServer */
+ irq_init = 1;
+ return 1;
}
static uae_u32 REGPARAM2 dev_open_2 (TrapContext *context)
uaecptr ioreq = m68k_areg (&context->regs, 1);
uae_u32 unit = m68k_dreg (&context->regs, 0);
uae_u32 flags = m68k_dreg (&context->regs, 1);
- uaecptr buffermgmt = get_long (ioreq + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4 + 4 + 4);
+ uaecptr buffermgmt;
struct devstruct *dev = getdevstruct (unit);
struct priv_devstruct *pdev = 0;
int i;
uaecptr tagp, tagpnext;
- initint(context);
- if (log_net)
- write_log ("opening %s:%d ioreq=%08.8X\n", SANA2NAME, unit, ioreq);
if (!dev)
- return openfail (ioreq, 32); /* badunitnum */
- if (get_word (ioreq + 0x12) < 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4 + 4 + 4 + 4)
- return openfail (ioreq, -1); /* too small iorequest */
-
- if (!buffermgmt)
- return openfail (ioreq, S2ERR_BAD_ARGUMENT);
+ return openfail (ioreq, IOERR_OPENFAIL);
+ if (!initint(context))
+ return openfail (ioreq, IOERR_SELFTEST);
+ if (log_net)
+ write_log ("opening %s:%d opencnt=%d ioreq=%08X\n", SANA2NAME, unit, dev->opencnt, ioreq);
+ if (get_word (ioreq + 0x12) < IOSTDREQ_SIZE)
+ return openfail (ioreq, IOERR_BADLENGTH);
if ((flags & SANA2OPF_PROM) && dev->opencnt > 0)
- return openfail (ioreq, -6); /* busy */
+ return openfail (ioreq, IOERR_UNITBUSY);
for (i = 0; i < MAX_OPEN_DEVICES; i++) {
pdev = &pdevst[i];
break;
}
if (i == MAX_OPEN_DEVICES)
- return openfail (ioreq, -6);
+ return openfail (ioreq, IOERR_UNITBUSY);
put_long (ioreq + 24, pdev - pdevst);
pdev->unit = unit;
pdev->promiscuous = (flags & SANA2OPF_PROM) ? 1 : 0;
if (pdev->td->active == 0)
- return openfail (ioreq, 32); /* badunit, no adapter */
+ return openfail (ioreq, IOERR_OPENFAIL);
- dev->opencnt = get_word (m68k_areg (&context->regs, 6) + 32);
if (dev->opencnt == 0) {
dev->unit = unit;
dev->sysdata = xcalloc (uaenet_getdatalenght(), 1);
if (!uaenet_open (dev->sysdata, pdev->td, dev, pdev->promiscuous)) {
xfree (dev->sysdata);
dev->sysdata = NULL;
- return openfail (ioreq, 32); /* badunitnum */
+ return openfail (ioreq, IOERR_OPENFAIL);
}
write_log ("%s: initializing unit %d\n", getdevname (), unit);
dev->td = pdev->td;
dev->adapter = pdev->td->active;
+ if (dev->adapter) {
+ dev->online = 1;
+ dev->configured = 1;
+ }
start_thread (dev);
}
}
pdev->copyfrombuff = pdev->copytobuff = pdev->packetfilter = 0;
- tagpnext = buffermgmt;
- while (tagpnext) {
- uae_u32 tag = get_long (tagpnext);
- uae_u32 val = get_long (tagpnext + 4);
- tagp = tagpnext;
- tagpnext += 8;
- switch (tag)
- {
- case TAG_DONE:
- tagpnext = 0;
- break;
- case TAG_IGNORE:
- break;
- case TAG_MORE:
- tagpnext = val;
- break;
- case TAG_SKIP:
- tagpnext = tagp + val * 8;
- break;
- case S2_CopyToBuff:
- pdev->copytobuff = val;
- break;
- case S2_CopyFromBuff:
- pdev->copyfrombuff = val;
- break;
- case S2_PacketFilter:
- pdev->packetfilter = val;
- break;
- }
- }
- if (log_net)
- write_log("%s:%d CTB=%08x CFB=%08x PF=%08x\n",
- getdevname(), unit,
- pdev->copytobuff, pdev->copyfrombuff, pdev->packetfilter);
- if (!pdev->copyfrombuff || !pdev->copyfrombuff) {
- if (dev->opencnt == 0) {
- uaenet_close (dev->sysdata);
- xfree (dev->sysdata);
- dev->sysdata = NULL;
+ pdev->tempbuf = 0;
+ if (get_word (ioreq + 0x12) >= SANA2_IOREQSIZE) {
+ buffermgmt = get_long (ioreq + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4 + 4 + 4);
+ tagpnext = buffermgmt;
+ while (tagpnext) {
+ uae_u32 tag = get_long (tagpnext);
+ uae_u32 val = get_long (tagpnext + 4);
+ tagp = tagpnext;
+ tagpnext += 8;
+ switch (tag)
+ {
+ case TAG_DONE:
+ tagpnext = 0;
+ break;
+ case TAG_IGNORE:
+ break;
+ case TAG_MORE:
+ tagpnext = val;
+ break;
+ case TAG_SKIP:
+ tagpnext = tagp + val * 8;
+ break;
+ case S2_CopyToBuff:
+ pdev->copytobuff = val;
+ break;
+ case S2_CopyFromBuff:
+ pdev->copyfrombuff = val;
+ break;
+ case S2_PacketFilter:
+ pdev->packetfilter = val;
+ break;
+ }
}
- return openfail (ioreq, S2ERR_BAD_ARGUMENT);
- }
- m68k_dreg (&context->regs, 0) = dev->td->mtu + ETH_HEADER_SIZE + 2;
- m68k_dreg (&context->regs, 1) = 1;
- pdev->tempbuf = CallLib (context, get_long (4), -0xC6); /* AllocMem */
- if (!pdev->tempbuf) {
- if (dev->opencnt == 0) {
- uaenet_close (dev->sysdata);
- xfree (dev->sysdata);
- dev->sysdata = NULL;
+ if (log_net)
+ write_log("%s:%d CTB=%08x CFB=%08x PF=%08x\n",
+ getdevname(), unit, pdev->copytobuff, pdev->copyfrombuff, pdev->packetfilter);
+ m68k_dreg (&context->regs, 0) = dev->td->mtu + ETH_HEADER_SIZE + 2;
+ m68k_dreg (&context->regs, 1) = 1;
+ pdev->tempbuf = CallLib (context, get_long (4), -0xC6); /* AllocMem */
+ if (!pdev->tempbuf) {
+ if (dev->opencnt == 0) {
+ uaenet_close (dev->sysdata);
+ xfree (dev->sysdata);
+ dev->sysdata = NULL;
+ }
+ return openfail (ioreq, S2ERR_BAD_ARGUMENT);
}
- return openfail (ioreq, S2ERR_BAD_ARGUMENT);
+ /* buffermanagement */
+ put_long (ioreq + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4 + 4 + 4, pdev->tempbuf);
}
- /* buffermanagement */
- put_long (ioreq + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4 + 4 + 4, pdev->tempbuf);
dev->exclusive = flags & SANA2OPF_MINE;
dev->opencnt++;
- put_word (m68k_areg (&context->regs, 6) + 32, dev->opencnt);
+ put_word (m68k_areg (&context->regs, 6) + 32, get_word (m68k_areg (&context->regs, 6) + 32) + 1);
put_byte (ioreq + 31, 0);
put_byte (ioreq + 8, 7);
return 0;
static void do_abort_async (struct devstruct *dev, uaecptr request)
{
- put_byte (request + 31, -2);
put_byte (request + 30, get_byte (request + 30) | 0x20);
+ put_byte (request + 31, IOERR_ABORTED);
+ put_long (request + 32, S2WERR_GENERIC_ERROR);
write_comm_pipe_u32 (&dev->requests, request, 1);
}
}
}
-static int dev_do_io (struct devstruct *dev, uaecptr request, int quick)
+static int dev_do_io_2 (struct devstruct *dev, uaecptr request, int quick)
{
uae_u8 flags = get_byte (request + 30);
uae_u32 command = get_word (request + 28);
struct priv_devstruct *pdev = getpdevstruct (request);
if (log_net)
- write_log ("S2: C=%02d T=%04X S=%02X%02X%02X%02X%02X%02X D=%02X%02X%02X%02X%02X%02X LEN=%d\n",
+ write_log ("S2: C=%02d T=%04X S=%02X%02X%02X%02X%02X%02X D=%02X%02X%02X%02X%02X%02X L=%d D=%08X SD=%08X BM=%08X\n",
command, packettype,
get_byte (srcaddr + 0), get_byte (srcaddr + 1), get_byte (srcaddr + 2), get_byte (srcaddr + 3), get_byte (srcaddr + 4), get_byte (srcaddr + 5),
get_byte (dstaddr + 0), get_byte (dstaddr + 1), get_byte (dstaddr + 2), get_byte (dstaddr + 3), get_byte (dstaddr + 4), get_byte (dstaddr + 5),
- datalength);
- if (!pdev) {
- write_log ("%s unknown iorequest %08x\n", getdevname (), request);
- return 0;
- }
+ datalength, data, statdata, buffermgmt);
+ if (command == CMD_READ || command == S2_READORPHAN || command == CMD_WRITE || command == S2_BROADCAST || command == S2_MULTICAST) {
+ if (!pdev->copyfrombuff || !pdev->copytobuff) {
+ io_error = S2ERR_BAD_ARGUMENT;
+ wire_error = S2WERR_BUFF_ERROR;
+ goto end;
+ }
+ }
switch (command)
{
- case NSCMD_DEVICEQUERY:
- put_long (data + 4, 16); /* size */
- put_word (data + 8, 7); /* NSDEVTYPE_SANA2 */
- put_word (data + 10, 0);
- put_long (data + 12, nscmd_cmd);
- put_long (data + 32, 16);
- break;
-
case CMD_READ:
if (!dev->online)
goto offline;
break;
case CMD_FLUSH:
+ dev->flush_timeout_cnt = 0;
+ dev->flush_timeout = FLUSH_TIMEOUT;
if (log_net)
- write_log ("flush started %08x\n", request);
+ write_log ("CMD_FLUSH started %08x\n", request);
uae_sem_wait (&async_sem);
flush (pdev);
uae_sem_post (&async_sem);
wire_error = S2WERR_IS_CONFIGURED;
} else {
dev->configured = TRUE;
- for (i = 0; i < ADDR_SIZE; i++)
- dev->mac[i] = get_byte (srcaddr + i);
}
break;
case S2_ONLINE:
-#if 0
if (!dev->configured) {
io_error = S2ERR_BAD_STATE;
wire_error = S2WERR_NOT_CONFIGURED;
}
-#endif
if (!dev->adapter) {
io_error = S2ERR_OUTOFSERVICE;
wire_error = S2WERR_RCVREL_HDW_ERR;
}
- if (!io_error && !dev->online) {
+ if (!io_error) {
uaenet_vsync_requested++;
async = 1;
}
break;
default:
- io_error = -3;
+ io_error = IOERR_NOCMD;
break;
offline:
return async;
}
+static int dev_do_io (struct devstruct *dev, uaecptr request, int quick)
+{
+ uae_u32 command = get_word (request + 28);
+ struct priv_devstruct *pdev = getpdevstruct (request);
+ uaecptr data = get_long (request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4);
+
+ put_byte (request + 31, 0);
+ if (!pdev) {
+ write_log ("%s unknown iorequest %08x\n", getdevname (), request);
+ return 0;
+ }
+ if (command == NSCMD_DEVICEQUERY) {
+ uae_u32 data = get_long (request + 40); /* io_data */
+ put_long (data + 0, 0);
+ put_long (data + 4, 16); /* size */
+ put_word (data + 8, 7); /* NSDEVTYPE_SANA2 */
+ put_word (data + 10, 0);
+ put_long (data + 12, nscmd_cmd);
+ put_long (request + 32, 16); /* io_actual */
+ return 0;
+ } else if (get_word (request + 0x12) < SANA2_IOREQSIZE) {
+ put_byte (request + 31, IOERR_BADLENGTH);
+ return 0;
+ }
+ return dev_do_io_2 (dev, request, quick);
+}
+
static int dev_can_quick (uae_u32 command)
{
switch (command)
} else {
if (command == CMD_WRITE || command == S2_BROADCAST || command == S2_MULTICAST) {
struct s2packet *s2p;
- uae_sem_wait (&async_sem);
- if (command == S2_BROADCAST) {
- uaecptr dstaddr = request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES;
- put_byte (dstaddr + 0, 0xff);
- put_byte (dstaddr + 1, 0xff);
- put_byte (dstaddr + 2, 0xff);
- put_byte (dstaddr + 3, 0xff);
- put_byte (dstaddr + 4, 0xff);
- put_byte (dstaddr + 5, 0xff);
- }
- s2p = createwritepacket (context, request);
- if (s2p)
- add_async_packet (dev, s2p, request);
- uae_sem_post (&async_sem);
- if (!s2p) {
- put_long (request + 32, S2WERR_BUFF_ERROR);
- put_byte (request + 31, S2ERR_NO_RESOURCES);
+ if (!pdev->copyfrombuff || !pdev->copytobuff) {
+ put_long (request + 32, S2ERR_BAD_ARGUMENT);
+ put_byte (request + 31, S2WERR_BUFF_ERROR);
+ } else {
+ if (command == S2_BROADCAST) {
+ uaecptr dstaddr = request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES;
+ put_byte (dstaddr + 0, 0xff);
+ put_byte (dstaddr + 1, 0xff);
+ put_byte (dstaddr + 2, 0xff);
+ put_byte (dstaddr + 3, 0xff);
+ put_byte (dstaddr + 4, 0xff);
+ put_byte (dstaddr + 5, 0xff);
+ }
+ s2p = createwritepacket (context, request);
+ if (s2p) {
+ uae_sem_wait (&async_sem);
+ add_async_packet (dev, s2p, request);
+ uae_sem_post (&async_sem);
+ }
+ if (!s2p) {
+ put_long (request + 32, S2WERR_BUFF_ERROR);
+ put_byte (request + 31, S2ERR_NO_RESOURCES);
+ }
}
}
put_byte (request + 30, get_byte (request + 30) & ~1);
int gotit;
struct asyncreq *ar;
- uae_sem_wait (&async_sem);
+ if (uae_sem_trywait (&async_sem)) {
+ uaenet_int_requested = 0;
+ uaenet_int_late = 1;
+ return 0;
+ }
for (i = 0; i < MAX_OPEN_DEVICES; i++)
pdevst[i].tmp = 0;
/* do not reply CMD_FLUSH until all other requests are gone */
if (dev->ar->next == NULL) {
if (log_net)
- write_log ("flush replied %08x\n", request);
+ write_log ("CMD_FLUSH replied %08x\n", request);
write_comm_pipe_u32 (&dev->requests, request, 1);
uaenet_vsync_requested--;
} else {
- static int cnt;
struct priv_devstruct *pdev = getpdevstruct (request);
if (pdev) {
- cnt--;
- if (cnt <= 0) {
- if (log_net)
- write_log ("flushing %08x..\n", request);
- cnt = 25;
+ dev->flush_timeout--;
+ if (dev->flush_timeout <= 0) {
+ dev->flush_timeout = FLUSH_TIMEOUT;
+ if (dev->flush_timeout_cnt > 1)
+ write_log ("WARNING: %s:%d CMD_FLUSH possibly frozen..\n", getdevname(), pdev->unit);
+ dev->flush_timeout_cnt++;
flush (pdev);
}
}
ar = ar->next;
}
}
-
- uaenet_int_requested = 0;
+ if (uaenet_int_late)
+ uaenet_int_requested = 1;
+ else
+ uaenet_int_requested = 0;
+ uaenet_int_late = 0;
uae_sem_post (&async_sem);
return ours;
}
while (dev->mc)
delmulticastaddresses (dev, dev->mc->start, dev->mc->end);
memset (dev, 0, sizeof (struct devstruct));
- dev->unitnum = -1;
}
for (i = 0; i < MAX_OPEN_DEVICES; i++)
memset (&pdevst[i], 0, sizeof (struct priv_devstruct));
uaenet_vsync_requested = 0;
uaenet_int_requested = 0;
+ irq_init = 0;
}
-static uaecptr ROM_netdev_resname = 0,
- ROM_netdev_resid = 0,
- ROM_netdev_init = 0;
uaecptr netdev_startup (uaecptr resaddr)
{
uaenet_open_driver (td);
ROM_netdev_resname = ds (getdevname());
- ROM_netdev_resid = ds ("UAE net.device 0.1");
+ ROM_netdev_resid = ds ("UAE net.device 0.2");
timerdevname = ds ("timer.device");
/* initcode */
#include "blkdev.h"
#include "scsidev.h"
#include "uae.h"
+#include "execio.h"
#define CDDEV_COMMANDS
#define MAX_ASYNC_REQUESTS 20
#define MAX_OPEN_DEVICES 20
-#define CMD_INVALID 0
-#define CMD_RESET 1
-#define CMD_READ 2
-#define CMD_WRITE 3
-#define CMD_UPDATE 4
-#define CMD_CLEAR 5
-#define CMD_STOP 6
-#define CMD_START 7
-#define CMD_FLUSH 8
-#define CMD_MOTOR 9
-#define CMD_SEEK 10
-#define CMD_FORMAT 11
-#define CMD_REMOVE 12
-#define CMD_CHANGENUM 13
-#define CMD_CHANGESTATE 14
-#define CMD_PROTSTATUS 15
-#define CMD_GETDRIVETYPE 18
-#define CMD_GETNUMTRACKS 19
-#define CMD_ADDCHANGEINT 20
-#define CMD_REMCHANGEINT 21
-#define CMD_GETGEOMETRY 22
-#define HD_SCSICMD 28
-#define CD_INFO 32
-#define CD_CONFIG 33
-#define CD_TOCMSF 34
-#define CD_TOCLSN 35
-#define CD_READXL 36
-#define CD_PLAYTRACK 37
-#define CD_PLAYMSF 38
-#define CD_PLAYLSN 39
-#define CD_PAUSE 40
-#define CD_SEARCH 41
-#define CD_QCODEMSF 42
-#define CD_QCODELSN 43
-#define CD_ATTENUATE 44
-#define CD_ADDFRAMEINT 45
-#define CD_REMFRAMEINT 46
-
-#define TD_READ64 24
-#define TD_WRITE64 25
-#define TD_SEEK64 26
-#define TD_FORMAT64 27
-
-#define DRIVE_NEWSTYLE 0x4E535459L /* 'NSTY' */
-#define NSCMD_DEVICEQUERY 0x4000
-#define NSCMD_TD_READ64 0xc000
-#define NSCMD_TD_WRITE64 0xc001
-#define NSCMD_TD_SEEK64 0xc002
-#define NSCMD_TD_FORMAT64 0xc003
-
#define ASYNC_REQUEST_NONE 0
#define ASYNC_REQUEST_TEMP 1
#define ASYNC_REQUEST_CHANGEINT 10
-#define ASYNC_REQUEST_FRAMEINT 11
-#define ASYNC_REQUEST_PLAY 12
-#define ASYNC_REQUEST_READXL 13
-#define ASYNC_REQUEST_FRAMECALL 14
struct devstruct {
int unitnum, aunit;
if (log_scsi)
write_log ("opening %s:%d ioreq=%08.8X\n", getdevname (type), unit, ioreq);
+ if (get_word (ioreq + 0x12) < IOSTDREQ_SIZE)
+ return openfail (ioreq, IOERR_BADLENGTH);
if (!dev)
return openfail (ioreq, 32); /* badunitnum */
if (!dev->opencnt) {
pdev->mode = DF_IOCTL;
}
if (!pdev->scsi && !pdev->ioctl)
- return openfail (ioreq, -1);
+ return openfail (ioreq, IOERR_OPENFAIL);
pdev->type = type;
pdev->unit = unit;
pdev->flags = flags;
if (pdev->inuse && pdev->unit == unit) break;
}
if (i == MAX_OPEN_DEVICES)
- return openfail (ioreq, -1);
+ return openfail (ioreq, IOERR_OPENFAIL);
put_long (ioreq + 24, pdev - pdevst);
}
dev->opencnt++;
if (!pdev)
return 0;
- command = get_word (request+28);
+ command = get_word (request + 28);
switch (command)
{
if (log_scsi)
write_log ("scsidev: did io: sdd %p request %p error %d\n", sdd, request, get_byte (request + 31));
} else {
- io_error = -3;
+ io_error = IOERR_NOCMD;
}
break;
case NSCMD_DEVICEQUERY:
+ put_long (io_data + 0, 0);
put_long (io_data + 4, 16); /* size */
- put_word (io_data + 8, 5); /* NSDEVTYPE_TRACKDISK */
+ put_word (io_data + 8, NSDEVTYPE_TRACKDISK);
put_word (io_data + 10, 0);
put_long (io_data + 12, nscmd_cmd);
io_actual = 16;
break;
default:
- io_error = -3;
+ io_error = IOERR_NOCMD;
break;
bad_command:
- io_error = -5; /* IOERR_BADADDRESS */
+ io_error = IOERR_BADADDRESS;
break;
}
put_long (request + 32, io_actual);
put_byte (request + 31, 32);
return get_byte (request + 31);
}
- put_byte (request + 31, -2);
+ put_byte (request + 31, IOERR_ABORTED);
if (log_scsi)
write_log ("abortio %s unit=%d, request=%08.8X\n", getdevname (pdev->type), pdev->unit, request);
- abort_async (dev, request, -2, 0);
+ abort_async (dev, request, IOERR_ABORTED, 0);
return 0;
}
0100 1000 10dd dDDD:00:-----:-----:02: MVMLE.W #1,d[!Dreg,Areg,Aipi]
0100 1000 11dd dDDD:00:-NZ00:-----:30: EXT.L d[Dreg]
0100 1000 11dd dDDD:00:-----:-----:02: MVMLE.L #1,d[!Dreg,Areg,Aipi]
-0100 1001 11dd dDDD:00:-NZ00:-----:30: EXT.B d[Dreg]
+0100 1001 11dd dDDD:20:-NZ00:-----:30: EXT.B d[Dreg]
0100 1010 zzss sSSS:00:-NZ00:-----:10: TST.z s
0100 1010 11dd dDDD:00:?????:?????:30: TAS.B d[!Areg]
0100 1010 1111 1100:00:?????:?????:00: ILLEGAL
static const int trace_traps = 0;
-
static void trap_HandleExtendedTrap (TrapHandler, int has_retval);
/*
static uae_sem_t trap_mutex;
static ExtendedTrapContext *current_context;
-
/*
* Thread body for trap context
*/
#include "native2amiga.h"
#include "uaeserial.h"
#include "serial.h"
+#include "execio.h"
#define MAX_TOTAL_DEVICES 8
int log_uaeserial = 0;
-#define CMD_INVALID 0
-#define CMD_RESET 1
-#define CMD_READ 2
-#define CMD_WRITE 3
-#define CMD_UPDATE 4
-#define CMD_CLEAR 5
-#define CMD_STOP 6
-#define CMD_START 7
-#define CMD_FLUSH 8
#define SDCMD_QUERY 9
#define SDCMD_BREAK 10
#define SDCMD_SETPARAMS 11
};
static int uniq;
-
+static uae_u32 nscmd_cmd;
static struct devstruct devst[MAX_TOTAL_DEVICES];
-
static uae_sem_t change_sem, async_sem;
static char *getdevname (void)
struct devstruct *dev;
int i, err;
+ if (get_word (ioreq + 0x12) < IOSTDREQ_SIZE)
+ return openfail (ioreq, IOERR_BADLENGTH);
for (i = 0; i < MAX_TOTAL_DEVICES; i++) {
if (devst[i].open && devst[i].unit == unit && devst[i].exclusive)
- return openfail (ioreq, -6); /* busy */
+ return openfail (ioreq, IOERR_UNITBUSY);
}
for (i = 0; i < MAX_TOTAL_DEVICES; i++) {
if (!devst[i].open)
break;
}
if (i == MAX_TOTAL_DEVICES)
- return openfail (ioreq, 32); /* badunitnum */
+ return openfail (ioreq, IOERR_OPENFAIL);
dev = &devst[i];
dev->sysdata = xcalloc (uaeser_getdatalenght(), 1);
if (!uaeser_open (dev->sysdata, dev, unit)) {
xfree (dev->sysdata);
- return openfail (ioreq, 32); /* badunitnum */
+ return openfail (ioreq, IOERR_OPENFAIL);
}
dev->unit = unit;
dev->open = 1;
}
if (log_uaeserial)
write_log ("%s:%d asyncronous request=%08.8X aborted\n", getdevname(), dev->unit, request);
- put_byte (request + 31, -2);
+ put_byte (request + 31, IOERR_ABORTED);
put_byte (request + 30, get_byte (request + 30) | 0x20);
write_comm_pipe_u32 (&dev->requests, request, 1);
}
io_done = 1;
}
} else {
- io_error = -6;
+ io_error = IOERR_BADADDRESS;
io_done = 1;
}
}
break;
case CMD_WRITE:
if (sigmask & 2) {
- io_error = -5;
+ io_error = IOERR_BADADDRESS;
addr = memmap(io_data, io_length);
if (addr && uaeser_write (dev->sysdata, addr, io_length))
io_error = 0;
if (uaeser_query (dev->sysdata, &io_status, &io_actual))
put_byte (request + io_Status, io_status);
else
- io_error = -5;
+ io_error = IOERR_BADADDRESS;
break;
case SDCMD_SETPARAMS:
io_error = setparams(dev, request);
case CMD_START:
case CMD_STOP:
break;
+ case NSCMD_DEVICEQUERY:
+ put_long (io_data + 0, 0);
+ put_long (io_data + 4, 16); /* size */
+ put_word (io_data + 8, NSDEVTYPE_SERIAL);
+ put_word (io_data + 10, 0);
+ put_long (io_data + 12, nscmd_cmd);
+ io_actual = 16;
+ break;
default:
- io_error = -3;
+ io_error = IOERR_NOCMD;
break;
}
put_long (request + 32, io_actual);
dl (functable);
dl (datatable);
dl (initcode);
+
+ nscmd_cmd = here ();
+ dw (NSCMD_DEVICEQUERY);
+ dw (CMD_RESET);
+ dw (CMD_READ);
+ dw (CMD_WRITE);
+ dw (CMD_CLEAR);
+ dw (CMD_START);
+ dw (CMD_STOP);
+ dw (CMD_FLUSH);
+ dw (SDCMD_BREAK);
+ dw (SDCMD_SETPARAMS);
+ dw (SDCMD_QUERY);
+ dw (0);
}
void uaeserialdev_start_threads (void)