1996-11-25 19:52:08 +00:00
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#endif
|
|
|
|
|
#include "mn10300_sim.h"
|
|
|
|
|
#include "simops.h"
|
|
|
|
|
#include "sys/syscall.h"
|
|
|
|
|
#include "bfd.h"
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <sys/times.h>
|
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
|
|
|
|
|
enum op_types {
|
|
|
|
|
OP_UNKNOWN,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
static void trace_input PARAMS ((char *name, enum op_types type, int size));
|
|
|
|
|
static void trace_output PARAMS ((enum op_types result));
|
|
|
|
|
static int init_text_p = 0;
|
|
|
|
|
static asection *text;
|
|
|
|
|
static bfd_vma text_start;
|
|
|
|
|
static bfd_vma text_end;
|
|
|
|
|
extern bfd *exec_bfd;
|
|
|
|
|
|
|
|
|
|
#ifndef SIZE_INSTRUCTION
|
|
|
|
|
#define SIZE_INSTRUCTION 6
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef SIZE_OPERANDS
|
|
|
|
|
#define SIZE_OPERANDS 16
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef SIZE_VALUES
|
|
|
|
|
#define SIZE_VALUES 11
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef SIZE_LOCATION
|
|
|
|
|
#define SIZE_LOCATION 40
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
trace_input (name, type, size)
|
|
|
|
|
char *name;
|
|
|
|
|
enum op_types type;
|
|
|
|
|
int size;
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
trace_output (result)
|
|
|
|
|
enum op_types result;
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
#define trace_input(NAME, IN1, IN2)
|
|
|
|
|
#define trace_output(RESULT)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_8000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] = SEXT8 (insn & 0xff);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_80 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F1E0 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc) >> 2)] = State.regs[REG_D0 + (insn & 0x3)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov am, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F1D0 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov imm8, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_9000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] = insn & 0xff;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov am, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_90 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 05:29:49 +00:00
|
|
|
|
/* mov sp, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_3C ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] = State.regs[REG_SP];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 05:29:49 +00:00
|
|
|
|
/* mov am, sp */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2F0 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
State.regs[REG_SP] = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov psw, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2E4 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = PSW;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, psw */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2F3 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
PSW = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov mdr, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2E0 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = State.regs[REG_MDR];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, mdr */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2F2 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_MDR] = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov (am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_70 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc) >> 2)]
|
|
|
|
|
= load_mem (State.regs[REG_A0 + (insn & 0x3)], 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov (d8,am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F80000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]
|
|
|
|
|
= load_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA000000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC000000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov (d8,sp), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_5800 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
= load_mem (State.regs[REG_SP] + insn & 0xff, 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FAB40000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FCB40000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* mov (di,am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F300 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]
|
1996-11-27 16:25:03 +00:00
|
|
|
|
= load_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov (abs16), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_300000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x30000) >> 16)] = load_mem (insn & 0xffff, 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FCA40000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov (am), an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc) >> 2)]
|
|
|
|
|
= load_mem (State.regs[REG_A0 + (insn & 0x3)], 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov (d8,am), an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F82000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc00) >> 10)]
|
|
|
|
|
= load_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA200000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC200000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov (d8,sp), an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_5C00 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
= load_mem (State.regs[REG_SP] + insn & 0xff, 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FAB00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FCB00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* mov (di,am), an*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F380 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
1996-11-27 16:25:03 +00:00
|
|
|
|
= load_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FAA00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FCA00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov (d8,am), sp */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8F000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_SP]
|
|
|
|
|
= load_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 4);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_60 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem (State.regs[REG_A0 + (insn & 0x3)], 4,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc) >> 2)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov dm, (d8,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F81000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 4,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA100000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC100000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, (d8,sp) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_4200 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem (State.regs[REG_SP] + insn & 0xff, 4,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA910000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC910000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* mov dm, (di,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F340 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 4,
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov dm, (abs16) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_10000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem ((insn & 0xffff), 4, State.regs[REG_D0 + ((insn & 0xc0000) >> 18)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC810000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov am, (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F010 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem (State.regs[REG_A0 + (insn & 0x3)], 4,
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc) >> 2)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov am, (d8,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F83000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 4,
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA300000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC300000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov am, (d8,sp) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_4300 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem (State.regs[REG_SP] + insn & 0xff, 4,
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA900000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC900000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* mov am, (di,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F3C0 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 4,
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0x300) >> 8)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FA800000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FC800000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* mov sp, (d8,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8F400 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem (State.regs[REG_A0 + ((insn & 0x300) >> 8)] + SEXT8 (insn & 0xff),
|
|
|
|
|
4, State.regs[REG_SP]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov imm16, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_2C0000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long value;
|
|
|
|
|
|
|
|
|
|
value = SEXT16 (insn & 0xffff);
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0x30000) >> 16)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mov */
|
|
|
|
|
void OP_FCCC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov imm16, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_240000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long value;
|
|
|
|
|
|
|
|
|
|
value = insn & 0xffff;
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0x30000) >> 16)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* mov imm32, an*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FCDC0000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
unsigned long value;
|
|
|
|
|
|
|
|
|
|
value = (insn & 0xffff) << 16 | extension;
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0x30000) >> 16)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movbu (am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F040 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc) >> 2)]
|
|
|
|
|
= load_mem (State.regs[REG_A0 + (insn & 0x3)], 1);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movbu (d8,am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F84000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]
|
|
|
|
|
= load_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 1);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FA400000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FC400000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movbu (d8,sp), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8B800 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
= load_mem ((State.regs[REG_SP] + SEXT8 (insn & 0xff)), 1);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FAB80000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FCB80000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* movbu (di,am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F400 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]
|
1996-11-27 16:25:03 +00:00
|
|
|
|
= load_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 1);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movbu (abs16), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_340000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x30000) >> 16)] = load_mem (insn & 0xffff, 1);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FCA80000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movbu dm, (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F050 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
store_mem (State.regs[REG_A0 + ((insn & 0xc) >> 2)], 1,
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movbu dm, (d8,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F85000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 1,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FA500000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FC500000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movbu dm, (d8,sp) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F89200 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem ((State.regs[REG_SP] + SEXT8 (insn & 0xff)), 1,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FA920000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FC920000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* movbu dm, (di,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F440 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 1,
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movbu dm, (abs16) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_20000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem ((insn & 0xffff), 1, State.regs[REG_D0 + ((insn & 0xc0000) >> 18)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movbu */
|
|
|
|
|
void OP_FC820000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movhu (am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F060 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc) >> 2)]
|
|
|
|
|
= load_mem (State.regs[REG_A0 + (insn & 0x3)], 2);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movhu (d8,am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F86000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]
|
|
|
|
|
= load_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 2);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FA600000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FC600000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movhu (d8,sp) dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8BC00 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
= load_mem ((State.regs[REG_SP] + SEXT8 (insn & 0xff)), 2);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FABC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FCBC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* movhu (di,am), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F480 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]
|
1996-11-27 16:25:03 +00:00
|
|
|
|
= load_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 2);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movhu (abs16), dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_380000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x30000) >> 16)] = load_mem (insn & 0xffff, 2);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FCAC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movhu dm, (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F070 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem (State.regs[REG_A0 + ((insn & 0xc) >> 2)], 2,
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movhu dm, (d8,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F87000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + ((insn & 0x300) >> 8)]
|
|
|
|
|
+ SEXT8 (insn & 0xff)), 2,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FA700000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FC700000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* movhu dm,(d8,sp) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F89300 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
store_mem ((State.regs[REG_SP] + SEXT8 (insn & 0xff)), 2,
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 10)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FA930000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FC930000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* movhu dm, (di,an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F4C0 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
store_mem ((State.regs[REG_A0 + (insn & 0x3)]
|
|
|
|
|
+ State.regs[REG_D0 + ((insn & 0xc) >> 2)]), 2,
|
1996-11-27 16:51:30 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* movhu dm, (abs16) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_30000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
store_mem ((insn & 0xffff), 2, State.regs[REG_D0 + ((insn & 0xc0000) >> 18)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movhu */
|
|
|
|
|
void OP_FC830000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* ext dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2D0 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
if (State.regs[REG_D0 + (insn & 0x3)] & 0x80000000)
|
|
|
|
|
State.regs[REG_MDR] = -1;
|
|
|
|
|
else
|
|
|
|
|
State.regs[REG_MDR] = 0;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* extb dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_10 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = SEXT8 (State.regs[REG_D0 + (insn & 0x3)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* extbu dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_14 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] &= 0xff;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* exth dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_18 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
= SEXT16 (State.regs[REG_D0 + (insn & 0x3)]);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* exthu dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_1C ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] &= 0xffff;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 05:29:49 +00:00
|
|
|
|
/* movm (sp), reg_list */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_CE00 ()
|
|
|
|
|
{
|
1996-11-27 05:29:49 +00:00
|
|
|
|
unsigned long sp = State.regs[REG_SP];
|
|
|
|
|
unsigned long mask;
|
|
|
|
|
|
|
|
|
|
mask = insn & 0xff;
|
|
|
|
|
|
|
|
|
|
if (mask & 0x8)
|
|
|
|
|
{
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_LAR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_LIR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_MDR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_A0 + 1] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_A0] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_D0 + 1] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_D0] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x10)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_A0 + 3] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x20)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_A0 + 2] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x40)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_D0 + 3] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_D0 + 2] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* And make sure to update the stack pointer. */
|
|
|
|
|
State.regs[REG_SP] = sp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* movm reg_list, (sp) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_CF00 ()
|
|
|
|
|
{
|
1996-11-27 05:29:49 +00:00
|
|
|
|
unsigned long sp = State.regs[REG_SP];
|
|
|
|
|
unsigned long mask;
|
|
|
|
|
|
|
|
|
|
mask = insn & 0xff;
|
|
|
|
|
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
|
{
|
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + 2] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x40)
|
|
|
|
|
{
|
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + 3] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x20)
|
|
|
|
|
{
|
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + 2] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x10)
|
|
|
|
|
{
|
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + 3] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x8)
|
|
|
|
|
{
|
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_D0 + 1] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_A0 + 1] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_MDR] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_LIR] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
1996-11-27 07:20:36 +00:00
|
|
|
|
State.regs[REG_LAR] = load_mem (sp, 4);
|
1996-11-27 05:29:49 +00:00
|
|
|
|
sp -= 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* And make sure to update the stack pointer. */
|
|
|
|
|
State.regs[REG_SP] = sp;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* clr dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_0 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc) >> 2)] = 0;
|
|
|
|
|
|
|
|
|
|
PSW |= PSW_Z;
|
|
|
|
|
PSW &= ~(PSW_V | PSW_C | PSW_N);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add dm,dn*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_E0 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
value = reg1 + reg2;
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add dm, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F160 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_A0 + (insn & 0x3)];
|
|
|
|
|
value = reg1 + reg2;
|
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add am, dn*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F150 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
value = reg1 + reg2;
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add am,an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F170 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_A0 + (insn & 0x3)];
|
|
|
|
|
value = reg1 + reg2;
|
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_2800 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc00) >> 8)];
|
|
|
|
|
imm = SEXT8 (insn & 0xff);
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc00) >> 8)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm16, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAC00000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc0000) >> 16)];
|
|
|
|
|
imm = SEXT16 (insn & 0xffff);
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc0000) >> 16)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm32,dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FCC00000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc0000) >> 16)];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc0000) >> 16)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm8, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_2000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc00) >> 8)];
|
|
|
|
|
imm = insn & 0xff;
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc00) >> 8)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm16, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAD00000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc0000) >> 16)];
|
|
|
|
|
imm = 0xffff;
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc0000) >> 16)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm32, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FCD00000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc0000) >> 16)];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc0000) >> 16)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm8, sp*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8FE00 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_SP];
|
|
|
|
|
imm = SEXT8 (insn & 0xff);
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_SP] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* add imm16,sp */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAFE0000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_SP];
|
|
|
|
|
imm = SEXT16 (insn & 0xffff);
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_SP] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* add */
|
|
|
|
|
void OP_FCFE0000 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_SP];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 + imm;
|
|
|
|
|
State.regs[REG_SP] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* addc */
|
|
|
|
|
void OP_F140 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
value = reg1 + reg2 + ((PSW & PSW_C) != 0);
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* sub dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F100 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
value = reg2 - reg1;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* sub dm, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F120 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_A0 + (insn & 0x3)];
|
|
|
|
|
value = reg2 - reg1;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* sub am, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F110 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
value = reg2 - reg1;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* sub am, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F130 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_A0 + (insn & 0x3)];
|
|
|
|
|
value = reg2 - reg1;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* sub */
|
|
|
|
|
void OP_FCC40000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0x300) >> 16)];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 16)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* sub */
|
|
|
|
|
void OP_FCD40000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0x300) >> 16)];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_A0 + ((insn & 0x300) >> 16)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* subc */
|
|
|
|
|
void OP_F180 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
value = reg2 - reg1 - ((PSW & PSW_C) != 0);
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mul */
|
|
|
|
|
void OP_F240 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long long temp;
|
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
temp = (State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
* State.regs[REG_D0 + ((insn & 0xc) >> 2)]);
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = temp & 0xffffffff;
|
|
|
|
|
State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulu */
|
|
|
|
|
void OP_F250 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long long temp;
|
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
temp = (State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
* State.regs[REG_D0 + ((insn & 0xc) >> 2)]);
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = temp & 0xffffffff;
|
|
|
|
|
State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* div */
|
|
|
|
|
void OP_F260 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
long long temp;
|
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
temp = State.regs[REG_MDR];
|
|
|
|
|
temp <<= 32;
|
|
|
|
|
temp |= State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
State.regs[REG_MDR] = temp % State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
temp /= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
temp = (State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
* State.regs[REG_D0 + ((insn & 0xc) >> 2)]);
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = temp & 0xffffffff;
|
|
|
|
|
State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* divu */
|
|
|
|
|
void OP_F270 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long long temp;
|
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
temp = State.regs[REG_MDR];
|
|
|
|
|
temp <<= 32;
|
|
|
|
|
temp |= State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
State.regs[REG_MDR] = temp % State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
temp /= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
temp = (State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
* State.regs[REG_D0 + ((insn & 0xc) >> 2)]);
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = temp & 0xffffffff;
|
|
|
|
|
State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* inc dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_40 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
State.regs[REG_D0 + ((insn & 0xc) >> 2)] += 1;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* inc an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_41 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
State.regs[REG_A0 + ((insn & 0xc) >> 2)] += 1;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 00:53:25 +00:00
|
|
|
|
/* inc4 an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_50 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
State.regs[REG_A0 + (insn & 0x3)] += 4;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 00:53:25 +00:00
|
|
|
|
/* cmp imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_A000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0x300) >> 8)];
|
|
|
|
|
imm = SEXT8 (insn & 0xff);
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 00:53:25 +00:00
|
|
|
|
/* cmp dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_A0 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
1996-11-27 07:20:36 +00:00
|
|
|
|
value = reg2 - reg1;
|
1996-11-27 00:53:25 +00:00
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 00:53:25 +00:00
|
|
|
|
/* cmp dm, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F1A0 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_A0 + (insn & 0x3)];
|
1996-11-27 07:20:36 +00:00
|
|
|
|
value = reg2 - reg1;
|
1996-11-27 00:53:25 +00:00
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 00:53:25 +00:00
|
|
|
|
/* cmp am, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F190 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_D0 + (insn & 0x3)];
|
1996-11-27 07:20:36 +00:00
|
|
|
|
value = reg2 - reg1;
|
1996-11-27 00:53:25 +00:00
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 00:53:25 +00:00
|
|
|
|
/* cmp imm8, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_B000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0x300) >> 8)];
|
|
|
|
|
imm = insn & 0xff;
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* cmp am, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_B0 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, reg2, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
reg2 = State.regs[REG_A0 + (insn & 0x3)];
|
1996-11-27 07:20:36 +00:00
|
|
|
|
value = reg2 - reg1;
|
1996-11-26 22:58:24 +00:00
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < reg2);
|
|
|
|
|
v = ((reg2 & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (reg2 & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* cmp imm16, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAC80000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0x300) >> 16)];
|
|
|
|
|
imm = SEXT16 (insn & 0xffff);
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* cmp imm32, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FCC80000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_D0 + ((insn & 0x300) >> 16)];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* cmp imm16, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAD80000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0x300) >> 16)];
|
|
|
|
|
imm = insn & 0xffff;
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* cmp imm32, an */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FCD80000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
int z, c, n, v;
|
|
|
|
|
unsigned long reg1, imm, value;
|
|
|
|
|
|
|
|
|
|
reg1 = State.regs[REG_A0 + ((insn & 0x300) >> 16)];
|
|
|
|
|
imm = ((insn & 0xffff) << 16) | extension;
|
|
|
|
|
value = reg1 - imm;
|
|
|
|
|
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x80000000);
|
|
|
|
|
c = (reg1 < imm);
|
|
|
|
|
v = ((imm & 0x8000000) != (reg1 & 0x80000000)
|
|
|
|
|
&& (imm & 0x8000000) != (value & 0x80000000));
|
|
|
|
|
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
|
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* and dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F200 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] &= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* and imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8E000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] &= (insn & 0xff);
|
|
|
|
|
z = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* and */
|
|
|
|
|
void OP_FAE00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* and */
|
|
|
|
|
void OP_FCE00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* and */
|
|
|
|
|
void OP_FAFC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* or dm, dn*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F210 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] |= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* or imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8E400 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] |= insn & 0xff;
|
|
|
|
|
z = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* or */
|
|
|
|
|
void OP_FAE40000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* or */
|
|
|
|
|
void OP_FCE40000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* or */
|
|
|
|
|
void OP_FAFD0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* xor dm, dn*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F220 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] ^= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* xor */
|
|
|
|
|
void OP_FAE80000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* xor */
|
|
|
|
|
void OP_FCE80000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* not */
|
|
|
|
|
void OP_F230 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = ~State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* btst imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8EC00 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
unsigned long temp;
|
|
|
|
|
int z, n;
|
|
|
|
|
|
|
|
|
|
temp = State.regs[REG_D0 + ((insn & 0x300) >> 8)];
|
|
|
|
|
temp &= (insn & 0xff);
|
|
|
|
|
n = (temp & 0x80000000) != 0;
|
|
|
|
|
z = (temp == 0);
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* btst */
|
|
|
|
|
void OP_FAEC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* btst */
|
|
|
|
|
void OP_FCEC0000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* btst */
|
|
|
|
|
void OP_FE020000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* btst */
|
|
|
|
|
void OP_FAF80000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* bset dm, (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F080 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long temp;
|
|
|
|
|
int z;
|
|
|
|
|
|
|
|
|
|
temp = load_mem (State.regs[REG_A0 + (insn & 3)], 1);
|
|
|
|
|
z = (temp & State.regs[REG_D0 + ((insn & 0xc) >> 2)]) == 0;
|
|
|
|
|
temp |= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
store_mem (State.regs[REG_A0 + (insn & 3)], 1, temp);
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= (z ? PSW_Z : 0);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* bset */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FE000000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* bset */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAF00000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* bclr dm, (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F090 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long temp;
|
|
|
|
|
int z;
|
|
|
|
|
|
|
|
|
|
temp = load_mem (State.regs[REG_A0 + (insn & 3)], 1);
|
|
|
|
|
z = (temp & State.regs[REG_D0 + ((insn & 0xc) >> 2)]) == 0;
|
|
|
|
|
temp = ~temp & State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
store_mem (State.regs[REG_A0 + (insn & 3)], 1, temp);
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= (z ? PSW_Z : 0);
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* bclr */
|
|
|
|
|
void OP_FE010000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* bclr */
|
|
|
|
|
void OP_FAF40000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* asr dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2B0 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
long temp;
|
|
|
|
|
int z, n, c;
|
|
|
|
|
|
|
|
|
|
temp = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
c = temp & 1;
|
|
|
|
|
temp >>= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = temp;
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* asr imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8C800 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
long temp;
|
|
|
|
|
int z, n, c;
|
|
|
|
|
|
|
|
|
|
temp = State.regs[REG_D0 + ((insn & 0x300) >> 8)];
|
|
|
|
|
c = temp & 1;
|
|
|
|
|
temp >>= (insn & 0xff);
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] = temp;
|
|
|
|
|
z = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* lsr dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F2A0 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int z, n, c;
|
|
|
|
|
|
|
|
|
|
c = State.regs[REG_D0 + (insn & 0x3)] & 1;
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
>>= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* lsr dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8C400 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
int z, n, c;
|
|
|
|
|
|
|
|
|
|
c = State.regs[REG_D0 + ((insn & 0x300) >> 8)] & 1;
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] >>= (insn & 0xff);
|
|
|
|
|
z = (State.regs[REG_D0 + ((insn & 0x3) >> 8)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + ((insn & 0x3) >> 8)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* asl dm, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F290 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)]
|
|
|
|
|
<<= State.regs[REG_D0 + ((insn & 0xc) >> 2)];
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:51:30 +00:00
|
|
|
|
/* asl imm8, dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8C000 ()
|
|
|
|
|
{
|
1996-11-27 16:51:30 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + ((insn & 0x300) >> 8)] <<= (insn & 0xff);
|
|
|
|
|
z = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + ((insn & 0x300) >> 8)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* asl2 dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_54 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
int n, z;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] <<= 2;
|
|
|
|
|
z = (State.regs[REG_D0 + (insn & 0x3)] == 0);
|
|
|
|
|
n = (State.regs[REG_D0 + (insn & 0x3)] & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* ror dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F284 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long value;
|
|
|
|
|
int c,n,z;
|
|
|
|
|
|
|
|
|
|
value = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
if (value & 0x1)
|
|
|
|
|
c = 1;
|
|
|
|
|
|
|
|
|
|
value >>= 1;
|
|
|
|
|
value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* rol dn */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F280 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned long value;
|
|
|
|
|
int c,n,z;
|
|
|
|
|
|
|
|
|
|
value = State.regs[REG_D0 + (insn & 0x3)];
|
|
|
|
|
if (value & 0x80000000)
|
|
|
|
|
c = 1;
|
|
|
|
|
|
|
|
|
|
value <<= 1;
|
|
|
|
|
value |= ((PSW & PSW_C) != 0);
|
|
|
|
|
State.regs[REG_D0 + (insn & 0x3)] = value;
|
|
|
|
|
z = (value == 0);
|
|
|
|
|
n = (value & 0x8000000) != 0;
|
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
|
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* beq label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C800 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (PSW & PSW_Z)
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bne label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C900 ()
|
|
|
|
|
{
|
1996-11-26 22:58:24 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!(PSW & PSW_Z))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bgt label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C100 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!((PSW & PSW_Z)
|
|
|
|
|
|| (((PSW & PSW_N) != 0) ^ (PSW & PSW_V) != 0)))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bge label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C200 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!(((PSW & PSW_N) != 0) ^ (PSW & PSW_V) != 0))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* ble label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C300 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if ((PSW & PSW_Z)
|
|
|
|
|
|| (((PSW & PSW_N) != 0) ^ (PSW & PSW_V) != 0))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* blt label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C000 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (((PSW & PSW_N) != 0) ^ (PSW & PSW_V) != 0)
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bhi label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C500 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bcc label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C600 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!(PSW & PSW_C))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bls label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C700 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bcs label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_C400 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (PSW & PSW_C)
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bvc label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8E800 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 3 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!(PSW & PSW_V))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 3;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bvs label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8E900 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 3 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (PSW & PSW_V)
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 3;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bnc label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8EA00 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 3 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (!(PSW & PSW_N))
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 3;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bns label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F8EB00 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 3 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
if (PSW & PSW_N)
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 3;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* bra label:8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_CA00 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
/* The dispatching code will add 2 after we return, so
|
|
|
|
|
we subtract two here to make things right. */
|
|
|
|
|
State.pc += SEXT8 (insn & 0xff) - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* leq */
|
|
|
|
|
void OP_D8 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lne */
|
|
|
|
|
void OP_D9 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lgt */
|
|
|
|
|
void OP_D1 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lge */
|
|
|
|
|
void OP_D2 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lle */
|
|
|
|
|
void OP_D3 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* llt */
|
|
|
|
|
void OP_D0 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lhi */
|
|
|
|
|
void OP_D5 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lcc */
|
|
|
|
|
void OP_D6 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lls */
|
|
|
|
|
void OP_D7 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lcs */
|
|
|
|
|
void OP_D4 ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lra */
|
|
|
|
|
void OP_DA ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* setlb */
|
|
|
|
|
void OP_DB ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* jmp (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F0F4 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
State.pc = State.regs[REG_A0 + (insn & 0x3)] - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* jmp label:16 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_CC0000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
State.pc += SEXT16 (insn & 0xffff) - 3;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* jmp label:32 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_DC000000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
State.pc += (((insn & 0xffffff) << 8) | extension) - 5;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* call label:16,reg_list,imm8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_CD000000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned int next_pc, sp, adjust;
|
|
|
|
|
unsigned long mask;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
next_pc = State.pc + 2;
|
|
|
|
|
State.mem[sp] = next_pc & 0xff;
|
|
|
|
|
State.mem[sp+1] = next_pc & 0xff00;
|
|
|
|
|
State.mem[sp+2] = next_pc & 0xff0000;
|
|
|
|
|
State.mem[sp+3] = next_pc & 0xff000000;
|
|
|
|
|
|
|
|
|
|
mask = insn & 0xff;
|
|
|
|
|
|
|
|
|
|
adjust = 0;
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0 + 2] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x40)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0 + 3] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x20)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0 + 2] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x10)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0 + 3] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x8)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0 + 1] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0 + 1] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_MDR] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_LIR] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_LAR] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* And make sure to update the stack pointer. */
|
|
|
|
|
State.regs[REG_SP] -= extension;
|
|
|
|
|
State.regs[REG_MDR] = next_pc;
|
|
|
|
|
State.pc += SEXT16 ((insn & 0xffff00) >> 8) - 5;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* call label:32,reg_list,imm8*/
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_DD000000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned int next_pc, sp, adjust;
|
|
|
|
|
unsigned long mask;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
next_pc = State.pc + 2;
|
|
|
|
|
State.mem[sp] = next_pc & 0xff;
|
|
|
|
|
State.mem[sp+1] = next_pc & 0xff00;
|
|
|
|
|
State.mem[sp+2] = next_pc & 0xff0000;
|
|
|
|
|
State.mem[sp+3] = next_pc & 0xff000000;
|
|
|
|
|
|
|
|
|
|
mask = (extension & 0xff00) >> 8;
|
|
|
|
|
|
|
|
|
|
adjust = 0;
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0 + 2] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x40)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0 + 3] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x20)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0 + 2] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x10)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0 + 3] = load_mem (sp + adjust, 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x8)
|
|
|
|
|
{
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_D0 + 1] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_A0 + 1] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_MDR] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_LIR] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
State.regs[REG_LAR] = load_mem (sp + adjust, 4);
|
|
|
|
|
adjust -= 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* And make sure to update the stack pointer. */
|
|
|
|
|
State.regs[REG_SP] -= (extension & 0xff);
|
|
|
|
|
State.regs[REG_MDR] = next_pc;
|
|
|
|
|
State.pc += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* calls (an) */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_F0F0 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
unsigned int next_pc, sp;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
next_pc = State.pc + 2;
|
|
|
|
|
State.mem[sp] = next_pc & 0xff;
|
|
|
|
|
State.mem[sp+1] = next_pc & 0xff00;
|
|
|
|
|
State.mem[sp+2] = next_pc & 0xff0000;
|
|
|
|
|
State.mem[sp+3] = next_pc & 0xff000000;
|
|
|
|
|
State.regs[REG_MDR] = next_pc;
|
|
|
|
|
State.pc = State.regs[REG_A0 + (insn & 0x3)] - 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* calls label:16 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FAFF0000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
unsigned int next_pc, sp;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
next_pc = State.pc + 4;
|
|
|
|
|
State.mem[sp] = next_pc & 0xff;
|
|
|
|
|
State.mem[sp+1] = next_pc & 0xff00;
|
|
|
|
|
State.mem[sp+2] = next_pc & 0xff0000;
|
|
|
|
|
State.mem[sp+3] = next_pc & 0xff000000;
|
|
|
|
|
State.regs[REG_MDR] = next_pc;
|
|
|
|
|
State.pc += SEXT16 (insn & 0xffff) - 4;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* calls label:32 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_FCFF0000 ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
unsigned int next_pc, sp;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
next_pc = State.pc + 6;
|
|
|
|
|
State.mem[sp] = next_pc & 0xff;
|
|
|
|
|
State.mem[sp+1] = next_pc & 0xff00;
|
|
|
|
|
State.mem[sp+2] = next_pc & 0xff0000;
|
|
|
|
|
State.mem[sp+3] = next_pc & 0xff000000;
|
|
|
|
|
State.regs[REG_MDR] = next_pc;
|
|
|
|
|
State.pc += (((insn & 0xffff) << 16) | extension) - 6;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ret */
|
|
|
|
|
void OP_DF0000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned int sp;
|
|
|
|
|
unsigned long mask;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_SP] += insn & 0xff;
|
|
|
|
|
State.pc = State.regs[REG_MDR] - 3;
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
|
|
|
|
|
mask = (insn & 0xff00) >> 8;
|
|
|
|
|
|
|
|
|
|
if (mask & 0x8)
|
|
|
|
|
{
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_LAR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_LIR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_MDR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_A0 + 1] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_A0] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_D0 + 1] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_D0] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x10)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_A0 + 3] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x20)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_A0 + 2] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x40)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_D0 + 3] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_D0 + 2] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
1996-11-27 07:20:36 +00:00
|
|
|
|
/* retf reg_list,imm8 */
|
1996-11-25 19:52:08 +00:00
|
|
|
|
void OP_DE0000 ()
|
|
|
|
|
{
|
1996-11-27 07:20:36 +00:00
|
|
|
|
unsigned int sp;
|
|
|
|
|
unsigned long mask;
|
|
|
|
|
|
|
|
|
|
State.regs[REG_SP] += insn & 0xff;
|
|
|
|
|
State.pc = (State.mem[sp] | (State.mem[sp+1] << 8)
|
|
|
|
|
| (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
|
|
|
|
|
State.pc -= 3;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
|
|
|
|
|
mask = (insn & 0xff00) >> 8;
|
|
|
|
|
|
|
|
|
|
if (mask & 0x8)
|
|
|
|
|
{
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_LAR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_LIR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_MDR] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_A0 + 1] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_A0] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_D0 + 1] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
State.regs[REG_D0] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x10)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_A0 + 3] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x20)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_A0 + 2] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x40)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_D0 + 3] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & 0x80)
|
|
|
|
|
{
|
|
|
|
|
State.regs[REG_D0 + 2] = load_mem (sp, 4);
|
|
|
|
|
sp += 4;
|
|
|
|
|
}
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* rets */
|
|
|
|
|
void OP_F0FC ()
|
|
|
|
|
{
|
1996-11-27 00:53:25 +00:00
|
|
|
|
unsigned int sp;
|
|
|
|
|
|
|
|
|
|
sp = State.regs[REG_SP];
|
|
|
|
|
State.pc = (State.mem[sp] | (State.mem[sp+1] << 8)
|
|
|
|
|
| (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
|
|
|
|
|
State.pc -= 2;
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* rti */
|
|
|
|
|
void OP_F0FD ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* trap */
|
|
|
|
|
void OP_F0FE ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* rtm */
|
|
|
|
|
void OP_F0FF ()
|
|
|
|
|
{
|
1996-11-27 16:25:03 +00:00
|
|
|
|
abort ();
|
1996-11-25 19:52:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* nop */
|
|
|
|
|
void OP_CB ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* putx */
|
|
|
|
|
void OP_F500 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* getx */
|
|
|
|
|
void OP_F6F0 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulq */
|
|
|
|
|
void OP_F600 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulq */
|
|
|
|
|
void OP_F90000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulq */
|
|
|
|
|
void OP_FB000000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulq */
|
|
|
|
|
void OP_FD000000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulqu */
|
|
|
|
|
void OP_F610 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulqu */
|
|
|
|
|
void OP_F91400 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulqu */
|
|
|
|
|
void OP_FB140000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mulqu */
|
|
|
|
|
void OP_FD140000 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* sat16 */
|
|
|
|
|
void OP_F640 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* sat24 */
|
|
|
|
|
void OP_F650 ()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* bsch */
|
|
|
|
|
void OP_F670 ()
|
|
|
|
|
{
|
|
|
|
|
}
|