28.05.2010

parent 02a1469e
......@@ -14,8 +14,7 @@ DIST_SUBDIRS = \
gui-none gui-beos gui-cocoa gui-gtk gui-muirexx \
od-generic od-amiga od-beos od-linux od-macosx od-win32 \
td-none td-amigaos td-beos td-posix td-sdl td-win32 \
keymap \
caps dms
keymap caps dms
BUILT_SOURCES = \
blit.h blitfunc.h blitfunc.c blittable.c \
......
......@@ -319,8 +319,7 @@ DIST_SUBDIRS = \
gui-none gui-beos gui-cocoa gui-gtk gui-muirexx \
od-generic od-amiga od-beos od-linux od-macosx od-win32 \
td-none td-amigaos td-beos td-posix td-sdl td-win32 \
keymap \
caps dms
keymap caps dms
BUILT_SOURCES = \
blit.h blitfunc.h blitfunc.c blittable.c \
......
......@@ -402,7 +402,7 @@ static int qcode_valid;
static int cdrom_disk, cdrom_paused, cdrom_playing;
static int cdrom_command_active;
static int cdrom_command_length;
static int cdrom_checksum_error;
static int cdrom_checksum_error, cdrom_unknown_command;
static int cdrom_data_offset, cdrom_speed, cdrom_sector_counter;
static int cdrom_current_sector, cdrom_seek_delay;
static int cdrom_data_end, cdrom_leadout;
......@@ -788,8 +788,8 @@ static int cdrom_command_led (void)
static int cdrom_command_media_status (void)
{
cdrom_result_buffer[0] = 10;
cdrom_result_buffer[1] = sys_command_ismedia (DF_IOCTL, unitnum, 0);
cdrom_result_buffer[0] = 0x0a;
cdrom_result_buffer[1] = sys_command_ismedia (DF_IOCTL, unitnum, 0) ? 0x83: 0x80;
return 2;
}
......@@ -942,6 +942,8 @@ static void cdrom_run_command (void)
uae_u8 checksum;
uae_u8 *pp = get_real_address (cdtx_address);
if (!(cdrom_flags & CDFLAG_TXD))
return;
for (;;) {
if (cdrom_command_active)
return;
......@@ -953,13 +955,20 @@ static void cdrom_run_command (void)
return;
}
cdrom_checksum_error = 0;
cdrom_unknown_command = 0;
cmd_len = command_lengths[cdrom_command & 0x0f];
if (cmd_len < 0) {
#if AKIKO_DEBUG_IO_CMD
write_log ("unknown command\n");
write_log ("unknown command %x\n", cdrom_command & 0x0f);
#endif
cmd_len = 1;
cdrom_unknown_command = 1;
cdrom_command_active = 1;
cdrom_command_length = 1;
set_status (CDINTERRUPT_TXDMADONE);
return;
}
#if AKIKO_DEBUG_IO_CMD
write_log ("IN:");
#endif
......@@ -1020,7 +1029,7 @@ static void cdrom_run_command_run (void)
}
if (len == 0)
return;
if (cdrom_checksum_error)
if (cdrom_checksum_error || cdrom_unknown_command)
cdrom_result_buffer[1] |= 0x80;
cdrom_start_return_data (len);
}
......
......@@ -558,7 +558,6 @@ static void led_vsync (void)
v = led_cycles_on * 255 / led_cycles_off;
else
v = 255;
if (v < 0)
v = 0;
if (v > 255)
......
......@@ -367,7 +367,6 @@ STATIC_INLINE int comp_fp_put (uae_u32 opcode, uae_u16 extra)
return -1;
}
}
switch (size) {
case 0: /* Long */
fmovi_mrb((uae_u32)temp_fp,sreg, clamp_bounds.l);
......@@ -483,7 +482,6 @@ void comp_fscc_opp (uae_u32 opcode, uae_u16 extra)
mov_l_ri(S1,255);
mov_l_ri(S4,0);
switch (extra & 0x0f) { /* according to fpp.c, the 0x10 bit is ignored */
case 0: break; /* set never */
case 1:
......@@ -609,32 +607,51 @@ void comp_fbcc_opp (uae_u32 opcode)
cmov_l_rr(PC_P,S1,4);
cmov_l_rr(PC_P,S2,10);
break;
case 2: register_branch(v1,v2,7); break;
case 3: register_branch(v1,v2,3); break;
case 4:
mov_l_rr(S2,PC_P);
cmov_l_rr(PC_P,S1,2);
cmov_l_rr(PC_P,S2,10); break;
case 5:
mov_l_rr(S2,PC_P);
cmov_l_rr(PC_P,S1,6);
cmov_l_rr(PC_P,S2,10); break;
case 6: register_branch(v1,v2,5); break;
case 7: register_branch(v1,v2,11); break;
case 8: register_branch(v1,v2,10); break;
case 9: register_branch(v1,v2,4); break;
case 10:
cmov_l_rr(PC_P,S1,10);
cmov_l_rr(PC_P,S1,7); break;
case 11:
cmov_l_rr(PC_P,S1,4);
cmov_l_rr(PC_P,S1,3); break;
case 12: register_branch(v1,v2,2); break;
case 13: register_branch(v1,v2,6); break;
case 14:
cmov_l_rr(PC_P,S1,5);
cmov_l_rr(PC_P,S1,10); break;
case 15: mov_l_rr(PC_P,S1); break;
case 2: register_branch(v1,v2,7); break;
case 3: register_branch(v1,v2,3); break;
case 4:
mov_l_rr(S2,PC_P);
cmov_l_rr(PC_P,S1,2);
cmov_l_rr(PC_P,S2,10);
break;
case 5:
mov_l_rr(S2,PC_P);
cmov_l_rr(PC_P,S1,6);
cmov_l_rr(PC_P,S2,10);
break;
case 6:
register_branch(v1,v2,5);
break;
case 7:
register_branch(v1,v2,11);
break;
case 8:
register_branch(v1,v2,10);
break;
case 9:
register_branch(v1,v2,4);
break;
case 10:
cmov_l_rr(PC_P,S1,10);
cmov_l_rr(PC_P,S1,7);
break;
case 11:
cmov_l_rr(PC_P,S1,4);
cmov_l_rr(PC_P,S1,3);
break;
case 12:
register_branch(v1,v2,2);
break;
case 13:
register_branch(v1,v2,6);
break;
case 14:
cmov_l_rr(PC_P,S1,5);
cmov_l_rr(PC_P,S1,10);
break;
case 15:
mov_l_rr(PC_P,S1);
break;
}
}
......@@ -909,7 +926,8 @@ void comp_fpp_opp (uae_u32 opcode, uae_u16 extra)
abort();
}
if (incr < 0) { // not reached
if (incr < 0) {
// not reached
for (reg = 7; reg >= 0; reg--) {
if (list & 0x80) {
sub_l_ri(ad,4);
......
......@@ -2678,7 +2678,7 @@ static int islinetoggle (void)
static int isvsync (void)
{
if (!currprefs.gfx_afullscreen || picasso_on || !currprefs.gfx_avsync)
if (currprefs.gfx_afullscreen != GFX_FULLSCREEN || picasso_on || !currprefs.gfx_avsync)
return 0;
return currprefs.gfx_avsync;
}
......@@ -4743,6 +4743,7 @@ STATIC_INLINE void do_sprites_1 (int num, int cycle, int hpos)
#endif
s->dmastate = 0;
#if 0
// roots 2.0 flower zoomer bottom part missing if this enabled
if (vpos == s->vstop) {
spr_arm (num, 0);
//return;
......
......@@ -1774,7 +1774,7 @@ STATIC_INLINE void do_flush_screen (int start, int stop)
unlockscr ();
if (start <= stop)
flush_screen (start, stop);
else if (currprefs.gfx_afullscreen == 1 && currprefs.gfx_avsync)
else if (currprefs.gfx_afullscreen == GFX_FULLSCREEN && currprefs.gfx_avsync)
flush_screen (0, 0); /* vsync mode */
}
......
......@@ -2120,8 +2120,6 @@ static void gen_opcode (unsigned long int opcode)
if (next_cpu_level < 0)
next_cpu_level = 0;
printf ("\tuae_u16 newsr; uae_u32 newpc;\n");
if (using_ce020) // need some delay so that interrupts have time to clear if previous ins was move to INTREQ
printf ("\tdo_cycles_ce (6 * CYCLE_UNIT);\n");
printf ("\tfor (;;) {\n");
printf ("\t\tuaecptr a = m68k_areg (regs, 7);\n");
printf ("\t\tuae_s16 sr = %s (a);\n", srcw);
......
......@@ -2313,7 +2313,7 @@ int is_vsync (void)
return 0;
}
void toggle_fullscreen (void)
void toggle_fullscreen (int mode)
{
}
......
......@@ -563,7 +563,7 @@ int check_prefs_changed_gfx (void)
return 0;
}
void toggle_fullscreen (void)
void toggle_fullscreen (int mode)
{
gWin->SetFullScreenMode(0);
}
......
......@@ -663,7 +663,7 @@ int is_vsync (void)
return 0;
}
void toggle_fullscreen (void)
void toggle_fullscreen (int mode)
{
};
......
......@@ -1888,7 +1888,7 @@ int is_vsync (void)
return vsync;
}
void toggle_fullscreen (void)
void toggle_fullscreen (int mode)
{
/* FIXME: Add support for separate full-screen/windowed sizes */
fullscreen = 1 - fullscreen;
......
......@@ -1534,7 +1534,7 @@ int is_vsync (void)
return 0;
}
void toggle_fullscreen (void)
void toggle_fullscreen (int mode)
{
#ifdef USE_DGA_EXTENSION
changed_prefs.gfx_afullscreen = changed_prefs.gfx_pfullscreen = !dgamode;
......
......@@ -189,7 +189,7 @@ void gui_display (int shortcut)
int was_fullscreen;
if (was_fullscreen = is_fullscreen ()) {
toggle_fullscreen ();
toggle_fullscreen (0);
if (is_fullscreen ()) {
resume_sound ();
return;
......@@ -199,7 +199,7 @@ void gui_display (int shortcut)
(new floppyFilePanel (shortcut))->run ();
if (was_fullscreen)
toggle_fullscreen ();
toggle_fullscreen (0);
}
resume_sound ();
}
......
......@@ -35,7 +35,7 @@
#define COCOA_GUI_MAX_PATH 255
/* These prototypes aren't declared in the sdlgfx header for some reason */
extern void toggle_fullscreen (void);
extern void toggle_fullscreen (int mode);
extern int is_fullscreen (void);
/* Defined in SDLmain.m */
......@@ -504,7 +504,7 @@ static BOOL wasFullscreen = NO; // used by ensureNotFullscreen() and restoreFull
- (void)goFullscreen:(id)sender
{
toggle_fullscreen();
toggle_fullscreen(0);
}
- (void)toggleInhibitDisplay:(id)sender
......@@ -523,7 +523,7 @@ int ensureNotFullscreen (void)
int result = 0;
if (is_fullscreen ()) {
toggle_fullscreen ();
toggle_fullscreen (0);
if (is_fullscreen ())
write_log ("Cannot activate GUI in full-screen mode\n");
......@@ -548,7 +548,7 @@ void restoreFullscreen (void)
#endif
if ((!is_fullscreen ()) && (wasFullscreen == YES))
toggle_fullscreen();
toggle_fullscreen(0);
wasFullscreen = NO;
}
......
......@@ -2468,7 +2468,7 @@ void gui_display (int shortcut)
/* If running fullscreen, then we must try to switched to windowed
* mode before activating the GUI */
if (is_fullscreen ()) {
toggle_fullscreen ();
toggle_fullscreen (0);
if (is_fullscreen ()) {
write_log ("Cannot activate GUI in full-screen mode\n");
return;
......
......@@ -132,7 +132,9 @@
enum aks { AKS_ENTERGUI = 0x200, AKS_SCREENSHOT_FILE, AKS_SCREENSHOT_CLIPBOARD, AKS_FREEZEBUTTON,
AKS_FLOPPY0, AKS_FLOPPY1, AKS_FLOPPY2, AKS_FLOPPY3,
AKS_EFLOPPY0, AKS_EFLOPPY1, AKS_EFLOPPY2, AKS_EFLOPPY3,
AKS_TOGGLEFULLSCREEN, AKS_ENTERDEBUGGER, AKS_IRQ7,
AKS_TOGGLEDEFAULTSCREEN,
AKS_TOGGLEWINDOWEDFULLSCREEN, AKS_TOGGLEFULLWINDOWFULLSCREEN, AKS_TOGGLEWINDOWFULLWINDOW,
AKS_ENTERDEBUGGER, AKS_IRQ7,
AKS_PAUSE, AKS_WARP, AKS_INHIBITSCREEN, AKS_STATEREWIND,
AKS_VOLDOWN, AKS_VOLUP, AKS_VOLMUTE,
AKS_MVOLDOWN, AKS_MVOLUP, AKS_MVOLMUTE,
......
......@@ -106,17 +106,12 @@ struct cache030
};
#define CACHESETS040 64
struct cache040set
{
uae_u32 data[4];
bool valid[4];
uae_u32 tag;
};
#define CACHELINES040 4
struct cache040
{
struct cache040set cs[4];
int count;
uae_u32 data[CACHELINES040][4];
bool valid[CACHELINES040];
uae_u32 tag[CACHELINES040];
};
struct regstruct
......@@ -419,6 +414,7 @@ extern void compemu_reset (void);
#else
#define flush_icache(uaecptr, int) do {} while (0)
#endif
extern void flush_dcache (uaecptr, int);
extern void flush_mmu (uaecptr, int);
extern int movec_illg (int regno);
......@@ -426,6 +422,6 @@ extern uae_u32 val_move2c (int regno);
extern void val_move2c2 (int regno, uae_u32 val);
struct cpum2c {
int regno;
char *regname;
TCHAR *regname;
};
extern struct cpum2c m2cregs[];
......@@ -184,7 +184,7 @@ struct uae_prefs {
bool gfx_autoresolution;
bool gfx_scandoubler;
int gfx_refreshrate;
bool gfx_avsync, gfx_pvsync;
int gfx_avsync, gfx_pvsync;
int gfx_resolution;
int gfx_lores_mode;
int gfx_linedbl;
......
......@@ -327,8 +327,10 @@ extern void mallocemu_free (void *ptr);
#endif
#include "target.h"
#if !defined(RECUR)
#include "machdep/machdep.h"
#include "gfxdep/gfx.h"
#endif
extern void console_out (const char *, ...);
extern void console_flush (void);
......@@ -405,6 +407,7 @@ extern void xfree (const void*);
#define _tcschr strchr
#define _tstof atof
#define _istdigit isdigit
#define _istspace isspace
#define _tstoi atoi
#define _tcstol strtol
#define _wunlink unlink
......
......@@ -123,7 +123,7 @@ extern void graphics_notify_state (int state);
extern void handle_events (void);
extern int is_fullscreen (void);
extern int is_vsync (void);
extern void toggle_fullscreen (void);
extern void toggle_fullscreen (int mode);
extern void toggle_mousegrab (void);
......
......@@ -467,7 +467,14 @@ void write_inputdevice_config (struct uae_prefs *p, FILE *f)
static int getnum (const TCHAR **pp)
{
const TCHAR *p = *pp;
int v = _tstol (p);
int v;
/* if (!_tcsnicmp (p, L"false", 5))
v = 0;
if (!_tcsnicmp (p, "true", 4))
v = 1;
else*/
v = _tstol (p);
while (*p != 0 && *p !='.' && *p != ',')
p++;
......@@ -544,7 +551,7 @@ static void set_kbr_default_event (struct uae_input_device *kbr, struct uae_inpu
}
}
static void set_kbr_default (struct uae_prefs *p, int index)
static void set_kbr_default (struct uae_prefs *p, int index, int devnum)
{
int i, j;
struct uae_input_device_kbr_default *trans = keyboard_default;
......@@ -555,6 +562,8 @@ static void set_kbr_default (struct uae_prefs *p, int index)
if (!trans)
return;
for (j = 0; j < MAX_INPUT_DEVICES; j++) {
if (devnum >= 0 && devnum != j)
continue;
kbr = &p->keyboard_settings[index][j];
for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) {
memset (kbr, 0, sizeof (struct uae_input_device));
......@@ -668,20 +677,27 @@ void read_inputdevice_config (struct uae_prefs *pr, char *option, char *value)
}
if (!_tcscmp (p2, "custom")) {
int disabled;
int iscustom;
p = value;
disabled = getnum (&p);
iscustom = getnum (&p);
if (idnum == GAMEPORT_INPUT_SETTINGS) {
clear_id (id);
if (joystick < 0)
set_kbr_default (pr, idnum);
id->enabled = disabled == 0 ? 1 : 0;
set_kbr_default (pr, idnum, devnum);
id->enabled = iscustom;
}
return;
}
if (!_tcscmp (p2, "empty")) {
int empty;
p = value;
empty = getnum (&p);
clear_id (id);
if (!empty) {
if (joystick < 0)
set_kbr_default (pr, idnum, devnum);
}
id->enabled = 1;
if (idnum == GAMEPORT_INPUT_SETTINGS)
id->enabled = 0;
......@@ -2234,8 +2250,17 @@ void inputdevice_handle_inputcode (void)
savestate_quick ((code - AKS_STATERESTOREQUICK) / 2, 0);
break;
#endif
case AKS_TOGGLEFULLSCREEN:
toggle_fullscreen ();
case AKS_TOGGLEDEFAULTSCREEN:
toggle_fullscreen (-1);
break;
case AKS_TOGGLEWINDOWEDFULLSCREEN:
toggle_fullscreen (0);
break;
case AKS_TOGGLEFULLWINDOWFULLSCREEN:
toggle_fullscreen (1);
break;
case AKS_TOGGLEWINDOWFULLWINDOW:
toggle_fullscreen (2);
break;
case AKS_TOGGLEMOUSEGRAB:
toggle_mousegrab ();
......@@ -3603,11 +3628,6 @@ static void compatibility_copy (struct uae_prefs *prefs)
case JSEM_MODE_DEFAULT:
case JSEM_MODE_MOUSE:
default:
if (firstmouse) { // map first mouse to each available host mouse device
for (j = 0; j < MAX_INPUT_DEVICES; j++)
input_get_default_mouse (mice, j, i);
firstmouse = false;
}
input_get_default_mouse (mice, joy, i);
joymodes[i] = JSEM_MODE_MOUSE;
break;
......@@ -4003,7 +4023,7 @@ void inputdevice_default_prefs (struct uae_prefs *p)
p->input_autofire_linecnt = 600;
for (i = 0; i < MAX_INPUT_SETTINGS; i++) {
if (i != GAMEPORT_INPUT_SETTINGS) {
set_kbr_default (p, i);
set_kbr_default (p, i, -1);
for (j = 0; j < MAX_INPUT_DEVICES; j++) {
if (input_get_default_mouse (p->mouse_settings[i], j, j & 1))
p->mouse_settings[i]->enabled = 1;
......@@ -4014,7 +4034,7 @@ void inputdevice_default_prefs (struct uae_prefs *p)
if (p->jports[0].id != -2 || p->jports[0].id != -2) {
reset_inputdevice_slot (p, i);
}
set_kbr_default (p, i);
set_kbr_default (p, i, -1);
}
}
}
......
......@@ -329,7 +329,9 @@ DEFEVENT(SPC_STATESAVE,"Quick save state",AM_K,0,0,AKS_STATESAVEQUICK)
DEFEVENT(SPC_STATERESTORE,"Quick restore state",AM_K,0,0,AKS_STATERESTOREQUICK)
DEFEVENT(SPC_STATESAVEDIALOG,"Save state",AM_K,0,0,AKS_STATESAVEDIALOG)
DEFEVENT(SPC_STATERESTOREDIALOG,"Restore state",AM_K,0,0,AKS_STATERESTOREDIALOG)
DEFEVENT(SPC_TOGGLEFULLSCREEN,"Toggle windowed/fullscreen",AM_K,0,0,AKS_TOGGLEFULLSCREEN)
DEFEVENT(SPC_TOGGLEFULLSCREEN,"Toggle windowed/fullscreen",AM_K,0,0,AKS_TOGGLEWINDOWEDFULLSCREEN)
DEFEVENT(SPC_TOGGLEFULLWINDOWFULLSCREEN,"Toggle full-window/fullscreen",AM_K,0,0,AKS_TOGGLEFULLWINDOWFULLSCREEN)
DEFEVENT(SPC_TOGGLEWINDOWFULLWINDOW,"Toggle window/full-window",AM_K,0,0,AKS_TOGGLEWINDOWFULLWINDOW)
DEFEVENT(SPC_TOGGLEMOUSEGRAB,"Toggle between mouse grabbed and un-grabbed",AM_K,0,0,AKS_TOGGLEMOUSEGRAB)
DEFEVENT(SPC_GLPANLEFT,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANLEFT) /*Koko*/
DEFEVENT(SPC_GLPANRIGHT,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANRIGHT) /*Koko*/
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -170,55 +170,55 @@ struct instr *table68k;
static int specialcase (uae_u16 opcode, int cpu_lev)
{
int mode = (opcode >> 3) & 7;
int reg = opcode & 7;
int mode = (opcode >> 3) & 7;
int reg = opcode & 7;
if (cpu_lev >= 2)
if (cpu_lev >= 2)
return cpu_lev;
/* TST.W A0, TST.L A0, TST.x (d16,PC) and TST.x (d8,PC,Xn) are 68020+ only */
if ((opcode & 0xff00) == 0x4a00) {
/* TST.W A0, TST.L A0, TST.x (d16,PC) and TST.x (d8,PC,Xn) are 68020+ only */
if ((opcode & 0xff00) == 0x4a00) {
if (mode == 7 && (reg == 4 || reg == 2 || reg == 3))
return 2;
return 2;
if (mode == 1) /* Ax */
return 2;
}
/* CMPI.W #x,(d16,PC) and CMPI.W #x,(d8,PC,Xn) are 68020+ only */
if ((opcode & 0xff00) == 0x0c00) {
return 2;
}
/* CMPI.W #x,(d16,PC) and CMPI.W #x,(d8,PC,Xn) are 68020+ only */
if ((opcode & 0xff00) == 0x0c00) {
if (mode == 7 && (reg == 2 || reg == 3))
return 2;
}
return cpu_lev;
return 2;
}
return cpu_lev;
}
static amodes mode_from_str (const char *str)
{
if (strncmp (str, "Dreg", 4) == 0) return Dreg;
if (strncmp (str, "Areg", 4) == 0) return Areg;
if (strncmp (str, "Aind", 4) == 0) return Aind;
if (strncmp (str, "Apdi", 4) == 0) return Apdi;
if (strncmp (str, "Aipi", 4) == 0) return Aipi;
if (strncmp (str, "Ad16", 4) == 0) return Ad16;
if (strncmp (str, "Ad8r", 4) == 0) return Ad8r;
if (strncmp (str, "absw", 4) == 0) return absw;
if (strncmp (str, "absl", 4) == 0) return absl;
if (strncmp (str, "PC16", 4) == 0) return PC16;
if (strncmp (str, "PC8r", 4) == 0) return PC8r;
if (strncmp (str, "Immd", 4) == 0) return imm;
abort ();
return 0;
if (strncmp (str, "Dreg", 4) == 0) return Dreg;
if (strncmp (str, "Areg", 4) == 0) return Areg;
if (strncmp (str, "Aind", 4) == 0) return Aind;
if (strncmp (str, "Apdi", 4) == 0) return Apdi;
if (strncmp (str, "Aipi", 4) == 0) return Aipi;
if (strncmp (str, "Ad16", 4) == 0) return Ad16;
if (strncmp (str, "Ad8r", 4) == 0) return Ad8r;
if (strncmp (str, "absw", 4) == 0) return absw;
if (strncmp (str, "absl", 4) == 0) return absl;
if (strncmp (str, "PC16", 4) == 0) return PC16;
if (strncmp (str, "PC8r", 4) == 0) return PC8r;
if (strncmp (str, "Immd", 4) == 0) return imm;
abort ();
return 0;
}
STATIC_INLINE amodes mode_from_mr (int mode, int reg)
{
switch (mode) {
case 0: return Dreg;
case 1: return Areg;
case 2: return Aind;
case 3: return Aipi;
case 4: return Apdi;
case 5: return Ad16;
case 6: return Ad8r;
case 7:
switch (mode) {
case 0: return Dreg;
case 1: return Areg;
case 2: return Aind;
case 3: return Aipi;
case 4: return Apdi;
case 5: return Ad16;
case 6: return Ad8r;
case 7:
switch (reg) {
case 0: return absw;
case 1: return absl;
......@@ -229,29 +229,29 @@ STATIC_INLINE amodes mode_from_mr (int mode, int reg)
case 6:
case 7: return am_illg;
}
}
abort ();
return 0;
}
abort ();
return 0;
}
static void build_insn (int insn)
{
int find = -1;
int variants;
int isjmp = 0;
struct instr_def id;
const char *opcstr;
int i;
int find = -1;
int variants;
int isjmp = 0;
struct instr_def id;
const char *opcstr;
int i;
int flaglive = 0, flagdead = 0;
int flaglive = 0, flagdead = 0;
id = defs68k[insn];
id = defs68k[insn];
/* Note: We treat anything with unknown flags as a jump. That
is overkill, but "the programmer" was lazy quite often, and
*this* programmer can't be bothered to work out what can and
can't trap. Usually, this will be overwritten with the gencomp
based information, anyway. */
/* Note: We treat anything with unknown flags as a jump. That
is overkill, but "the programmer" was lazy quite often, and
*this* programmer can't be bothered to work out what can and
can't trap. Usually, this will be overwritten with the gencomp
based information, anyway. */
for (i = 0; i < 5; i++) {
switch (id.flaginfo[i].flagset){
......@@ -300,42 +300,42 @@ out1:
int srcreg = -1, destreg = -1;
for (i = 0; i < lastbit; i++)
bitcnt[i] = bitval[i] = 0;
bitcnt[i] = bitval[i] = 0;
vmsk = 1 << id.n_variable;
for (i = 0, msk = 0x8000; i < 16; i++, msk >>= 1) {
if (!(msk & id.mask)) {
if (!(msk & id.mask)) {
int currbit = id.bitpos[bitno++];
int bit_set;
vmsk >>= 1;
bit_set = variants & vmsk ? 1 : 0;
if (bit_set)
opc |= msk;
opc |= msk;
bitpos[currbit] = 15 - i;
bitcnt[currbit]++;
bitval[currbit] <<= 1;
bitval[currbit] |= bit_set;
}
}
}
if (bitval[bitj] == 0) bitval[bitj] = 8;
/* first check whether this one does not match after all */
if (bitval[bitz] == 3 || bitval[bitC] == 1)
continue;
continue;
if (bitcnt[bitI] && (bitval[bitI] == 0x00 || bitval[bitI] == 0xff))
continue;
continue;
/* bitI and bitC get copied to biti and bitc */
if (bitcnt[bitI]) {
bitval[biti] = bitval[bitI]; bitpos[biti] = bitpos[bitI];
bitval[biti] = bitval[bitI]; bitpos[biti] = bitpos[bitI];
}
if (bitcnt[bitC])
bitval[bitc] = bitval[bitC];
bitval[bitc] = bitval[bitC];
pos = 0;
while (opcstr[pos] && !isspace(opcstr[pos])) {
if (opcstr[pos] == '.') {
if (opcstr[pos] == '.') {
pos++;
switch (opcstr[pos]) {
......@@ -370,524 +370,525 @@ out1:
/* now, we have read the mnemonic and the size */
while (opcstr[pos] && isspace(opcstr[pos]))
pos++;
pos++;
/* A goto a day keeps the D******a away. */
if (opcstr[pos] == 0)
goto endofline;
goto endofline;
/* parse the source address */
usesrc = 1;
switch (opcstr[pos++]) {
case 'D':
srcmode = Dreg;
switch (opcstr[pos++]) {
case 'r': srcreg = bitval[bitr]; srcgather = 1; srcpos = bitpos[bitr]; break;
case 'R': srcreg = bitval[bitR]; srcgather = 1; srcpos = bitpos[bitR]; break;
default: abort();
}
break;
srcmode = Dreg;
switch (opcstr[pos++]) {
case 'r': srcreg = bitval[bitr]; srcgather = 1; srcpos = bitpos[bitr]; break;
case 'R': srcreg = bitval[bitR]; srcgather = 1; srcpos = bitpos[bitR]; break;
default: abort();
}
break;
case 'A':
srcmode = Areg;
switch (opcstr[pos++]) {
case 'r': srcreg = bitval[bitr]; srcgather = 1; srcpos = bitpos[bitr]; break;
case 'R': srcreg = bitval[bitR]; srcgather = 1; srcpos = bitpos[bitR]; break;
default: abort();
}
switch (opcstr[pos]) {
case 'p': srcmode = Apdi; pos++; break;
case 'P': srcmode = Aipi; pos++; break;
srcmode = Areg;
switch (opcstr[pos++]) {
case 'r': srcreg = bitval[bitr]; srcgather = 1; srcpos = bitpos[bitr]; break;
case 'R': srcreg = bitval[bitR]; srcgather = 1; srcpos = bitpos[bitR]; break;
default: abort();
}
switch (opcstr[pos]) {
case 'p': srcmode = Apdi; pos++; break;
case 'P': srcmode = Aipi; pos++; break;
case 'a': srcmode = Aind; pos++; break;
}
break;
}
break;
case 'L':
srcmode = absl;
break;
srcmode = absl;
break;
case '#':
switch (opcstr[pos++]) {
case 'z': srcmode = imm; break;
case '0': srcmode = imm0; break;
case '1': srcmode = imm1; break;
case '2': srcmode = imm2; break;
case 'i': srcmode = immi; srcreg = (uae_s32)(uae_s8)bitval[biti];
switch (opcstr[pos++]) {
case 'z': srcmode = imm; break;
case '0': srcmode = imm0; break;
case '1': srcmode = imm1; break;
case '2': srcmode = imm2; break;
case 'i': srcmode = immi; srcreg = (uae_s32)(uae_s8)bitval[biti];
if (CPU_EMU_SIZE < 4) {
/* Used for branch instructions */
srctype = 1;
srcgather = 1;
srcpos = bitpos[biti];
/* Used for branch instructions */
srctype = 1;
srcgather = 1;
srcpos = bitpos[biti];
}
break;
case 'j': srcmode = immi; srcreg = bitval[bitj];
case 'j': srcmode = immi; srcreg = bitval[bitj];
if (CPU_EMU_SIZE < 3) {
/* 1..8 for ADDQ/SUBQ and rotshi insns */
srcgather = 1;
srctype = 3;
srcpos = bitpos[bitj];
/* 1..8 for ADDQ/SUBQ and rotshi insns */
srcgather = 1;
srctype = 3;
srcpos = bitpos[bitj];
}
break;
case 'J': srcmode = immi; srcreg = bitval[bitJ];
case 'J': srcmode = immi; srcreg = bitval[bitJ];
if (CPU_EMU_SIZE < 5) {
/* 0..15 */
srcgather = 1;
srctype = 2;
srcpos = bitpos[bitJ];
/* 0..15 */
srcgather = 1;
srctype = 2;
srcpos = bitpos[bitJ];
}
break;
case 'k': srcmode = immi; srcreg = bitval[bitk];
case 'k': srcmode = immi; srcreg = bitval[bitk];
if (CPU_EMU_SIZE < 3) {
srcgather = 1;
srctype = 4;
srcpos = bitpos[bitk];
srcgather = 1;
srctype = 4;
srcpos = bitpos[bitk];
}
break;
case 'K': srcmode = immi; srcreg = bitval[bitK];
case 'K': srcmode = immi; srcreg = bitval[bitK];
if (CPU_EMU_SIZE < 5) {
/* 0..15 */
srcgather = 1;
srctype = 5;
srcpos = bitpos[bitK];
/* 0..15 */
srcgather = 1;
srctype = 5;
srcpos = bitpos[bitK];
}
break;
case 'p': srcmode = immi; srcreg = bitval[bitK];
if (CPU_EMU_SIZE < 5) {
/* 0..3 */
srcgather = 1;
srctype = 7;
srcpos = bitpos[bitp];
}
break;
default: abort();
}
break;
case 'd':
srcreg = bitval[bitD];
srcmode = mode_from_mr(bitval[bitd],bitval[bitD]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitD];
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
case 'p': srcmode = immi; srcreg = bitval[bitK];
if (CPU_EMU_SIZE < 5) {
/* 0..3 */
srcgather = 1;
srctype = 7;
srcpos = bitpos[bitp];
}
break;
default: abort();
}
while(opcstr[pos] != ']') pos++;
pos++;
break;
}
}
}
/* Some addressing modes are invalid as destination */
if (srcmode == imm || srcmode == PC16 || srcmode == PC8r)
goto nomatch;
break;
case 's':
srcreg = bitval[bitS];
srcmode = mode_from_mr(bitval[bits],bitval[bitS]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitS];
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
case 'd':
srcreg = bitval[bitD];
srcmode = mode_from_mr(bitval[bitd],bitval[bitD]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitD];
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
pos++;
break;
}
}
}
/* Some addressing modes are invalid as destination */
if (srcmode == imm || srcmode == PC16 || srcmode == PC8r)
goto nomatch;
pos++;
break;
case 's':
srcreg = bitval[bitS];
srcmode = mode_from_mr(bitval[bits],bitval[bitS]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitS];
}
while(opcstr[pos] != ']') pos++;
pos++;
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
pos++;
}
}
}
break;
default: abort();
}
}
break;
default: abort();
}
/* safety check - might have changed */
if (srcmode != Areg && srcmode != Dreg && srcmode != Aind
&& srcmode != Ad16 && srcmode != Ad8r && srcmode != Aipi
&& srcmode != Apdi && srcmode != immi)
{
srcgather = 0;
}
if (srcmode == Areg && sz == sz_byte)
goto nomatch;
if (opcstr[pos] != ',')
goto endofline;
pos++;
/* parse the destination address */
usedst = 1;
switch (opcstr[pos++]) {
case 'D':
destmode = Dreg;
switch (opcstr[pos++]) {
case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;
case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;
default: abort();
}
if (dstpos < 0 || dstpos >= 32)
abort ();
break;
case 'A':
destmode = Areg;
switch (opcstr[pos++]) {
case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;
case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;
case 'x': destreg = 0; dstgather = 0; dstpos = 0; break;
default: abort();
}
if (dstpos < 0 || dstpos >= 32)
abort ();
switch (opcstr[pos]) {
case 'p': destmode = Apdi; pos++; break;
case 'P': destmode = Aipi; pos++; break;
}
break;
case 'L':
destmode = absl;
break;
case '#':
switch (opcstr[pos++]) {
case 'z': destmode = imm; break;
case '0': destmode = imm0; break;
case '1': destmode = imm1; break;
case '2': destmode = imm2; break;
case 'i': destmode = immi; destreg = (uae_s32)(uae_s8)bitval[biti]; break;
case 'j': destmode = immi; destreg = bitval[bitj]; break;
case 'J': destmode = immi; destreg = bitval[bitJ]; break;
case 'k': destmode = immi; destreg = bitval[bitk]; break;
case 'K': destmode = immi; destreg = bitval[bitK]; break;
default: abort();
}
break;
case 'd':
destreg = bitval[bitD];
destmode = mode_from_mr(bitval[bitd],bitval[bitD]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
/* safety check - might have changed */
if (srcmode != Areg && srcmode != Dreg && srcmode != Aind
&& srcmode != Ad16 && srcmode != Ad8r && srcmode != Aipi
&& srcmode != Apdi && srcmode != immi)
{
dstgather = 1; dstpos = bitpos[bitD];
srcgather = 0;
}
if (srcmode == Areg && sz == sz_byte)
goto nomatch;
if (opcstr[pos] == '[') {
if (opcstr[pos] != ',')
goto endofline;
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
/* parse the destination address */
usedst = 1;
switch (opcstr[pos++]) {
case 'D':
destmode = Dreg;
switch (opcstr[pos++]) {
case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;
case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;
default: abort();
}
if (dstpos < 0 || dstpos >= 32)
abort ();
break;
case 'A':
destmode = Areg;
switch (opcstr[pos++]) {
case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;
case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;
case 'x': destreg = 0; dstgather = 0; dstpos = 0; break;
default: abort();
}
if (dstpos < 0 || dstpos >= 32)
abort ();
switch (opcstr[pos]) {
case 'p': destmode = Apdi; pos++; break;
case 'P': destmode = Aipi; pos++; break;
}
break;
case 'L':
destmode = absl;
break;
case '#':
switch (opcstr[pos++]) {
case 'z': destmode = imm; break;
case '0': destmode = imm0; break;
case '1': destmode = imm1; break;
case '2': destmode = imm2; break;
case 'i': destmode = immi; destreg = (uae_s32)(uae_s8)bitval[biti]; break;
case 'j': destmode = immi; destreg = bitval[bitj]; break;
case 'J': destmode = immi; destreg = bitval[bitJ]; break;
case 'k': destmode = immi; destreg = bitval[bitk]; break;
case 'K': destmode = immi; destreg = bitval[bitK]; break;
default: abort();
}
break;
case 'd':
destreg = bitval[bitD];
destmode = mode_from_mr(bitval[bitd],bitval[bitD]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
{
dstgather = 1; dstpos = bitpos[bitD];
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
pos++;
break;
}
}
}
/* Some addressing modes are invalid as destination */
if (destmode == imm || destmode == PC16 || destmode == PC8r)
goto nomatch;
pos++;
break;
case 's':
destreg = bitval[bitS];
destmode = mode_from_mr(bitval[bits],bitval[bitS]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
{
dstgather = 1; dstpos = bitpos[bitS];
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
pos++;
}
}
}
while(opcstr[pos] != ']') pos++;
pos++;
break;
}
default: abort();
}
}
/* Some addressing modes are invalid as destination */
if (destmode == imm || destmode == PC16 || destmode == PC8r)
goto nomatch;
break;
case 's':
destreg = bitval[bitS];
destmode = mode_from_mr(bitval[bits],bitval[bitS]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
/* safety check - might have changed */
if (destmode != Areg && destmode != Dreg && destmode != Aind
&& destmode != Ad16 && destmode != Ad8r && destmode != Aipi
&& destmode != Apdi)
{
dstgather = 1; dstpos = bitpos[bitS];
dstgather = 0;
}
if (opcstr[pos] == '[') {
pos++;
if (opcstr[pos] == '!') {
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
else
goto nomatch;
pos += 10;
} else {
/* normal */
while(mode_from_str(opcstr+pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
pos++;
}
}
}
break;
default: abort();
}
/* safety check - might have changed */
if (destmode != Areg && destmode != Dreg && destmode != Aind
&& destmode != Ad16 && destmode != Ad8r && destmode != Aipi
&& destmode != Apdi)
{
dstgather = 0;
}
if (destmode == Areg && sz == sz_byte)
goto nomatch;
if (destmode == Areg && sz == sz_byte)
goto nomatch;
#if 0
if (sz == sz_byte && (destmode == Aipi || destmode == Apdi)) {
dstgather = 0;
}
if (sz == sz_byte && (destmode == Aipi || destmode == Apdi)) {
dstgather = 0;
}
#endif
endofline:
/* now, we have a match */
if (table68k[opc].mnemo != i_ILLG)
;//write_log ("Double match: %x: %s\n", opc, opcstr);
if (find == -1) {
for (find = 0;; find++) {
if (strcmp(mnemonic, lookuptab[find].name) == 0) {
table68k[opc].mnemo = lookuptab[find].mnemo;
break;
endofline:
/* now, we have a match */
if (table68k[opc].mnemo != i_ILLG)
;//write_log ("Double match: %x: %s\n", opc, opcstr);
if (find == -1) {
for (find = 0;; find++) {
if (strcmp (mnemonic, lookuptab[find].name) == 0) {
table68k[opc].mnemo = lookuptab[find].mnemo;
break;
}
if (strlen (lookuptab[find].name) == 0)
abort();
}
}
if (strlen(lookuptab[find].name) == 0) abort();
}
}
else {
table68k[opc].mnemo = lookuptab[find].mnemo;
}
table68k[opc].cc = bitval[bitc];
if (table68k[opc].mnemo == i_BTST
|| table68k[opc].mnemo == i_BSET
|| table68k[opc].mnemo == i_BCLR
|| table68k[opc].mnemo == i_BCHG)
{
sz = destmode == Dreg ? sz_long : sz_byte;
}
table68k[opc].size = sz;
table68k[opc].sreg = srcreg;
table68k[opc].dreg = destreg;
table68k[opc].smode = srcmode;
table68k[opc].dmode = destmode;
table68k[opc].spos = srcgather ? srcpos : -1;
table68k[opc].dpos = dstgather ? dstpos : -1;
table68k[opc].suse = usesrc;
table68k[opc].duse = usedst;
table68k[opc].stype = srctype;
table68k[opc].plev = id.plevel;
table68k[opc].clev = specialcase(opc, id.cpulevel);
else {
table68k[opc].mnemo = lookuptab[find].mnemo;
}
table68k[opc].cc = bitval[bitc];
if (table68k[opc].mnemo == i_BTST
|| table68k[opc].mnemo == i_BSET
|| table68k[opc].mnemo == i_BCLR
|| table68k[opc].mnemo == i_BCHG)
{
sz = destmode == Dreg ? sz_long : sz_byte;
}
table68k[opc].size = sz;
table68k[opc].sreg = srcreg;
table68k[opc].dreg = destreg;
table68k[opc].smode = srcmode;
table68k[opc].dmode = destmode;
table68k[opc].spos = srcgather ? srcpos : -1;
table68k[opc].dpos = dstgather ? dstpos : -1;
table68k[opc].suse = usesrc;
table68k[opc].duse = usedst;
table68k[opc].stype = srctype;
table68k[opc].plev = id.plevel;
table68k[opc].clev = specialcase(opc, id.cpulevel);
#if 0
for (i = 0; i < 5; i++) {
table68k[opc].flaginfo[i].flagset = id.flaginfo[i].flagset;
table68k[opc].flaginfo[i].flaguse = id.flaginfo[i].flaguse;
}
for (i = 0; i < 5; i++) {
table68k[opc].flaginfo[i].flagset = id.flaginfo[i].flagset;
table68k[opc].flaginfo[i].flaguse = id.flaginfo[i].flaguse;
}
#endif
table68k[opc].flagdead = flagdead;
table68k[opc].flaglive = flaglive;
table68k[opc].isjmp = isjmp;
nomatch:
/* FOO! */;
}
table68k[opc].flagdead = flagdead;
table68k[opc].flaglive = flaglive;
table68k[opc].isjmp = isjmp;
nomatch:
/* FOO! */;
}
}
void read_table68k (void)
{
int i;
int i;
free (table68k);
table68k = (struct instr *)xmalloc (65536 * sizeof (struct instr));
for (i = 0; i < 65536; i++) {
free (table68k);
table68k = xmalloc (sizeof (struct instr) * 65536);
for (i = 0; i < 65536; i++) {
table68k[i].mnemo = i_ILLG;
table68k[i].handler = -1;
}
for (i = 0; i < n_defs68k; i++) {
}
for (i = 0; i < n_defs68k; i++) {
build_insn (i);
}
}
}
static int mismatch;
static void handle_merges (long int opcode)
{
uae_u16 smsk;
uae_u16 dmsk;
int sbitdst, dstend;
int srcreg, dstreg;
if (table68k[opcode].spos == -1) {
sbitdst = 1; smsk = 0;
} else {
switch (table68k[opcode].stype) {
case 0:
smsk = 7; sbitdst = 8; break;
case 1:
smsk = 255; sbitdst = 256; break;
case 2:
smsk = 15; sbitdst = 16; break;
case 3:
smsk = 7; sbitdst = 8; break;
case 4:
smsk = 7; sbitdst = 8; break;
case 5:
smsk = 63; sbitdst = 64; break;
case 7:
smsk = 3; sbitdst = 4; break;
default:
smsk = 0; sbitdst = 0;
abort();
break;
uae_u16 smsk;
uae_u16 dmsk;
int sbitdst, dstend;
int srcreg, dstreg;
if (table68k[opcode].spos == -1) {
sbitdst = 1; smsk = 0;
} else {
switch (table68k[opcode].stype) {
case 0:
smsk = 7; sbitdst = 8; break;
case 1:
smsk = 255; sbitdst = 256; break;
case 2:
smsk = 15; sbitdst = 16; break;
case 3:
smsk = 7; sbitdst = 8; break;
case 4:
smsk = 7; sbitdst = 8; break;
case 5:
smsk = 63; sbitdst = 64; break;
case 7:
smsk = 3; sbitdst = 4; break;
default:
smsk = 0; sbitdst = 0;
abort();
break;
}
smsk <<= table68k[opcode].spos;
}
if (table68k[opcode].dpos == -1) {
dstend = 1; dmsk = 0;
} else {
dmsk = 7 << table68k[opcode].dpos;
dstend = 8;
}
smsk <<= table68k[opcode].spos;
}
if (table68k[opcode].dpos == -1) {
dstend = 1; dmsk = 0;
} else {
dmsk = 7 << table68k[opcode].dpos;
dstend = 8;
}
for (srcreg=0; srcreg < sbitdst; srcreg++) {
for (dstreg=0; dstreg < dstend; dstreg++) {
uae_u16 code = (uae_u16)opcode;
code = (code & ~smsk) | (srcreg << table68k[opcode].spos);
code = (code & ~dmsk) | (dstreg << table68k[opcode].dpos);
/* Check whether this is in fact the same instruction.
* The instructions should never differ, except for the
* Bcc.(BW) case. */
if (table68k[code].mnemo != table68k[opcode].mnemo
|| table68k[code].size != table68k[opcode].size
|| table68k[code].suse != table68k[opcode].suse
|| table68k[code].duse != table68k[opcode].duse)
{
mismatch++; continue;
}
if (table68k[opcode].suse
&& (table68k[opcode].spos != table68k[code].spos
|| table68k[opcode].smode != table68k[code].smode
|| table68k[opcode].stype != table68k[code].stype))
{
mismatch++; continue;
}
if (table68k[opcode].duse
&& (table68k[opcode].dpos != table68k[code].dpos
|| table68k[opcode].dmode != table68k[code].dmode))
{
mismatch++; continue;
}
if (code != opcode)
table68k[code].handler = opcode;
for (srcreg=0; srcreg < sbitdst; srcreg++) {
for (dstreg=0; dstreg < dstend; dstreg++) {
uae_u16 code = (uae_u16)opcode;
code = (code & ~smsk) | (srcreg << table68k[opcode].spos);
code = (code & ~dmsk) | (dstreg << table68k[opcode].dpos);
/* Check whether this is in fact the same instruction.
* The instructions should never differ, except for the
* Bcc.(BW) case. */
if (table68k[code].mnemo != table68k[opcode].mnemo
|| table68k[code].size != table68k[opcode].size
|| table68k[code].suse != table68k[opcode].suse
|| table68k[code].duse != table68k[opcode].duse)
{
mismatch++; continue;
}
if (table68k[opcode].suse
&& (table68k[opcode].spos != table68k[code].spos
|| table68k[opcode].smode != table68k[code].smode
|| table68k[opcode].stype != table68k[code].stype))
{
mismatch++; continue;
}
if (table68k[opcode].duse
&& (table68k[opcode].dpos != table68k[code].dpos
|| table68k[opcode].dmode != table68k[code].dmode))
{
mismatch++; continue;
}
if (code != opcode)
table68k[code].handler = opcode;
}
}
}
}
void do_merges (void)
{
long int opcode;
int nr = 0;
mismatch = 0;
for (opcode = 0; opcode < 65536; opcode++) {
if (table68k[opcode].handler != -1 || table68k[opcode].mnemo == i_ILLG)
continue;
nr++;
handle_merges (opcode);
}
nr_cpuop_funcs = nr;
long int opcode;
int nr = 0;
mismatch = 0;
for (opcode = 0; opcode < 65536; opcode++) {
if (table68k[opcode].handler != -1 || table68k[opcode].mnemo == i_ILLG)
continue;
nr++;
handle_merges (opcode);
}
nr_cpuop_funcs = nr;
}
int get_no_mismatches (void)
{
return mismatch;
return mismatch;
}
......@@ -4,7 +4,7 @@ running configure, to aid debugging if configure makes a mistake.
It was created by configure, which was
generated by GNU Autoconf 2.65. Invocation command line was
$ ./configure --disable-option-checking --prefix=/usr/local --with-sdl --with-sdl-gl --with-sdl-gfx --with-sdl-sound --with-caps --with-gayle --enable-drvsnd --enable-amax --enable-cd32 --enable-scsi-device --disable-jit --cache-file=/dev/null --srcdir=.
$ ./configure --disable-option-checking --prefix=/usr/local --with-sdl --with-sdl-gl --with-sdl-gfx --with-sdl-sound --with-caps --with-gayle --enable-drvsnd --enable-amax --enable-cd32 --enable-scsi-device --cache-file=/dev/null --srcdir=.
## --------- ##
## Platform. ##
......@@ -445,7 +445,7 @@ configure:4344: $? = 0
configure:4344: result: yes
configure:4350: checking for _doprnt
configure:4350: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
/tmp/cc4EAiYz.o: In function `main':
/tmp/ccwoa8am.o: In function `main':
/home/gnostic/puaex/src/tools/conftest.c:67: undefined reference to `_doprnt'
collect2: ld returned 1 exit status
configure:4350: $? = 1
......@@ -533,7 +533,7 @@ configure:4364: $? = 0
configure:4364: result: yes
configure:4364: checking for strcmpi
configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
/tmp/ccFh4SgP.o: In function `main':
/tmp/ccvPJKzx.o: In function `main':
/home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `strcmpi'
collect2: ld returned 1 exit status
configure:4364: $? = 1
......@@ -613,7 +613,7 @@ configure: failed program was:
configure:4364: result: no
configure:4364: checking for stricmp
configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
/tmp/ccn7jZ5T.o: In function `main':
/tmp/ccIoevFC.o: In function `main':
/home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `stricmp'
collect2: ld returned 1 exit status
configure:4364: $? = 1
......
......@@ -438,7 +438,7 @@ $config_links
Report bugs to the package provider."
ac_cs_config="'--disable-option-checking' '--prefix=/usr/local' '--with-sdl' '--with-sdl-gl' '--with-sdl-gfx' '--with-sdl-sound' '--with-caps' '--with-gayle' '--enable-drvsnd' '--enable-amax' '--enable-cd32' '--enable-scsi-device' '--disable-jit' '--cache-file=/dev/null' '--srcdir=.'"
ac_cs_config="'--disable-option-checking' '--prefix=/usr/local' '--with-sdl' '--with-sdl-gl' '--with-sdl-gfx' '--with-sdl-sound' '--with-caps' '--with-gayle' '--enable-drvsnd' '--enable-amax' '--enable-cd32' '--enable-scsi-device' '--cache-file=/dev/null' '--srcdir=.'"
ac_cs_version="\
config.status
configured by ./configure, generated by GNU Autoconf 2.65,
......@@ -522,7 +522,7 @@ if $ac_cs_silent; then
fi
if $ac_cs_recheck; then
set X '/bin/bash' './configure' '--disable-option-checking' '--prefix=/usr/local' '--with-sdl' '--with-sdl-gl' '--with-sdl-gfx' '--with-sdl-sound' '--with-caps' '--with-gayle' '--enable-drvsnd' '--enable-amax' '--enable-cd32' '--enable-scsi-device' '--disable-jit' '--cache-file=/dev/null' '--srcdir=.' $ac_configure_extra_args --no-create --no-recursion
set X '/bin/bash' './configure' '--disable-option-checking' '--prefix=/usr/local' '--with-sdl' '--with-sdl-gl' '--with-sdl-gfx' '--with-sdl-sound' '--with-caps' '--with-gayle' '--enable-drvsnd' '--enable-amax' '--enable-cd32' '--enable-scsi-device' '--cache-file=/dev/null' '--srcdir=.' $ac_configure_extra_args --no-create --no-recursion
shift
$as_echo "running CONFIG_SHELL=/bin/bash $*" >&6
CONFIG_SHELL='/bin/bash'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment