src/musashi/m68k_in.c

Sat, 27 Nov 2010 01:13:12 +0000

author
Philip Pemberton <philpem@philpem.me.uk>
date
Sat, 27 Nov 2010 01:13:12 +0000
changeset 0
8bf1bf91a36d
child 110
acea4b2f396f
permissions
-rw-r--r--

initial commit

philpem@0 1 /* ======================================================================== */
philpem@0 2 /* ========================= LICENSING & COPYRIGHT ======================== */
philpem@0 3 /* ======================================================================== */
philpem@0 4 /*
philpem@0 5 * MUSASHI
philpem@0 6 * Version 3.3
philpem@0 7 *
philpem@0 8 * A portable Motorola M680x0 processor emulation engine.
philpem@0 9 * Copyright 1998-2001 Karl Stenerud. All rights reserved.
philpem@0 10 *
philpem@0 11 * This code may be freely used for non-commercial purposes as long as this
philpem@0 12 * copyright notice remains unaltered in the source code and any binary files
philpem@0 13 * containing this code in compiled form.
philpem@0 14 *
philpem@0 15 * All other lisencing terms must be negotiated with the author
philpem@0 16 * (Karl Stenerud).
philpem@0 17 *
philpem@0 18 * The latest version of this code can be obtained at:
philpem@0 19 * http://kstenerud.cjb.net
philpem@0 20 */
philpem@0 21
philpem@0 22
philpem@0 23
philpem@0 24 /* Input file for m68kmake
philpem@0 25 * -----------------------
philpem@0 26 *
philpem@0 27 * All sections begin with 80 X's in a row followed by an end-of-line
philpem@0 28 * sequence.
philpem@0 29 * After this, m68kmake will expect to find one of the following section
philpem@0 30 * identifiers:
philpem@0 31 * M68KMAKE_PROTOTYPE_HEADER - header for opcode handler prototypes
philpem@0 32 * M68KMAKE_PROTOTYPE_FOOTER - footer for opcode handler prototypes
philpem@0 33 * M68KMAKE_TABLE_HEADER - header for opcode handler jumptable
philpem@0 34 * M68KMAKE_TABLE_FOOTER - footer for opcode handler jumptable
philpem@0 35 * M68KMAKE_TABLE_BODY - the table itself
philpem@0 36 * M68KMAKE_OPCODE_HANDLER_HEADER - header for opcode handler implementation
philpem@0 37 * M68KMAKE_OPCODE_HANDLER_FOOTER - footer for opcode handler implementation
philpem@0 38 * M68KMAKE_OPCODE_HANDLER_BODY - body section for opcode handler implementation
philpem@0 39 *
philpem@0 40 * NOTE: M68KMAKE_OPCODE_HANDLER_BODY must be last in the file and
philpem@0 41 * M68KMAKE_TABLE_BODY must be second last in the file.
philpem@0 42 *
philpem@0 43 * The M68KMAKE_OPHANDLER_BODY section contains the opcode handler
philpem@0 44 * primitives themselves. Each opcode handler begins with:
philpem@0 45 * M68KMAKE_OP(A, B, C, D)
philpem@0 46 *
philpem@0 47 * where A is the opcode handler name, B is the size of the operation,
philpem@0 48 * C denotes any special processing mode, and D denotes a specific
philpem@0 49 * addressing mode.
philpem@0 50 * For C and D where nothing is specified, use "."
philpem@0 51 *
philpem@0 52 * Example:
philpem@0 53 * M68KMAKE_OP(abcd, 8, rr, .) abcd, size 8, register to register, default EA
philpem@0 54 * M68KMAKE_OP(abcd, 8, mm, ax7) abcd, size 8, memory to memory, register X is A7
philpem@0 55 * M68KMAKE_OP(tst, 16, ., pcix) tst, size 16, PCIX addressing
philpem@0 56 *
philpem@0 57 * All opcode handler primitives end with a closing curly brace "}" at column 1
philpem@0 58 *
philpem@0 59 * NOTE: Do not place a M68KMAKE_OP() directive inside the opcode handler,
philpem@0 60 * and do not put a closing curly brace at column 1 unless it is
philpem@0 61 * marking the end of the handler!
philpem@0 62 *
philpem@0 63 * Inside the handler, m68kmake will recognize M68KMAKE_GET_OPER_xx_xx,
philpem@0 64 * M68KMAKE_GET_EA_xx_xx, and M68KMAKE_CC directives, and create multiple
philpem@0 65 * opcode handlers to handle variations in the opcode handler.
philpem@0 66 * Note: M68KMAKE_CC will only be interpreted in condition code opcodes.
philpem@0 67 * As well, M68KMAKE_GET_EA_xx_xx and M68KMAKE_GET_OPER_xx_xx will only
philpem@0 68 * be interpreted on instructions where the corresponding table entry
philpem@0 69 * specifies multiple effective addressing modes.
philpem@0 70 * Example:
philpem@0 71 * clr 32 . . 0100001010...... A+-DXWL... U U U 12 6 4
philpem@0 72 *
philpem@0 73 * This table entry says that the clr.l opcde has 7 variations (A+-DXWL).
philpem@0 74 * It is run in user or supervisor mode for all CPUs, and uses 12 cycles for
philpem@0 75 * 68000, 6 cycles for 68010, and 4 cycles for 68020.
philpem@0 76 */
philpem@0 77
philpem@0 78 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 79 M68KMAKE_PROTOTYPE_HEADER
philpem@0 80
philpem@0 81 #ifndef M68KOPS__HEADER
philpem@0 82 #define M68KOPS__HEADER
philpem@0 83
philpem@0 84 /* ======================================================================== */
philpem@0 85 /* ============================ OPCODE HANDLERS =========================== */
philpem@0 86 /* ======================================================================== */
philpem@0 87
philpem@0 88
philpem@0 89
philpem@0 90 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 91 M68KMAKE_PROTOTYPE_FOOTER
philpem@0 92
philpem@0 93
philpem@0 94 /* Build the opcode handler table */
philpem@0 95 void m68ki_build_opcode_table(void);
philpem@0 96
philpem@0 97 extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
philpem@0 98 extern unsigned char m68ki_cycles[][0x10000];
philpem@0 99
philpem@0 100
philpem@0 101 /* ======================================================================== */
philpem@0 102 /* ============================== END OF FILE ============================= */
philpem@0 103 /* ======================================================================== */
philpem@0 104
philpem@0 105 #endif /* M68KOPS__HEADER */
philpem@0 106
philpem@0 107
philpem@0 108
philpem@0 109 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 110 M68KMAKE_TABLE_HEADER
philpem@0 111
philpem@0 112 /* ======================================================================== */
philpem@0 113 /* ========================= OPCODE TABLE BUILDER ========================= */
philpem@0 114 /* ======================================================================== */
philpem@0 115
philpem@0 116 #include "m68kops.h"
philpem@0 117
philpem@0 118 #define NUM_CPU_TYPES 3
philpem@0 119
philpem@0 120 void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
philpem@0 121 unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */
philpem@0 122
philpem@0 123 /* This is used to generate the opcode handler jump table */
philpem@0 124 typedef struct
philpem@0 125 {
philpem@0 126 void (*opcode_handler)(void); /* handler function */
philpem@0 127 unsigned int mask; /* mask on opcode */
philpem@0 128 unsigned int match; /* what to match after masking */
philpem@0 129 unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */
philpem@0 130 } opcode_handler_struct;
philpem@0 131
philpem@0 132
philpem@0 133 /* Opcode handler table */
philpem@0 134 static opcode_handler_struct m68k_opcode_handler_table[] =
philpem@0 135 {
philpem@0 136 /* function mask match 000 010 020 */
philpem@0 137
philpem@0 138
philpem@0 139
philpem@0 140 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 141 M68KMAKE_TABLE_FOOTER
philpem@0 142
philpem@0 143 {0, 0, 0, {0, 0, 0}}
philpem@0 144 };
philpem@0 145
philpem@0 146
philpem@0 147 /* Build the opcode handler jump table */
philpem@0 148 void m68ki_build_opcode_table(void)
philpem@0 149 {
philpem@0 150 opcode_handler_struct *ostruct;
philpem@0 151 int instr;
philpem@0 152 int i;
philpem@0 153 int j;
philpem@0 154 int k;
philpem@0 155
philpem@0 156 for(i = 0; i < 0x10000; i++)
philpem@0 157 {
philpem@0 158 /* default to illegal */
philpem@0 159 m68ki_instruction_jump_table[i] = m68k_op_illegal;
philpem@0 160 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 161 m68ki_cycles[k][i] = 0;
philpem@0 162 }
philpem@0 163
philpem@0 164 ostruct = m68k_opcode_handler_table;
philpem@0 165 while(ostruct->mask != 0xff00)
philpem@0 166 {
philpem@0 167 for(i = 0;i < 0x10000;i++)
philpem@0 168 {
philpem@0 169 if((i & ostruct->mask) == ostruct->match)
philpem@0 170 {
philpem@0 171 m68ki_instruction_jump_table[i] = ostruct->opcode_handler;
philpem@0 172 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 173 m68ki_cycles[k][i] = ostruct->cycles[k];
philpem@0 174 }
philpem@0 175 }
philpem@0 176 ostruct++;
philpem@0 177 }
philpem@0 178 while(ostruct->mask == 0xff00)
philpem@0 179 {
philpem@0 180 for(i = 0;i <= 0xff;i++)
philpem@0 181 {
philpem@0 182 m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
philpem@0 183 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 184 m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
philpem@0 185 }
philpem@0 186 ostruct++;
philpem@0 187 }
philpem@0 188 while(ostruct->mask == 0xf1f8)
philpem@0 189 {
philpem@0 190 for(i = 0;i < 8;i++)
philpem@0 191 {
philpem@0 192 for(j = 0;j < 8;j++)
philpem@0 193 {
philpem@0 194 instr = ostruct->match | (i << 9) | j;
philpem@0 195 m68ki_instruction_jump_table[instr] = ostruct->opcode_handler;
philpem@0 196 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 197 m68ki_cycles[k][instr] = ostruct->cycles[k];
philpem@0 198 if((instr & 0xf000) == 0xe000 && (!(instr & 0x20)))
philpem@0 199 m68ki_cycles[0][instr] = m68ki_cycles[1][instr] = ostruct->cycles[k] + ((((j-1)&7)+1)<<1);
philpem@0 200 }
philpem@0 201 }
philpem@0 202 ostruct++;
philpem@0 203 }
philpem@0 204 while(ostruct->mask == 0xfff0)
philpem@0 205 {
philpem@0 206 for(i = 0;i <= 0x0f;i++)
philpem@0 207 {
philpem@0 208 m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
philpem@0 209 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 210 m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
philpem@0 211 }
philpem@0 212 ostruct++;
philpem@0 213 }
philpem@0 214 while(ostruct->mask == 0xf1ff)
philpem@0 215 {
philpem@0 216 for(i = 0;i <= 0x07;i++)
philpem@0 217 {
philpem@0 218 m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler;
philpem@0 219 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 220 m68ki_cycles[k][ostruct->match | (i << 9)] = ostruct->cycles[k];
philpem@0 221 }
philpem@0 222 ostruct++;
philpem@0 223 }
philpem@0 224 while(ostruct->mask == 0xfff8)
philpem@0 225 {
philpem@0 226 for(i = 0;i <= 0x07;i++)
philpem@0 227 {
philpem@0 228 m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
philpem@0 229 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 230 m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
philpem@0 231 }
philpem@0 232 ostruct++;
philpem@0 233 }
philpem@0 234 while(ostruct->mask == 0xffff)
philpem@0 235 {
philpem@0 236 m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler;
philpem@0 237 for(k=0;k<NUM_CPU_TYPES;k++)
philpem@0 238 m68ki_cycles[k][ostruct->match] = ostruct->cycles[k];
philpem@0 239 ostruct++;
philpem@0 240 }
philpem@0 241 }
philpem@0 242
philpem@0 243
philpem@0 244 /* ======================================================================== */
philpem@0 245 /* ============================== END OF FILE ============================= */
philpem@0 246 /* ======================================================================== */
philpem@0 247
philpem@0 248
philpem@0 249
philpem@0 250 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 251 M68KMAKE_OPCODE_HANDLER_HEADER
philpem@0 252
philpem@0 253 #include "m68kcpu.h"
philpem@0 254
philpem@0 255 /* ======================================================================== */
philpem@0 256 /* ========================= INSTRUCTION HANDLERS ========================= */
philpem@0 257 /* ======================================================================== */
philpem@0 258
philpem@0 259
philpem@0 260
philpem@0 261 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 262 M68KMAKE_OPCODE_HANDLER_FOOTER
philpem@0 263
philpem@0 264 /* ======================================================================== */
philpem@0 265 /* ============================== END OF FILE ============================= */
philpem@0 266 /* ======================================================================== */
philpem@0 267
philpem@0 268
philpem@0 269
philpem@0 270 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 271 M68KMAKE_TABLE_BODY
philpem@0 272
philpem@0 273 The following table is arranged as follows:
philpem@0 274
philpem@0 275 name: Opcode mnemonic
philpem@0 276
philpem@0 277 size: Operation size
philpem@0 278
philpem@0 279 spec proc: Special processing mode:
philpem@0 280 .: normal
philpem@0 281 s: static operand
philpem@0 282 r: register operand
philpem@0 283 rr: register to register
philpem@0 284 mm: memory to memory
philpem@0 285 er: effective address to register
philpem@0 286 re: register to effective address
philpem@0 287 dd: data register to data register
philpem@0 288 da: data register to address register
philpem@0 289 aa: address register to address register
philpem@0 290 cr: control register to register
philpem@0 291 rc: register to control register
philpem@0 292 toc: to condition code register
philpem@0 293 tos: to status register
philpem@0 294 tou: to user stack pointer
philpem@0 295 frc: from condition code register
philpem@0 296 frs: from status register
philpem@0 297 fru: from user stack pointer
philpem@0 298 * for move.x, the special processing mode is a specific
philpem@0 299 destination effective addressing mode.
philpem@0 300
philpem@0 301 spec ea: Specific effective addressing mode:
philpem@0 302 .: normal
philpem@0 303 i: immediate
philpem@0 304 d: data register
philpem@0 305 a: address register
philpem@0 306 ai: address register indirect
philpem@0 307 pi: address register indirect with postincrement
philpem@0 308 pd: address register indirect with predecrement
philpem@0 309 di: address register indirect with displacement
philpem@0 310 ix: address register indirect with index
philpem@0 311 aw: absolute word address
philpem@0 312 al: absolute long address
philpem@0 313 pcdi: program counter relative with displacement
philpem@0 314 pcix: program counter relative with index
philpem@0 315 a7: register specified in instruction is A7
philpem@0 316 ax7: register field X of instruction is A7
philpem@0 317 ay7: register field Y of instruction is A7
philpem@0 318 axy7: register fields X and Y of instruction are A7
philpem@0 319
philpem@0 320 bit pattern: Pattern to recognize this opcode. "." means don't care.
philpem@0 321
philpem@0 322 allowed ea: List of allowed addressing modes:
philpem@0 323 .: not present
philpem@0 324 A: address register indirect
philpem@0 325 +: ARI (address register indirect) with postincrement
philpem@0 326 -: ARI with predecrement
philpem@0 327 D: ARI with displacement
philpem@0 328 X: ARI with index
philpem@0 329 W: absolute word address
philpem@0 330 L: absolute long address
philpem@0 331 d: program counter indirect with displacement
philpem@0 332 x: program counter indirect with index
philpem@0 333 I: immediate
philpem@0 334 mode: CPU operating mode for each cpu type. U = user or supervisor,
philpem@0 335 S = supervisor only, "." = opcode not present.
philpem@0 336
philpem@0 337 cpu cycles: Base number of cycles required to execute this opcode on the
philpem@0 338 specified CPU type.
philpem@0 339 Use "." if CPU does not have this opcode.
philpem@0 340
philpem@0 341
philpem@0 342
philpem@0 343 spec spec allowed ea mode cpu cycles
philpem@0 344 name size proc ea bit pattern A+-DXWLdxI 0 1 2 000 010 020 comments
philpem@0 345 ====== ==== ==== ==== ================ ========== = = = === === === =============
philpem@0 346 M68KMAKE_TABLE_START
philpem@0 347 1010 0 . . 1010............ .......... U U U 4 4 4
philpem@0 348 1111 0 . . 1111............ .......... U U U 4 4 4
philpem@0 349 abcd 8 rr . 1100...100000... .......... U U U 6 6 4
philpem@0 350 abcd 8 mm ax7 1100111100001... .......... U U U 18 18 16
philpem@0 351 abcd 8 mm ay7 1100...100001111 .......... U U U 18 18 16
philpem@0 352 abcd 8 mm axy7 1100111100001111 .......... U U U 18 18 16
philpem@0 353 abcd 8 mm . 1100...100001... .......... U U U 18 18 16
philpem@0 354 add 8 er d 1101...000000... .......... U U U 4 4 2
philpem@0 355 add 8 er . 1101...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 356 add 16 er d 1101...001000... .......... U U U 4 4 2
philpem@0 357 add 16 er a 1101...001001... .......... U U U 4 4 2
philpem@0 358 add 16 er . 1101...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 359 add 32 er d 1101...010000... .......... U U U 6 6 2
philpem@0 360 add 32 er a 1101...010001... .......... U U U 6 6 2
philpem@0 361 add 32 er . 1101...010...... A+-DXWLdxI U U U 6 6 2
philpem@0 362 add 8 re . 1101...100...... A+-DXWL... U U U 8 8 4
philpem@0 363 add 16 re . 1101...101...... A+-DXWL... U U U 8 8 4
philpem@0 364 add 32 re . 1101...110...... A+-DXWL... U U U 12 12 4
philpem@0 365 adda 16 . d 1101...011000... .......... U U U 8 8 2
philpem@0 366 adda 16 . a 1101...011001... .......... U U U 8 8 2
philpem@0 367 adda 16 . . 1101...011...... A+-DXWLdxI U U U 8 8 2
philpem@0 368 adda 32 . d 1101...111000... .......... U U U 6 6 2
philpem@0 369 adda 32 . a 1101...111001... .......... U U U 6 6 2
philpem@0 370 adda 32 . . 1101...111...... A+-DXWLdxI U U U 6 6 2
philpem@0 371 addi 8 . d 0000011000000... .......... U U U 8 8 2
philpem@0 372 addi 8 . . 0000011000...... A+-DXWL... U U U 12 12 4
philpem@0 373 addi 16 . d 0000011001000... .......... U U U 8 8 2
philpem@0 374 addi 16 . . 0000011001...... A+-DXWL... U U U 12 12 4
philpem@0 375 addi 32 . d 0000011010000... .......... U U U 16 14 2
philpem@0 376 addi 32 . . 0000011010...... A+-DXWL... U U U 20 20 4
philpem@0 377 addq 8 . d 0101...000000... .......... U U U 4 4 2
philpem@0 378 addq 8 . . 0101...000...... A+-DXWL... U U U 8 8 4
philpem@0 379 addq 16 . d 0101...001000... .......... U U U 4 4 2
philpem@0 380 addq 16 . a 0101...001001... .......... U U U 4 4 2
philpem@0 381 addq 16 . . 0101...001...... A+-DXWL... U U U 8 8 4
philpem@0 382 addq 32 . d 0101...010000... .......... U U U 8 8 2
philpem@0 383 addq 32 . a 0101...010001... .......... U U U 8 8 2
philpem@0 384 addq 32 . . 0101...010...... A+-DXWL... U U U 12 12 4
philpem@0 385 addx 8 rr . 1101...100000... .......... U U U 4 4 2
philpem@0 386 addx 16 rr . 1101...101000... .......... U U U 4 4 2
philpem@0 387 addx 32 rr . 1101...110000... .......... U U U 8 6 2
philpem@0 388 addx 8 mm ax7 1101111100001... .......... U U U 18 18 12
philpem@0 389 addx 8 mm ay7 1101...100001111 .......... U U U 18 18 12
philpem@0 390 addx 8 mm axy7 1101111100001111 .......... U U U 18 18 12
philpem@0 391 addx 8 mm . 1101...100001... .......... U U U 18 18 12
philpem@0 392 addx 16 mm . 1101...101001... .......... U U U 18 18 12
philpem@0 393 addx 32 mm . 1101...110001... .......... U U U 30 30 12
philpem@0 394 and 8 er d 1100...000000... .......... U U U 4 4 2
philpem@0 395 and 8 er . 1100...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 396 and 16 er d 1100...001000... .......... U U U 4 4 2
philpem@0 397 and 16 er . 1100...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 398 and 32 er d 1100...010000... .......... U U U 6 6 2
philpem@0 399 and 32 er . 1100...010...... A+-DXWLdxI U U U 6 6 2
philpem@0 400 and 8 re . 1100...100...... A+-DXWL... U U U 8 8 4
philpem@0 401 and 16 re . 1100...101...... A+-DXWL... U U U 8 8 4
philpem@0 402 and 32 re . 1100...110...... A+-DXWL... U U U 12 12 4
philpem@0 403 andi 16 toc . 0000001000111100 .......... U U U 20 16 12
philpem@0 404 andi 16 tos . 0000001001111100 .......... S S S 20 16 12
philpem@0 405 andi 8 . d 0000001000000... .......... U U U 8 8 2
philpem@0 406 andi 8 . . 0000001000...... A+-DXWL... U U U 12 12 4
philpem@0 407 andi 16 . d 0000001001000... .......... U U U 8 8 2
philpem@0 408 andi 16 . . 0000001001...... A+-DXWL... U U U 12 12 4
philpem@0 409 andi 32 . d 0000001010000... .......... U U U 14 14 2
philpem@0 410 andi 32 . . 0000001010...... A+-DXWL... U U U 20 20 4
philpem@0 411 asr 8 s . 1110...000000... .......... U U U 6 6 6
philpem@0 412 asr 16 s . 1110...001000... .......... U U U 6 6 6
philpem@0 413 asr 32 s . 1110...010000... .......... U U U 8 8 6
philpem@0 414 asr 8 r . 1110...000100... .......... U U U 6 6 6
philpem@0 415 asr 16 r . 1110...001100... .......... U U U 6 6 6
philpem@0 416 asr 32 r . 1110...010100... .......... U U U 8 8 6
philpem@0 417 asr 16 . . 1110000011...... A+-DXWL... U U U 8 8 5
philpem@0 418 asl 8 s . 1110...100000... .......... U U U 6 6 8
philpem@0 419 asl 16 s . 1110...101000... .......... U U U 6 6 8
philpem@0 420 asl 32 s . 1110...110000... .......... U U U 8 8 8
philpem@0 421 asl 8 r . 1110...100100... .......... U U U 6 6 8
philpem@0 422 asl 16 r . 1110...101100... .......... U U U 6 6 8
philpem@0 423 asl 32 r . 1110...110100... .......... U U U 8 8 8
philpem@0 424 asl 16 . . 1110000111...... A+-DXWL... U U U 8 8 6
philpem@0 425 bcc 8 . . 0110............ .......... U U U 8 8 6
philpem@0 426 bcc 16 . . 0110....00000000 .......... U U U 10 10 6
philpem@0 427 bcc 32 . . 0110....11111111 .......... . . U . . 6
philpem@0 428 bchg 8 r . 0000...101...... A+-DXWL... U U U 8 8 4
philpem@0 429 bchg 32 r d 0000...101000... .......... U U U 8 8 4
philpem@0 430 bchg 8 s . 0000100001...... A+-DXWL... U U U 12 12 4
philpem@0 431 bchg 32 s d 0000100001000... .......... U U U 12 12 4
philpem@0 432 bclr 8 r . 0000...110...... A+-DXWL... U U U 8 10 4
philpem@0 433 bclr 32 r d 0000...110000... .......... U U U 10 10 4
philpem@0 434 bclr 8 s . 0000100010...... A+-DXWL... U U U 12 12 4
philpem@0 435 bclr 32 s d 0000100010000... .......... U U U 14 14 4
philpem@0 436 bfchg 32 . d 1110101011000... .......... . . U . . 12 timing not quite correct
philpem@0 437 bfchg 32 . . 1110101011...... A..DXWL... . . U . . 20
philpem@0 438 bfclr 32 . d 1110110011000... .......... . . U . . 12
philpem@0 439 bfclr 32 . . 1110110011...... A..DXWL... . . U . . 20
philpem@0 440 bfexts 32 . d 1110101111000... .......... . . U . . 8
philpem@0 441 bfexts 32 . . 1110101111...... A..DXWLdx. . . U . . 15
philpem@0 442 bfextu 32 . d 1110100111000... .......... . . U . . 8
philpem@0 443 bfextu 32 . . 1110100111...... A..DXWLdx. . . U . . 15
philpem@0 444 bfffo 32 . d 1110110111000... .......... . . U . . 18
philpem@0 445 bfffo 32 . . 1110110111...... A..DXWLdx. . . U . . 28
philpem@0 446 bfins 32 . d 1110111111000... .......... . . U . . 10
philpem@0 447 bfins 32 . . 1110111111...... A..DXWL... . . U . . 17
philpem@0 448 bfset 32 . d 1110111011000... .......... . . U . . 12
philpem@0 449 bfset 32 . . 1110111011...... A..DXWL... . . U . . 20
philpem@0 450 bftst 32 . d 1110100011000... .......... . . U . . 6
philpem@0 451 bftst 32 . . 1110100011...... A..DXWLdx. . . U . . 13
philpem@0 452 bkpt 0 . . 0100100001001... .......... . U U . 10 10
philpem@0 453 bra 8 . . 01100000........ .......... U U U 10 10 10
philpem@0 454 bra 16 . . 0110000000000000 .......... U U U 10 10 10
philpem@0 455 bra 32 . . 0110000011111111 .......... U U U . . 10
philpem@0 456 bset 32 r d 0000...111000... .......... U U U 8 8 4
philpem@0 457 bset 8 r . 0000...111...... A+-DXWL... U U U 8 8 4
philpem@0 458 bset 8 s . 0000100011...... A+-DXWL... U U U 12 12 4
philpem@0 459 bset 32 s d 0000100011000... .......... U U U 12 12 4
philpem@0 460 bsr 8 . . 01100001........ .......... U U U 18 18 7
philpem@0 461 bsr 16 . . 0110000100000000 .......... U U U 18 18 7
philpem@0 462 bsr 32 . . 0110000111111111 .......... . . U . . 7
philpem@0 463 btst 8 r . 0000...100...... A+-DXWLdxI U U U 4 4 4
philpem@0 464 btst 32 r d 0000...100000... .......... U U U 6 6 4
philpem@0 465 btst 8 s . 0000100000...... A+-DXWLdx. U U U 8 8 4
philpem@0 466 btst 32 s d 0000100000000... .......... U U U 10 10 4
philpem@0 467 callm 32 . . 0000011011...... A..DXWLdx. . . U . . 60 not properly emulated
philpem@0 468 cas 8 . . 0000101011...... A+-DXWL... . . U . . 12
philpem@0 469 cas 16 . . 0000110011...... A+-DXWL... . . U . . 12
philpem@0 470 cas 32 . . 0000111011...... A+-DXWL... . . U . . 12
philpem@0 471 cas2 16 . . 0000110011111100 .......... . . U . . 12
philpem@0 472 cas2 32 . . 0000111011111100 .......... . . U . . 12
philpem@0 473 chk 16 . d 0100...110000... .......... U U U 10 8 8
philpem@0 474 chk 16 . . 0100...110...... A+-DXWLdxI U U U 10 8 8
philpem@0 475 chk 32 . d 0100...100000... .......... . . U . . 8
philpem@0 476 chk 32 . . 0100...100...... A+-DXWLdxI . . U . . 8
philpem@0 477 chk2cmp2 8 . . 0000000011...... A..DXWLdx. . . U . . 18
philpem@0 478 chk2cmp2 16 . . 0000001011...... A..DXWLdx. . . U . . 18
philpem@0 479 chk2cmp2 32 . . 0000010011...... A..DXWLdx. . . U . . 18
philpem@0 480 clr 8 . d 0100001000000... .......... U U U 4 4 2
philpem@0 481 clr 8 . . 0100001000...... A+-DXWL... U U U 8 4 4
philpem@0 482 clr 16 . d 0100001001000... .......... U U U 4 4 2
philpem@0 483 clr 16 . . 0100001001...... A+-DXWL... U U U 8 4 4
philpem@0 484 clr 32 . d 0100001010000... .......... U U U 6 6 2
philpem@0 485 clr 32 . . 0100001010...... A+-DXWL... U U U 12 6 4
philpem@0 486 cmp 8 . d 1011...000000... .......... U U U 4 4 2
philpem@0 487 cmp 8 . . 1011...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 488 cmp 16 . d 1011...001000... .......... U U U 4 4 2
philpem@0 489 cmp 16 . a 1011...001001... .......... U U U 4 4 2
philpem@0 490 cmp 16 . . 1011...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 491 cmp 32 . d 1011...010000... .......... U U U 6 6 2
philpem@0 492 cmp 32 . a 1011...010001... .......... U U U 6 6 2
philpem@0 493 cmp 32 . . 1011...010...... A+-DXWLdxI U U U 6 6 2
philpem@0 494 cmpa 16 . d 1011...011000... .......... U U U 6 6 4
philpem@0 495 cmpa 16 . a 1011...011001... .......... U U U 6 6 4
philpem@0 496 cmpa 16 . . 1011...011...... A+-DXWLdxI U U U 6 6 4
philpem@0 497 cmpa 32 . d 1011...111000... .......... U U U 6 6 4
philpem@0 498 cmpa 32 . a 1011...111001... .......... U U U 6 6 4
philpem@0 499 cmpa 32 . . 1011...111...... A+-DXWLdxI U U U 6 6 4
philpem@0 500 cmpi 8 . d 0000110000000... .......... U U U 8 8 2
philpem@0 501 cmpi 8 . . 0000110000...... A+-DXWL... U U U 8 8 2
philpem@0 502 cmpi 8 . pcdi 0000110000111010 .......... . . U . . 7
philpem@0 503 cmpi 8 . pcix 0000110000111011 .......... . . U . . 9
philpem@0 504 cmpi 16 . d 0000110001000... .......... U U U 8 8 2
philpem@0 505 cmpi 16 . . 0000110001...... A+-DXWL... U U U 8 8 2
philpem@0 506 cmpi 16 . pcdi 0000110001111010 .......... . . U . . 7
philpem@0 507 cmpi 16 . pcix 0000110001111011 .......... . . U . . 9
philpem@0 508 cmpi 32 . d 0000110010000... .......... U U U 14 12 2
philpem@0 509 cmpi 32 . . 0000110010...... A+-DXWL... U U U 12 12 2
philpem@0 510 cmpi 32 . pcdi 0000110010111010 .......... . . U . . 7
philpem@0 511 cmpi 32 . pcix 0000110010111011 .......... . . U . . 9
philpem@0 512 cmpm 8 . ax7 1011111100001... .......... U U U 12 12 9
philpem@0 513 cmpm 8 . ay7 1011...100001111 .......... U U U 12 12 9
philpem@0 514 cmpm 8 . axy7 1011111100001111 .......... U U U 12 12 9
philpem@0 515 cmpm 8 . . 1011...100001... .......... U U U 12 12 9
philpem@0 516 cmpm 16 . . 1011...101001... .......... U U U 12 12 9
philpem@0 517 cmpm 32 . . 1011...110001... .......... U U U 20 20 9
philpem@0 518 cpbcc 32 . . 1111...01....... .......... . . U . . 4 unemulated
philpem@0 519 cpdbcc 32 . . 1111...001001... .......... . . U . . 4 unemulated
philpem@0 520 cpgen 32 . . 1111...000...... .......... . . U . . 4 unemulated
philpem@0 521 cpscc 32 . . 1111...001...... .......... . . U . . 4 unemulated
philpem@0 522 cptrapcc 32 . . 1111...001111... .......... . . U . . 4 unemulated
philpem@0 523 dbt 16 . . 0101000011001... .......... U U U 12 12 6
philpem@0 524 dbf 16 . . 0101000111001... .......... U U U 14 14 6
philpem@0 525 dbcc 16 . . 0101....11001... .......... U U U 12 12 6
philpem@0 526 divs 16 . d 1000...111000... .......... U U U 158 122 56
philpem@0 527 divs 16 . . 1000...111...... A+-DXWLdxI U U U 158 122 56
philpem@0 528 divu 16 . d 1000...011000... .......... U U U 140 108 44
philpem@0 529 divu 16 . . 1000...011...... A+-DXWLdxI U U U 140 108 44
philpem@0 530 divl 32 . d 0100110001000... .......... . . U . . 84
philpem@0 531 divl 32 . . 0100110001...... A+-DXWLdxI . . U . . 84
philpem@0 532 eor 8 . d 1011...100000... .......... U U U 4 4 2
philpem@0 533 eor 8 . . 1011...100...... A+-DXWL... U U U 8 8 4
philpem@0 534 eor 16 . d 1011...101000... .......... U U U 4 4 2
philpem@0 535 eor 16 . . 1011...101...... A+-DXWL... U U U 8 8 4
philpem@0 536 eor 32 . d 1011...110000... .......... U U U 8 6 2
philpem@0 537 eor 32 . . 1011...110...... A+-DXWL... U U U 12 12 4
philpem@0 538 eori 16 toc . 0000101000111100 .......... U U U 20 16 12
philpem@0 539 eori 16 tos . 0000101001111100 .......... S S S 20 16 12
philpem@0 540 eori 8 . d 0000101000000... .......... U U U 8 8 2
philpem@0 541 eori 8 . . 0000101000...... A+-DXWL... U U U 12 12 4
philpem@0 542 eori 16 . d 0000101001000... .......... U U U 8 8 2
philpem@0 543 eori 16 . . 0000101001...... A+-DXWL... U U U 12 12 4
philpem@0 544 eori 32 . d 0000101010000... .......... U U U 16 14 2
philpem@0 545 eori 32 . . 0000101010...... A+-DXWL... U U U 20 20 4
philpem@0 546 exg 32 dd . 1100...101000... .......... U U U 6 6 2
philpem@0 547 exg 32 aa . 1100...101001... .......... U U U 6 6 2
philpem@0 548 exg 32 da . 1100...110001... .......... U U U 6 6 2
philpem@0 549 ext 16 . . 0100100010000... .......... U U U 4 4 4
philpem@0 550 ext 32 . . 0100100011000... .......... U U U 4 4 4
philpem@0 551 extb 32 . . 0100100111000... .......... . . U . . 4
philpem@0 552 illegal 0 . . 0100101011111100 .......... U U U 4 4 4
philpem@0 553 jmp 32 . . 0100111011...... A..DXWLdx. U U U 4 4 0
philpem@0 554 jsr 32 . . 0100111010...... A..DXWLdx. U U U 12 12 0
philpem@0 555 lea 32 . . 0100...111...... A..DXWLdx. U U U 0 0 2
philpem@0 556 link 16 . a7 0100111001010111 .......... U U U 16 16 5
philpem@0 557 link 16 . . 0100111001010... .......... U U U 16 16 5
philpem@0 558 link 32 . a7 0100100000001111 .......... . . U . . 6
philpem@0 559 link 32 . . 0100100000001... .......... . . U . . 6
philpem@0 560 lsr 8 s . 1110...000001... .......... U U U 6 6 4
philpem@0 561 lsr 16 s . 1110...001001... .......... U U U 6 6 4
philpem@0 562 lsr 32 s . 1110...010001... .......... U U U 8 8 4
philpem@0 563 lsr 8 r . 1110...000101... .......... U U U 6 6 6
philpem@0 564 lsr 16 r . 1110...001101... .......... U U U 6 6 6
philpem@0 565 lsr 32 r . 1110...010101... .......... U U U 8 8 6
philpem@0 566 lsr 16 . . 1110001011...... A+-DXWL... U U U 8 8 5
philpem@0 567 lsl 8 s . 1110...100001... .......... U U U 6 6 4
philpem@0 568 lsl 16 s . 1110...101001... .......... U U U 6 6 4
philpem@0 569 lsl 32 s . 1110...110001... .......... U U U 8 8 4
philpem@0 570 lsl 8 r . 1110...100101... .......... U U U 6 6 6
philpem@0 571 lsl 16 r . 1110...101101... .......... U U U 6 6 6
philpem@0 572 lsl 32 r . 1110...110101... .......... U U U 8 8 6
philpem@0 573 lsl 16 . . 1110001111...... A+-DXWL... U U U 8 8 5
philpem@0 574 move 8 d d 0001...000000... .......... U U U 4 4 2
philpem@0 575 move 8 d . 0001...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 576 move 8 ai d 0001...010000... .......... U U U 8 8 4
philpem@0 577 move 8 ai . 0001...010...... A+-DXWLdxI U U U 8 8 4
philpem@0 578 move 8 pi d 0001...011000... .......... U U U 8 8 4
philpem@0 579 move 8 pi . 0001...011...... A+-DXWLdxI U U U 8 8 4
philpem@0 580 move 8 pi7 d 0001111011000... .......... U U U 8 8 4
philpem@0 581 move 8 pi7 . 0001111011...... A+-DXWLdxI U U U 8 8 4
philpem@0 582 move 8 pd d 0001...100000... .......... U U U 8 8 5
philpem@0 583 move 8 pd . 0001...100...... A+-DXWLdxI U U U 8 8 5
philpem@0 584 move 8 pd7 d 0001111100000... .......... U U U 8 8 5
philpem@0 585 move 8 pd7 . 0001111100...... A+-DXWLdxI U U U 8 8 5
philpem@0 586 move 8 di d 0001...101000... .......... U U U 12 12 5
philpem@0 587 move 8 di . 0001...101...... A+-DXWLdxI U U U 12 12 5
philpem@0 588 move 8 ix d 0001...110000... .......... U U U 14 14 7
philpem@0 589 move 8 ix . 0001...110...... A+-DXWLdxI U U U 14 14 7
philpem@0 590 move 8 aw d 0001000111000... .......... U U U 12 12 4
philpem@0 591 move 8 aw . 0001000111...... A+-DXWLdxI U U U 12 12 4
philpem@0 592 move 8 al d 0001001111000... .......... U U U 16 16 6
philpem@0 593 move 8 al . 0001001111...... A+-DXWLdxI U U U 16 16 6
philpem@0 594 move 16 d d 0011...000000... .......... U U U 4 4 2
philpem@0 595 move 16 d a 0011...000001... .......... U U U 4 4 2
philpem@0 596 move 16 d . 0011...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 597 move 16 ai d 0011...010000... .......... U U U 8 8 4
philpem@0 598 move 16 ai a 0011...010001... .......... U U U 8 8 4
philpem@0 599 move 16 ai . 0011...010...... A+-DXWLdxI U U U 8 8 4
philpem@0 600 move 16 pi d 0011...011000... .......... U U U 8 8 4
philpem@0 601 move 16 pi a 0011...011001... .......... U U U 8 8 4
philpem@0 602 move 16 pi . 0011...011...... A+-DXWLdxI U U U 8 8 4
philpem@0 603 move 16 pd d 0011...100000... .......... U U U 8 8 5
philpem@0 604 move 16 pd a 0011...100001... .......... U U U 8 8 5
philpem@0 605 move 16 pd . 0011...100...... A+-DXWLdxI U U U 8 8 5
philpem@0 606 move 16 di d 0011...101000... .......... U U U 12 12 5
philpem@0 607 move 16 di a 0011...101001... .......... U U U 12 12 5
philpem@0 608 move 16 di . 0011...101...... A+-DXWLdxI U U U 12 12 5
philpem@0 609 move 16 ix d 0011...110000... .......... U U U 14 14 7
philpem@0 610 move 16 ix a 0011...110001... .......... U U U 14 14 7
philpem@0 611 move 16 ix . 0011...110...... A+-DXWLdxI U U U 14 14 7
philpem@0 612 move 16 aw d 0011000111000... .......... U U U 12 12 4
philpem@0 613 move 16 aw a 0011000111001... .......... U U U 12 12 4
philpem@0 614 move 16 aw . 0011000111...... A+-DXWLdxI U U U 12 12 4
philpem@0 615 move 16 al d 0011001111000... .......... U U U 16 16 6
philpem@0 616 move 16 al a 0011001111001... .......... U U U 16 16 6
philpem@0 617 move 16 al . 0011001111...... A+-DXWLdxI U U U 16 16 6
philpem@0 618 move 32 d d 0010...000000... .......... U U U 4 4 2
philpem@0 619 move 32 d a 0010...000001... .......... U U U 4 4 2
philpem@0 620 move 32 d . 0010...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 621 move 32 ai d 0010...010000... .......... U U U 12 12 4
philpem@0 622 move 32 ai a 0010...010001... .......... U U U 12 12 4
philpem@0 623 move 32 ai . 0010...010...... A+-DXWLdxI U U U 12 12 4
philpem@0 624 move 32 pi d 0010...011000... .......... U U U 12 12 4
philpem@0 625 move 32 pi a 0010...011001... .......... U U U 12 12 4
philpem@0 626 move 32 pi . 0010...011...... A+-DXWLdxI U U U 12 12 4
philpem@0 627 move 32 pd d 0010...100000... .......... U U U 12 14 5
philpem@0 628 move 32 pd a 0010...100001... .......... U U U 12 14 5
philpem@0 629 move 32 pd . 0010...100...... A+-DXWLdxI U U U 12 14 5
philpem@0 630 move 32 di d 0010...101000... .......... U U U 16 16 5
philpem@0 631 move 32 di a 0010...101001... .......... U U U 16 16 5
philpem@0 632 move 32 di . 0010...101...... A+-DXWLdxI U U U 16 16 5
philpem@0 633 move 32 ix d 0010...110000... .......... U U U 18 18 7
philpem@0 634 move 32 ix a 0010...110001... .......... U U U 18 18 7
philpem@0 635 move 32 ix . 0010...110...... A+-DXWLdxI U U U 18 18 7
philpem@0 636 move 32 aw d 0010000111000... .......... U U U 16 16 4
philpem@0 637 move 32 aw a 0010000111001... .......... U U U 16 16 4
philpem@0 638 move 32 aw . 0010000111...... A+-DXWLdxI U U U 16 16 4
philpem@0 639 move 32 al d 0010001111000... .......... U U U 20 20 6
philpem@0 640 move 32 al a 0010001111001... .......... U U U 20 20 6
philpem@0 641 move 32 al . 0010001111...... A+-DXWLdxI U U U 20 20 6
philpem@0 642 movea 16 . d 0011...001000... .......... U U U 4 4 2
philpem@0 643 movea 16 . a 0011...001001... .......... U U U 4 4 2
philpem@0 644 movea 16 . . 0011...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 645 movea 32 . d 0010...001000... .......... U U U 4 4 2
philpem@0 646 movea 32 . a 0010...001001... .......... U U U 4 4 2
philpem@0 647 movea 32 . . 0010...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 648 move 16 frc d 0100001011000... .......... . U U . 4 4
philpem@0 649 move 16 frc . 0100001011...... A+-DXWL... . U U . 8 4
philpem@0 650 move 16 toc d 0100010011000... .......... U U U 12 12 4
philpem@0 651 move 16 toc . 0100010011...... A+-DXWLdxI U U U 12 12 4
philpem@0 652 move 16 frs d 0100000011000... .......... U S S 6 4 8 U only for 000
philpem@0 653 move 16 frs . 0100000011...... A+-DXWL... U S S 8 8 8 U only for 000
philpem@0 654 move 16 tos d 0100011011000... .......... S S S 12 12 8
philpem@0 655 move 16 tos . 0100011011...... A+-DXWLdxI S S S 12 12 8
philpem@0 656 move 32 fru . 0100111001101... .......... S S S 4 6 2
philpem@0 657 move 32 tou . 0100111001100... .......... S S S 4 6 2
philpem@0 658 movec 32 cr . 0100111001111010 .......... . S S . 12 6
philpem@0 659 movec 32 rc . 0100111001111011 .......... . S S . 10 12
philpem@0 660 movem 16 re pd 0100100010100... .......... U U U 8 8 4
philpem@0 661 movem 16 re . 0100100010...... A..DXWL... U U U 8 8 4
philpem@0 662 movem 32 re pd 0100100011100... .......... U U U 8 8 4
philpem@0 663 movem 32 re . 0100100011...... A..DXWL... U U U 8 8 4
philpem@0 664 movem 16 er pi 0100110010011... .......... U U U 12 12 8
philpem@0 665 movem 16 er . 0100110010...... A..DXWLdx. U U U 12 12 8
philpem@0 666 movem 32 er pi 0100110011011... .......... U U U 12 12 8
philpem@0 667 movem 32 er . 0100110011...... A..DXWLdx. U U U 12 12 8
philpem@0 668 movep 16 er . 0000...100001... .......... U U U 16 16 12
philpem@0 669 movep 32 er . 0000...101001... .......... U U U 24 24 18
philpem@0 670 movep 16 re . 0000...110001... .......... U U U 16 16 11
philpem@0 671 movep 32 re . 0000...111001... .......... U U U 24 24 17
philpem@0 672 moveq 32 . . 0111...0........ .......... U U U 4 4 2
philpem@0 673 moves 8 . . 0000111000...... A+-DXWL... . S S . 14 5
philpem@0 674 moves 16 . . 0000111001...... A+-DXWL... . S S . 14 5
philpem@0 675 moves 32 . . 0000111010...... A+-DXWL... . S S . 16 5
philpem@0 676 muls 16 . d 1100...111000... .......... U U U 54 32 27
philpem@0 677 muls 16 . . 1100...111...... A+-DXWLdxI U U U 54 32 27
philpem@0 678 mulu 16 . d 1100...011000... .......... U U U 54 30 27
philpem@0 679 mulu 16 . . 1100...011...... A+-DXWLdxI U U U 54 30 27
philpem@0 680 mull 32 . d 0100110000000... .......... . . U . . 43
philpem@0 681 mull 32 . . 0100110000...... A+-DXWLdxI . . U . . 43
philpem@0 682 nbcd 8 . d 0100100000000... .......... U U U 6 6 6
philpem@0 683 nbcd 8 . . 0100100000...... A+-DXWL... U U U 8 8 6
philpem@0 684 neg 8 . d 0100010000000... .......... U U U 4 4 2
philpem@0 685 neg 8 . . 0100010000...... A+-DXWL... U U U 8 8 4
philpem@0 686 neg 16 . d 0100010001000... .......... U U U 4 4 2
philpem@0 687 neg 16 . . 0100010001...... A+-DXWL... U U U 8 8 4
philpem@0 688 neg 32 . d 0100010010000... .......... U U U 6 6 2
philpem@0 689 neg 32 . . 0100010010...... A+-DXWL... U U U 12 12 4
philpem@0 690 negx 8 . d 0100000000000... .......... U U U 4 4 2
philpem@0 691 negx 8 . . 0100000000...... A+-DXWL... U U U 8 8 4
philpem@0 692 negx 16 . d 0100000001000... .......... U U U 4 4 2
philpem@0 693 negx 16 . . 0100000001...... A+-DXWL... U U U 8 8 4
philpem@0 694 negx 32 . d 0100000010000... .......... U U U 6 6 2
philpem@0 695 negx 32 . . 0100000010...... A+-DXWL... U U U 12 12 4
philpem@0 696 nop 0 . . 0100111001110001 .......... U U U 4 4 2
philpem@0 697 not 8 . d 0100011000000... .......... U U U 4 4 2
philpem@0 698 not 8 . . 0100011000...... A+-DXWL... U U U 8 8 4
philpem@0 699 not 16 . d 0100011001000... .......... U U U 4 4 2
philpem@0 700 not 16 . . 0100011001...... A+-DXWL... U U U 8 8 4
philpem@0 701 not 32 . d 0100011010000... .......... U U U 6 6 2
philpem@0 702 not 32 . . 0100011010...... A+-DXWL... U U U 12 12 4
philpem@0 703 or 8 er d 1000...000000... .......... U U U 4 4 2
philpem@0 704 or 8 er . 1000...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 705 or 16 er d 1000...001000... .......... U U U 4 4 2
philpem@0 706 or 16 er . 1000...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 707 or 32 er d 1000...010000... .......... U U U 6 6 2
philpem@0 708 or 32 er . 1000...010...... A+-DXWLdxI U U U 6 6 2
philpem@0 709 or 8 re . 1000...100...... A+-DXWL... U U U 8 8 4
philpem@0 710 or 16 re . 1000...101...... A+-DXWL... U U U 8 8 4
philpem@0 711 or 32 re . 1000...110...... A+-DXWL... U U U 12 12 4
philpem@0 712 ori 16 toc . 0000000000111100 .......... U U U 20 16 12
philpem@0 713 ori 16 tos . 0000000001111100 .......... S S S 20 16 12
philpem@0 714 ori 8 . d 0000000000000... .......... U U U 8 8 2
philpem@0 715 ori 8 . . 0000000000...... A+-DXWL... U U U 12 12 4
philpem@0 716 ori 16 . d 0000000001000... .......... U U U 8 8 2
philpem@0 717 ori 16 . . 0000000001...... A+-DXWL... U U U 12 12 4
philpem@0 718 ori 32 . d 0000000010000... .......... U U U 16 14 2
philpem@0 719 ori 32 . . 0000000010...... A+-DXWL... U U U 20 20 4
philpem@0 720 pack 16 rr . 1000...101000... .......... . . U . . 6
philpem@0 721 pack 16 mm ax7 1000111101001... .......... . . U . . 13
philpem@0 722 pack 16 mm ay7 1000...101001111 .......... . . U . . 13
philpem@0 723 pack 16 mm axy7 1000111101001111 .......... . . U . . 13
philpem@0 724 pack 16 mm . 1000...101001... .......... . . U . . 13
philpem@0 725 pea 32 . . 0100100001...... A..DXWLdx. U U U 6 6 5
philpem@0 726 reset 0 . . 0100111001110000 .......... S S S 0 0 0
philpem@0 727 ror 8 s . 1110...000011... .......... U U U 6 6 8
philpem@0 728 ror 16 s . 1110...001011... .......... U U U 6 6 8
philpem@0 729 ror 32 s . 1110...010011... .......... U U U 8 8 8
philpem@0 730 ror 8 r . 1110...000111... .......... U U U 6 6 8
philpem@0 731 ror 16 r . 1110...001111... .......... U U U 6 6 8
philpem@0 732 ror 32 r . 1110...010111... .......... U U U 8 8 8
philpem@0 733 ror 16 . . 1110011011...... A+-DXWL... U U U 8 8 7
philpem@0 734 rol 8 s . 1110...100011... .......... U U U 6 6 8
philpem@0 735 rol 16 s . 1110...101011... .......... U U U 6 6 8
philpem@0 736 rol 32 s . 1110...110011... .......... U U U 8 8 8
philpem@0 737 rol 8 r . 1110...100111... .......... U U U 6 6 8
philpem@0 738 rol 16 r . 1110...101111... .......... U U U 6 6 8
philpem@0 739 rol 32 r . 1110...110111... .......... U U U 8 8 8
philpem@0 740 rol 16 . . 1110011111...... A+-DXWL... U U U 8 8 7
philpem@0 741 roxr 8 s . 1110...000010... .......... U U U 6 6 12
philpem@0 742 roxr 16 s . 1110...001010... .......... U U U 6 6 12
philpem@0 743 roxr 32 s . 1110...010010... .......... U U U 8 8 12
philpem@0 744 roxr 8 r . 1110...000110... .......... U U U 6 6 12
philpem@0 745 roxr 16 r . 1110...001110... .......... U U U 6 6 12
philpem@0 746 roxr 32 r . 1110...010110... .......... U U U 8 8 12
philpem@0 747 roxr 16 . . 1110010011...... A+-DXWL... U U U 8 8 5
philpem@0 748 roxl 8 s . 1110...100010... .......... U U U 6 6 12
philpem@0 749 roxl 16 s . 1110...101010... .......... U U U 6 6 12
philpem@0 750 roxl 32 s . 1110...110010... .......... U U U 8 8 12
philpem@0 751 roxl 8 r . 1110...100110... .......... U U U 6 6 12
philpem@0 752 roxl 16 r . 1110...101110... .......... U U U 6 6 12
philpem@0 753 roxl 32 r . 1110...110110... .......... U U U 8 8 12
philpem@0 754 roxl 16 . . 1110010111...... A+-DXWL... U U U 8 8 5
philpem@0 755 rtd 32 . . 0100111001110100 .......... . U U . 16 10
philpem@0 756 rte 32 . . 0100111001110011 .......... S S S 20 24 20 bus fault not emulated
philpem@0 757 rtm 32 . . 000001101100.... .......... . . U . . 19 not properly emulated
philpem@0 758 rtr 32 . . 0100111001110111 .......... U U U 20 20 14
philpem@0 759 rts 32 . . 0100111001110101 .......... U U U 16 16 10
philpem@0 760 sbcd 8 rr . 1000...100000... .......... U U U 6 6 4
philpem@0 761 sbcd 8 mm ax7 1000111100001... .......... U U U 18 18 16
philpem@0 762 sbcd 8 mm ay7 1000...100001111 .......... U U U 18 18 16
philpem@0 763 sbcd 8 mm axy7 1000111100001111 .......... U U U 18 18 16
philpem@0 764 sbcd 8 mm . 1000...100001... .......... U U U 18 18 16
philpem@0 765 st 8 . d 0101000011000... .......... U U U 6 4 4
philpem@0 766 st 8 . . 0101000011...... A+-DXWL... U U U 8 8 6
philpem@0 767 sf 8 . d 0101000111000... .......... U U U 4 4 4
philpem@0 768 sf 8 . . 0101000111...... A+-DXWL... U U U 8 8 6
philpem@0 769 scc 8 . d 0101....11000... .......... U U U 4 4 4
philpem@0 770 scc 8 . . 0101....11...... A+-DXWL... U U U 8 8 6
philpem@0 771 stop 0 . . 0100111001110010 .......... S S S 4 4 8
philpem@0 772 sub 8 er d 1001...000000... .......... U U U 4 4 2
philpem@0 773 sub 8 er . 1001...000...... A+-DXWLdxI U U U 4 4 2
philpem@0 774 sub 16 er d 1001...001000... .......... U U U 4 4 2
philpem@0 775 sub 16 er a 1001...001001... .......... U U U 4 4 2
philpem@0 776 sub 16 er . 1001...001...... A+-DXWLdxI U U U 4 4 2
philpem@0 777 sub 32 er d 1001...010000... .......... U U U 6 6 2
philpem@0 778 sub 32 er a 1001...010001... .......... U U U 6 6 2
philpem@0 779 sub 32 er . 1001...010...... A+-DXWLdxI U U U 6 6 2
philpem@0 780 sub 8 re . 1001...100...... A+-DXWL... U U U 8 8 4
philpem@0 781 sub 16 re . 1001...101...... A+-DXWL... U U U 8 8 4
philpem@0 782 sub 32 re . 1001...110...... A+-DXWL... U U U 12 12 4
philpem@0 783 suba 16 . d 1001...011000... .......... U U U 8 8 2
philpem@0 784 suba 16 . a 1001...011001... .......... U U U 8 8 2
philpem@0 785 suba 16 . . 1001...011...... A+-DXWLdxI U U U 8 8 2
philpem@0 786 suba 32 . d 1001...111000... .......... U U U 6 6 2
philpem@0 787 suba 32 . a 1001...111001... .......... U U U 6 6 2
philpem@0 788 suba 32 . . 1001...111...... A+-DXWLdxI U U U 6 6 2
philpem@0 789 subi 8 . d 0000010000000... .......... U U U 8 8 2
philpem@0 790 subi 8 . . 0000010000...... A+-DXWL... U U U 12 12 4
philpem@0 791 subi 16 . d 0000010001000... .......... U U U 8 8 2
philpem@0 792 subi 16 . . 0000010001...... A+-DXWL... U U U 12 12 4
philpem@0 793 subi 32 . d 0000010010000... .......... U U U 16 14 2
philpem@0 794 subi 32 . . 0000010010...... A+-DXWL... U U U 20 20 4
philpem@0 795 subq 8 . d 0101...100000... .......... U U U 4 4 2
philpem@0 796 subq 8 . . 0101...100...... A+-DXWL... U U U 8 8 4
philpem@0 797 subq 16 . d 0101...101000... .......... U U U 4 4 2
philpem@0 798 subq 16 . a 0101...101001... .......... U U U 8 4 2
philpem@0 799 subq 16 . . 0101...101...... A+-DXWL... U U U 8 8 4
philpem@0 800 subq 32 . d 0101...110000... .......... U U U 8 8 2
philpem@0 801 subq 32 . a 0101...110001... .......... U U U 8 8 2
philpem@0 802 subq 32 . . 0101...110...... A+-DXWL... U U U 12 12 4
philpem@0 803 subx 8 rr . 1001...100000... .......... U U U 4 4 2
philpem@0 804 subx 16 rr . 1001...101000... .......... U U U 4 4 2
philpem@0 805 subx 32 rr . 1001...110000... .......... U U U 8 6 2
philpem@0 806 subx 8 mm ax7 1001111100001... .......... U U U 18 18 12
philpem@0 807 subx 8 mm ay7 1001...100001111 .......... U U U 18 18 12
philpem@0 808 subx 8 mm axy7 1001111100001111 .......... U U U 18 18 12
philpem@0 809 subx 8 mm . 1001...100001... .......... U U U 18 18 12
philpem@0 810 subx 16 mm . 1001...101001... .......... U U U 18 18 12
philpem@0 811 subx 32 mm . 1001...110001... .......... U U U 30 30 12
philpem@0 812 swap 32 . . 0100100001000... .......... U U U 4 4 4
philpem@0 813 tas 8 . d 0100101011000... .......... U U U 4 4 4
philpem@0 814 tas 8 . . 0100101011...... A+-DXWL... U U U 14 14 12
philpem@0 815 trap 0 . . 010011100100.... .......... U U U 4 4 4
philpem@0 816 trapt 0 . . 0101000011111100 .......... . . U . . 4
philpem@0 817 trapt 16 . . 0101000011111010 .......... . . U . . 6
philpem@0 818 trapt 32 . . 0101000011111011 .......... . . U . . 8
philpem@0 819 trapf 0 . . 0101000111111100 .......... . . U . . 4
philpem@0 820 trapf 16 . . 0101000111111010 .......... . . U . . 6
philpem@0 821 trapf 32 . . 0101000111111011 .......... . . U . . 8
philpem@0 822 trapcc 0 . . 0101....11111100 .......... . . U . . 4
philpem@0 823 trapcc 16 . . 0101....11111010 .......... . . U . . 6
philpem@0 824 trapcc 32 . . 0101....11111011 .......... . . U . . 8
philpem@0 825 trapv 0 . . 0100111001110110 .......... U U U 4 4 4
philpem@0 826 tst 8 . d 0100101000000... .......... U U U 4 4 2
philpem@0 827 tst 8 . . 0100101000...... A+-DXWL... U U U 4 4 2
philpem@0 828 tst 8 . pcdi 0100101000111010 .......... . . U . . 7
philpem@0 829 tst 8 . pcix 0100101000111011 .......... . . U . . 9
philpem@0 830 tst 8 . i 0100101000111100 .......... . . U . . 6
philpem@0 831 tst 16 . d 0100101001000... .......... U U U 4 4 2
philpem@0 832 tst 16 . a 0100101001001... .......... . . U . . 2
philpem@0 833 tst 16 . . 0100101001...... A+-DXWL... U U U 4 4 2
philpem@0 834 tst 16 . pcdi 0100101001111010 .......... . . U . . 7
philpem@0 835 tst 16 . pcix 0100101001111011 .......... . . U . . 9
philpem@0 836 tst 16 . i 0100101001111100 .......... . . U . . 6
philpem@0 837 tst 32 . d 0100101010000... .......... U U U 4 4 2
philpem@0 838 tst 32 . a 0100101010001... .......... . . U . . 2
philpem@0 839 tst 32 . . 0100101010...... A+-DXWL... U U U 4 4 2
philpem@0 840 tst 32 . pcdi 0100101010111010 .......... . . U . . 7
philpem@0 841 tst 32 . pcix 0100101010111011 .......... . . U . . 9
philpem@0 842 tst 32 . i 0100101010111100 .......... . . U . . 6
philpem@0 843 unlk 32 . a7 0100111001011111 .......... U U U 12 12 6
philpem@0 844 unlk 32 . . 0100111001011... .......... U U U 12 12 6
philpem@0 845 unpk 16 rr . 1000...110000... .......... . . U . . 8
philpem@0 846 unpk 16 mm ax7 1000111110001... .......... . . U . . 13
philpem@0 847 unpk 16 mm ay7 1000...110001111 .......... . . U . . 13
philpem@0 848 unpk 16 mm axy7 1000111110001111 .......... . . U . . 13
philpem@0 849 unpk 16 mm . 1000...110001... .......... . . U . . 13
philpem@0 850
philpem@0 851
philpem@0 852
philpem@0 853 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 854 M68KMAKE_OPCODE_HANDLER_BODY
philpem@0 855
philpem@0 856 M68KMAKE_OP(1010, 0, ., .)
philpem@0 857 {
philpem@0 858 m68ki_exception_1010();
philpem@0 859 }
philpem@0 860
philpem@0 861
philpem@0 862 M68KMAKE_OP(1111, 0, ., .)
philpem@0 863 {
philpem@0 864 m68ki_exception_1111();
philpem@0 865 }
philpem@0 866
philpem@0 867
philpem@0 868 M68KMAKE_OP(abcd, 8, rr, .)
philpem@0 869 {
philpem@0 870 uint* r_dst = &DX;
philpem@0 871 uint src = DY;
philpem@0 872 uint dst = *r_dst;
philpem@0 873 uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
philpem@0 874
philpem@0 875 if(res > 9)
philpem@0 876 res += 6;
philpem@0 877 res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
philpem@0 878 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 879 if(FLAG_C)
philpem@0 880 res -= 0xa0;
philpem@0 881
philpem@0 882 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 883
philpem@0 884 res = MASK_OUT_ABOVE_8(res);
philpem@0 885 FLAG_Z |= res;
philpem@0 886
philpem@0 887 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 888 }
philpem@0 889
philpem@0 890
philpem@0 891 M68KMAKE_OP(abcd, 8, mm, ax7)
philpem@0 892 {
philpem@0 893 uint src = OPER_AY_PD_8();
philpem@0 894 uint ea = EA_A7_PD_8();
philpem@0 895 uint dst = m68ki_read_8(ea);
philpem@0 896 uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
philpem@0 897
philpem@0 898 if(res > 9)
philpem@0 899 res += 6;
philpem@0 900 res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
philpem@0 901 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 902 if(FLAG_C)
philpem@0 903 res -= 0xa0;
philpem@0 904
philpem@0 905 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 906
philpem@0 907 res = MASK_OUT_ABOVE_8(res);
philpem@0 908 FLAG_Z |= res;
philpem@0 909
philpem@0 910 m68ki_write_8(ea, res);
philpem@0 911 }
philpem@0 912
philpem@0 913
philpem@0 914 M68KMAKE_OP(abcd, 8, mm, ay7)
philpem@0 915 {
philpem@0 916 uint src = OPER_A7_PD_8();
philpem@0 917 uint ea = EA_AX_PD_8();
philpem@0 918 uint dst = m68ki_read_8(ea);
philpem@0 919 uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
philpem@0 920
philpem@0 921 if(res > 9)
philpem@0 922 res += 6;
philpem@0 923 res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
philpem@0 924 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 925 if(FLAG_C)
philpem@0 926 res -= 0xa0;
philpem@0 927
philpem@0 928 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 929
philpem@0 930 res = MASK_OUT_ABOVE_8(res);
philpem@0 931 FLAG_Z |= res;
philpem@0 932
philpem@0 933 m68ki_write_8(ea, res);
philpem@0 934 }
philpem@0 935
philpem@0 936
philpem@0 937 M68KMAKE_OP(abcd, 8, mm, axy7)
philpem@0 938 {
philpem@0 939 uint src = OPER_A7_PD_8();
philpem@0 940 uint ea = EA_A7_PD_8();
philpem@0 941 uint dst = m68ki_read_8(ea);
philpem@0 942 uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
philpem@0 943
philpem@0 944 if(res > 9)
philpem@0 945 res += 6;
philpem@0 946 res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
philpem@0 947 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 948 if(FLAG_C)
philpem@0 949 res -= 0xa0;
philpem@0 950
philpem@0 951 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 952
philpem@0 953 res = MASK_OUT_ABOVE_8(res);
philpem@0 954 FLAG_Z |= res;
philpem@0 955
philpem@0 956 m68ki_write_8(ea, res);
philpem@0 957 }
philpem@0 958
philpem@0 959
philpem@0 960 M68KMAKE_OP(abcd, 8, mm, .)
philpem@0 961 {
philpem@0 962 uint src = OPER_AY_PD_8();
philpem@0 963 uint ea = EA_AX_PD_8();
philpem@0 964 uint dst = m68ki_read_8(ea);
philpem@0 965 uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
philpem@0 966
philpem@0 967 if(res > 9)
philpem@0 968 res += 6;
philpem@0 969 res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
philpem@0 970 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 971 if(FLAG_C)
philpem@0 972 res -= 0xa0;
philpem@0 973
philpem@0 974 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 975
philpem@0 976 res = MASK_OUT_ABOVE_8(res);
philpem@0 977 FLAG_Z |= res;
philpem@0 978
philpem@0 979 m68ki_write_8(ea, res);
philpem@0 980 }
philpem@0 981
philpem@0 982
philpem@0 983 M68KMAKE_OP(add, 8, er, d)
philpem@0 984 {
philpem@0 985 uint* r_dst = &DX;
philpem@0 986 uint src = MASK_OUT_ABOVE_8(DY);
philpem@0 987 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 988 uint res = src + dst;
philpem@0 989
philpem@0 990 FLAG_N = NFLAG_8(res);
philpem@0 991 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 992 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 993 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 994
philpem@0 995 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 996 }
philpem@0 997
philpem@0 998
philpem@0 999 M68KMAKE_OP(add, 8, er, .)
philpem@0 1000 {
philpem@0 1001 uint* r_dst = &DX;
philpem@0 1002 uint src = M68KMAKE_GET_OPER_AY_8;
philpem@0 1003 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 1004 uint res = src + dst;
philpem@0 1005
philpem@0 1006 FLAG_N = NFLAG_8(res);
philpem@0 1007 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1008 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1009 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1010
philpem@0 1011 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 1012 }
philpem@0 1013
philpem@0 1014
philpem@0 1015 M68KMAKE_OP(add, 16, er, d)
philpem@0 1016 {
philpem@0 1017 uint* r_dst = &DX;
philpem@0 1018 uint src = MASK_OUT_ABOVE_16(DY);
philpem@0 1019 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1020 uint res = src + dst;
philpem@0 1021
philpem@0 1022 FLAG_N = NFLAG_16(res);
philpem@0 1023 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1024 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1025 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1026
philpem@0 1027 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 1028 }
philpem@0 1029
philpem@0 1030
philpem@0 1031 M68KMAKE_OP(add, 16, er, a)
philpem@0 1032 {
philpem@0 1033 uint* r_dst = &DX;
philpem@0 1034 uint src = MASK_OUT_ABOVE_16(AY);
philpem@0 1035 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1036 uint res = src + dst;
philpem@0 1037
philpem@0 1038 FLAG_N = NFLAG_16(res);
philpem@0 1039 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1040 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1041 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1042
philpem@0 1043 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 1044 }
philpem@0 1045
philpem@0 1046
philpem@0 1047 M68KMAKE_OP(add, 16, er, .)
philpem@0 1048 {
philpem@0 1049 uint* r_dst = &DX;
philpem@0 1050 uint src = M68KMAKE_GET_OPER_AY_16;
philpem@0 1051 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1052 uint res = src + dst;
philpem@0 1053
philpem@0 1054 FLAG_N = NFLAG_16(res);
philpem@0 1055 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1056 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1057 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1058
philpem@0 1059 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 1060 }
philpem@0 1061
philpem@0 1062
philpem@0 1063 M68KMAKE_OP(add, 32, er, d)
philpem@0 1064 {
philpem@0 1065 uint* r_dst = &DX;
philpem@0 1066 uint src = DY;
philpem@0 1067 uint dst = *r_dst;
philpem@0 1068 uint res = src + dst;
philpem@0 1069
philpem@0 1070 FLAG_N = NFLAG_32(res);
philpem@0 1071 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1072 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1073 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1074
philpem@0 1075 *r_dst = FLAG_Z;
philpem@0 1076 }
philpem@0 1077
philpem@0 1078
philpem@0 1079 M68KMAKE_OP(add, 32, er, a)
philpem@0 1080 {
philpem@0 1081 uint* r_dst = &DX;
philpem@0 1082 uint src = AY;
philpem@0 1083 uint dst = *r_dst;
philpem@0 1084 uint res = src + dst;
philpem@0 1085
philpem@0 1086 FLAG_N = NFLAG_32(res);
philpem@0 1087 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1088 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1089 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1090
philpem@0 1091 *r_dst = FLAG_Z;
philpem@0 1092 }
philpem@0 1093
philpem@0 1094
philpem@0 1095 M68KMAKE_OP(add, 32, er, .)
philpem@0 1096 {
philpem@0 1097 uint* r_dst = &DX;
philpem@0 1098 uint src = M68KMAKE_GET_OPER_AY_32;
philpem@0 1099 uint dst = *r_dst;
philpem@0 1100 uint res = src + dst;
philpem@0 1101
philpem@0 1102 FLAG_N = NFLAG_32(res);
philpem@0 1103 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1104 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1105 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1106
philpem@0 1107 *r_dst = FLAG_Z;
philpem@0 1108 }
philpem@0 1109
philpem@0 1110
philpem@0 1111 M68KMAKE_OP(add, 8, re, .)
philpem@0 1112 {
philpem@0 1113 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 1114 uint src = MASK_OUT_ABOVE_8(DX);
philpem@0 1115 uint dst = m68ki_read_8(ea);
philpem@0 1116 uint res = src + dst;
philpem@0 1117
philpem@0 1118 FLAG_N = NFLAG_8(res);
philpem@0 1119 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1120 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1121 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1122
philpem@0 1123 m68ki_write_8(ea, FLAG_Z);
philpem@0 1124 }
philpem@0 1125
philpem@0 1126
philpem@0 1127 M68KMAKE_OP(add, 16, re, .)
philpem@0 1128 {
philpem@0 1129 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 1130 uint src = MASK_OUT_ABOVE_16(DX);
philpem@0 1131 uint dst = m68ki_read_16(ea);
philpem@0 1132 uint res = src + dst;
philpem@0 1133
philpem@0 1134 FLAG_N = NFLAG_16(res);
philpem@0 1135 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1136 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1137 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1138
philpem@0 1139 m68ki_write_16(ea, FLAG_Z);
philpem@0 1140 }
philpem@0 1141
philpem@0 1142
philpem@0 1143 M68KMAKE_OP(add, 32, re, .)
philpem@0 1144 {
philpem@0 1145 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 1146 uint src = DX;
philpem@0 1147 uint dst = m68ki_read_32(ea);
philpem@0 1148 uint res = src + dst;
philpem@0 1149
philpem@0 1150 FLAG_N = NFLAG_32(res);
philpem@0 1151 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1152 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1153 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1154
philpem@0 1155 m68ki_write_32(ea, FLAG_Z);
philpem@0 1156 }
philpem@0 1157
philpem@0 1158
philpem@0 1159 M68KMAKE_OP(adda, 16, ., d)
philpem@0 1160 {
philpem@0 1161 uint* r_dst = &AX;
philpem@0 1162
philpem@0 1163 *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY));
philpem@0 1164 }
philpem@0 1165
philpem@0 1166
philpem@0 1167 M68KMAKE_OP(adda, 16, ., a)
philpem@0 1168 {
philpem@0 1169 uint* r_dst = &AX;
philpem@0 1170
philpem@0 1171 *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY));
philpem@0 1172 }
philpem@0 1173
philpem@0 1174
philpem@0 1175 M68KMAKE_OP(adda, 16, ., .)
philpem@0 1176 {
philpem@0 1177 uint* r_dst = &AX;
philpem@0 1178
philpem@0 1179 *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));
philpem@0 1180 }
philpem@0 1181
philpem@0 1182
philpem@0 1183 M68KMAKE_OP(adda, 32, ., d)
philpem@0 1184 {
philpem@0 1185 uint* r_dst = &AX;
philpem@0 1186
philpem@0 1187 *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY);
philpem@0 1188 }
philpem@0 1189
philpem@0 1190
philpem@0 1191 M68KMAKE_OP(adda, 32, ., a)
philpem@0 1192 {
philpem@0 1193 uint* r_dst = &AX;
philpem@0 1194
philpem@0 1195 *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY);
philpem@0 1196 }
philpem@0 1197
philpem@0 1198
philpem@0 1199 M68KMAKE_OP(adda, 32, ., .)
philpem@0 1200 {
philpem@0 1201 uint* r_dst = &AX;
philpem@0 1202
philpem@0 1203 *r_dst = MASK_OUT_ABOVE_32(*r_dst + M68KMAKE_GET_OPER_AY_32);
philpem@0 1204 }
philpem@0 1205
philpem@0 1206
philpem@0 1207 M68KMAKE_OP(addi, 8, ., d)
philpem@0 1208 {
philpem@0 1209 uint* r_dst = &DY;
philpem@0 1210 uint src = OPER_I_8();
philpem@0 1211 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 1212 uint res = src + dst;
philpem@0 1213
philpem@0 1214 FLAG_N = NFLAG_8(res);
philpem@0 1215 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1216 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1217 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1218
philpem@0 1219 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 1220 }
philpem@0 1221
philpem@0 1222
philpem@0 1223 M68KMAKE_OP(addi, 8, ., .)
philpem@0 1224 {
philpem@0 1225 uint src = OPER_I_8();
philpem@0 1226 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 1227 uint dst = m68ki_read_8(ea);
philpem@0 1228 uint res = src + dst;
philpem@0 1229
philpem@0 1230 FLAG_N = NFLAG_8(res);
philpem@0 1231 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1232 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1233 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1234
philpem@0 1235 m68ki_write_8(ea, FLAG_Z);
philpem@0 1236 }
philpem@0 1237
philpem@0 1238
philpem@0 1239 M68KMAKE_OP(addi, 16, ., d)
philpem@0 1240 {
philpem@0 1241 uint* r_dst = &DY;
philpem@0 1242 uint src = OPER_I_16();
philpem@0 1243 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1244 uint res = src + dst;
philpem@0 1245
philpem@0 1246 FLAG_N = NFLAG_16(res);
philpem@0 1247 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1248 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1249 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1250
philpem@0 1251 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 1252 }
philpem@0 1253
philpem@0 1254
philpem@0 1255 M68KMAKE_OP(addi, 16, ., .)
philpem@0 1256 {
philpem@0 1257 uint src = OPER_I_16();
philpem@0 1258 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 1259 uint dst = m68ki_read_16(ea);
philpem@0 1260 uint res = src + dst;
philpem@0 1261
philpem@0 1262 FLAG_N = NFLAG_16(res);
philpem@0 1263 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1264 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1265 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1266
philpem@0 1267 m68ki_write_16(ea, FLAG_Z);
philpem@0 1268 }
philpem@0 1269
philpem@0 1270
philpem@0 1271 M68KMAKE_OP(addi, 32, ., d)
philpem@0 1272 {
philpem@0 1273 uint* r_dst = &DY;
philpem@0 1274 uint src = OPER_I_32();
philpem@0 1275 uint dst = *r_dst;
philpem@0 1276 uint res = src + dst;
philpem@0 1277
philpem@0 1278 FLAG_N = NFLAG_32(res);
philpem@0 1279 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1280 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1281 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1282
philpem@0 1283 *r_dst = FLAG_Z;
philpem@0 1284 }
philpem@0 1285
philpem@0 1286
philpem@0 1287 M68KMAKE_OP(addi, 32, ., .)
philpem@0 1288 {
philpem@0 1289 uint src = OPER_I_32();
philpem@0 1290 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 1291 uint dst = m68ki_read_32(ea);
philpem@0 1292 uint res = src + dst;
philpem@0 1293
philpem@0 1294 FLAG_N = NFLAG_32(res);
philpem@0 1295 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1296 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1297 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1298
philpem@0 1299 m68ki_write_32(ea, FLAG_Z);
philpem@0 1300 }
philpem@0 1301
philpem@0 1302
philpem@0 1303 M68KMAKE_OP(addq, 8, ., d)
philpem@0 1304 {
philpem@0 1305 uint* r_dst = &DY;
philpem@0 1306 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1307 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 1308 uint res = src + dst;
philpem@0 1309
philpem@0 1310 FLAG_N = NFLAG_8(res);
philpem@0 1311 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1312 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1313 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1314
philpem@0 1315 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 1316 }
philpem@0 1317
philpem@0 1318
philpem@0 1319 M68KMAKE_OP(addq, 8, ., .)
philpem@0 1320 {
philpem@0 1321 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1322 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 1323 uint dst = m68ki_read_8(ea);
philpem@0 1324 uint res = src + dst;
philpem@0 1325
philpem@0 1326 FLAG_N = NFLAG_8(res);
philpem@0 1327 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1328 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1329 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1330
philpem@0 1331 m68ki_write_8(ea, FLAG_Z);
philpem@0 1332 }
philpem@0 1333
philpem@0 1334
philpem@0 1335 M68KMAKE_OP(addq, 16, ., d)
philpem@0 1336 {
philpem@0 1337 uint* r_dst = &DY;
philpem@0 1338 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1339 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1340 uint res = src + dst;
philpem@0 1341
philpem@0 1342 FLAG_N = NFLAG_16(res);
philpem@0 1343 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1344 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1345 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1346
philpem@0 1347 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 1348 }
philpem@0 1349
philpem@0 1350
philpem@0 1351 M68KMAKE_OP(addq, 16, ., a)
philpem@0 1352 {
philpem@0 1353 uint* r_dst = &AY;
philpem@0 1354
philpem@0 1355 *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
philpem@0 1356 }
philpem@0 1357
philpem@0 1358
philpem@0 1359 M68KMAKE_OP(addq, 16, ., .)
philpem@0 1360 {
philpem@0 1361 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1362 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 1363 uint dst = m68ki_read_16(ea);
philpem@0 1364 uint res = src + dst;
philpem@0 1365
philpem@0 1366 FLAG_N = NFLAG_16(res);
philpem@0 1367 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1368 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1369 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1370
philpem@0 1371 m68ki_write_16(ea, FLAG_Z);
philpem@0 1372 }
philpem@0 1373
philpem@0 1374
philpem@0 1375 M68KMAKE_OP(addq, 32, ., d)
philpem@0 1376 {
philpem@0 1377 uint* r_dst = &DY;
philpem@0 1378 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1379 uint dst = *r_dst;
philpem@0 1380 uint res = src + dst;
philpem@0 1381
philpem@0 1382 FLAG_N = NFLAG_32(res);
philpem@0 1383 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1384 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1385 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1386
philpem@0 1387 *r_dst = FLAG_Z;
philpem@0 1388 }
philpem@0 1389
philpem@0 1390
philpem@0 1391 M68KMAKE_OP(addq, 32, ., a)
philpem@0 1392 {
philpem@0 1393 uint* r_dst = &AY;
philpem@0 1394
philpem@0 1395 *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
philpem@0 1396 }
philpem@0 1397
philpem@0 1398
philpem@0 1399 M68KMAKE_OP(addq, 32, ., .)
philpem@0 1400 {
philpem@0 1401 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1402 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 1403 uint dst = m68ki_read_32(ea);
philpem@0 1404 uint res = src + dst;
philpem@0 1405
philpem@0 1406
philpem@0 1407 FLAG_N = NFLAG_32(res);
philpem@0 1408 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1409 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1410 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 1411
philpem@0 1412 m68ki_write_32(ea, FLAG_Z);
philpem@0 1413 }
philpem@0 1414
philpem@0 1415
philpem@0 1416 M68KMAKE_OP(addx, 8, rr, .)
philpem@0 1417 {
philpem@0 1418 uint* r_dst = &DX;
philpem@0 1419 uint src = MASK_OUT_ABOVE_8(DY);
philpem@0 1420 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 1421 uint res = src + dst + XFLAG_AS_1();
philpem@0 1422
philpem@0 1423 FLAG_N = NFLAG_8(res);
philpem@0 1424 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1425 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1426
philpem@0 1427 res = MASK_OUT_ABOVE_8(res);
philpem@0 1428 FLAG_Z |= res;
philpem@0 1429
philpem@0 1430 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 1431 }
philpem@0 1432
philpem@0 1433
philpem@0 1434 M68KMAKE_OP(addx, 16, rr, .)
philpem@0 1435 {
philpem@0 1436 uint* r_dst = &DX;
philpem@0 1437 uint src = MASK_OUT_ABOVE_16(DY);
philpem@0 1438 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1439 uint res = src + dst + XFLAG_AS_1();
philpem@0 1440
philpem@0 1441 FLAG_N = NFLAG_16(res);
philpem@0 1442 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1443 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1444
philpem@0 1445 res = MASK_OUT_ABOVE_16(res);
philpem@0 1446 FLAG_Z |= res;
philpem@0 1447
philpem@0 1448 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 1449 }
philpem@0 1450
philpem@0 1451
philpem@0 1452 M68KMAKE_OP(addx, 32, rr, .)
philpem@0 1453 {
philpem@0 1454 uint* r_dst = &DX;
philpem@0 1455 uint src = DY;
philpem@0 1456 uint dst = *r_dst;
philpem@0 1457 uint res = src + dst + XFLAG_AS_1();
philpem@0 1458
philpem@0 1459 FLAG_N = NFLAG_32(res);
philpem@0 1460 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1461 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1462
philpem@0 1463 res = MASK_OUT_ABOVE_32(res);
philpem@0 1464 FLAG_Z |= res;
philpem@0 1465
philpem@0 1466 *r_dst = res;
philpem@0 1467 }
philpem@0 1468
philpem@0 1469
philpem@0 1470 M68KMAKE_OP(addx, 8, mm, ax7)
philpem@0 1471 {
philpem@0 1472 uint src = OPER_AY_PD_8();
philpem@0 1473 uint ea = EA_A7_PD_8();
philpem@0 1474 uint dst = m68ki_read_8(ea);
philpem@0 1475 uint res = src + dst + XFLAG_AS_1();
philpem@0 1476
philpem@0 1477 FLAG_N = NFLAG_8(res);
philpem@0 1478 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1479 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1480
philpem@0 1481 res = MASK_OUT_ABOVE_8(res);
philpem@0 1482 FLAG_Z |= res;
philpem@0 1483
philpem@0 1484 m68ki_write_8(ea, res);
philpem@0 1485 }
philpem@0 1486
philpem@0 1487
philpem@0 1488 M68KMAKE_OP(addx, 8, mm, ay7)
philpem@0 1489 {
philpem@0 1490 uint src = OPER_A7_PD_8();
philpem@0 1491 uint ea = EA_AX_PD_8();
philpem@0 1492 uint dst = m68ki_read_8(ea);
philpem@0 1493 uint res = src + dst + XFLAG_AS_1();
philpem@0 1494
philpem@0 1495 FLAG_N = NFLAG_8(res);
philpem@0 1496 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1497 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1498
philpem@0 1499 res = MASK_OUT_ABOVE_8(res);
philpem@0 1500 FLAG_Z |= res;
philpem@0 1501
philpem@0 1502 m68ki_write_8(ea, res);
philpem@0 1503 }
philpem@0 1504
philpem@0 1505
philpem@0 1506 M68KMAKE_OP(addx, 8, mm, axy7)
philpem@0 1507 {
philpem@0 1508 uint src = OPER_A7_PD_8();
philpem@0 1509 uint ea = EA_A7_PD_8();
philpem@0 1510 uint dst = m68ki_read_8(ea);
philpem@0 1511 uint res = src + dst + XFLAG_AS_1();
philpem@0 1512
philpem@0 1513 FLAG_N = NFLAG_8(res);
philpem@0 1514 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1515 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1516
philpem@0 1517 res = MASK_OUT_ABOVE_8(res);
philpem@0 1518 FLAG_Z |= res;
philpem@0 1519
philpem@0 1520 m68ki_write_8(ea, res);
philpem@0 1521 }
philpem@0 1522
philpem@0 1523
philpem@0 1524 M68KMAKE_OP(addx, 8, mm, .)
philpem@0 1525 {
philpem@0 1526 uint src = OPER_AY_PD_8();
philpem@0 1527 uint ea = EA_AX_PD_8();
philpem@0 1528 uint dst = m68ki_read_8(ea);
philpem@0 1529 uint res = src + dst + XFLAG_AS_1();
philpem@0 1530
philpem@0 1531 FLAG_N = NFLAG_8(res);
philpem@0 1532 FLAG_V = VFLAG_ADD_8(src, dst, res);
philpem@0 1533 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 1534
philpem@0 1535 res = MASK_OUT_ABOVE_8(res);
philpem@0 1536 FLAG_Z |= res;
philpem@0 1537
philpem@0 1538 m68ki_write_8(ea, res);
philpem@0 1539 }
philpem@0 1540
philpem@0 1541
philpem@0 1542 M68KMAKE_OP(addx, 16, mm, .)
philpem@0 1543 {
philpem@0 1544 uint src = OPER_AY_PD_16();
philpem@0 1545 uint ea = EA_AX_PD_16();
philpem@0 1546 uint dst = m68ki_read_16(ea);
philpem@0 1547 uint res = src + dst + XFLAG_AS_1();
philpem@0 1548
philpem@0 1549 FLAG_N = NFLAG_16(res);
philpem@0 1550 FLAG_V = VFLAG_ADD_16(src, dst, res);
philpem@0 1551 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 1552
philpem@0 1553 res = MASK_OUT_ABOVE_16(res);
philpem@0 1554 FLAG_Z |= res;
philpem@0 1555
philpem@0 1556 m68ki_write_16(ea, res);
philpem@0 1557 }
philpem@0 1558
philpem@0 1559
philpem@0 1560 M68KMAKE_OP(addx, 32, mm, .)
philpem@0 1561 {
philpem@0 1562 uint src = OPER_AY_PD_32();
philpem@0 1563 uint ea = EA_AX_PD_32();
philpem@0 1564 uint dst = m68ki_read_32(ea);
philpem@0 1565 uint res = src + dst + XFLAG_AS_1();
philpem@0 1566
philpem@0 1567 FLAG_N = NFLAG_32(res);
philpem@0 1568 FLAG_V = VFLAG_ADD_32(src, dst, res);
philpem@0 1569 FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
philpem@0 1570
philpem@0 1571 res = MASK_OUT_ABOVE_32(res);
philpem@0 1572 FLAG_Z |= res;
philpem@0 1573
philpem@0 1574 m68ki_write_32(ea, res);
philpem@0 1575 }
philpem@0 1576
philpem@0 1577
philpem@0 1578 M68KMAKE_OP(and, 8, er, d)
philpem@0 1579 {
philpem@0 1580 FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00));
philpem@0 1581
philpem@0 1582 FLAG_N = NFLAG_8(FLAG_Z);
philpem@0 1583 FLAG_C = CFLAG_CLEAR;
philpem@0 1584 FLAG_V = VFLAG_CLEAR;
philpem@0 1585 }
philpem@0 1586
philpem@0 1587
philpem@0 1588 M68KMAKE_OP(and, 8, er, .)
philpem@0 1589 {
philpem@0 1590 FLAG_Z = MASK_OUT_ABOVE_8(DX &= (M68KMAKE_GET_OPER_AY_8 | 0xffffff00));
philpem@0 1591
philpem@0 1592 FLAG_N = NFLAG_8(FLAG_Z);
philpem@0 1593 FLAG_C = CFLAG_CLEAR;
philpem@0 1594 FLAG_V = VFLAG_CLEAR;
philpem@0 1595 }
philpem@0 1596
philpem@0 1597
philpem@0 1598 M68KMAKE_OP(and, 16, er, d)
philpem@0 1599 {
philpem@0 1600 FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000));
philpem@0 1601
philpem@0 1602 FLAG_N = NFLAG_16(FLAG_Z);
philpem@0 1603 FLAG_C = CFLAG_CLEAR;
philpem@0 1604 FLAG_V = VFLAG_CLEAR;
philpem@0 1605 }
philpem@0 1606
philpem@0 1607
philpem@0 1608 M68KMAKE_OP(and, 16, er, .)
philpem@0 1609 {
philpem@0 1610 FLAG_Z = MASK_OUT_ABOVE_16(DX &= (M68KMAKE_GET_OPER_AY_16 | 0xffff0000));
philpem@0 1611
philpem@0 1612 FLAG_N = NFLAG_16(FLAG_Z);
philpem@0 1613 FLAG_C = CFLAG_CLEAR;
philpem@0 1614 FLAG_V = VFLAG_CLEAR;
philpem@0 1615 }
philpem@0 1616
philpem@0 1617
philpem@0 1618 M68KMAKE_OP(and, 32, er, d)
philpem@0 1619 {
philpem@0 1620 FLAG_Z = DX &= DY;
philpem@0 1621
philpem@0 1622 FLAG_N = NFLAG_32(FLAG_Z);
philpem@0 1623 FLAG_C = CFLAG_CLEAR;
philpem@0 1624 FLAG_V = VFLAG_CLEAR;
philpem@0 1625 }
philpem@0 1626
philpem@0 1627
philpem@0 1628 M68KMAKE_OP(and, 32, er, .)
philpem@0 1629 {
philpem@0 1630 FLAG_Z = DX &= M68KMAKE_GET_OPER_AY_32;
philpem@0 1631
philpem@0 1632 FLAG_N = NFLAG_32(FLAG_Z);
philpem@0 1633 FLAG_C = CFLAG_CLEAR;
philpem@0 1634 FLAG_V = VFLAG_CLEAR;
philpem@0 1635 }
philpem@0 1636
philpem@0 1637
philpem@0 1638 M68KMAKE_OP(and, 8, re, .)
philpem@0 1639 {
philpem@0 1640 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 1641 uint res = DX & m68ki_read_8(ea);
philpem@0 1642
philpem@0 1643 FLAG_N = NFLAG_8(res);
philpem@0 1644 FLAG_C = CFLAG_CLEAR;
philpem@0 1645 FLAG_V = VFLAG_CLEAR;
philpem@0 1646 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 1647
philpem@0 1648 m68ki_write_8(ea, FLAG_Z);
philpem@0 1649 }
philpem@0 1650
philpem@0 1651
philpem@0 1652 M68KMAKE_OP(and, 16, re, .)
philpem@0 1653 {
philpem@0 1654 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 1655 uint res = DX & m68ki_read_16(ea);
philpem@0 1656
philpem@0 1657 FLAG_N = NFLAG_16(res);
philpem@0 1658 FLAG_C = CFLAG_CLEAR;
philpem@0 1659 FLAG_V = VFLAG_CLEAR;
philpem@0 1660 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 1661
philpem@0 1662 m68ki_write_16(ea, FLAG_Z);
philpem@0 1663 }
philpem@0 1664
philpem@0 1665
philpem@0 1666 M68KMAKE_OP(and, 32, re, .)
philpem@0 1667 {
philpem@0 1668 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 1669 uint res = DX & m68ki_read_32(ea);
philpem@0 1670
philpem@0 1671 FLAG_N = NFLAG_32(res);
philpem@0 1672 FLAG_Z = res;
philpem@0 1673 FLAG_C = CFLAG_CLEAR;
philpem@0 1674 FLAG_V = VFLAG_CLEAR;
philpem@0 1675
philpem@0 1676 m68ki_write_32(ea, res);
philpem@0 1677 }
philpem@0 1678
philpem@0 1679
philpem@0 1680 M68KMAKE_OP(andi, 8, ., d)
philpem@0 1681 {
philpem@0 1682 FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00));
philpem@0 1683
philpem@0 1684 FLAG_N = NFLAG_8(FLAG_Z);
philpem@0 1685 FLAG_C = CFLAG_CLEAR;
philpem@0 1686 FLAG_V = VFLAG_CLEAR;
philpem@0 1687 }
philpem@0 1688
philpem@0 1689
philpem@0 1690 M68KMAKE_OP(andi, 8, ., .)
philpem@0 1691 {
philpem@0 1692 uint src = OPER_I_8();
philpem@0 1693 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 1694 uint res = src & m68ki_read_8(ea);
philpem@0 1695
philpem@0 1696 FLAG_N = NFLAG_8(res);
philpem@0 1697 FLAG_Z = res;
philpem@0 1698 FLAG_C = CFLAG_CLEAR;
philpem@0 1699 FLAG_V = VFLAG_CLEAR;
philpem@0 1700
philpem@0 1701 m68ki_write_8(ea, res);
philpem@0 1702 }
philpem@0 1703
philpem@0 1704
philpem@0 1705 M68KMAKE_OP(andi, 16, ., d)
philpem@0 1706 {
philpem@0 1707 FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000));
philpem@0 1708
philpem@0 1709 FLAG_N = NFLAG_16(FLAG_Z);
philpem@0 1710 FLAG_C = CFLAG_CLEAR;
philpem@0 1711 FLAG_V = VFLAG_CLEAR;
philpem@0 1712 }
philpem@0 1713
philpem@0 1714
philpem@0 1715 M68KMAKE_OP(andi, 16, ., .)
philpem@0 1716 {
philpem@0 1717 uint src = OPER_I_16();
philpem@0 1718 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 1719 uint res = src & m68ki_read_16(ea);
philpem@0 1720
philpem@0 1721 FLAG_N = NFLAG_16(res);
philpem@0 1722 FLAG_Z = res;
philpem@0 1723 FLAG_C = CFLAG_CLEAR;
philpem@0 1724 FLAG_V = VFLAG_CLEAR;
philpem@0 1725
philpem@0 1726 m68ki_write_16(ea, res);
philpem@0 1727 }
philpem@0 1728
philpem@0 1729
philpem@0 1730 M68KMAKE_OP(andi, 32, ., d)
philpem@0 1731 {
philpem@0 1732 FLAG_Z = DY &= (OPER_I_32());
philpem@0 1733
philpem@0 1734 FLAG_N = NFLAG_32(FLAG_Z);
philpem@0 1735 FLAG_C = CFLAG_CLEAR;
philpem@0 1736 FLAG_V = VFLAG_CLEAR;
philpem@0 1737 }
philpem@0 1738
philpem@0 1739
philpem@0 1740 M68KMAKE_OP(andi, 32, ., .)
philpem@0 1741 {
philpem@0 1742 uint src = OPER_I_32();
philpem@0 1743 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 1744 uint res = src & m68ki_read_32(ea);
philpem@0 1745
philpem@0 1746 FLAG_N = NFLAG_32(res);
philpem@0 1747 FLAG_Z = res;
philpem@0 1748 FLAG_C = CFLAG_CLEAR;
philpem@0 1749 FLAG_V = VFLAG_CLEAR;
philpem@0 1750
philpem@0 1751 m68ki_write_32(ea, res);
philpem@0 1752 }
philpem@0 1753
philpem@0 1754
philpem@0 1755 M68KMAKE_OP(andi, 16, toc, .)
philpem@0 1756 {
philpem@0 1757 m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16());
philpem@0 1758 }
philpem@0 1759
philpem@0 1760
philpem@0 1761 M68KMAKE_OP(andi, 16, tos, .)
philpem@0 1762 {
philpem@0 1763 if(FLAG_S)
philpem@0 1764 {
philpem@0 1765 uint src = OPER_I_16();
philpem@0 1766 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 1767 m68ki_set_sr(m68ki_get_sr() & src);
philpem@0 1768 return;
philpem@0 1769 }
philpem@0 1770 m68ki_exception_privilege_violation();
philpem@0 1771 }
philpem@0 1772
philpem@0 1773
philpem@0 1774 M68KMAKE_OP(asr, 8, s, .)
philpem@0 1775 {
philpem@0 1776 uint* r_dst = &DY;
philpem@0 1777 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1778 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 1779 uint res = src >> shift;
philpem@0 1780
philpem@0 1781 if(GET_MSB_8(src))
philpem@0 1782 res |= m68ki_shift_8_table[shift];
philpem@0 1783
philpem@0 1784 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 1785
philpem@0 1786 FLAG_N = NFLAG_8(res);
philpem@0 1787 FLAG_Z = res;
philpem@0 1788 FLAG_V = VFLAG_CLEAR;
philpem@0 1789 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 1790 }
philpem@0 1791
philpem@0 1792
philpem@0 1793 M68KMAKE_OP(asr, 16, s, .)
philpem@0 1794 {
philpem@0 1795 uint* r_dst = &DY;
philpem@0 1796 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1797 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1798 uint res = src >> shift;
philpem@0 1799
philpem@0 1800 if(GET_MSB_16(src))
philpem@0 1801 res |= m68ki_shift_16_table[shift];
philpem@0 1802
philpem@0 1803 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 1804
philpem@0 1805 FLAG_N = NFLAG_16(res);
philpem@0 1806 FLAG_Z = res;
philpem@0 1807 FLAG_V = VFLAG_CLEAR;
philpem@0 1808 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 1809 }
philpem@0 1810
philpem@0 1811
philpem@0 1812 M68KMAKE_OP(asr, 32, s, .)
philpem@0 1813 {
philpem@0 1814 uint* r_dst = &DY;
philpem@0 1815 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 1816 uint src = *r_dst;
philpem@0 1817 uint res = src >> shift;
philpem@0 1818
philpem@0 1819 if(GET_MSB_32(src))
philpem@0 1820 res |= m68ki_shift_32_table[shift];
philpem@0 1821
philpem@0 1822 *r_dst = res;
philpem@0 1823
philpem@0 1824 FLAG_N = NFLAG_32(res);
philpem@0 1825 FLAG_Z = res;
philpem@0 1826 FLAG_V = VFLAG_CLEAR;
philpem@0 1827 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 1828 }
philpem@0 1829
philpem@0 1830
philpem@0 1831 M68KMAKE_OP(asr, 8, r, .)
philpem@0 1832 {
philpem@0 1833 uint* r_dst = &DY;
philpem@0 1834 uint shift = DX & 0x3f;
philpem@0 1835 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 1836 uint res = src >> shift;
philpem@0 1837
philpem@0 1838 if(shift != 0)
philpem@0 1839 {
philpem@0 1840 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 1841
philpem@0 1842 if(shift < 8)
philpem@0 1843 {
philpem@0 1844 if(GET_MSB_8(src))
philpem@0 1845 res |= m68ki_shift_8_table[shift];
philpem@0 1846
philpem@0 1847 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 1848
philpem@0 1849 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 1850 FLAG_N = NFLAG_8(res);
philpem@0 1851 FLAG_Z = res;
philpem@0 1852 FLAG_V = VFLAG_CLEAR;
philpem@0 1853 return;
philpem@0 1854 }
philpem@0 1855
philpem@0 1856 if(GET_MSB_8(src))
philpem@0 1857 {
philpem@0 1858 *r_dst |= 0xff;
philpem@0 1859 FLAG_C = CFLAG_SET;
philpem@0 1860 FLAG_X = XFLAG_SET;
philpem@0 1861 FLAG_N = NFLAG_SET;
philpem@0 1862 FLAG_Z = ZFLAG_CLEAR;
philpem@0 1863 FLAG_V = VFLAG_CLEAR;
philpem@0 1864 return;
philpem@0 1865 }
philpem@0 1866
philpem@0 1867 *r_dst &= 0xffffff00;
philpem@0 1868 FLAG_C = CFLAG_CLEAR;
philpem@0 1869 FLAG_X = XFLAG_CLEAR;
philpem@0 1870 FLAG_N = NFLAG_CLEAR;
philpem@0 1871 FLAG_Z = ZFLAG_SET;
philpem@0 1872 FLAG_V = VFLAG_CLEAR;
philpem@0 1873 return;
philpem@0 1874 }
philpem@0 1875
philpem@0 1876 FLAG_C = CFLAG_CLEAR;
philpem@0 1877 FLAG_N = NFLAG_8(src);
philpem@0 1878 FLAG_Z = src;
philpem@0 1879 FLAG_V = VFLAG_CLEAR;
philpem@0 1880 }
philpem@0 1881
philpem@0 1882
philpem@0 1883 M68KMAKE_OP(asr, 16, r, .)
philpem@0 1884 {
philpem@0 1885 uint* r_dst = &DY;
philpem@0 1886 uint shift = DX & 0x3f;
philpem@0 1887 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 1888 uint res = src >> shift;
philpem@0 1889
philpem@0 1890 if(shift != 0)
philpem@0 1891 {
philpem@0 1892 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 1893
philpem@0 1894 if(shift < 16)
philpem@0 1895 {
philpem@0 1896 if(GET_MSB_16(src))
philpem@0 1897 res |= m68ki_shift_16_table[shift];
philpem@0 1898
philpem@0 1899 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 1900
philpem@0 1901 FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
philpem@0 1902 FLAG_N = NFLAG_16(res);
philpem@0 1903 FLAG_Z = res;
philpem@0 1904 FLAG_V = VFLAG_CLEAR;
philpem@0 1905 return;
philpem@0 1906 }
philpem@0 1907
philpem@0 1908 if(GET_MSB_16(src))
philpem@0 1909 {
philpem@0 1910 *r_dst |= 0xffff;
philpem@0 1911 FLAG_C = CFLAG_SET;
philpem@0 1912 FLAG_X = XFLAG_SET;
philpem@0 1913 FLAG_N = NFLAG_SET;
philpem@0 1914 FLAG_Z = ZFLAG_CLEAR;
philpem@0 1915 FLAG_V = VFLAG_CLEAR;
philpem@0 1916 return;
philpem@0 1917 }
philpem@0 1918
philpem@0 1919 *r_dst &= 0xffff0000;
philpem@0 1920 FLAG_C = CFLAG_CLEAR;
philpem@0 1921 FLAG_X = XFLAG_CLEAR;
philpem@0 1922 FLAG_N = NFLAG_CLEAR;
philpem@0 1923 FLAG_Z = ZFLAG_SET;
philpem@0 1924 FLAG_V = VFLAG_CLEAR;
philpem@0 1925 return;
philpem@0 1926 }
philpem@0 1927
philpem@0 1928 FLAG_C = CFLAG_CLEAR;
philpem@0 1929 FLAG_N = NFLAG_16(src);
philpem@0 1930 FLAG_Z = src;
philpem@0 1931 FLAG_V = VFLAG_CLEAR;
philpem@0 1932 }
philpem@0 1933
philpem@0 1934
philpem@0 1935 M68KMAKE_OP(asr, 32, r, .)
philpem@0 1936 {
philpem@0 1937 uint* r_dst = &DY;
philpem@0 1938 uint shift = DX & 0x3f;
philpem@0 1939 uint src = *r_dst;
philpem@0 1940 uint res = src >> shift;
philpem@0 1941
philpem@0 1942 if(shift != 0)
philpem@0 1943 {
philpem@0 1944 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 1945
philpem@0 1946 if(shift < 32)
philpem@0 1947 {
philpem@0 1948 if(GET_MSB_32(src))
philpem@0 1949 res |= m68ki_shift_32_table[shift];
philpem@0 1950
philpem@0 1951 *r_dst = res;
philpem@0 1952
philpem@0 1953 FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
philpem@0 1954 FLAG_N = NFLAG_32(res);
philpem@0 1955 FLAG_Z = res;
philpem@0 1956 FLAG_V = VFLAG_CLEAR;
philpem@0 1957 return;
philpem@0 1958 }
philpem@0 1959
philpem@0 1960 if(GET_MSB_32(src))
philpem@0 1961 {
philpem@0 1962 *r_dst = 0xffffffff;
philpem@0 1963 FLAG_C = CFLAG_SET;
philpem@0 1964 FLAG_X = XFLAG_SET;
philpem@0 1965 FLAG_N = NFLAG_SET;
philpem@0 1966 FLAG_Z = ZFLAG_CLEAR;
philpem@0 1967 FLAG_V = VFLAG_CLEAR;
philpem@0 1968 return;
philpem@0 1969 }
philpem@0 1970
philpem@0 1971 *r_dst = 0;
philpem@0 1972 FLAG_C = CFLAG_CLEAR;
philpem@0 1973 FLAG_X = XFLAG_CLEAR;
philpem@0 1974 FLAG_N = NFLAG_CLEAR;
philpem@0 1975 FLAG_Z = ZFLAG_SET;
philpem@0 1976 FLAG_V = VFLAG_CLEAR;
philpem@0 1977 return;
philpem@0 1978 }
philpem@0 1979
philpem@0 1980 FLAG_C = CFLAG_CLEAR;
philpem@0 1981 FLAG_N = NFLAG_32(src);
philpem@0 1982 FLAG_Z = src;
philpem@0 1983 FLAG_V = VFLAG_CLEAR;
philpem@0 1984 }
philpem@0 1985
philpem@0 1986
philpem@0 1987 M68KMAKE_OP(asr, 16, ., .)
philpem@0 1988 {
philpem@0 1989 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 1990 uint src = m68ki_read_16(ea);
philpem@0 1991 uint res = src >> 1;
philpem@0 1992
philpem@0 1993 if(GET_MSB_16(src))
philpem@0 1994 res |= 0x8000;
philpem@0 1995
philpem@0 1996 m68ki_write_16(ea, res);
philpem@0 1997
philpem@0 1998 FLAG_N = NFLAG_16(res);
philpem@0 1999 FLAG_Z = res;
philpem@0 2000 FLAG_V = VFLAG_CLEAR;
philpem@0 2001 FLAG_C = FLAG_X = src << 8;
philpem@0 2002 }
philpem@0 2003
philpem@0 2004
philpem@0 2005 M68KMAKE_OP(asl, 8, s, .)
philpem@0 2006 {
philpem@0 2007 uint* r_dst = &DY;
philpem@0 2008 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 2009 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 2010 uint res = MASK_OUT_ABOVE_8(src << shift);
philpem@0 2011
philpem@0 2012 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 2013
philpem@0 2014 FLAG_X = FLAG_C = src << shift;
philpem@0 2015 FLAG_N = NFLAG_8(res);
philpem@0 2016 FLAG_Z = res;
philpem@0 2017 src &= m68ki_shift_8_table[shift + 1];
philpem@0 2018 FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7;
philpem@0 2019 }
philpem@0 2020
philpem@0 2021
philpem@0 2022 M68KMAKE_OP(asl, 16, s, .)
philpem@0 2023 {
philpem@0 2024 uint* r_dst = &DY;
philpem@0 2025 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 2026 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 2027 uint res = MASK_OUT_ABOVE_16(src << shift);
philpem@0 2028
philpem@0 2029 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 2030
philpem@0 2031 FLAG_N = NFLAG_16(res);
philpem@0 2032 FLAG_Z = res;
philpem@0 2033 FLAG_X = FLAG_C = src >> (8-shift);
philpem@0 2034 src &= m68ki_shift_16_table[shift + 1];
philpem@0 2035 FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
philpem@0 2036 }
philpem@0 2037
philpem@0 2038
philpem@0 2039 M68KMAKE_OP(asl, 32, s, .)
philpem@0 2040 {
philpem@0 2041 uint* r_dst = &DY;
philpem@0 2042 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 2043 uint src = *r_dst;
philpem@0 2044 uint res = MASK_OUT_ABOVE_32(src << shift);
philpem@0 2045
philpem@0 2046 *r_dst = res;
philpem@0 2047
philpem@0 2048 FLAG_N = NFLAG_32(res);
philpem@0 2049 FLAG_Z = res;
philpem@0 2050 FLAG_X = FLAG_C = src >> (24-shift);
philpem@0 2051 src &= m68ki_shift_32_table[shift + 1];
philpem@0 2052 FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
philpem@0 2053 }
philpem@0 2054
philpem@0 2055
philpem@0 2056 M68KMAKE_OP(asl, 8, r, .)
philpem@0 2057 {
philpem@0 2058 uint* r_dst = &DY;
philpem@0 2059 uint shift = DX & 0x3f;
philpem@0 2060 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 2061 uint res = MASK_OUT_ABOVE_8(src << shift);
philpem@0 2062
philpem@0 2063 if(shift != 0)
philpem@0 2064 {
philpem@0 2065 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 2066
philpem@0 2067 if(shift < 8)
philpem@0 2068 {
philpem@0 2069 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 2070 FLAG_X = FLAG_C = src << shift;
philpem@0 2071 FLAG_N = NFLAG_8(res);
philpem@0 2072 FLAG_Z = res;
philpem@0 2073 src &= m68ki_shift_8_table[shift + 1];
philpem@0 2074 FLAG_V = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7;
philpem@0 2075 return;
philpem@0 2076 }
philpem@0 2077
philpem@0 2078 *r_dst &= 0xffffff00;
philpem@0 2079 FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8;
philpem@0 2080 FLAG_N = NFLAG_CLEAR;
philpem@0 2081 FLAG_Z = ZFLAG_SET;
philpem@0 2082 FLAG_V = (!(src == 0))<<7;
philpem@0 2083 return;
philpem@0 2084 }
philpem@0 2085
philpem@0 2086 FLAG_C = CFLAG_CLEAR;
philpem@0 2087 FLAG_N = NFLAG_8(src);
philpem@0 2088 FLAG_Z = src;
philpem@0 2089 FLAG_V = VFLAG_CLEAR;
philpem@0 2090 }
philpem@0 2091
philpem@0 2092
philpem@0 2093 M68KMAKE_OP(asl, 16, r, .)
philpem@0 2094 {
philpem@0 2095 uint* r_dst = &DY;
philpem@0 2096 uint shift = DX & 0x3f;
philpem@0 2097 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 2098 uint res = MASK_OUT_ABOVE_16(src << shift);
philpem@0 2099
philpem@0 2100 if(shift != 0)
philpem@0 2101 {
philpem@0 2102 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 2103
philpem@0 2104 if(shift < 16)
philpem@0 2105 {
philpem@0 2106 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 2107 FLAG_X = FLAG_C = (src << shift) >> 8;
philpem@0 2108 FLAG_N = NFLAG_16(res);
philpem@0 2109 FLAG_Z = res;
philpem@0 2110 src &= m68ki_shift_16_table[shift + 1];
philpem@0 2111 FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
philpem@0 2112 return;
philpem@0 2113 }
philpem@0 2114
philpem@0 2115 *r_dst &= 0xffff0000;
philpem@0 2116 FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8;
philpem@0 2117 FLAG_N = NFLAG_CLEAR;
philpem@0 2118 FLAG_Z = ZFLAG_SET;
philpem@0 2119 FLAG_V = (!(src == 0))<<7;
philpem@0 2120 return;
philpem@0 2121 }
philpem@0 2122
philpem@0 2123 FLAG_C = CFLAG_CLEAR;
philpem@0 2124 FLAG_N = NFLAG_16(src);
philpem@0 2125 FLAG_Z = src;
philpem@0 2126 FLAG_V = VFLAG_CLEAR;
philpem@0 2127 }
philpem@0 2128
philpem@0 2129
philpem@0 2130 M68KMAKE_OP(asl, 32, r, .)
philpem@0 2131 {
philpem@0 2132 uint* r_dst = &DY;
philpem@0 2133 uint shift = DX & 0x3f;
philpem@0 2134 uint src = *r_dst;
philpem@0 2135 uint res = MASK_OUT_ABOVE_32(src << shift);
philpem@0 2136
philpem@0 2137 if(shift != 0)
philpem@0 2138 {
philpem@0 2139 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 2140
philpem@0 2141 if(shift < 32)
philpem@0 2142 {
philpem@0 2143 *r_dst = res;
philpem@0 2144 FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
philpem@0 2145 FLAG_N = NFLAG_32(res);
philpem@0 2146 FLAG_Z = res;
philpem@0 2147 src &= m68ki_shift_32_table[shift + 1];
philpem@0 2148 FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
philpem@0 2149 return;
philpem@0 2150 }
philpem@0 2151
philpem@0 2152 *r_dst = 0;
philpem@0 2153 FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
philpem@0 2154 FLAG_N = NFLAG_CLEAR;
philpem@0 2155 FLAG_Z = ZFLAG_SET;
philpem@0 2156 FLAG_V = (!(src == 0))<<7;
philpem@0 2157 return;
philpem@0 2158 }
philpem@0 2159
philpem@0 2160 FLAG_C = CFLAG_CLEAR;
philpem@0 2161 FLAG_N = NFLAG_32(src);
philpem@0 2162 FLAG_Z = src;
philpem@0 2163 FLAG_V = VFLAG_CLEAR;
philpem@0 2164 }
philpem@0 2165
philpem@0 2166
philpem@0 2167 M68KMAKE_OP(asl, 16, ., .)
philpem@0 2168 {
philpem@0 2169 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 2170 uint src = m68ki_read_16(ea);
philpem@0 2171 uint res = MASK_OUT_ABOVE_16(src << 1);
philpem@0 2172
philpem@0 2173 m68ki_write_16(ea, res);
philpem@0 2174
philpem@0 2175 FLAG_N = NFLAG_16(res);
philpem@0 2176 FLAG_Z = res;
philpem@0 2177 FLAG_X = FLAG_C = src >> 7;
philpem@0 2178 src &= 0xc000;
philpem@0 2179 FLAG_V = (!(src == 0 || src == 0xc000))<<7;
philpem@0 2180 }
philpem@0 2181
philpem@0 2182
philpem@0 2183 M68KMAKE_OP(bcc, 8, ., .)
philpem@0 2184 {
philpem@0 2185 if(M68KMAKE_CC)
philpem@0 2186 {
philpem@0 2187 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 2188 m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
philpem@0 2189 return;
philpem@0 2190 }
philpem@0 2191 USE_CYCLES(CYC_BCC_NOTAKE_B);
philpem@0 2192 }
philpem@0 2193
philpem@0 2194
philpem@0 2195 M68KMAKE_OP(bcc, 16, ., .)
philpem@0 2196 {
philpem@0 2197 if(M68KMAKE_CC)
philpem@0 2198 {
philpem@0 2199 uint offset = OPER_I_16();
philpem@0 2200 REG_PC -= 2;
philpem@0 2201 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 2202 m68ki_branch_16(offset);
philpem@0 2203 return;
philpem@0 2204 }
philpem@0 2205 REG_PC += 2;
philpem@0 2206 USE_CYCLES(CYC_BCC_NOTAKE_W);
philpem@0 2207 }
philpem@0 2208
philpem@0 2209
philpem@0 2210 M68KMAKE_OP(bcc, 32, ., .)
philpem@0 2211 {
philpem@0 2212 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2213 {
philpem@0 2214 if(M68KMAKE_CC)
philpem@0 2215 {
philpem@0 2216 uint offset = OPER_I_32();
philpem@0 2217 REG_PC -= 4;
philpem@0 2218 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 2219 m68ki_branch_32(offset);
philpem@0 2220 return;
philpem@0 2221 }
philpem@0 2222 REG_PC += 4;
philpem@0 2223 return;
philpem@0 2224 }
philpem@0 2225 m68ki_exception_illegal();
philpem@0 2226 }
philpem@0 2227
philpem@0 2228
philpem@0 2229 M68KMAKE_OP(bchg, 32, r, d)
philpem@0 2230 {
philpem@0 2231 uint* r_dst = &DY;
philpem@0 2232 uint mask = 1 << (DX & 0x1f);
philpem@0 2233
philpem@0 2234 FLAG_Z = *r_dst & mask;
philpem@0 2235 *r_dst ^= mask;
philpem@0 2236 }
philpem@0 2237
philpem@0 2238
philpem@0 2239 M68KMAKE_OP(bchg, 8, r, .)
philpem@0 2240 {
philpem@0 2241 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2242 uint src = m68ki_read_8(ea);
philpem@0 2243 uint mask = 1 << (DX & 7);
philpem@0 2244
philpem@0 2245 FLAG_Z = src & mask;
philpem@0 2246 m68ki_write_8(ea, src ^ mask);
philpem@0 2247 }
philpem@0 2248
philpem@0 2249
philpem@0 2250 M68KMAKE_OP(bchg, 32, s, d)
philpem@0 2251 {
philpem@0 2252 uint* r_dst = &DY;
philpem@0 2253 uint mask = 1 << (OPER_I_8() & 0x1f);
philpem@0 2254
philpem@0 2255 FLAG_Z = *r_dst & mask;
philpem@0 2256 *r_dst ^= mask;
philpem@0 2257 }
philpem@0 2258
philpem@0 2259
philpem@0 2260 M68KMAKE_OP(bchg, 8, s, .)
philpem@0 2261 {
philpem@0 2262 uint mask = 1 << (OPER_I_8() & 7);
philpem@0 2263 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2264 uint src = m68ki_read_8(ea);
philpem@0 2265
philpem@0 2266 FLAG_Z = src & mask;
philpem@0 2267 m68ki_write_8(ea, src ^ mask);
philpem@0 2268 }
philpem@0 2269
philpem@0 2270
philpem@0 2271 M68KMAKE_OP(bclr, 32, r, d)
philpem@0 2272 {
philpem@0 2273 uint* r_dst = &DY;
philpem@0 2274 uint mask = 1 << (DX & 0x1f);
philpem@0 2275
philpem@0 2276 FLAG_Z = *r_dst & mask;
philpem@0 2277 *r_dst &= ~mask;
philpem@0 2278 }
philpem@0 2279
philpem@0 2280
philpem@0 2281 M68KMAKE_OP(bclr, 8, r, .)
philpem@0 2282 {
philpem@0 2283 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2284 uint src = m68ki_read_8(ea);
philpem@0 2285 uint mask = 1 << (DX & 7);
philpem@0 2286
philpem@0 2287 FLAG_Z = src & mask;
philpem@0 2288 m68ki_write_8(ea, src & ~mask);
philpem@0 2289 }
philpem@0 2290
philpem@0 2291
philpem@0 2292 M68KMAKE_OP(bclr, 32, s, d)
philpem@0 2293 {
philpem@0 2294 uint* r_dst = &DY;
philpem@0 2295 uint mask = 1 << (OPER_I_8() & 0x1f);
philpem@0 2296
philpem@0 2297 FLAG_Z = *r_dst & mask;
philpem@0 2298 *r_dst &= ~mask;
philpem@0 2299 }
philpem@0 2300
philpem@0 2301
philpem@0 2302 M68KMAKE_OP(bclr, 8, s, .)
philpem@0 2303 {
philpem@0 2304 uint mask = 1 << (OPER_I_8() & 7);
philpem@0 2305 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2306 uint src = m68ki_read_8(ea);
philpem@0 2307
philpem@0 2308 FLAG_Z = src & mask;
philpem@0 2309 m68ki_write_8(ea, src & ~mask);
philpem@0 2310 }
philpem@0 2311
philpem@0 2312
philpem@0 2313 M68KMAKE_OP(bfchg, 32, ., d)
philpem@0 2314 {
philpem@0 2315 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2316 {
philpem@0 2317 uint word2 = OPER_I_16();
philpem@0 2318 uint offset = (word2>>6)&31;
philpem@0 2319 uint width = word2;
philpem@0 2320 uint* data = &DY;
philpem@0 2321 uint64 mask;
philpem@0 2322
philpem@0 2323
philpem@0 2324 if(BIT_B(word2))
philpem@0 2325 offset = REG_D[offset&7];
philpem@0 2326 if(BIT_5(word2))
philpem@0 2327 width = REG_D[width&7];
philpem@0 2328
philpem@0 2329 offset &= 31;
philpem@0 2330 width = ((width-1) & 31) + 1;
philpem@0 2331
philpem@0 2332 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2333 mask = ROR_32(mask, offset);
philpem@0 2334
philpem@0 2335 FLAG_N = NFLAG_32(*data<<offset);
philpem@0 2336 FLAG_Z = *data & mask;
philpem@0 2337 FLAG_V = VFLAG_CLEAR;
philpem@0 2338 FLAG_C = CFLAG_CLEAR;
philpem@0 2339
philpem@0 2340 *data ^= mask;
philpem@0 2341
philpem@0 2342 return;
philpem@0 2343 }
philpem@0 2344 m68ki_exception_illegal();
philpem@0 2345 }
philpem@0 2346
philpem@0 2347
philpem@0 2348 M68KMAKE_OP(bfchg, 32, ., .)
philpem@0 2349 {
philpem@0 2350 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2351 {
philpem@0 2352 uint word2 = OPER_I_16();
philpem@0 2353 sint offset = (word2>>6)&31;
philpem@0 2354 uint width = word2;
philpem@0 2355 uint mask_base;
philpem@0 2356 uint data_long;
philpem@0 2357 uint mask_long;
philpem@0 2358 uint data_byte = 0;
philpem@0 2359 uint mask_byte = 0;
philpem@0 2360 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2361
philpem@0 2362
philpem@0 2363 if(BIT_B(word2))
philpem@0 2364 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2365 if(BIT_5(word2))
philpem@0 2366 width = REG_D[width&7];
philpem@0 2367
philpem@0 2368 /* Offset is signed so we have to use ugly math =( */
philpem@0 2369 ea += offset / 8;
philpem@0 2370 offset %= 8;
philpem@0 2371 if(offset < 0)
philpem@0 2372 {
philpem@0 2373 offset += 8;
philpem@0 2374 ea--;
philpem@0 2375 }
philpem@0 2376 width = ((width-1) & 31) + 1;
philpem@0 2377
philpem@0 2378 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2379 mask_long = mask_base >> offset;
philpem@0 2380
philpem@0 2381 data_long = m68ki_read_32(ea);
philpem@0 2382 FLAG_N = NFLAG_32(data_long << offset);
philpem@0 2383 FLAG_Z = data_long & mask_long;
philpem@0 2384 FLAG_V = VFLAG_CLEAR;
philpem@0 2385 FLAG_C = CFLAG_CLEAR;
philpem@0 2386
philpem@0 2387 m68ki_write_32(ea, data_long ^ mask_long);
philpem@0 2388
philpem@0 2389 if((width + offset) > 32)
philpem@0 2390 {
philpem@0 2391 mask_byte = MASK_OUT_ABOVE_8(mask_base);
philpem@0 2392 data_byte = m68ki_read_8(ea+4);
philpem@0 2393 FLAG_Z |= (data_byte & mask_byte);
philpem@0 2394 m68ki_write_8(ea+4, data_byte ^ mask_byte);
philpem@0 2395 }
philpem@0 2396 return;
philpem@0 2397 }
philpem@0 2398 m68ki_exception_illegal();
philpem@0 2399 }
philpem@0 2400
philpem@0 2401
philpem@0 2402 M68KMAKE_OP(bfclr, 32, ., d)
philpem@0 2403 {
philpem@0 2404 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2405 {
philpem@0 2406 uint word2 = OPER_I_16();
philpem@0 2407 uint offset = (word2>>6)&31;
philpem@0 2408 uint width = word2;
philpem@0 2409 uint* data = &DY;
philpem@0 2410 uint64 mask;
philpem@0 2411
philpem@0 2412
philpem@0 2413 if(BIT_B(word2))
philpem@0 2414 offset = REG_D[offset&7];
philpem@0 2415 if(BIT_5(word2))
philpem@0 2416 width = REG_D[width&7];
philpem@0 2417
philpem@0 2418
philpem@0 2419 offset &= 31;
philpem@0 2420 width = ((width-1) & 31) + 1;
philpem@0 2421
philpem@0 2422
philpem@0 2423 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2424 mask = ROR_32(mask, offset);
philpem@0 2425
philpem@0 2426 FLAG_N = NFLAG_32(*data<<offset);
philpem@0 2427 FLAG_Z = *data & mask;
philpem@0 2428 FLAG_V = VFLAG_CLEAR;
philpem@0 2429 FLAG_C = CFLAG_CLEAR;
philpem@0 2430
philpem@0 2431 *data &= ~mask;
philpem@0 2432
philpem@0 2433 return;
philpem@0 2434 }
philpem@0 2435 m68ki_exception_illegal();
philpem@0 2436 }
philpem@0 2437
philpem@0 2438
philpem@0 2439 M68KMAKE_OP(bfclr, 32, ., .)
philpem@0 2440 {
philpem@0 2441 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2442 {
philpem@0 2443 uint word2 = OPER_I_16();
philpem@0 2444 sint offset = (word2>>6)&31;
philpem@0 2445 uint width = word2;
philpem@0 2446 uint mask_base;
philpem@0 2447 uint data_long;
philpem@0 2448 uint mask_long;
philpem@0 2449 uint data_byte = 0;
philpem@0 2450 uint mask_byte = 0;
philpem@0 2451 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2452
philpem@0 2453
philpem@0 2454 if(BIT_B(word2))
philpem@0 2455 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2456 if(BIT_5(word2))
philpem@0 2457 width = REG_D[width&7];
philpem@0 2458
philpem@0 2459 /* Offset is signed so we have to use ugly math =( */
philpem@0 2460 ea += offset / 8;
philpem@0 2461 offset %= 8;
philpem@0 2462 if(offset < 0)
philpem@0 2463 {
philpem@0 2464 offset += 8;
philpem@0 2465 ea--;
philpem@0 2466 }
philpem@0 2467 width = ((width-1) & 31) + 1;
philpem@0 2468
philpem@0 2469 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2470 mask_long = mask_base >> offset;
philpem@0 2471
philpem@0 2472 data_long = m68ki_read_32(ea);
philpem@0 2473 FLAG_N = NFLAG_32(data_long << offset);
philpem@0 2474 FLAG_Z = data_long & mask_long;
philpem@0 2475 FLAG_V = VFLAG_CLEAR;
philpem@0 2476 FLAG_C = CFLAG_CLEAR;
philpem@0 2477
philpem@0 2478 m68ki_write_32(ea, data_long & ~mask_long);
philpem@0 2479
philpem@0 2480 if((width + offset) > 32)
philpem@0 2481 {
philpem@0 2482 mask_byte = MASK_OUT_ABOVE_8(mask_base);
philpem@0 2483 data_byte = m68ki_read_8(ea+4);
philpem@0 2484 FLAG_Z |= (data_byte & mask_byte);
philpem@0 2485 m68ki_write_8(ea+4, data_byte & ~mask_byte);
philpem@0 2486 }
philpem@0 2487 return;
philpem@0 2488 }
philpem@0 2489 m68ki_exception_illegal();
philpem@0 2490 }
philpem@0 2491
philpem@0 2492
philpem@0 2493 M68KMAKE_OP(bfexts, 32, ., d)
philpem@0 2494 {
philpem@0 2495 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2496 {
philpem@0 2497 uint word2 = OPER_I_16();
philpem@0 2498 uint offset = (word2>>6)&31;
philpem@0 2499 uint width = word2;
philpem@0 2500 uint64 data = DY;
philpem@0 2501
philpem@0 2502
philpem@0 2503 if(BIT_B(word2))
philpem@0 2504 offset = REG_D[offset&7];
philpem@0 2505 if(BIT_5(word2))
philpem@0 2506 width = REG_D[width&7];
philpem@0 2507
philpem@0 2508 offset &= 31;
philpem@0 2509 width = ((width-1) & 31) + 1;
philpem@0 2510
philpem@0 2511 data = ROL_32(data, offset);
philpem@0 2512 FLAG_N = NFLAG_32(data);
philpem@0 2513 data = MAKE_INT_32(data) >> (32 - width);
philpem@0 2514
philpem@0 2515 FLAG_Z = data;
philpem@0 2516 FLAG_V = VFLAG_CLEAR;
philpem@0 2517 FLAG_C = CFLAG_CLEAR;
philpem@0 2518
philpem@0 2519 REG_D[(word2>>12)&7] = data;
philpem@0 2520
philpem@0 2521 return;
philpem@0 2522 }
philpem@0 2523 m68ki_exception_illegal();
philpem@0 2524 }
philpem@0 2525
philpem@0 2526
philpem@0 2527 M68KMAKE_OP(bfexts, 32, ., .)
philpem@0 2528 {
philpem@0 2529 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2530 {
philpem@0 2531 uint word2 = OPER_I_16();
philpem@0 2532 sint offset = (word2>>6)&31;
philpem@0 2533 uint width = word2;
philpem@0 2534 uint data;
philpem@0 2535 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2536
philpem@0 2537
philpem@0 2538 if(BIT_B(word2))
philpem@0 2539 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2540 if(BIT_5(word2))
philpem@0 2541 width = REG_D[width&7];
philpem@0 2542
philpem@0 2543 /* Offset is signed so we have to use ugly math =( */
philpem@0 2544 ea += offset / 8;
philpem@0 2545 offset %= 8;
philpem@0 2546 if(offset < 0)
philpem@0 2547 {
philpem@0 2548 offset += 8;
philpem@0 2549 ea--;
philpem@0 2550 }
philpem@0 2551 width = ((width-1) & 31) + 1;
philpem@0 2552
philpem@0 2553 data = m68ki_read_32(ea);
philpem@0 2554
philpem@0 2555 data = MASK_OUT_ABOVE_32(data<<offset);
philpem@0 2556
philpem@0 2557 if((offset+width) > 32)
philpem@0 2558 data |= (m68ki_read_8(ea+4) << offset) >> 8;
philpem@0 2559
philpem@0 2560 FLAG_N = NFLAG_32(data);
philpem@0 2561 data = MAKE_INT_32(data) >> (32 - width);
philpem@0 2562
philpem@0 2563 FLAG_Z = data;
philpem@0 2564 FLAG_V = VFLAG_CLEAR;
philpem@0 2565 FLAG_C = CFLAG_CLEAR;
philpem@0 2566
philpem@0 2567 REG_D[(word2 >> 12) & 7] = data;
philpem@0 2568
philpem@0 2569 return;
philpem@0 2570 }
philpem@0 2571 m68ki_exception_illegal();
philpem@0 2572 }
philpem@0 2573
philpem@0 2574
philpem@0 2575 M68KMAKE_OP(bfextu, 32, ., d)
philpem@0 2576 {
philpem@0 2577 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2578 {
philpem@0 2579 uint word2 = OPER_I_16();
philpem@0 2580 uint offset = (word2>>6)&31;
philpem@0 2581 uint width = word2;
philpem@0 2582 uint64 data = DY;
philpem@0 2583
philpem@0 2584
philpem@0 2585 if(BIT_B(word2))
philpem@0 2586 offset = REG_D[offset&7];
philpem@0 2587 if(BIT_5(word2))
philpem@0 2588 width = REG_D[width&7];
philpem@0 2589
philpem@0 2590 offset &= 31;
philpem@0 2591 width = ((width-1) & 31) + 1;
philpem@0 2592
philpem@0 2593 data = ROL_32(data, offset);
philpem@0 2594 FLAG_N = NFLAG_32(data);
philpem@0 2595 data >>= 32 - width;
philpem@0 2596
philpem@0 2597 FLAG_Z = data;
philpem@0 2598 FLAG_V = VFLAG_CLEAR;
philpem@0 2599 FLAG_C = CFLAG_CLEAR;
philpem@0 2600
philpem@0 2601 REG_D[(word2>>12)&7] = data;
philpem@0 2602
philpem@0 2603 return;
philpem@0 2604 }
philpem@0 2605 m68ki_exception_illegal();
philpem@0 2606 }
philpem@0 2607
philpem@0 2608
philpem@0 2609 M68KMAKE_OP(bfextu, 32, ., .)
philpem@0 2610 {
philpem@0 2611 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2612 {
philpem@0 2613 uint word2 = OPER_I_16();
philpem@0 2614 sint offset = (word2>>6)&31;
philpem@0 2615 uint width = word2;
philpem@0 2616 uint data;
philpem@0 2617 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2618
philpem@0 2619
philpem@0 2620 if(BIT_B(word2))
philpem@0 2621 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2622 if(BIT_5(word2))
philpem@0 2623 width = REG_D[width&7];
philpem@0 2624
philpem@0 2625 /* Offset is signed so we have to use ugly math =( */
philpem@0 2626 ea += offset / 8;
philpem@0 2627 offset %= 8;
philpem@0 2628 if(offset < 0)
philpem@0 2629 {
philpem@0 2630 offset += 8;
philpem@0 2631 ea--;
philpem@0 2632 }
philpem@0 2633 width = ((width-1) & 31) + 1;
philpem@0 2634
philpem@0 2635 data = m68ki_read_32(ea);
philpem@0 2636 data = MASK_OUT_ABOVE_32(data<<offset);
philpem@0 2637
philpem@0 2638 if((offset+width) > 32)
philpem@0 2639 data |= (m68ki_read_8(ea+4) << offset) >> 8;
philpem@0 2640
philpem@0 2641 FLAG_N = NFLAG_32(data);
philpem@0 2642 data >>= (32 - width);
philpem@0 2643
philpem@0 2644 FLAG_Z = data;
philpem@0 2645 FLAG_V = VFLAG_CLEAR;
philpem@0 2646 FLAG_C = CFLAG_CLEAR;
philpem@0 2647
philpem@0 2648 REG_D[(word2 >> 12) & 7] = data;
philpem@0 2649
philpem@0 2650 return;
philpem@0 2651 }
philpem@0 2652 m68ki_exception_illegal();
philpem@0 2653 }
philpem@0 2654
philpem@0 2655
philpem@0 2656 M68KMAKE_OP(bfffo, 32, ., d)
philpem@0 2657 {
philpem@0 2658 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2659 {
philpem@0 2660 uint word2 = OPER_I_16();
philpem@0 2661 uint offset = (word2>>6)&31;
philpem@0 2662 uint width = word2;
philpem@0 2663 uint64 data = DY;
philpem@0 2664 uint bit;
philpem@0 2665
philpem@0 2666
philpem@0 2667 if(BIT_B(word2))
philpem@0 2668 offset = REG_D[offset&7];
philpem@0 2669 if(BIT_5(word2))
philpem@0 2670 width = REG_D[width&7];
philpem@0 2671
philpem@0 2672 offset &= 31;
philpem@0 2673 width = ((width-1) & 31) + 1;
philpem@0 2674
philpem@0 2675 data = ROL_32(data, offset);
philpem@0 2676 FLAG_N = NFLAG_32(data);
philpem@0 2677 data >>= 32 - width;
philpem@0 2678
philpem@0 2679 FLAG_Z = data;
philpem@0 2680 FLAG_V = VFLAG_CLEAR;
philpem@0 2681 FLAG_C = CFLAG_CLEAR;
philpem@0 2682
philpem@0 2683 for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
philpem@0 2684 offset++;
philpem@0 2685
philpem@0 2686 REG_D[(word2>>12)&7] = offset;
philpem@0 2687
philpem@0 2688 return;
philpem@0 2689 }
philpem@0 2690 m68ki_exception_illegal();
philpem@0 2691 }
philpem@0 2692
philpem@0 2693
philpem@0 2694 M68KMAKE_OP(bfffo, 32, ., .)
philpem@0 2695 {
philpem@0 2696 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2697 {
philpem@0 2698 uint word2 = OPER_I_16();
philpem@0 2699 sint offset = (word2>>6)&31;
philpem@0 2700 sint local_offset;
philpem@0 2701 uint width = word2;
philpem@0 2702 uint data;
philpem@0 2703 uint bit;
philpem@0 2704 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2705
philpem@0 2706
philpem@0 2707 if(BIT_B(word2))
philpem@0 2708 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2709 if(BIT_5(word2))
philpem@0 2710 width = REG_D[width&7];
philpem@0 2711
philpem@0 2712 /* Offset is signed so we have to use ugly math =( */
philpem@0 2713 ea += offset / 8;
philpem@0 2714 local_offset = offset % 8;
philpem@0 2715 if(local_offset < 0)
philpem@0 2716 {
philpem@0 2717 local_offset += 8;
philpem@0 2718 ea--;
philpem@0 2719 }
philpem@0 2720 width = ((width-1) & 31) + 1;
philpem@0 2721
philpem@0 2722 data = m68ki_read_32(ea);
philpem@0 2723 data = MASK_OUT_ABOVE_32(data<<local_offset);
philpem@0 2724
philpem@0 2725 if((local_offset+width) > 32)
philpem@0 2726 data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
philpem@0 2727
philpem@0 2728 FLAG_N = NFLAG_32(data);
philpem@0 2729 data >>= (32 - width);
philpem@0 2730
philpem@0 2731 FLAG_Z = data;
philpem@0 2732 FLAG_V = VFLAG_CLEAR;
philpem@0 2733 FLAG_C = CFLAG_CLEAR;
philpem@0 2734
philpem@0 2735 for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
philpem@0 2736 offset++;
philpem@0 2737
philpem@0 2738 REG_D[(word2>>12)&7] = offset;
philpem@0 2739
philpem@0 2740 return;
philpem@0 2741 }
philpem@0 2742 m68ki_exception_illegal();
philpem@0 2743 }
philpem@0 2744
philpem@0 2745
philpem@0 2746 M68KMAKE_OP(bfins, 32, ., d)
philpem@0 2747 {
philpem@0 2748 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2749 {
philpem@0 2750 uint word2 = OPER_I_16();
philpem@0 2751 uint offset = (word2>>6)&31;
philpem@0 2752 uint width = word2;
philpem@0 2753 uint* data = &DY;
philpem@0 2754 uint64 mask;
philpem@0 2755 uint64 insert = REG_D[(word2>>12)&7];
philpem@0 2756
philpem@0 2757
philpem@0 2758 if(BIT_B(word2))
philpem@0 2759 offset = REG_D[offset&7];
philpem@0 2760 if(BIT_5(word2))
philpem@0 2761 width = REG_D[width&7];
philpem@0 2762
philpem@0 2763
philpem@0 2764 offset &= 31;
philpem@0 2765 width = ((width-1) & 31) + 1;
philpem@0 2766
philpem@0 2767
philpem@0 2768 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2769 mask = ROR_32(mask, offset);
philpem@0 2770
philpem@0 2771 insert = MASK_OUT_ABOVE_32(insert << (32 - width));
philpem@0 2772 FLAG_N = NFLAG_32(insert);
philpem@0 2773 FLAG_Z = insert;
philpem@0 2774 insert = ROR_32(insert, offset);
philpem@0 2775
philpem@0 2776 FLAG_V = VFLAG_CLEAR;
philpem@0 2777 FLAG_C = CFLAG_CLEAR;
philpem@0 2778
philpem@0 2779 *data &= ~mask;
philpem@0 2780 *data |= insert;
philpem@0 2781
philpem@0 2782 return;
philpem@0 2783 }
philpem@0 2784 m68ki_exception_illegal();
philpem@0 2785 }
philpem@0 2786
philpem@0 2787
philpem@0 2788 M68KMAKE_OP(bfins, 32, ., .)
philpem@0 2789 {
philpem@0 2790 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2791 {
philpem@0 2792 uint word2 = OPER_I_16();
philpem@0 2793 sint offset = (word2>>6)&31;
philpem@0 2794 uint width = word2;
philpem@0 2795 uint insert_base = REG_D[(word2>>12)&7];
philpem@0 2796 uint insert_long;
philpem@0 2797 uint insert_byte;
philpem@0 2798 uint mask_base;
philpem@0 2799 uint data_long;
philpem@0 2800 uint mask_long;
philpem@0 2801 uint data_byte = 0;
philpem@0 2802 uint mask_byte = 0;
philpem@0 2803 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2804
philpem@0 2805
philpem@0 2806 if(BIT_B(word2))
philpem@0 2807 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2808 if(BIT_5(word2))
philpem@0 2809 width = REG_D[width&7];
philpem@0 2810
philpem@0 2811 /* Offset is signed so we have to use ugly math =( */
philpem@0 2812 ea += offset / 8;
philpem@0 2813 offset %= 8;
philpem@0 2814 if(offset < 0)
philpem@0 2815 {
philpem@0 2816 offset += 8;
philpem@0 2817 ea--;
philpem@0 2818 }
philpem@0 2819 width = ((width-1) & 31) + 1;
philpem@0 2820
philpem@0 2821 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2822 mask_long = mask_base >> offset;
philpem@0 2823
philpem@0 2824 insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
philpem@0 2825 FLAG_N = NFLAG_32(insert_base);
philpem@0 2826 FLAG_Z = insert_base;
philpem@0 2827 insert_long = insert_base >> offset;
philpem@0 2828
philpem@0 2829 data_long = m68ki_read_32(ea);
philpem@0 2830 FLAG_V = VFLAG_CLEAR;
philpem@0 2831 FLAG_C = CFLAG_CLEAR;
philpem@0 2832
philpem@0 2833 m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
philpem@0 2834
philpem@0 2835 if((width + offset) > 32)
philpem@0 2836 {
philpem@0 2837 mask_byte = MASK_OUT_ABOVE_8(mask_base);
philpem@0 2838 insert_byte = MASK_OUT_ABOVE_8(insert_base);
philpem@0 2839 data_byte = m68ki_read_8(ea+4);
philpem@0 2840 FLAG_Z |= (data_byte & mask_byte);
philpem@0 2841 m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
philpem@0 2842 }
philpem@0 2843 return;
philpem@0 2844 }
philpem@0 2845 m68ki_exception_illegal();
philpem@0 2846 }
philpem@0 2847
philpem@0 2848
philpem@0 2849 M68KMAKE_OP(bfset, 32, ., d)
philpem@0 2850 {
philpem@0 2851 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2852 {
philpem@0 2853 uint word2 = OPER_I_16();
philpem@0 2854 uint offset = (word2>>6)&31;
philpem@0 2855 uint width = word2;
philpem@0 2856 uint* data = &DY;
philpem@0 2857 uint64 mask;
philpem@0 2858
philpem@0 2859
philpem@0 2860 if(BIT_B(word2))
philpem@0 2861 offset = REG_D[offset&7];
philpem@0 2862 if(BIT_5(word2))
philpem@0 2863 width = REG_D[width&7];
philpem@0 2864
philpem@0 2865
philpem@0 2866 offset &= 31;
philpem@0 2867 width = ((width-1) & 31) + 1;
philpem@0 2868
philpem@0 2869
philpem@0 2870 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2871 mask = ROR_32(mask, offset);
philpem@0 2872
philpem@0 2873 FLAG_N = NFLAG_32(*data<<offset);
philpem@0 2874 FLAG_Z = *data & mask;
philpem@0 2875 FLAG_V = VFLAG_CLEAR;
philpem@0 2876 FLAG_C = CFLAG_CLEAR;
philpem@0 2877
philpem@0 2878 *data |= mask;
philpem@0 2879
philpem@0 2880 return;
philpem@0 2881 }
philpem@0 2882 m68ki_exception_illegal();
philpem@0 2883 }
philpem@0 2884
philpem@0 2885
philpem@0 2886 M68KMAKE_OP(bfset, 32, ., .)
philpem@0 2887 {
philpem@0 2888 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2889 {
philpem@0 2890 uint word2 = OPER_I_16();
philpem@0 2891 sint offset = (word2>>6)&31;
philpem@0 2892 uint width = word2;
philpem@0 2893 uint mask_base;
philpem@0 2894 uint data_long;
philpem@0 2895 uint mask_long;
philpem@0 2896 uint data_byte = 0;
philpem@0 2897 uint mask_byte = 0;
philpem@0 2898 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2899
philpem@0 2900
philpem@0 2901 if(BIT_B(word2))
philpem@0 2902 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2903 if(BIT_5(word2))
philpem@0 2904 width = REG_D[width&7];
philpem@0 2905
philpem@0 2906 /* Offset is signed so we have to use ugly math =( */
philpem@0 2907 ea += offset / 8;
philpem@0 2908 offset %= 8;
philpem@0 2909 if(offset < 0)
philpem@0 2910 {
philpem@0 2911 offset += 8;
philpem@0 2912 ea--;
philpem@0 2913 }
philpem@0 2914 width = ((width-1) & 31) + 1;
philpem@0 2915
philpem@0 2916
philpem@0 2917 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2918 mask_long = mask_base >> offset;
philpem@0 2919
philpem@0 2920 data_long = m68ki_read_32(ea);
philpem@0 2921 FLAG_N = NFLAG_32(data_long << offset);
philpem@0 2922 FLAG_Z = data_long & mask_long;
philpem@0 2923 FLAG_V = VFLAG_CLEAR;
philpem@0 2924 FLAG_C = CFLAG_CLEAR;
philpem@0 2925
philpem@0 2926 m68ki_write_32(ea, data_long | mask_long);
philpem@0 2927
philpem@0 2928 if((width + offset) > 32)
philpem@0 2929 {
philpem@0 2930 mask_byte = MASK_OUT_ABOVE_8(mask_base);
philpem@0 2931 data_byte = m68ki_read_8(ea+4);
philpem@0 2932 FLAG_Z |= (data_byte & mask_byte);
philpem@0 2933 m68ki_write_8(ea+4, data_byte | mask_byte);
philpem@0 2934 }
philpem@0 2935 return;
philpem@0 2936 }
philpem@0 2937 m68ki_exception_illegal();
philpem@0 2938 }
philpem@0 2939
philpem@0 2940
philpem@0 2941 M68KMAKE_OP(bftst, 32, ., d)
philpem@0 2942 {
philpem@0 2943 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2944 {
philpem@0 2945 uint word2 = OPER_I_16();
philpem@0 2946 uint offset = (word2>>6)&31;
philpem@0 2947 uint width = word2;
philpem@0 2948 uint* data = &DY;
philpem@0 2949 uint64 mask;
philpem@0 2950
philpem@0 2951
philpem@0 2952 if(BIT_B(word2))
philpem@0 2953 offset = REG_D[offset&7];
philpem@0 2954 if(BIT_5(word2))
philpem@0 2955 width = REG_D[width&7];
philpem@0 2956
philpem@0 2957
philpem@0 2958 offset &= 31;
philpem@0 2959 width = ((width-1) & 31) + 1;
philpem@0 2960
philpem@0 2961
philpem@0 2962 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 2963 mask = ROR_32(mask, offset);
philpem@0 2964
philpem@0 2965 FLAG_N = NFLAG_32(*data<<offset);
philpem@0 2966 FLAG_Z = *data & mask;
philpem@0 2967 FLAG_V = VFLAG_CLEAR;
philpem@0 2968 FLAG_C = CFLAG_CLEAR;
philpem@0 2969
philpem@0 2970 return;
philpem@0 2971 }
philpem@0 2972 m68ki_exception_illegal();
philpem@0 2973 }
philpem@0 2974
philpem@0 2975
philpem@0 2976 M68KMAKE_OP(bftst, 32, ., .)
philpem@0 2977 {
philpem@0 2978 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 2979 {
philpem@0 2980 uint word2 = OPER_I_16();
philpem@0 2981 sint offset = (word2>>6)&31;
philpem@0 2982 uint width = word2;
philpem@0 2983 uint mask_base;
philpem@0 2984 uint data_long;
philpem@0 2985 uint mask_long;
philpem@0 2986 uint data_byte = 0;
philpem@0 2987 uint mask_byte = 0;
philpem@0 2988 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 2989
philpem@0 2990 if(BIT_B(word2))
philpem@0 2991 offset = MAKE_INT_32(REG_D[offset&7]);
philpem@0 2992 if(BIT_5(word2))
philpem@0 2993 width = REG_D[width&7];
philpem@0 2994
philpem@0 2995 /* Offset is signed so we have to use ugly math =( */
philpem@0 2996 ea += offset / 8;
philpem@0 2997 offset %= 8;
philpem@0 2998 if(offset < 0)
philpem@0 2999 {
philpem@0 3000 offset += 8;
philpem@0 3001 ea--;
philpem@0 3002 }
philpem@0 3003 width = ((width-1) & 31) + 1;
philpem@0 3004
philpem@0 3005
philpem@0 3006 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
philpem@0 3007 mask_long = mask_base >> offset;
philpem@0 3008
philpem@0 3009 data_long = m68ki_read_32(ea);
philpem@0 3010 FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
philpem@0 3011 FLAG_Z = data_long & mask_long;
philpem@0 3012 FLAG_V = VFLAG_CLEAR;
philpem@0 3013 FLAG_C = CFLAG_CLEAR;
philpem@0 3014
philpem@0 3015 if((width + offset) > 32)
philpem@0 3016 {
philpem@0 3017 mask_byte = MASK_OUT_ABOVE_8(mask_base);
philpem@0 3018 data_byte = m68ki_read_8(ea+4);
philpem@0 3019 FLAG_Z |= (data_byte & mask_byte);
philpem@0 3020 }
philpem@0 3021 return;
philpem@0 3022 }
philpem@0 3023 m68ki_exception_illegal();
philpem@0 3024 }
philpem@0 3025
philpem@0 3026
philpem@0 3027 M68KMAKE_OP(bkpt, 0, ., .)
philpem@0 3028 {
philpem@0 3029 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 3030 {
philpem@0 3031 m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0); /* auto-disable (see m68kcpu.h) */
philpem@0 3032 }
philpem@0 3033 m68ki_exception_illegal();
philpem@0 3034 }
philpem@0 3035
philpem@0 3036
philpem@0 3037 M68KMAKE_OP(bra, 8, ., .)
philpem@0 3038 {
philpem@0 3039 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3040 m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
philpem@0 3041 if(REG_PC == REG_PPC)
philpem@0 3042 USE_ALL_CYCLES();
philpem@0 3043 }
philpem@0 3044
philpem@0 3045
philpem@0 3046 M68KMAKE_OP(bra, 16, ., .)
philpem@0 3047 {
philpem@0 3048 uint offset = OPER_I_16();
philpem@0 3049 REG_PC -= 2;
philpem@0 3050 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3051 m68ki_branch_16(offset);
philpem@0 3052 if(REG_PC == REG_PPC)
philpem@0 3053 USE_ALL_CYCLES();
philpem@0 3054 }
philpem@0 3055
philpem@0 3056
philpem@0 3057 M68KMAKE_OP(bra, 32, ., .)
philpem@0 3058 {
philpem@0 3059 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3060 {
philpem@0 3061 uint offset = OPER_I_32();
philpem@0 3062 REG_PC -= 4;
philpem@0 3063 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3064 m68ki_branch_32(offset);
philpem@0 3065 if(REG_PC == REG_PPC)
philpem@0 3066 USE_ALL_CYCLES();
philpem@0 3067 return;
philpem@0 3068 }
philpem@0 3069 m68ki_exception_illegal();
philpem@0 3070 }
philpem@0 3071
philpem@0 3072
philpem@0 3073 M68KMAKE_OP(bset, 32, r, d)
philpem@0 3074 {
philpem@0 3075 uint* r_dst = &DY;
philpem@0 3076 uint mask = 1 << (DX & 0x1f);
philpem@0 3077
philpem@0 3078 FLAG_Z = *r_dst & mask;
philpem@0 3079 *r_dst |= mask;
philpem@0 3080 }
philpem@0 3081
philpem@0 3082
philpem@0 3083 M68KMAKE_OP(bset, 8, r, .)
philpem@0 3084 {
philpem@0 3085 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 3086 uint src = m68ki_read_8(ea);
philpem@0 3087 uint mask = 1 << (DX & 7);
philpem@0 3088
philpem@0 3089 FLAG_Z = src & mask;
philpem@0 3090 m68ki_write_8(ea, src | mask);
philpem@0 3091 }
philpem@0 3092
philpem@0 3093
philpem@0 3094 M68KMAKE_OP(bset, 32, s, d)
philpem@0 3095 {
philpem@0 3096 uint* r_dst = &DY;
philpem@0 3097 uint mask = 1 << (OPER_I_8() & 0x1f);
philpem@0 3098
philpem@0 3099 FLAG_Z = *r_dst & mask;
philpem@0 3100 *r_dst |= mask;
philpem@0 3101 }
philpem@0 3102
philpem@0 3103
philpem@0 3104 M68KMAKE_OP(bset, 8, s, .)
philpem@0 3105 {
philpem@0 3106 uint mask = 1 << (OPER_I_8() & 7);
philpem@0 3107 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 3108 uint src = m68ki_read_8(ea);
philpem@0 3109
philpem@0 3110 FLAG_Z = src & mask;
philpem@0 3111 m68ki_write_8(ea, src | mask);
philpem@0 3112 }
philpem@0 3113
philpem@0 3114
philpem@0 3115 M68KMAKE_OP(bsr, 8, ., .)
philpem@0 3116 {
philpem@0 3117 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3118 m68ki_push_32(REG_PC);
philpem@0 3119 m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
philpem@0 3120 }
philpem@0 3121
philpem@0 3122
philpem@0 3123 M68KMAKE_OP(bsr, 16, ., .)
philpem@0 3124 {
philpem@0 3125 uint offset = OPER_I_16();
philpem@0 3126 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3127 m68ki_push_32(REG_PC);
philpem@0 3128 REG_PC -= 2;
philpem@0 3129 m68ki_branch_16(offset);
philpem@0 3130 }
philpem@0 3131
philpem@0 3132
philpem@0 3133 M68KMAKE_OP(bsr, 32, ., .)
philpem@0 3134 {
philpem@0 3135 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3136 {
philpem@0 3137 uint offset = OPER_I_32();
philpem@0 3138 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3139 m68ki_push_32(REG_PC);
philpem@0 3140 REG_PC -= 4;
philpem@0 3141 m68ki_branch_32(offset);
philpem@0 3142 return;
philpem@0 3143 }
philpem@0 3144 m68ki_exception_illegal();
philpem@0 3145 }
philpem@0 3146
philpem@0 3147
philpem@0 3148 M68KMAKE_OP(btst, 32, r, d)
philpem@0 3149 {
philpem@0 3150 FLAG_Z = DY & (1 << (DX & 0x1f));
philpem@0 3151 }
philpem@0 3152
philpem@0 3153
philpem@0 3154 M68KMAKE_OP(btst, 8, r, .)
philpem@0 3155 {
philpem@0 3156 FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << (DX & 7));
philpem@0 3157 }
philpem@0 3158
philpem@0 3159
philpem@0 3160 M68KMAKE_OP(btst, 32, s, d)
philpem@0 3161 {
philpem@0 3162 FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f));
philpem@0 3163 }
philpem@0 3164
philpem@0 3165
philpem@0 3166 M68KMAKE_OP(btst, 8, s, .)
philpem@0 3167 {
philpem@0 3168 uint bit = OPER_I_8() & 7;
philpem@0 3169
philpem@0 3170 FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << bit);
philpem@0 3171 }
philpem@0 3172
philpem@0 3173
philpem@0 3174 M68KMAKE_OP(callm, 32, ., .)
philpem@0 3175 {
philpem@0 3176 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 3177 {
philpem@0 3178 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 3179
philpem@0 3180 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3181 REG_PC += 2;
philpem@0 3182 (void)ea; /* just to avoid an 'unused variable' warning */
philpem@0 3183 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 3184 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 3185 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 3186 return;
philpem@0 3187 }
philpem@0 3188 m68ki_exception_illegal();
philpem@0 3189 }
philpem@0 3190
philpem@0 3191
philpem@0 3192 M68KMAKE_OP(cas, 8, ., .)
philpem@0 3193 {
philpem@0 3194 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3195 {
philpem@0 3196 uint word2 = OPER_I_16();
philpem@0 3197 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 3198 uint dest = m68ki_read_8(ea);
philpem@0 3199 uint* compare = &REG_D[word2 & 7];
philpem@0 3200 uint res = dest - MASK_OUT_ABOVE_8(*compare);
philpem@0 3201
philpem@0 3202 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3203 FLAG_N = NFLAG_8(res);
philpem@0 3204 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3205 FLAG_V = VFLAG_SUB_8(*compare, dest, res);
philpem@0 3206 FLAG_C = CFLAG_8(res);
philpem@0 3207
philpem@0 3208 if(COND_NE())
philpem@0 3209 *compare = MASK_OUT_BELOW_8(*compare) | dest;
philpem@0 3210 else
philpem@0 3211 {
philpem@0 3212 USE_CYCLES(3);
philpem@0 3213 m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
philpem@0 3214 }
philpem@0 3215 return;
philpem@0 3216 }
philpem@0 3217 m68ki_exception_illegal();
philpem@0 3218 }
philpem@0 3219
philpem@0 3220
philpem@0 3221 M68KMAKE_OP(cas, 16, ., .)
philpem@0 3222 {
philpem@0 3223 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3224 {
philpem@0 3225 uint word2 = OPER_I_16();
philpem@0 3226 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 3227 uint dest = m68ki_read_16(ea);
philpem@0 3228 uint* compare = &REG_D[word2 & 7];
philpem@0 3229 uint res = dest - MASK_OUT_ABOVE_16(*compare);
philpem@0 3230
philpem@0 3231 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3232 FLAG_N = NFLAG_16(res);
philpem@0 3233 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3234 FLAG_V = VFLAG_SUB_16(*compare, dest, res);
philpem@0 3235 FLAG_C = CFLAG_16(res);
philpem@0 3236
philpem@0 3237 if(COND_NE())
philpem@0 3238 *compare = MASK_OUT_BELOW_16(*compare) | dest;
philpem@0 3239 else
philpem@0 3240 {
philpem@0 3241 USE_CYCLES(3);
philpem@0 3242 m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
philpem@0 3243 }
philpem@0 3244 return;
philpem@0 3245 }
philpem@0 3246 m68ki_exception_illegal();
philpem@0 3247 }
philpem@0 3248
philpem@0 3249
philpem@0 3250 M68KMAKE_OP(cas, 32, ., .)
philpem@0 3251 {
philpem@0 3252 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3253 {
philpem@0 3254 uint word2 = OPER_I_16();
philpem@0 3255 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 3256 uint dest = m68ki_read_32(ea);
philpem@0 3257 uint* compare = &REG_D[word2 & 7];
philpem@0 3258 uint res = dest - *compare;
philpem@0 3259
philpem@0 3260 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3261 FLAG_N = NFLAG_32(res);
philpem@0 3262 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3263 FLAG_V = VFLAG_SUB_32(*compare, dest, res);
philpem@0 3264 FLAG_C = CFLAG_SUB_32(*compare, dest, res);
philpem@0 3265
philpem@0 3266 if(COND_NE())
philpem@0 3267 *compare = dest;
philpem@0 3268 else
philpem@0 3269 {
philpem@0 3270 USE_CYCLES(3);
philpem@0 3271 m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
philpem@0 3272 }
philpem@0 3273 return;
philpem@0 3274 }
philpem@0 3275 m68ki_exception_illegal();
philpem@0 3276 }
philpem@0 3277
philpem@0 3278
philpem@0 3279 M68KMAKE_OP(cas2, 16, ., .)
philpem@0 3280 {
philpem@0 3281 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3282 {
philpem@0 3283 uint word2 = OPER_I_32();
philpem@0 3284 uint* compare1 = &REG_D[(word2 >> 16) & 7];
philpem@0 3285 uint ea1 = REG_DA[(word2 >> 28) & 15];
philpem@0 3286 uint dest1 = m68ki_read_16(ea1);
philpem@0 3287 uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1);
philpem@0 3288 uint* compare2 = &REG_D[word2 & 7];
philpem@0 3289 uint ea2 = REG_DA[(word2 >> 12) & 15];
philpem@0 3290 uint dest2 = m68ki_read_16(ea2);
philpem@0 3291 uint res2;
philpem@0 3292
philpem@0 3293 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3294 FLAG_N = NFLAG_16(res1);
philpem@0 3295 FLAG_Z = MASK_OUT_ABOVE_16(res1);
philpem@0 3296 FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1);
philpem@0 3297 FLAG_C = CFLAG_16(res1);
philpem@0 3298
philpem@0 3299 if(COND_EQ())
philpem@0 3300 {
philpem@0 3301 res2 = dest2 - MASK_OUT_ABOVE_16(*compare2);
philpem@0 3302
philpem@0 3303 FLAG_N = NFLAG_16(res2);
philpem@0 3304 FLAG_Z = MASK_OUT_ABOVE_16(res2);
philpem@0 3305 FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2);
philpem@0 3306 FLAG_C = CFLAG_16(res2);
philpem@0 3307
philpem@0 3308 if(COND_EQ())
philpem@0 3309 {
philpem@0 3310 USE_CYCLES(3);
philpem@0 3311 m68ki_write_16(ea1, REG_D[(word2 >> 22) & 7]);
philpem@0 3312 m68ki_write_16(ea2, REG_D[(word2 >> 6) & 7]);
philpem@0 3313 return;
philpem@0 3314 }
philpem@0 3315 }
philpem@0 3316 *compare1 = BIT_1F(word2) ? MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1;
philpem@0 3317 *compare2 = BIT_F(word2) ? MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2;
philpem@0 3318 return;
philpem@0 3319 }
philpem@0 3320 m68ki_exception_illegal();
philpem@0 3321 }
philpem@0 3322
philpem@0 3323
philpem@0 3324 M68KMAKE_OP(cas2, 32, ., .)
philpem@0 3325 {
philpem@0 3326 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3327 {
philpem@0 3328 uint word2 = OPER_I_32();
philpem@0 3329 uint* compare1 = &REG_D[(word2 >> 16) & 7];
philpem@0 3330 uint ea1 = REG_DA[(word2 >> 28) & 15];
philpem@0 3331 uint dest1 = m68ki_read_32(ea1);
philpem@0 3332 uint res1 = dest1 - *compare1;
philpem@0 3333 uint* compare2 = &REG_D[word2 & 7];
philpem@0 3334 uint ea2 = REG_DA[(word2 >> 12) & 15];
philpem@0 3335 uint dest2 = m68ki_read_32(ea2);
philpem@0 3336 uint res2;
philpem@0 3337
philpem@0 3338 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 3339 FLAG_N = NFLAG_32(res1);
philpem@0 3340 FLAG_Z = MASK_OUT_ABOVE_32(res1);
philpem@0 3341 FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1);
philpem@0 3342 FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1);
philpem@0 3343
philpem@0 3344 if(COND_EQ())
philpem@0 3345 {
philpem@0 3346 res2 = dest2 - *compare2;
philpem@0 3347
philpem@0 3348 FLAG_N = NFLAG_32(res2);
philpem@0 3349 FLAG_Z = MASK_OUT_ABOVE_32(res2);
philpem@0 3350 FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2);
philpem@0 3351 FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2);
philpem@0 3352
philpem@0 3353 if(COND_EQ())
philpem@0 3354 {
philpem@0 3355 USE_CYCLES(3);
philpem@0 3356 m68ki_write_32(ea1, REG_D[(word2 >> 22) & 7]);
philpem@0 3357 m68ki_write_32(ea2, REG_D[(word2 >> 6) & 7]);
philpem@0 3358 return;
philpem@0 3359 }
philpem@0 3360 }
philpem@0 3361 *compare1 = dest1;
philpem@0 3362 *compare2 = dest2;
philpem@0 3363 return;
philpem@0 3364 }
philpem@0 3365 m68ki_exception_illegal();
philpem@0 3366 }
philpem@0 3367
philpem@0 3368
philpem@0 3369 M68KMAKE_OP(chk, 16, ., d)
philpem@0 3370 {
philpem@0 3371 sint src = MAKE_INT_16(DX);
philpem@0 3372 sint bound = MAKE_INT_16(DY);
philpem@0 3373
philpem@0 3374 if(src >= 0 && src <= bound)
philpem@0 3375 {
philpem@0 3376 return;
philpem@0 3377 }
philpem@0 3378 FLAG_N = (src < 0)<<7;
philpem@0 3379 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3380 }
philpem@0 3381
philpem@0 3382
philpem@0 3383 M68KMAKE_OP(chk, 16, ., .)
philpem@0 3384 {
philpem@0 3385 sint src = MAKE_INT_16(DX);
philpem@0 3386 sint bound = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
philpem@0 3387
philpem@0 3388 if(src >= 0 && src <= bound)
philpem@0 3389 {
philpem@0 3390 return;
philpem@0 3391 }
philpem@0 3392 FLAG_N = (src < 0)<<7;
philpem@0 3393 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3394 }
philpem@0 3395
philpem@0 3396
philpem@0 3397 M68KMAKE_OP(chk, 32, ., d)
philpem@0 3398 {
philpem@0 3399 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3400 {
philpem@0 3401 sint src = MAKE_INT_32(DX);
philpem@0 3402 sint bound = MAKE_INT_32(DY);
philpem@0 3403
philpem@0 3404 if(src >= 0 && src <= bound)
philpem@0 3405 {
philpem@0 3406 return;
philpem@0 3407 }
philpem@0 3408 FLAG_N = (src < 0)<<7;
philpem@0 3409 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3410 return;
philpem@0 3411 }
philpem@0 3412 m68ki_exception_illegal();
philpem@0 3413 }
philpem@0 3414
philpem@0 3415
philpem@0 3416 M68KMAKE_OP(chk, 32, ., .)
philpem@0 3417 {
philpem@0 3418 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3419 {
philpem@0 3420 sint src = MAKE_INT_32(DX);
philpem@0 3421 sint bound = MAKE_INT_32(M68KMAKE_GET_OPER_AY_32);
philpem@0 3422
philpem@0 3423 if(src >= 0 && src <= bound)
philpem@0 3424 {
philpem@0 3425 return;
philpem@0 3426 }
philpem@0 3427 FLAG_N = (src < 0)<<7;
philpem@0 3428 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3429 return;
philpem@0 3430 }
philpem@0 3431 m68ki_exception_illegal();
philpem@0 3432 }
philpem@0 3433
philpem@0 3434
philpem@0 3435 M68KMAKE_OP(chk2cmp2, 8, ., .)
philpem@0 3436 {
philpem@0 3437 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3438 {
philpem@0 3439 uint word2 = OPER_I_16();
philpem@0 3440 uint compare = REG_DA[(word2 >> 12) & 15];
philpem@0 3441 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 3442 uint lower_bound = m68ki_read_8(ea);
philpem@0 3443 uint upper_bound = m68ki_read_8(ea + 1);
philpem@0 3444
philpem@0 3445 if(!BIT_F(word2))
philpem@0 3446 compare = MAKE_INT_8(compare);
philpem@0 3447
philpem@0 3448 FLAG_C = compare - lower_bound;
philpem@0 3449 FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C);
philpem@0 3450 if(COND_CS())
philpem@0 3451 {
philpem@0 3452 if(BIT_B(word2))
philpem@0 3453 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3454 return;
philpem@0 3455 }
philpem@0 3456
philpem@0 3457 FLAG_C = upper_bound - compare;
philpem@0 3458 FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C);
philpem@0 3459 if(COND_CS() && BIT_B(word2))
philpem@0 3460 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3461
philpem@0 3462 return;
philpem@0 3463 }
philpem@0 3464 m68ki_exception_illegal();
philpem@0 3465 }
philpem@0 3466
philpem@0 3467
philpem@0 3468 M68KMAKE_OP(chk2cmp2, 16, ., .)
philpem@0 3469 {
philpem@0 3470 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3471 {
philpem@0 3472 uint word2 = OPER_I_16();
philpem@0 3473 uint compare = REG_DA[(word2 >> 12) & 15];
philpem@0 3474 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 3475 uint lower_bound = m68ki_read_16(ea);
philpem@0 3476 uint upper_bound = m68ki_read_16(ea + 1);
philpem@0 3477
philpem@0 3478 if(!BIT_F(word2))
philpem@0 3479 compare = MAKE_INT_16(compare);
philpem@0 3480
philpem@0 3481 FLAG_C = compare - lower_bound;
philpem@0 3482 FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C);
philpem@0 3483 FLAG_C = CFLAG_16(FLAG_C);
philpem@0 3484 if(COND_CS())
philpem@0 3485 {
philpem@0 3486 if(BIT_B(word2))
philpem@0 3487 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3488 return;
philpem@0 3489 }
philpem@0 3490
philpem@0 3491 FLAG_C = upper_bound - compare;
philpem@0 3492 FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C);
philpem@0 3493 FLAG_C = CFLAG_16(FLAG_C);
philpem@0 3494 if(COND_CS() && BIT_B(word2))
philpem@0 3495 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3496
philpem@0 3497 return;
philpem@0 3498 }
philpem@0 3499 m68ki_exception_illegal();
philpem@0 3500 }
philpem@0 3501
philpem@0 3502
philpem@0 3503 M68KMAKE_OP(chk2cmp2, 32, ., .)
philpem@0 3504 {
philpem@0 3505 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3506 {
philpem@0 3507 uint word2 = OPER_I_16();
philpem@0 3508 uint compare = REG_DA[(word2 >> 12) & 15];
philpem@0 3509 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 3510 uint lower_bound = m68ki_read_32(ea);
philpem@0 3511 uint upper_bound = m68ki_read_32(ea + 1);
philpem@0 3512
philpem@0 3513 FLAG_C = compare - lower_bound;
philpem@0 3514 FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C);
philpem@0 3515 FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
philpem@0 3516 if(COND_CS())
philpem@0 3517 {
philpem@0 3518 if(BIT_B(word2))
philpem@0 3519 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3520 return;
philpem@0 3521 }
philpem@0 3522
philpem@0 3523 FLAG_C = upper_bound - compare;
philpem@0 3524 FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C);
philpem@0 3525 FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
philpem@0 3526 if(COND_CS() && BIT_B(word2))
philpem@0 3527 m68ki_exception_trap(EXCEPTION_CHK);
philpem@0 3528
philpem@0 3529 return;
philpem@0 3530 }
philpem@0 3531 m68ki_exception_illegal();
philpem@0 3532 }
philpem@0 3533
philpem@0 3534
philpem@0 3535 M68KMAKE_OP(clr, 8, ., d)
philpem@0 3536 {
philpem@0 3537 DY &= 0xffffff00;
philpem@0 3538
philpem@0 3539 FLAG_N = NFLAG_CLEAR;
philpem@0 3540 FLAG_V = VFLAG_CLEAR;
philpem@0 3541 FLAG_C = CFLAG_CLEAR;
philpem@0 3542 FLAG_Z = ZFLAG_SET;
philpem@0 3543 }
philpem@0 3544
philpem@0 3545
philpem@0 3546 M68KMAKE_OP(clr, 8, ., .)
philpem@0 3547 {
philpem@0 3548 m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0);
philpem@0 3549
philpem@0 3550 FLAG_N = NFLAG_CLEAR;
philpem@0 3551 FLAG_V = VFLAG_CLEAR;
philpem@0 3552 FLAG_C = CFLAG_CLEAR;
philpem@0 3553 FLAG_Z = ZFLAG_SET;
philpem@0 3554 }
philpem@0 3555
philpem@0 3556
philpem@0 3557 M68KMAKE_OP(clr, 16, ., d)
philpem@0 3558 {
philpem@0 3559 DY &= 0xffff0000;
philpem@0 3560
philpem@0 3561 FLAG_N = NFLAG_CLEAR;
philpem@0 3562 FLAG_V = VFLAG_CLEAR;
philpem@0 3563 FLAG_C = CFLAG_CLEAR;
philpem@0 3564 FLAG_Z = ZFLAG_SET;
philpem@0 3565 }
philpem@0 3566
philpem@0 3567
philpem@0 3568 M68KMAKE_OP(clr, 16, ., .)
philpem@0 3569 {
philpem@0 3570 m68ki_write_16(M68KMAKE_GET_EA_AY_16, 0);
philpem@0 3571
philpem@0 3572 FLAG_N = NFLAG_CLEAR;
philpem@0 3573 FLAG_V = VFLAG_CLEAR;
philpem@0 3574 FLAG_C = CFLAG_CLEAR;
philpem@0 3575 FLAG_Z = ZFLAG_SET;
philpem@0 3576 }
philpem@0 3577
philpem@0 3578
philpem@0 3579 M68KMAKE_OP(clr, 32, ., d)
philpem@0 3580 {
philpem@0 3581 DY = 0;
philpem@0 3582
philpem@0 3583 FLAG_N = NFLAG_CLEAR;
philpem@0 3584 FLAG_V = VFLAG_CLEAR;
philpem@0 3585 FLAG_C = CFLAG_CLEAR;
philpem@0 3586 FLAG_Z = ZFLAG_SET;
philpem@0 3587 }
philpem@0 3588
philpem@0 3589
philpem@0 3590 M68KMAKE_OP(clr, 32, ., .)
philpem@0 3591 {
philpem@0 3592 m68ki_write_32(M68KMAKE_GET_EA_AY_32, 0);
philpem@0 3593
philpem@0 3594 FLAG_N = NFLAG_CLEAR;
philpem@0 3595 FLAG_V = VFLAG_CLEAR;
philpem@0 3596 FLAG_C = CFLAG_CLEAR;
philpem@0 3597 FLAG_Z = ZFLAG_SET;
philpem@0 3598 }
philpem@0 3599
philpem@0 3600
philpem@0 3601 M68KMAKE_OP(cmp, 8, ., d)
philpem@0 3602 {
philpem@0 3603 uint src = MASK_OUT_ABOVE_8(DY);
philpem@0 3604 uint dst = MASK_OUT_ABOVE_8(DX);
philpem@0 3605 uint res = dst - src;
philpem@0 3606
philpem@0 3607 FLAG_N = NFLAG_8(res);
philpem@0 3608 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3609 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3610 FLAG_C = CFLAG_8(res);
philpem@0 3611 }
philpem@0 3612
philpem@0 3613
philpem@0 3614 M68KMAKE_OP(cmp, 8, ., .)
philpem@0 3615 {
philpem@0 3616 uint src = M68KMAKE_GET_OPER_AY_8;
philpem@0 3617 uint dst = MASK_OUT_ABOVE_8(DX);
philpem@0 3618 uint res = dst - src;
philpem@0 3619
philpem@0 3620 FLAG_N = NFLAG_8(res);
philpem@0 3621 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3622 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3623 FLAG_C = CFLAG_8(res);
philpem@0 3624 }
philpem@0 3625
philpem@0 3626
philpem@0 3627 M68KMAKE_OP(cmp, 16, ., d)
philpem@0 3628 {
philpem@0 3629 uint src = MASK_OUT_ABOVE_16(DY);
philpem@0 3630 uint dst = MASK_OUT_ABOVE_16(DX);
philpem@0 3631 uint res = dst - src;
philpem@0 3632
philpem@0 3633 FLAG_N = NFLAG_16(res);
philpem@0 3634 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3635 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3636 FLAG_C = CFLAG_16(res);
philpem@0 3637 }
philpem@0 3638
philpem@0 3639
philpem@0 3640 M68KMAKE_OP(cmp, 16, ., a)
philpem@0 3641 {
philpem@0 3642 uint src = MASK_OUT_ABOVE_16(AY);
philpem@0 3643 uint dst = MASK_OUT_ABOVE_16(DX);
philpem@0 3644 uint res = dst - src;
philpem@0 3645
philpem@0 3646 FLAG_N = NFLAG_16(res);
philpem@0 3647 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3648 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3649 FLAG_C = CFLAG_16(res);
philpem@0 3650 }
philpem@0 3651
philpem@0 3652
philpem@0 3653 M68KMAKE_OP(cmp, 16, ., .)
philpem@0 3654 {
philpem@0 3655 uint src = M68KMAKE_GET_OPER_AY_16;
philpem@0 3656 uint dst = MASK_OUT_ABOVE_16(DX);
philpem@0 3657 uint res = dst - src;
philpem@0 3658
philpem@0 3659 FLAG_N = NFLAG_16(res);
philpem@0 3660 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3661 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3662 FLAG_C = CFLAG_16(res);
philpem@0 3663 }
philpem@0 3664
philpem@0 3665
philpem@0 3666 M68KMAKE_OP(cmp, 32, ., d)
philpem@0 3667 {
philpem@0 3668 uint src = DY;
philpem@0 3669 uint dst = DX;
philpem@0 3670 uint res = dst - src;
philpem@0 3671
philpem@0 3672 FLAG_N = NFLAG_32(res);
philpem@0 3673 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3674 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3675 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3676 }
philpem@0 3677
philpem@0 3678
philpem@0 3679 M68KMAKE_OP(cmp, 32, ., a)
philpem@0 3680 {
philpem@0 3681 uint src = AY;
philpem@0 3682 uint dst = DX;
philpem@0 3683 uint res = dst - src;
philpem@0 3684
philpem@0 3685 FLAG_N = NFLAG_32(res);
philpem@0 3686 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3687 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3688 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3689 }
philpem@0 3690
philpem@0 3691
philpem@0 3692 M68KMAKE_OP(cmp, 32, ., .)
philpem@0 3693 {
philpem@0 3694 uint src = M68KMAKE_GET_OPER_AY_32;
philpem@0 3695 uint dst = DX;
philpem@0 3696 uint res = dst - src;
philpem@0 3697
philpem@0 3698 FLAG_N = NFLAG_32(res);
philpem@0 3699 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3700 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3701 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3702 }
philpem@0 3703
philpem@0 3704
philpem@0 3705 M68KMAKE_OP(cmpa, 16, ., d)
philpem@0 3706 {
philpem@0 3707 uint src = MAKE_INT_16(DY);
philpem@0 3708 uint dst = AX;
philpem@0 3709 uint res = dst - src;
philpem@0 3710
philpem@0 3711 FLAG_N = NFLAG_32(res);
philpem@0 3712 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3713 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3714 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3715 }
philpem@0 3716
philpem@0 3717
philpem@0 3718 M68KMAKE_OP(cmpa, 16, ., a)
philpem@0 3719 {
philpem@0 3720 uint src = MAKE_INT_16(AY);
philpem@0 3721 uint dst = AX;
philpem@0 3722 uint res = dst - src;
philpem@0 3723
philpem@0 3724 FLAG_N = NFLAG_32(res);
philpem@0 3725 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3726 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3727 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3728 }
philpem@0 3729
philpem@0 3730
philpem@0 3731 M68KMAKE_OP(cmpa, 16, ., .)
philpem@0 3732 {
philpem@0 3733 uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
philpem@0 3734 uint dst = AX;
philpem@0 3735 uint res = dst - src;
philpem@0 3736
philpem@0 3737 FLAG_N = NFLAG_32(res);
philpem@0 3738 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3739 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3740 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3741 }
philpem@0 3742
philpem@0 3743
philpem@0 3744 M68KMAKE_OP(cmpa, 32, ., d)
philpem@0 3745 {
philpem@0 3746 uint src = DY;
philpem@0 3747 uint dst = AX;
philpem@0 3748 uint res = dst - src;
philpem@0 3749
philpem@0 3750 FLAG_N = NFLAG_32(res);
philpem@0 3751 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3752 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3753 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3754 }
philpem@0 3755
philpem@0 3756
philpem@0 3757 M68KMAKE_OP(cmpa, 32, ., a)
philpem@0 3758 {
philpem@0 3759 uint src = AY;
philpem@0 3760 uint dst = AX;
philpem@0 3761 uint res = dst - src;
philpem@0 3762
philpem@0 3763 FLAG_N = NFLAG_32(res);
philpem@0 3764 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3765 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3766 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3767 }
philpem@0 3768
philpem@0 3769
philpem@0 3770 M68KMAKE_OP(cmpa, 32, ., .)
philpem@0 3771 {
philpem@0 3772 uint src = M68KMAKE_GET_OPER_AY_32;
philpem@0 3773 uint dst = AX;
philpem@0 3774 uint res = dst - src;
philpem@0 3775
philpem@0 3776 FLAG_N = NFLAG_32(res);
philpem@0 3777 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3778 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3779 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3780 }
philpem@0 3781
philpem@0 3782
philpem@0 3783 M68KMAKE_OP(cmpi, 8, ., d)
philpem@0 3784 {
philpem@0 3785 uint src = OPER_I_8();
philpem@0 3786 uint dst = MASK_OUT_ABOVE_8(DY);
philpem@0 3787 uint res = dst - src;
philpem@0 3788
philpem@0 3789 FLAG_N = NFLAG_8(res);
philpem@0 3790 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3791 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3792 FLAG_C = CFLAG_8(res);
philpem@0 3793 }
philpem@0 3794
philpem@0 3795
philpem@0 3796 M68KMAKE_OP(cmpi, 8, ., .)
philpem@0 3797 {
philpem@0 3798 uint src = OPER_I_8();
philpem@0 3799 uint dst = M68KMAKE_GET_OPER_AY_8;
philpem@0 3800 uint res = dst - src;
philpem@0 3801
philpem@0 3802 FLAG_N = NFLAG_8(res);
philpem@0 3803 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3804 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3805 FLAG_C = CFLAG_8(res);
philpem@0 3806 }
philpem@0 3807
philpem@0 3808
philpem@0 3809 M68KMAKE_OP(cmpi, 8, ., pcdi)
philpem@0 3810 {
philpem@0 3811 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3812 {
philpem@0 3813 uint src = OPER_I_8();
philpem@0 3814 uint dst = OPER_PCDI_8();
philpem@0 3815 uint res = dst - src;
philpem@0 3816
philpem@0 3817 FLAG_N = NFLAG_8(res);
philpem@0 3818 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3819 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3820 FLAG_C = CFLAG_8(res);
philpem@0 3821 return;
philpem@0 3822 }
philpem@0 3823 m68ki_exception_illegal();
philpem@0 3824 }
philpem@0 3825
philpem@0 3826
philpem@0 3827 M68KMAKE_OP(cmpi, 8, ., pcix)
philpem@0 3828 {
philpem@0 3829 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3830 {
philpem@0 3831 uint src = OPER_I_8();
philpem@0 3832 uint dst = OPER_PCIX_8();
philpem@0 3833 uint res = dst - src;
philpem@0 3834
philpem@0 3835 FLAG_N = NFLAG_8(res);
philpem@0 3836 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3837 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3838 FLAG_C = CFLAG_8(res);
philpem@0 3839 return;
philpem@0 3840 }
philpem@0 3841 m68ki_exception_illegal();
philpem@0 3842 }
philpem@0 3843
philpem@0 3844
philpem@0 3845 M68KMAKE_OP(cmpi, 16, ., d)
philpem@0 3846 {
philpem@0 3847 uint src = OPER_I_16();
philpem@0 3848 uint dst = MASK_OUT_ABOVE_16(DY);
philpem@0 3849 uint res = dst - src;
philpem@0 3850
philpem@0 3851 FLAG_N = NFLAG_16(res);
philpem@0 3852 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3853 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3854 FLAG_C = CFLAG_16(res);
philpem@0 3855 }
philpem@0 3856
philpem@0 3857
philpem@0 3858 M68KMAKE_OP(cmpi, 16, ., .)
philpem@0 3859 {
philpem@0 3860 uint src = OPER_I_16();
philpem@0 3861 uint dst = M68KMAKE_GET_OPER_AY_16;
philpem@0 3862 uint res = dst - src;
philpem@0 3863
philpem@0 3864 FLAG_N = NFLAG_16(res);
philpem@0 3865 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3866 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3867 FLAG_C = CFLAG_16(res);
philpem@0 3868 }
philpem@0 3869
philpem@0 3870
philpem@0 3871 M68KMAKE_OP(cmpi, 16, ., pcdi)
philpem@0 3872 {
philpem@0 3873 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3874 {
philpem@0 3875 uint src = OPER_I_16();
philpem@0 3876 uint dst = OPER_PCDI_16();
philpem@0 3877 uint res = dst - src;
philpem@0 3878
philpem@0 3879 FLAG_N = NFLAG_16(res);
philpem@0 3880 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3881 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3882 FLAG_C = CFLAG_16(res);
philpem@0 3883 return;
philpem@0 3884 }
philpem@0 3885 m68ki_exception_illegal();
philpem@0 3886 }
philpem@0 3887
philpem@0 3888
philpem@0 3889 M68KMAKE_OP(cmpi, 16, ., pcix)
philpem@0 3890 {
philpem@0 3891 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3892 {
philpem@0 3893 uint src = OPER_I_16();
philpem@0 3894 uint dst = OPER_PCIX_16();
philpem@0 3895 uint res = dst - src;
philpem@0 3896
philpem@0 3897 FLAG_N = NFLAG_16(res);
philpem@0 3898 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 3899 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 3900 FLAG_C = CFLAG_16(res);
philpem@0 3901 return;
philpem@0 3902 }
philpem@0 3903 m68ki_exception_illegal();
philpem@0 3904 }
philpem@0 3905
philpem@0 3906
philpem@0 3907 M68KMAKE_OP(cmpi, 32, ., d)
philpem@0 3908 {
philpem@0 3909 uint src = OPER_I_32();
philpem@0 3910 uint dst = DY;
philpem@0 3911 uint res = dst - src;
philpem@0 3912
philpem@0 3913 FLAG_N = NFLAG_32(res);
philpem@0 3914 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3915 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3916 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3917 }
philpem@0 3918
philpem@0 3919
philpem@0 3920 M68KMAKE_OP(cmpi, 32, ., .)
philpem@0 3921 {
philpem@0 3922 uint src = OPER_I_32();
philpem@0 3923 uint dst = M68KMAKE_GET_OPER_AY_32;
philpem@0 3924 uint res = dst - src;
philpem@0 3925
philpem@0 3926 FLAG_N = NFLAG_32(res);
philpem@0 3927 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3928 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3929 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3930 }
philpem@0 3931
philpem@0 3932
philpem@0 3933 M68KMAKE_OP(cmpi, 32, ., pcdi)
philpem@0 3934 {
philpem@0 3935 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3936 {
philpem@0 3937 uint src = OPER_I_32();
philpem@0 3938 uint dst = OPER_PCDI_32();
philpem@0 3939 uint res = dst - src;
philpem@0 3940
philpem@0 3941 FLAG_N = NFLAG_32(res);
philpem@0 3942 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3943 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3944 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3945 return;
philpem@0 3946 }
philpem@0 3947 m68ki_exception_illegal();
philpem@0 3948 }
philpem@0 3949
philpem@0 3950
philpem@0 3951 M68KMAKE_OP(cmpi, 32, ., pcix)
philpem@0 3952 {
philpem@0 3953 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 3954 {
philpem@0 3955 uint src = OPER_I_32();
philpem@0 3956 uint dst = OPER_PCIX_32();
philpem@0 3957 uint res = dst - src;
philpem@0 3958
philpem@0 3959 FLAG_N = NFLAG_32(res);
philpem@0 3960 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 3961 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 3962 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 3963 return;
philpem@0 3964 }
philpem@0 3965 m68ki_exception_illegal();
philpem@0 3966 }
philpem@0 3967
philpem@0 3968
philpem@0 3969 M68KMAKE_OP(cmpm, 8, ., ax7)
philpem@0 3970 {
philpem@0 3971 uint src = OPER_AY_PI_8();
philpem@0 3972 uint dst = OPER_A7_PI_8();
philpem@0 3973 uint res = dst - src;
philpem@0 3974
philpem@0 3975 FLAG_N = NFLAG_8(res);
philpem@0 3976 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3977 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3978 FLAG_C = CFLAG_8(res);
philpem@0 3979 }
philpem@0 3980
philpem@0 3981
philpem@0 3982 M68KMAKE_OP(cmpm, 8, ., ay7)
philpem@0 3983 {
philpem@0 3984 uint src = OPER_A7_PI_8();
philpem@0 3985 uint dst = OPER_AX_PI_8();
philpem@0 3986 uint res = dst - src;
philpem@0 3987
philpem@0 3988 FLAG_N = NFLAG_8(res);
philpem@0 3989 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 3990 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 3991 FLAG_C = CFLAG_8(res);
philpem@0 3992 }
philpem@0 3993
philpem@0 3994
philpem@0 3995 M68KMAKE_OP(cmpm, 8, ., axy7)
philpem@0 3996 {
philpem@0 3997 uint src = OPER_A7_PI_8();
philpem@0 3998 uint dst = OPER_A7_PI_8();
philpem@0 3999 uint res = dst - src;
philpem@0 4000
philpem@0 4001 FLAG_N = NFLAG_8(res);
philpem@0 4002 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 4003 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 4004 FLAG_C = CFLAG_8(res);
philpem@0 4005 }
philpem@0 4006
philpem@0 4007
philpem@0 4008 M68KMAKE_OP(cmpm, 8, ., .)
philpem@0 4009 {
philpem@0 4010 uint src = OPER_AY_PI_8();
philpem@0 4011 uint dst = OPER_AX_PI_8();
philpem@0 4012 uint res = dst - src;
philpem@0 4013
philpem@0 4014 FLAG_N = NFLAG_8(res);
philpem@0 4015 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 4016 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 4017 FLAG_C = CFLAG_8(res);
philpem@0 4018 }
philpem@0 4019
philpem@0 4020
philpem@0 4021 M68KMAKE_OP(cmpm, 16, ., .)
philpem@0 4022 {
philpem@0 4023 uint src = OPER_AY_PI_16();
philpem@0 4024 uint dst = OPER_AX_PI_16();
philpem@0 4025 uint res = dst - src;
philpem@0 4026
philpem@0 4027 FLAG_N = NFLAG_16(res);
philpem@0 4028 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 4029 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 4030 FLAG_C = CFLAG_16(res);
philpem@0 4031 }
philpem@0 4032
philpem@0 4033
philpem@0 4034 M68KMAKE_OP(cmpm, 32, ., .)
philpem@0 4035 {
philpem@0 4036 uint src = OPER_AY_PI_32();
philpem@0 4037 uint dst = OPER_AX_PI_32();
philpem@0 4038 uint res = dst - src;
philpem@0 4039
philpem@0 4040 FLAG_N = NFLAG_32(res);
philpem@0 4041 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 4042 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 4043 FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 4044 }
philpem@0 4045
philpem@0 4046
philpem@0 4047 M68KMAKE_OP(cpbcc, 32, ., .)
philpem@0 4048 {
philpem@0 4049 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4050 {
philpem@0 4051 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 4052 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 4053 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 4054 return;
philpem@0 4055 }
philpem@0 4056 m68ki_exception_1111();
philpem@0 4057 }
philpem@0 4058
philpem@0 4059
philpem@0 4060 M68KMAKE_OP(cpdbcc, 32, ., .)
philpem@0 4061 {
philpem@0 4062 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4063 {
philpem@0 4064 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 4065 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 4066 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 4067 return;
philpem@0 4068 }
philpem@0 4069 m68ki_exception_1111();
philpem@0 4070 }
philpem@0 4071
philpem@0 4072
philpem@0 4073 M68KMAKE_OP(cpgen, 32, ., .)
philpem@0 4074 {
philpem@0 4075 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4076 {
philpem@0 4077 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 4078 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 4079 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 4080 return;
philpem@0 4081 }
philpem@0 4082 m68ki_exception_1111();
philpem@0 4083 }
philpem@0 4084
philpem@0 4085
philpem@0 4086 M68KMAKE_OP(cpscc, 32, ., .)
philpem@0 4087 {
philpem@0 4088 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4089 {
philpem@0 4090 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 4091 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 4092 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 4093 return;
philpem@0 4094 }
philpem@0 4095 m68ki_exception_1111();
philpem@0 4096 }
philpem@0 4097
philpem@0 4098
philpem@0 4099 M68KMAKE_OP(cptrapcc, 32, ., .)
philpem@0 4100 {
philpem@0 4101 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4102 {
philpem@0 4103 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 4104 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 4105 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 4106 return;
philpem@0 4107 }
philpem@0 4108 m68ki_exception_1111();
philpem@0 4109 }
philpem@0 4110
philpem@0 4111
philpem@0 4112 M68KMAKE_OP(dbt, 16, ., .)
philpem@0 4113 {
philpem@0 4114 REG_PC += 2;
philpem@0 4115 }
philpem@0 4116
philpem@0 4117
philpem@0 4118 M68KMAKE_OP(dbf, 16, ., .)
philpem@0 4119 {
philpem@0 4120 uint* r_dst = &DY;
philpem@0 4121 uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
philpem@0 4122
philpem@0 4123 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 4124 if(res != 0xffff)
philpem@0 4125 {
philpem@0 4126 uint offset = OPER_I_16();
philpem@0 4127 REG_PC -= 2;
philpem@0 4128 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 4129 m68ki_branch_16(offset);
philpem@0 4130 return;
philpem@0 4131 }
philpem@0 4132 REG_PC += 2;
philpem@0 4133 }
philpem@0 4134
philpem@0 4135
philpem@0 4136 M68KMAKE_OP(dbcc, 16, ., .)
philpem@0 4137 {
philpem@0 4138 if(M68KMAKE_NOT_CC)
philpem@0 4139 {
philpem@0 4140 uint* r_dst = &DY;
philpem@0 4141 uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
philpem@0 4142
philpem@0 4143 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 4144 if(res != 0xffff)
philpem@0 4145 {
philpem@0 4146 uint offset = OPER_I_16();
philpem@0 4147 REG_PC -= 2;
philpem@0 4148 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 4149 m68ki_branch_16(offset);
philpem@0 4150 USE_CYCLES(CYC_DBCC_F_NOEXP);
philpem@0 4151 return;
philpem@0 4152 }
philpem@0 4153 REG_PC += 2;
philpem@0 4154 USE_CYCLES(CYC_DBCC_F_EXP);
philpem@0 4155 return;
philpem@0 4156 }
philpem@0 4157 REG_PC += 2;
philpem@0 4158 }
philpem@0 4159
philpem@0 4160
philpem@0 4161 M68KMAKE_OP(divs, 16, ., d)
philpem@0 4162 {
philpem@0 4163 uint* r_dst = &DX;
philpem@0 4164 sint src = MAKE_INT_16(DY);
philpem@0 4165 sint quotient;
philpem@0 4166 sint remainder;
philpem@0 4167
philpem@0 4168 if(src != 0)
philpem@0 4169 {
philpem@0 4170 if((uint32)*r_dst == 0x80000000 && src == -1)
philpem@0 4171 {
philpem@0 4172 FLAG_Z = 0;
philpem@0 4173 FLAG_N = NFLAG_CLEAR;
philpem@0 4174 FLAG_V = VFLAG_CLEAR;
philpem@0 4175 FLAG_C = CFLAG_CLEAR;
philpem@0 4176 *r_dst = 0;
philpem@0 4177 return;
philpem@0 4178 }
philpem@0 4179
philpem@0 4180 quotient = MAKE_INT_32(*r_dst) / src;
philpem@0 4181 remainder = MAKE_INT_32(*r_dst) % src;
philpem@0 4182
philpem@0 4183 if(quotient == MAKE_INT_16(quotient))
philpem@0 4184 {
philpem@0 4185 FLAG_Z = quotient;
philpem@0 4186 FLAG_N = NFLAG_16(quotient);
philpem@0 4187 FLAG_V = VFLAG_CLEAR;
philpem@0 4188 FLAG_C = CFLAG_CLEAR;
philpem@0 4189 *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
philpem@0 4190 return;
philpem@0 4191 }
philpem@0 4192 FLAG_V = VFLAG_SET;
philpem@0 4193 return;
philpem@0 4194 }
philpem@0 4195 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4196 }
philpem@0 4197
philpem@0 4198
philpem@0 4199 M68KMAKE_OP(divs, 16, ., .)
philpem@0 4200 {
philpem@0 4201 uint* r_dst = &DX;
philpem@0 4202 sint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
philpem@0 4203 sint quotient;
philpem@0 4204 sint remainder;
philpem@0 4205
philpem@0 4206 if(src != 0)
philpem@0 4207 {
philpem@0 4208 if((uint32)*r_dst == 0x80000000 && src == -1)
philpem@0 4209 {
philpem@0 4210 FLAG_Z = 0;
philpem@0 4211 FLAG_N = NFLAG_CLEAR;
philpem@0 4212 FLAG_V = VFLAG_CLEAR;
philpem@0 4213 FLAG_C = CFLAG_CLEAR;
philpem@0 4214 *r_dst = 0;
philpem@0 4215 return;
philpem@0 4216 }
philpem@0 4217
philpem@0 4218 quotient = MAKE_INT_32(*r_dst) / src;
philpem@0 4219 remainder = MAKE_INT_32(*r_dst) % src;
philpem@0 4220
philpem@0 4221 if(quotient == MAKE_INT_16(quotient))
philpem@0 4222 {
philpem@0 4223 FLAG_Z = quotient;
philpem@0 4224 FLAG_N = NFLAG_16(quotient);
philpem@0 4225 FLAG_V = VFLAG_CLEAR;
philpem@0 4226 FLAG_C = CFLAG_CLEAR;
philpem@0 4227 *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
philpem@0 4228 return;
philpem@0 4229 }
philpem@0 4230 FLAG_V = VFLAG_SET;
philpem@0 4231 return;
philpem@0 4232 }
philpem@0 4233 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4234 }
philpem@0 4235
philpem@0 4236
philpem@0 4237 M68KMAKE_OP(divu, 16, ., d)
philpem@0 4238 {
philpem@0 4239 uint* r_dst = &DX;
philpem@0 4240 uint src = MASK_OUT_ABOVE_16(DY);
philpem@0 4241
philpem@0 4242 if(src != 0)
philpem@0 4243 {
philpem@0 4244 uint quotient = *r_dst / src;
philpem@0 4245 uint remainder = *r_dst % src;
philpem@0 4246
philpem@0 4247 if(quotient < 0x10000)
philpem@0 4248 {
philpem@0 4249 FLAG_Z = quotient;
philpem@0 4250 FLAG_N = NFLAG_16(quotient);
philpem@0 4251 FLAG_V = VFLAG_CLEAR;
philpem@0 4252 FLAG_C = CFLAG_CLEAR;
philpem@0 4253 *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
philpem@0 4254 return;
philpem@0 4255 }
philpem@0 4256 FLAG_V = VFLAG_SET;
philpem@0 4257 return;
philpem@0 4258 }
philpem@0 4259 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4260 }
philpem@0 4261
philpem@0 4262
philpem@0 4263 M68KMAKE_OP(divu, 16, ., .)
philpem@0 4264 {
philpem@0 4265 uint* r_dst = &DX;
philpem@0 4266 uint src = M68KMAKE_GET_OPER_AY_16;
philpem@0 4267
philpem@0 4268 if(src != 0)
philpem@0 4269 {
philpem@0 4270 uint quotient = *r_dst / src;
philpem@0 4271 uint remainder = *r_dst % src;
philpem@0 4272
philpem@0 4273 if(quotient < 0x10000)
philpem@0 4274 {
philpem@0 4275 FLAG_Z = quotient;
philpem@0 4276 FLAG_N = NFLAG_16(quotient);
philpem@0 4277 FLAG_V = VFLAG_CLEAR;
philpem@0 4278 FLAG_C = CFLAG_CLEAR;
philpem@0 4279 *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
philpem@0 4280 return;
philpem@0 4281 }
philpem@0 4282 FLAG_V = VFLAG_SET;
philpem@0 4283 return;
philpem@0 4284 }
philpem@0 4285 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4286 }
philpem@0 4287
philpem@0 4288
philpem@0 4289 M68KMAKE_OP(divl, 32, ., d)
philpem@0 4290 {
philpem@0 4291 #if M68K_USE_64_BIT
philpem@0 4292
philpem@0 4293 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4294 {
philpem@0 4295 uint word2 = OPER_I_16();
philpem@0 4296 uint64 divisor = DY;
philpem@0 4297 uint64 dividend = 0;
philpem@0 4298 uint64 quotient = 0;
philpem@0 4299 uint64 remainder = 0;
philpem@0 4300
philpem@0 4301 if(divisor != 0)
philpem@0 4302 {
philpem@0 4303 if(BIT_A(word2)) /* 64 bit */
philpem@0 4304 {
philpem@0 4305 dividend = REG_D[word2 & 7];
philpem@0 4306 dividend <<= 32;
philpem@0 4307 dividend |= REG_D[(word2 >> 12) & 7];
philpem@0 4308
philpem@0 4309 if(BIT_B(word2)) /* signed */
philpem@0 4310 {
philpem@0 4311 quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
philpem@0 4312 remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
philpem@0 4313 if((sint64)quotient != (sint64)((sint32)quotient))
philpem@0 4314 {
philpem@0 4315 FLAG_V = VFLAG_SET;
philpem@0 4316 return;
philpem@0 4317 }
philpem@0 4318 }
philpem@0 4319 else /* unsigned */
philpem@0 4320 {
philpem@0 4321 quotient = dividend / divisor;
philpem@0 4322 if(quotient > 0xffffffff)
philpem@0 4323 {
philpem@0 4324 FLAG_V = VFLAG_SET;
philpem@0 4325 return;
philpem@0 4326 }
philpem@0 4327 remainder = dividend % divisor;
philpem@0 4328 }
philpem@0 4329 }
philpem@0 4330 else /* 32 bit */
philpem@0 4331 {
philpem@0 4332 dividend = REG_D[(word2 >> 12) & 7];
philpem@0 4333 if(BIT_B(word2)) /* signed */
philpem@0 4334 {
philpem@0 4335 quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
philpem@0 4336 remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
philpem@0 4337 }
philpem@0 4338 else /* unsigned */
philpem@0 4339 {
philpem@0 4340 quotient = dividend / divisor;
philpem@0 4341 remainder = dividend % divisor;
philpem@0 4342 }
philpem@0 4343 }
philpem@0 4344
philpem@0 4345 REG_D[word2 & 7] = remainder;
philpem@0 4346 REG_D[(word2 >> 12) & 7] = quotient;
philpem@0 4347
philpem@0 4348 FLAG_N = NFLAG_32(quotient);
philpem@0 4349 FLAG_Z = quotient;
philpem@0 4350 FLAG_V = VFLAG_CLEAR;
philpem@0 4351 FLAG_C = CFLAG_CLEAR;
philpem@0 4352 return;
philpem@0 4353 }
philpem@0 4354 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4355 return;
philpem@0 4356 }
philpem@0 4357 m68ki_exception_illegal();
philpem@0 4358
philpem@0 4359 #else
philpem@0 4360
philpem@0 4361 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4362 {
philpem@0 4363 uint word2 = OPER_I_16();
philpem@0 4364 uint divisor = DY;
philpem@0 4365 uint dividend_hi = REG_D[word2 & 7];
philpem@0 4366 uint dividend_lo = REG_D[(word2 >> 12) & 7];
philpem@0 4367 uint quotient = 0;
philpem@0 4368 uint remainder = 0;
philpem@0 4369 uint dividend_neg = 0;
philpem@0 4370 uint divisor_neg = 0;
philpem@0 4371 sint i;
philpem@0 4372 uint overflow;
philpem@0 4373
philpem@0 4374 if(divisor != 0)
philpem@0 4375 {
philpem@0 4376 /* quad / long : long quotient, long remainder */
philpem@0 4377 if(BIT_A(word2))
philpem@0 4378 {
philpem@0 4379 if(BIT_B(word2)) /* signed */
philpem@0 4380 {
philpem@0 4381 /* special case in signed divide */
philpem@0 4382 if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
philpem@0 4383 {
philpem@0 4384 REG_D[word2 & 7] = 0;
philpem@0 4385 REG_D[(word2 >> 12) & 7] = 0x80000000;
philpem@0 4386
philpem@0 4387 FLAG_N = NFLAG_SET;
philpem@0 4388 FLAG_Z = ZFLAG_CLEAR;
philpem@0 4389 FLAG_V = VFLAG_CLEAR;
philpem@0 4390 FLAG_C = CFLAG_CLEAR;
philpem@0 4391 return;
philpem@0 4392 }
philpem@0 4393 if(GET_MSB_32(dividend_hi))
philpem@0 4394 {
philpem@0 4395 dividend_neg = 1;
philpem@0 4396 dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
philpem@0 4397 dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
philpem@0 4398 }
philpem@0 4399 if(GET_MSB_32(divisor))
philpem@0 4400 {
philpem@0 4401 divisor_neg = 1;
philpem@0 4402 divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
philpem@0 4403
philpem@0 4404 }
philpem@0 4405 }
philpem@0 4406
philpem@0 4407 /* if the upper long is greater than the divisor, we're overflowing. */
philpem@0 4408 if(dividend_hi >= divisor)
philpem@0 4409 {
philpem@0 4410 FLAG_V = VFLAG_SET;
philpem@0 4411 return;
philpem@0 4412 }
philpem@0 4413
philpem@0 4414 for(i = 31; i >= 0; i--)
philpem@0 4415 {
philpem@0 4416 quotient <<= 1;
philpem@0 4417 remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
philpem@0 4418 if(remainder >= divisor)
philpem@0 4419 {
philpem@0 4420 remainder -= divisor;
philpem@0 4421 quotient++;
philpem@0 4422 }
philpem@0 4423 }
philpem@0 4424 for(i = 31; i >= 0; i--)
philpem@0 4425 {
philpem@0 4426 quotient <<= 1;
philpem@0 4427 overflow = GET_MSB_32(remainder);
philpem@0 4428 remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
philpem@0 4429 if(remainder >= divisor || overflow)
philpem@0 4430 {
philpem@0 4431 remainder -= divisor;
philpem@0 4432 quotient++;
philpem@0 4433 }
philpem@0 4434 }
philpem@0 4435
philpem@0 4436 if(BIT_B(word2)) /* signed */
philpem@0 4437 {
philpem@0 4438 if(quotient > 0x7fffffff)
philpem@0 4439 {
philpem@0 4440 FLAG_V = VFLAG_SET;
philpem@0 4441 return;
philpem@0 4442 }
philpem@0 4443 if(dividend_neg)
philpem@0 4444 {
philpem@0 4445 remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
philpem@0 4446 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
philpem@0 4447 }
philpem@0 4448 if(divisor_neg)
philpem@0 4449 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
philpem@0 4450 }
philpem@0 4451
philpem@0 4452 REG_D[word2 & 7] = remainder;
philpem@0 4453 REG_D[(word2 >> 12) & 7] = quotient;
philpem@0 4454
philpem@0 4455 FLAG_N = NFLAG_32(quotient);
philpem@0 4456 FLAG_Z = quotient;
philpem@0 4457 FLAG_V = VFLAG_CLEAR;
philpem@0 4458 FLAG_C = CFLAG_CLEAR;
philpem@0 4459 return;
philpem@0 4460 }
philpem@0 4461
philpem@0 4462 /* long / long: long quotient, maybe long remainder */
philpem@0 4463 if(BIT_B(word2)) /* signed */
philpem@0 4464 {
philpem@0 4465 /* Special case in divide */
philpem@0 4466 if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
philpem@0 4467 {
philpem@0 4468 FLAG_N = NFLAG_SET;
philpem@0 4469 FLAG_Z = ZFLAG_CLEAR;
philpem@0 4470 FLAG_V = VFLAG_CLEAR;
philpem@0 4471 FLAG_C = CFLAG_CLEAR;
philpem@0 4472 REG_D[(word2 >> 12) & 7] = 0x80000000;
philpem@0 4473 REG_D[word2 & 7] = 0;
philpem@0 4474 return;
philpem@0 4475 }
philpem@0 4476 REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
philpem@0 4477 quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
philpem@0 4478 }
philpem@0 4479 else
philpem@0 4480 {
philpem@0 4481 REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
philpem@0 4482 quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
philpem@0 4483 }
philpem@0 4484
philpem@0 4485 FLAG_N = NFLAG_32(quotient);
philpem@0 4486 FLAG_Z = quotient;
philpem@0 4487 FLAG_V = VFLAG_CLEAR;
philpem@0 4488 FLAG_C = CFLAG_CLEAR;
philpem@0 4489 return;
philpem@0 4490 }
philpem@0 4491 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4492 return;
philpem@0 4493 }
philpem@0 4494 m68ki_exception_illegal();
philpem@0 4495
philpem@0 4496 #endif
philpem@0 4497 }
philpem@0 4498
philpem@0 4499
philpem@0 4500 M68KMAKE_OP(divl, 32, ., .)
philpem@0 4501 {
philpem@0 4502 #if M68K_USE_64_BIT
philpem@0 4503
philpem@0 4504 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4505 {
philpem@0 4506 uint word2 = OPER_I_16();
philpem@0 4507 uint64 divisor = M68KMAKE_GET_OPER_AY_32;
philpem@0 4508 uint64 dividend = 0;
philpem@0 4509 uint64 quotient = 0;
philpem@0 4510 uint64 remainder = 0;
philpem@0 4511
philpem@0 4512 if(divisor != 0)
philpem@0 4513 {
philpem@0 4514 if(BIT_A(word2)) /* 64 bit */
philpem@0 4515 {
philpem@0 4516 dividend = REG_D[word2 & 7];
philpem@0 4517 dividend <<= 32;
philpem@0 4518 dividend |= REG_D[(word2 >> 12) & 7];
philpem@0 4519
philpem@0 4520 if(BIT_B(word2)) /* signed */
philpem@0 4521 {
philpem@0 4522 quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
philpem@0 4523 remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
philpem@0 4524 if((sint64)quotient != (sint64)((sint32)quotient))
philpem@0 4525 {
philpem@0 4526 FLAG_V = VFLAG_SET;
philpem@0 4527 return;
philpem@0 4528 }
philpem@0 4529 }
philpem@0 4530 else /* unsigned */
philpem@0 4531 {
philpem@0 4532 quotient = dividend / divisor;
philpem@0 4533 if(quotient > 0xffffffff)
philpem@0 4534 {
philpem@0 4535 FLAG_V = VFLAG_SET;
philpem@0 4536 return;
philpem@0 4537 }
philpem@0 4538 remainder = dividend % divisor;
philpem@0 4539 }
philpem@0 4540 }
philpem@0 4541 else /* 32 bit */
philpem@0 4542 {
philpem@0 4543 dividend = REG_D[(word2 >> 12) & 7];
philpem@0 4544 if(BIT_B(word2)) /* signed */
philpem@0 4545 {
philpem@0 4546 quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
philpem@0 4547 remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
philpem@0 4548 }
philpem@0 4549 else /* unsigned */
philpem@0 4550 {
philpem@0 4551 quotient = dividend / divisor;
philpem@0 4552 remainder = dividend % divisor;
philpem@0 4553 }
philpem@0 4554 }
philpem@0 4555
philpem@0 4556 REG_D[word2 & 7] = remainder;
philpem@0 4557 REG_D[(word2 >> 12) & 7] = quotient;
philpem@0 4558
philpem@0 4559 FLAG_N = NFLAG_32(quotient);
philpem@0 4560 FLAG_Z = quotient;
philpem@0 4561 FLAG_V = VFLAG_CLEAR;
philpem@0 4562 FLAG_C = CFLAG_CLEAR;
philpem@0 4563 return;
philpem@0 4564 }
philpem@0 4565 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4566 return;
philpem@0 4567 }
philpem@0 4568 m68ki_exception_illegal();
philpem@0 4569
philpem@0 4570 #else
philpem@0 4571
philpem@0 4572 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4573 {
philpem@0 4574 uint word2 = OPER_I_16();
philpem@0 4575 uint divisor = M68KMAKE_GET_OPER_AY_32;
philpem@0 4576 uint dividend_hi = REG_D[word2 & 7];
philpem@0 4577 uint dividend_lo = REG_D[(word2 >> 12) & 7];
philpem@0 4578 uint quotient = 0;
philpem@0 4579 uint remainder = 0;
philpem@0 4580 uint dividend_neg = 0;
philpem@0 4581 uint divisor_neg = 0;
philpem@0 4582 sint i;
philpem@0 4583 uint overflow;
philpem@0 4584
philpem@0 4585 if(divisor != 0)
philpem@0 4586 {
philpem@0 4587 /* quad / long : long quotient, long remainder */
philpem@0 4588 if(BIT_A(word2))
philpem@0 4589 {
philpem@0 4590 if(BIT_B(word2)) /* signed */
philpem@0 4591 {
philpem@0 4592 /* special case in signed divide */
philpem@0 4593 if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
philpem@0 4594 {
philpem@0 4595 REG_D[word2 & 7] = 0;
philpem@0 4596 REG_D[(word2 >> 12) & 7] = 0x80000000;
philpem@0 4597
philpem@0 4598 FLAG_N = NFLAG_SET;
philpem@0 4599 FLAG_Z = ZFLAG_CLEAR;
philpem@0 4600 FLAG_V = VFLAG_CLEAR;
philpem@0 4601 FLAG_C = CFLAG_CLEAR;
philpem@0 4602 return;
philpem@0 4603 }
philpem@0 4604 if(GET_MSB_32(dividend_hi))
philpem@0 4605 {
philpem@0 4606 dividend_neg = 1;
philpem@0 4607 dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
philpem@0 4608 dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
philpem@0 4609 }
philpem@0 4610 if(GET_MSB_32(divisor))
philpem@0 4611 {
philpem@0 4612 divisor_neg = 1;
philpem@0 4613 divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
philpem@0 4614
philpem@0 4615 }
philpem@0 4616 }
philpem@0 4617
philpem@0 4618 /* if the upper long is greater than the divisor, we're overflowing. */
philpem@0 4619 if(dividend_hi >= divisor)
philpem@0 4620 {
philpem@0 4621 FLAG_V = VFLAG_SET;
philpem@0 4622 return;
philpem@0 4623 }
philpem@0 4624
philpem@0 4625 for(i = 31; i >= 0; i--)
philpem@0 4626 {
philpem@0 4627 quotient <<= 1;
philpem@0 4628 remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
philpem@0 4629 if(remainder >= divisor)
philpem@0 4630 {
philpem@0 4631 remainder -= divisor;
philpem@0 4632 quotient++;
philpem@0 4633 }
philpem@0 4634 }
philpem@0 4635 for(i = 31; i >= 0; i--)
philpem@0 4636 {
philpem@0 4637 quotient <<= 1;
philpem@0 4638 overflow = GET_MSB_32(remainder);
philpem@0 4639 remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
philpem@0 4640 if(remainder >= divisor || overflow)
philpem@0 4641 {
philpem@0 4642 remainder -= divisor;
philpem@0 4643 quotient++;
philpem@0 4644 }
philpem@0 4645 }
philpem@0 4646
philpem@0 4647 if(BIT_B(word2)) /* signed */
philpem@0 4648 {
philpem@0 4649 if(quotient > 0x7fffffff)
philpem@0 4650 {
philpem@0 4651 FLAG_V = VFLAG_SET;
philpem@0 4652 return;
philpem@0 4653 }
philpem@0 4654 if(dividend_neg)
philpem@0 4655 {
philpem@0 4656 remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
philpem@0 4657 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
philpem@0 4658 }
philpem@0 4659 if(divisor_neg)
philpem@0 4660 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
philpem@0 4661 }
philpem@0 4662
philpem@0 4663 REG_D[word2 & 7] = remainder;
philpem@0 4664 REG_D[(word2 >> 12) & 7] = quotient;
philpem@0 4665
philpem@0 4666 FLAG_N = NFLAG_32(quotient);
philpem@0 4667 FLAG_Z = quotient;
philpem@0 4668 FLAG_V = VFLAG_CLEAR;
philpem@0 4669 FLAG_C = CFLAG_CLEAR;
philpem@0 4670 return;
philpem@0 4671 }
philpem@0 4672
philpem@0 4673 /* long / long: long quotient, maybe long remainder */
philpem@0 4674 if(BIT_B(word2)) /* signed */
philpem@0 4675 {
philpem@0 4676 /* Special case in divide */
philpem@0 4677 if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
philpem@0 4678 {
philpem@0 4679 FLAG_N = NFLAG_SET;
philpem@0 4680 FLAG_Z = ZFLAG_CLEAR;
philpem@0 4681 FLAG_V = VFLAG_CLEAR;
philpem@0 4682 FLAG_C = CFLAG_CLEAR;
philpem@0 4683 REG_D[(word2 >> 12) & 7] = 0x80000000;
philpem@0 4684 REG_D[word2 & 7] = 0;
philpem@0 4685 return;
philpem@0 4686 }
philpem@0 4687 REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
philpem@0 4688 quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
philpem@0 4689 }
philpem@0 4690 else
philpem@0 4691 {
philpem@0 4692 REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
philpem@0 4693 quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
philpem@0 4694 }
philpem@0 4695
philpem@0 4696 FLAG_N = NFLAG_32(quotient);
philpem@0 4697 FLAG_Z = quotient;
philpem@0 4698 FLAG_V = VFLAG_CLEAR;
philpem@0 4699 FLAG_C = CFLAG_CLEAR;
philpem@0 4700 return;
philpem@0 4701 }
philpem@0 4702 m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
philpem@0 4703 return;
philpem@0 4704 }
philpem@0 4705 m68ki_exception_illegal();
philpem@0 4706
philpem@0 4707 #endif
philpem@0 4708 }
philpem@0 4709
philpem@0 4710
philpem@0 4711 M68KMAKE_OP(eor, 8, ., d)
philpem@0 4712 {
philpem@0 4713 uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX));
philpem@0 4714
philpem@0 4715 FLAG_N = NFLAG_8(res);
philpem@0 4716 FLAG_Z = res;
philpem@0 4717 FLAG_C = CFLAG_CLEAR;
philpem@0 4718 FLAG_V = VFLAG_CLEAR;
philpem@0 4719 }
philpem@0 4720
philpem@0 4721
philpem@0 4722 M68KMAKE_OP(eor, 8, ., .)
philpem@0 4723 {
philpem@0 4724 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 4725 uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
philpem@0 4726
philpem@0 4727 m68ki_write_8(ea, res);
philpem@0 4728
philpem@0 4729 FLAG_N = NFLAG_8(res);
philpem@0 4730 FLAG_Z = res;
philpem@0 4731 FLAG_C = CFLAG_CLEAR;
philpem@0 4732 FLAG_V = VFLAG_CLEAR;
philpem@0 4733 }
philpem@0 4734
philpem@0 4735
philpem@0 4736 M68KMAKE_OP(eor, 16, ., d)
philpem@0 4737 {
philpem@0 4738 uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX));
philpem@0 4739
philpem@0 4740 FLAG_N = NFLAG_16(res);
philpem@0 4741 FLAG_Z = res;
philpem@0 4742 FLAG_C = CFLAG_CLEAR;
philpem@0 4743 FLAG_V = VFLAG_CLEAR;
philpem@0 4744 }
philpem@0 4745
philpem@0 4746
philpem@0 4747 M68KMAKE_OP(eor, 16, ., .)
philpem@0 4748 {
philpem@0 4749 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 4750 uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
philpem@0 4751
philpem@0 4752 m68ki_write_16(ea, res);
philpem@0 4753
philpem@0 4754 FLAG_N = NFLAG_16(res);
philpem@0 4755 FLAG_Z = res;
philpem@0 4756 FLAG_C = CFLAG_CLEAR;
philpem@0 4757 FLAG_V = VFLAG_CLEAR;
philpem@0 4758 }
philpem@0 4759
philpem@0 4760
philpem@0 4761 M68KMAKE_OP(eor, 32, ., d)
philpem@0 4762 {
philpem@0 4763 uint res = DY ^= DX;
philpem@0 4764
philpem@0 4765 FLAG_N = NFLAG_32(res);
philpem@0 4766 FLAG_Z = res;
philpem@0 4767 FLAG_C = CFLAG_CLEAR;
philpem@0 4768 FLAG_V = VFLAG_CLEAR;
philpem@0 4769 }
philpem@0 4770
philpem@0 4771
philpem@0 4772 M68KMAKE_OP(eor, 32, ., .)
philpem@0 4773 {
philpem@0 4774 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 4775 uint res = DX ^ m68ki_read_32(ea);
philpem@0 4776
philpem@0 4777 m68ki_write_32(ea, res);
philpem@0 4778
philpem@0 4779 FLAG_N = NFLAG_32(res);
philpem@0 4780 FLAG_Z = res;
philpem@0 4781 FLAG_C = CFLAG_CLEAR;
philpem@0 4782 FLAG_V = VFLAG_CLEAR;
philpem@0 4783 }
philpem@0 4784
philpem@0 4785
philpem@0 4786 M68KMAKE_OP(eori, 8, ., d)
philpem@0 4787 {
philpem@0 4788 uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8());
philpem@0 4789
philpem@0 4790 FLAG_N = NFLAG_8(res);
philpem@0 4791 FLAG_Z = res;
philpem@0 4792 FLAG_C = CFLAG_CLEAR;
philpem@0 4793 FLAG_V = VFLAG_CLEAR;
philpem@0 4794 }
philpem@0 4795
philpem@0 4796
philpem@0 4797 M68KMAKE_OP(eori, 8, ., .)
philpem@0 4798 {
philpem@0 4799 uint src = OPER_I_8();
philpem@0 4800 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 4801 uint res = src ^ m68ki_read_8(ea);
philpem@0 4802
philpem@0 4803 m68ki_write_8(ea, res);
philpem@0 4804
philpem@0 4805 FLAG_N = NFLAG_8(res);
philpem@0 4806 FLAG_Z = res;
philpem@0 4807 FLAG_C = CFLAG_CLEAR;
philpem@0 4808 FLAG_V = VFLAG_CLEAR;
philpem@0 4809 }
philpem@0 4810
philpem@0 4811
philpem@0 4812 M68KMAKE_OP(eori, 16, ., d)
philpem@0 4813 {
philpem@0 4814 uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16());
philpem@0 4815
philpem@0 4816 FLAG_N = NFLAG_16(res);
philpem@0 4817 FLAG_Z = res;
philpem@0 4818 FLAG_C = CFLAG_CLEAR;
philpem@0 4819 FLAG_V = VFLAG_CLEAR;
philpem@0 4820 }
philpem@0 4821
philpem@0 4822
philpem@0 4823 M68KMAKE_OP(eori, 16, ., .)
philpem@0 4824 {
philpem@0 4825 uint src = OPER_I_16();
philpem@0 4826 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 4827 uint res = src ^ m68ki_read_16(ea);
philpem@0 4828
philpem@0 4829 m68ki_write_16(ea, res);
philpem@0 4830
philpem@0 4831 FLAG_N = NFLAG_16(res);
philpem@0 4832 FLAG_Z = res;
philpem@0 4833 FLAG_C = CFLAG_CLEAR;
philpem@0 4834 FLAG_V = VFLAG_CLEAR;
philpem@0 4835 }
philpem@0 4836
philpem@0 4837
philpem@0 4838 M68KMAKE_OP(eori, 32, ., d)
philpem@0 4839 {
philpem@0 4840 uint res = DY ^= OPER_I_32();
philpem@0 4841
philpem@0 4842 FLAG_N = NFLAG_32(res);
philpem@0 4843 FLAG_Z = res;
philpem@0 4844 FLAG_C = CFLAG_CLEAR;
philpem@0 4845 FLAG_V = VFLAG_CLEAR;
philpem@0 4846 }
philpem@0 4847
philpem@0 4848
philpem@0 4849 M68KMAKE_OP(eori, 32, ., .)
philpem@0 4850 {
philpem@0 4851 uint src = OPER_I_32();
philpem@0 4852 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 4853 uint res = src ^ m68ki_read_32(ea);
philpem@0 4854
philpem@0 4855 m68ki_write_32(ea, res);
philpem@0 4856
philpem@0 4857 FLAG_N = NFLAG_32(res);
philpem@0 4858 FLAG_Z = res;
philpem@0 4859 FLAG_C = CFLAG_CLEAR;
philpem@0 4860 FLAG_V = VFLAG_CLEAR;
philpem@0 4861 }
philpem@0 4862
philpem@0 4863
philpem@0 4864 M68KMAKE_OP(eori, 16, toc, .)
philpem@0 4865 {
philpem@0 4866 m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16());
philpem@0 4867 }
philpem@0 4868
philpem@0 4869
philpem@0 4870 M68KMAKE_OP(eori, 16, tos, .)
philpem@0 4871 {
philpem@0 4872 if(FLAG_S)
philpem@0 4873 {
philpem@0 4874 uint src = OPER_I_16();
philpem@0 4875 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 4876 m68ki_set_sr(m68ki_get_sr() ^ src);
philpem@0 4877 return;
philpem@0 4878 }
philpem@0 4879 m68ki_exception_privilege_violation();
philpem@0 4880 }
philpem@0 4881
philpem@0 4882
philpem@0 4883 M68KMAKE_OP(exg, 32, dd, .)
philpem@0 4884 {
philpem@0 4885 uint* reg_a = &DX;
philpem@0 4886 uint* reg_b = &DY;
philpem@0 4887 uint tmp = *reg_a;
philpem@0 4888 *reg_a = *reg_b;
philpem@0 4889 *reg_b = tmp;
philpem@0 4890 }
philpem@0 4891
philpem@0 4892
philpem@0 4893 M68KMAKE_OP(exg, 32, aa, .)
philpem@0 4894 {
philpem@0 4895 uint* reg_a = &AX;
philpem@0 4896 uint* reg_b = &AY;
philpem@0 4897 uint tmp = *reg_a;
philpem@0 4898 *reg_a = *reg_b;
philpem@0 4899 *reg_b = tmp;
philpem@0 4900 }
philpem@0 4901
philpem@0 4902
philpem@0 4903 M68KMAKE_OP(exg, 32, da, .)
philpem@0 4904 {
philpem@0 4905 uint* reg_a = &DX;
philpem@0 4906 uint* reg_b = &AY;
philpem@0 4907 uint tmp = *reg_a;
philpem@0 4908 *reg_a = *reg_b;
philpem@0 4909 *reg_b = tmp;
philpem@0 4910 }
philpem@0 4911
philpem@0 4912
philpem@0 4913 M68KMAKE_OP(ext, 16, ., .)
philpem@0 4914 {
philpem@0 4915 uint* r_dst = &DY;
philpem@0 4916
philpem@0 4917 *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0);
philpem@0 4918
philpem@0 4919 FLAG_N = NFLAG_16(*r_dst);
philpem@0 4920 FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 4921 FLAG_V = VFLAG_CLEAR;
philpem@0 4922 FLAG_C = CFLAG_CLEAR;
philpem@0 4923 }
philpem@0 4924
philpem@0 4925
philpem@0 4926 M68KMAKE_OP(ext, 32, ., .)
philpem@0 4927 {
philpem@0 4928 uint* r_dst = &DY;
philpem@0 4929
philpem@0 4930 *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0);
philpem@0 4931
philpem@0 4932 FLAG_N = NFLAG_32(*r_dst);
philpem@0 4933 FLAG_Z = *r_dst;
philpem@0 4934 FLAG_V = VFLAG_CLEAR;
philpem@0 4935 FLAG_C = CFLAG_CLEAR;
philpem@0 4936 }
philpem@0 4937
philpem@0 4938
philpem@0 4939 M68KMAKE_OP(extb, 32, ., .)
philpem@0 4940 {
philpem@0 4941 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 4942 {
philpem@0 4943 uint* r_dst = &DY;
philpem@0 4944
philpem@0 4945 *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0);
philpem@0 4946
philpem@0 4947 FLAG_N = NFLAG_32(*r_dst);
philpem@0 4948 FLAG_Z = *r_dst;
philpem@0 4949 FLAG_V = VFLAG_CLEAR;
philpem@0 4950 FLAG_C = CFLAG_CLEAR;
philpem@0 4951 return;
philpem@0 4952 }
philpem@0 4953 m68ki_exception_illegal();
philpem@0 4954 }
philpem@0 4955
philpem@0 4956
philpem@0 4957 M68KMAKE_OP(illegal, 0, ., .)
philpem@0 4958 {
philpem@0 4959 m68ki_exception_illegal();
philpem@0 4960 }
philpem@0 4961
philpem@0 4962 M68KMAKE_OP(jmp, 32, ., .)
philpem@0 4963 {
philpem@0 4964 m68ki_jump(M68KMAKE_GET_EA_AY_32);
philpem@0 4965 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 4966 if(REG_PC == REG_PPC)
philpem@0 4967 USE_ALL_CYCLES();
philpem@0 4968 }
philpem@0 4969
philpem@0 4970
philpem@0 4971 M68KMAKE_OP(jsr, 32, ., .)
philpem@0 4972 {
philpem@0 4973 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 4974 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 4975 m68ki_push_32(REG_PC);
philpem@0 4976 m68ki_jump(ea);
philpem@0 4977 }
philpem@0 4978
philpem@0 4979
philpem@0 4980 M68KMAKE_OP(lea, 32, ., .)
philpem@0 4981 {
philpem@0 4982 AX = M68KMAKE_GET_EA_AY_32;
philpem@0 4983 }
philpem@0 4984
philpem@0 4985
philpem@0 4986 M68KMAKE_OP(link, 16, ., a7)
philpem@0 4987 {
philpem@0 4988 REG_A[7] -= 4;
philpem@0 4989 m68ki_write_32(REG_A[7], REG_A[7]);
philpem@0 4990 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
philpem@0 4991 }
philpem@0 4992
philpem@0 4993
philpem@0 4994 M68KMAKE_OP(link, 16, ., .)
philpem@0 4995 {
philpem@0 4996 uint* r_dst = &AY;
philpem@0 4997
philpem@0 4998 m68ki_push_32(*r_dst);
philpem@0 4999 *r_dst = REG_A[7];
philpem@0 5000 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
philpem@0 5001 }
philpem@0 5002
philpem@0 5003
philpem@0 5004 M68KMAKE_OP(link, 32, ., a7)
philpem@0 5005 {
philpem@0 5006 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 5007 {
philpem@0 5008 REG_A[7] -= 4;
philpem@0 5009 m68ki_write_32(REG_A[7], REG_A[7]);
philpem@0 5010 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());
philpem@0 5011 return;
philpem@0 5012 }
philpem@0 5013 m68ki_exception_illegal();
philpem@0 5014 }
philpem@0 5015
philpem@0 5016
philpem@0 5017 M68KMAKE_OP(link, 32, ., .)
philpem@0 5018 {
philpem@0 5019 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 5020 {
philpem@0 5021 uint* r_dst = &AY;
philpem@0 5022
philpem@0 5023 m68ki_push_32(*r_dst);
philpem@0 5024 *r_dst = REG_A[7];
philpem@0 5025 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());
philpem@0 5026 return;
philpem@0 5027 }
philpem@0 5028 m68ki_exception_illegal();
philpem@0 5029 }
philpem@0 5030
philpem@0 5031
philpem@0 5032 M68KMAKE_OP(lsr, 8, s, .)
philpem@0 5033 {
philpem@0 5034 uint* r_dst = &DY;
philpem@0 5035 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 5036 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 5037 uint res = src >> shift;
philpem@0 5038
philpem@0 5039 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 5040
philpem@0 5041 FLAG_N = NFLAG_CLEAR;
philpem@0 5042 FLAG_Z = res;
philpem@0 5043 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 5044 FLAG_V = VFLAG_CLEAR;
philpem@0 5045 }
philpem@0 5046
philpem@0 5047
philpem@0 5048 M68KMAKE_OP(lsr, 16, s, .)
philpem@0 5049 {
philpem@0 5050 uint* r_dst = &DY;
philpem@0 5051 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 5052 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 5053 uint res = src >> shift;
philpem@0 5054
philpem@0 5055 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5056
philpem@0 5057 FLAG_N = NFLAG_CLEAR;
philpem@0 5058 FLAG_Z = res;
philpem@0 5059 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 5060 FLAG_V = VFLAG_CLEAR;
philpem@0 5061 }
philpem@0 5062
philpem@0 5063
philpem@0 5064 M68KMAKE_OP(lsr, 32, s, .)
philpem@0 5065 {
philpem@0 5066 uint* r_dst = &DY;
philpem@0 5067 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 5068 uint src = *r_dst;
philpem@0 5069 uint res = src >> shift;
philpem@0 5070
philpem@0 5071 *r_dst = res;
philpem@0 5072
philpem@0 5073 FLAG_N = NFLAG_CLEAR;
philpem@0 5074 FLAG_Z = res;
philpem@0 5075 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 5076 FLAG_V = VFLAG_CLEAR;
philpem@0 5077 }
philpem@0 5078
philpem@0 5079
philpem@0 5080 M68KMAKE_OP(lsr, 8, r, .)
philpem@0 5081 {
philpem@0 5082 uint* r_dst = &DY;
philpem@0 5083 uint shift = DX & 0x3f;
philpem@0 5084 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 5085 uint res = src >> shift;
philpem@0 5086
philpem@0 5087 if(shift != 0)
philpem@0 5088 {
philpem@0 5089 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 5090
philpem@0 5091 if(shift <= 8)
philpem@0 5092 {
philpem@0 5093 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 5094 FLAG_X = FLAG_C = src << (9-shift);
philpem@0 5095 FLAG_N = NFLAG_CLEAR;
philpem@0 5096 FLAG_Z = res;
philpem@0 5097 FLAG_V = VFLAG_CLEAR;
philpem@0 5098 return;
philpem@0 5099 }
philpem@0 5100
philpem@0 5101 *r_dst &= 0xffffff00;
philpem@0 5102 FLAG_X = XFLAG_CLEAR;
philpem@0 5103 FLAG_C = CFLAG_CLEAR;
philpem@0 5104 FLAG_N = NFLAG_CLEAR;
philpem@0 5105 FLAG_Z = ZFLAG_SET;
philpem@0 5106 FLAG_V = VFLAG_CLEAR;
philpem@0 5107 return;
philpem@0 5108 }
philpem@0 5109
philpem@0 5110 FLAG_C = CFLAG_CLEAR;
philpem@0 5111 FLAG_N = NFLAG_8(src);
philpem@0 5112 FLAG_Z = src;
philpem@0 5113 FLAG_V = VFLAG_CLEAR;
philpem@0 5114 }
philpem@0 5115
philpem@0 5116
philpem@0 5117 M68KMAKE_OP(lsr, 16, r, .)
philpem@0 5118 {
philpem@0 5119 uint* r_dst = &DY;
philpem@0 5120 uint shift = DX & 0x3f;
philpem@0 5121 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 5122 uint res = src >> shift;
philpem@0 5123
philpem@0 5124 if(shift != 0)
philpem@0 5125 {
philpem@0 5126 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 5127
philpem@0 5128 if(shift <= 16)
philpem@0 5129 {
philpem@0 5130 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5131 FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
philpem@0 5132 FLAG_N = NFLAG_CLEAR;
philpem@0 5133 FLAG_Z = res;
philpem@0 5134 FLAG_V = VFLAG_CLEAR;
philpem@0 5135 return;
philpem@0 5136 }
philpem@0 5137
philpem@0 5138 *r_dst &= 0xffff0000;
philpem@0 5139 FLAG_X = XFLAG_CLEAR;
philpem@0 5140 FLAG_C = CFLAG_CLEAR;
philpem@0 5141 FLAG_N = NFLAG_CLEAR;
philpem@0 5142 FLAG_Z = ZFLAG_SET;
philpem@0 5143 FLAG_V = VFLAG_CLEAR;
philpem@0 5144 return;
philpem@0 5145 }
philpem@0 5146
philpem@0 5147 FLAG_C = CFLAG_CLEAR;
philpem@0 5148 FLAG_N = NFLAG_16(src);
philpem@0 5149 FLAG_Z = src;
philpem@0 5150 FLAG_V = VFLAG_CLEAR;
philpem@0 5151 }
philpem@0 5152
philpem@0 5153
philpem@0 5154 M68KMAKE_OP(lsr, 32, r, .)
philpem@0 5155 {
philpem@0 5156 uint* r_dst = &DY;
philpem@0 5157 uint shift = DX & 0x3f;
philpem@0 5158 uint src = *r_dst;
philpem@0 5159 uint res = src >> shift;
philpem@0 5160
philpem@0 5161 if(shift != 0)
philpem@0 5162 {
philpem@0 5163 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 5164
philpem@0 5165 if(shift < 32)
philpem@0 5166 {
philpem@0 5167 *r_dst = res;
philpem@0 5168 FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
philpem@0 5169 FLAG_N = NFLAG_CLEAR;
philpem@0 5170 FLAG_Z = res;
philpem@0 5171 FLAG_V = VFLAG_CLEAR;
philpem@0 5172 return;
philpem@0 5173 }
philpem@0 5174
philpem@0 5175 *r_dst = 0;
philpem@0 5176 FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0);
philpem@0 5177 FLAG_N = NFLAG_CLEAR;
philpem@0 5178 FLAG_Z = ZFLAG_SET;
philpem@0 5179 FLAG_V = VFLAG_CLEAR;
philpem@0 5180 return;
philpem@0 5181 }
philpem@0 5182
philpem@0 5183 FLAG_C = CFLAG_CLEAR;
philpem@0 5184 FLAG_N = NFLAG_32(src);
philpem@0 5185 FLAG_Z = src;
philpem@0 5186 FLAG_V = VFLAG_CLEAR;
philpem@0 5187 }
philpem@0 5188
philpem@0 5189
philpem@0 5190 M68KMAKE_OP(lsr, 16, ., .)
philpem@0 5191 {
philpem@0 5192 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 5193 uint src = m68ki_read_16(ea);
philpem@0 5194 uint res = src >> 1;
philpem@0 5195
philpem@0 5196 m68ki_write_16(ea, res);
philpem@0 5197
philpem@0 5198 FLAG_N = NFLAG_CLEAR;
philpem@0 5199 FLAG_Z = res;
philpem@0 5200 FLAG_C = FLAG_X = src << 8;
philpem@0 5201 FLAG_V = VFLAG_CLEAR;
philpem@0 5202 }
philpem@0 5203
philpem@0 5204
philpem@0 5205 M68KMAKE_OP(lsl, 8, s, .)
philpem@0 5206 {
philpem@0 5207 uint* r_dst = &DY;
philpem@0 5208 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 5209 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 5210 uint res = MASK_OUT_ABOVE_8(src << shift);
philpem@0 5211
philpem@0 5212 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 5213
philpem@0 5214 FLAG_N = NFLAG_8(res);
philpem@0 5215 FLAG_Z = res;
philpem@0 5216 FLAG_X = FLAG_C = src << shift;
philpem@0 5217 FLAG_V = VFLAG_CLEAR;
philpem@0 5218 }
philpem@0 5219
philpem@0 5220
philpem@0 5221 M68KMAKE_OP(lsl, 16, s, .)
philpem@0 5222 {
philpem@0 5223 uint* r_dst = &DY;
philpem@0 5224 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 5225 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 5226 uint res = MASK_OUT_ABOVE_16(src << shift);
philpem@0 5227
philpem@0 5228 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5229
philpem@0 5230 FLAG_N = NFLAG_16(res);
philpem@0 5231 FLAG_Z = res;
philpem@0 5232 FLAG_X = FLAG_C = src >> (8-shift);
philpem@0 5233 FLAG_V = VFLAG_CLEAR;
philpem@0 5234 }
philpem@0 5235
philpem@0 5236
philpem@0 5237 M68KMAKE_OP(lsl, 32, s, .)
philpem@0 5238 {
philpem@0 5239 uint* r_dst = &DY;
philpem@0 5240 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 5241 uint src = *r_dst;
philpem@0 5242 uint res = MASK_OUT_ABOVE_32(src << shift);
philpem@0 5243
philpem@0 5244 *r_dst = res;
philpem@0 5245
philpem@0 5246 FLAG_N = NFLAG_32(res);
philpem@0 5247 FLAG_Z = res;
philpem@0 5248 FLAG_X = FLAG_C = src >> (24-shift);
philpem@0 5249 FLAG_V = VFLAG_CLEAR;
philpem@0 5250 }
philpem@0 5251
philpem@0 5252
philpem@0 5253 M68KMAKE_OP(lsl, 8, r, .)
philpem@0 5254 {
philpem@0 5255 uint* r_dst = &DY;
philpem@0 5256 uint shift = DX & 0x3f;
philpem@0 5257 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 5258 uint res = MASK_OUT_ABOVE_8(src << shift);
philpem@0 5259
philpem@0 5260 if(shift != 0)
philpem@0 5261 {
philpem@0 5262 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 5263
philpem@0 5264 if(shift <= 8)
philpem@0 5265 {
philpem@0 5266 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 5267 FLAG_X = FLAG_C = src << shift;
philpem@0 5268 FLAG_N = NFLAG_8(res);
philpem@0 5269 FLAG_Z = res;
philpem@0 5270 FLAG_V = VFLAG_CLEAR;
philpem@0 5271 return;
philpem@0 5272 }
philpem@0 5273
philpem@0 5274 *r_dst &= 0xffffff00;
philpem@0 5275 FLAG_X = XFLAG_CLEAR;
philpem@0 5276 FLAG_C = CFLAG_CLEAR;
philpem@0 5277 FLAG_N = NFLAG_CLEAR;
philpem@0 5278 FLAG_Z = ZFLAG_SET;
philpem@0 5279 FLAG_V = VFLAG_CLEAR;
philpem@0 5280 return;
philpem@0 5281 }
philpem@0 5282
philpem@0 5283 FLAG_C = CFLAG_CLEAR;
philpem@0 5284 FLAG_N = NFLAG_8(src);
philpem@0 5285 FLAG_Z = src;
philpem@0 5286 FLAG_V = VFLAG_CLEAR;
philpem@0 5287 }
philpem@0 5288
philpem@0 5289
philpem@0 5290 M68KMAKE_OP(lsl, 16, r, .)
philpem@0 5291 {
philpem@0 5292 uint* r_dst = &DY;
philpem@0 5293 uint shift = DX & 0x3f;
philpem@0 5294 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 5295 uint res = MASK_OUT_ABOVE_16(src << shift);
philpem@0 5296
philpem@0 5297 if(shift != 0)
philpem@0 5298 {
philpem@0 5299 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 5300
philpem@0 5301 if(shift <= 16)
philpem@0 5302 {
philpem@0 5303 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5304 FLAG_X = FLAG_C = (src << shift) >> 8;
philpem@0 5305 FLAG_N = NFLAG_16(res);
philpem@0 5306 FLAG_Z = res;
philpem@0 5307 FLAG_V = VFLAG_CLEAR;
philpem@0 5308 return;
philpem@0 5309 }
philpem@0 5310
philpem@0 5311 *r_dst &= 0xffff0000;
philpem@0 5312 FLAG_X = XFLAG_CLEAR;
philpem@0 5313 FLAG_C = CFLAG_CLEAR;
philpem@0 5314 FLAG_N = NFLAG_CLEAR;
philpem@0 5315 FLAG_Z = ZFLAG_SET;
philpem@0 5316 FLAG_V = VFLAG_CLEAR;
philpem@0 5317 return;
philpem@0 5318 }
philpem@0 5319
philpem@0 5320 FLAG_C = CFLAG_CLEAR;
philpem@0 5321 FLAG_N = NFLAG_16(src);
philpem@0 5322 FLAG_Z = src;
philpem@0 5323 FLAG_V = VFLAG_CLEAR;
philpem@0 5324 }
philpem@0 5325
philpem@0 5326
philpem@0 5327 M68KMAKE_OP(lsl, 32, r, .)
philpem@0 5328 {
philpem@0 5329 uint* r_dst = &DY;
philpem@0 5330 uint shift = DX & 0x3f;
philpem@0 5331 uint src = *r_dst;
philpem@0 5332 uint res = MASK_OUT_ABOVE_32(src << shift);
philpem@0 5333
philpem@0 5334 if(shift != 0)
philpem@0 5335 {
philpem@0 5336 USE_CYCLES(shift<<CYC_SHIFT);
philpem@0 5337
philpem@0 5338 if(shift < 32)
philpem@0 5339 {
philpem@0 5340 *r_dst = res;
philpem@0 5341 FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
philpem@0 5342 FLAG_N = NFLAG_32(res);
philpem@0 5343 FLAG_Z = res;
philpem@0 5344 FLAG_V = VFLAG_CLEAR;
philpem@0 5345 return;
philpem@0 5346 }
philpem@0 5347
philpem@0 5348 *r_dst = 0;
philpem@0 5349 FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
philpem@0 5350 FLAG_N = NFLAG_CLEAR;
philpem@0 5351 FLAG_Z = ZFLAG_SET;
philpem@0 5352 FLAG_V = VFLAG_CLEAR;
philpem@0 5353 return;
philpem@0 5354 }
philpem@0 5355
philpem@0 5356 FLAG_C = CFLAG_CLEAR;
philpem@0 5357 FLAG_N = NFLAG_32(src);
philpem@0 5358 FLAG_Z = src;
philpem@0 5359 FLAG_V = VFLAG_CLEAR;
philpem@0 5360 }
philpem@0 5361
philpem@0 5362
philpem@0 5363 M68KMAKE_OP(lsl, 16, ., .)
philpem@0 5364 {
philpem@0 5365 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 5366 uint src = m68ki_read_16(ea);
philpem@0 5367 uint res = MASK_OUT_ABOVE_16(src << 1);
philpem@0 5368
philpem@0 5369 m68ki_write_16(ea, res);
philpem@0 5370
philpem@0 5371 FLAG_N = NFLAG_16(res);
philpem@0 5372 FLAG_Z = res;
philpem@0 5373 FLAG_X = FLAG_C = src >> 7;
philpem@0 5374 FLAG_V = VFLAG_CLEAR;
philpem@0 5375 }
philpem@0 5376
philpem@0 5377
philpem@0 5378 M68KMAKE_OP(move, 8, d, d)
philpem@0 5379 {
philpem@0 5380 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5381 uint* r_dst = &DX;
philpem@0 5382
philpem@0 5383 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 5384
philpem@0 5385 FLAG_N = NFLAG_8(res);
philpem@0 5386 FLAG_Z = res;
philpem@0 5387 FLAG_V = VFLAG_CLEAR;
philpem@0 5388 FLAG_C = CFLAG_CLEAR;
philpem@0 5389 }
philpem@0 5390
philpem@0 5391
philpem@0 5392 M68KMAKE_OP(move, 8, d, .)
philpem@0 5393 {
philpem@0 5394 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5395 uint* r_dst = &DX;
philpem@0 5396
philpem@0 5397 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 5398
philpem@0 5399 FLAG_N = NFLAG_8(res);
philpem@0 5400 FLAG_Z = res;
philpem@0 5401 FLAG_V = VFLAG_CLEAR;
philpem@0 5402 FLAG_C = CFLAG_CLEAR;
philpem@0 5403 }
philpem@0 5404
philpem@0 5405
philpem@0 5406 M68KMAKE_OP(move, 8, ai, d)
philpem@0 5407 {
philpem@0 5408 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5409 uint ea = EA_AX_AI_8();
philpem@0 5410
philpem@0 5411 m68ki_write_8(ea, res);
philpem@0 5412
philpem@0 5413 FLAG_N = NFLAG_8(res);
philpem@0 5414 FLAG_Z = res;
philpem@0 5415 FLAG_V = VFLAG_CLEAR;
philpem@0 5416 FLAG_C = CFLAG_CLEAR;
philpem@0 5417 }
philpem@0 5418
philpem@0 5419
philpem@0 5420 M68KMAKE_OP(move, 8, ai, .)
philpem@0 5421 {
philpem@0 5422 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5423 uint ea = EA_AX_AI_8();
philpem@0 5424
philpem@0 5425 m68ki_write_8(ea, res);
philpem@0 5426
philpem@0 5427 FLAG_N = NFLAG_8(res);
philpem@0 5428 FLAG_Z = res;
philpem@0 5429 FLAG_V = VFLAG_CLEAR;
philpem@0 5430 FLAG_C = CFLAG_CLEAR;
philpem@0 5431 }
philpem@0 5432
philpem@0 5433
philpem@0 5434 M68KMAKE_OP(move, 8, pi7, d)
philpem@0 5435 {
philpem@0 5436 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5437 uint ea = EA_A7_PI_8();
philpem@0 5438
philpem@0 5439 m68ki_write_8(ea, res);
philpem@0 5440
philpem@0 5441 FLAG_N = NFLAG_8(res);
philpem@0 5442 FLAG_Z = res;
philpem@0 5443 FLAG_V = VFLAG_CLEAR;
philpem@0 5444 FLAG_C = CFLAG_CLEAR;
philpem@0 5445 }
philpem@0 5446
philpem@0 5447
philpem@0 5448 M68KMAKE_OP(move, 8, pi, d)
philpem@0 5449 {
philpem@0 5450 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5451 uint ea = EA_AX_PI_8();
philpem@0 5452
philpem@0 5453 m68ki_write_8(ea, res);
philpem@0 5454
philpem@0 5455 FLAG_N = NFLAG_8(res);
philpem@0 5456 FLAG_Z = res;
philpem@0 5457 FLAG_V = VFLAG_CLEAR;
philpem@0 5458 FLAG_C = CFLAG_CLEAR;
philpem@0 5459 }
philpem@0 5460
philpem@0 5461
philpem@0 5462 M68KMAKE_OP(move, 8, pi7, .)
philpem@0 5463 {
philpem@0 5464 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5465 uint ea = EA_A7_PI_8();
philpem@0 5466
philpem@0 5467 m68ki_write_8(ea, res);
philpem@0 5468
philpem@0 5469 FLAG_N = NFLAG_8(res);
philpem@0 5470 FLAG_Z = res;
philpem@0 5471 FLAG_V = VFLAG_CLEAR;
philpem@0 5472 FLAG_C = CFLAG_CLEAR;
philpem@0 5473 }
philpem@0 5474
philpem@0 5475
philpem@0 5476 M68KMAKE_OP(move, 8, pi, .)
philpem@0 5477 {
philpem@0 5478 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5479 uint ea = EA_AX_PI_8();
philpem@0 5480
philpem@0 5481 m68ki_write_8(ea, res);
philpem@0 5482
philpem@0 5483 FLAG_N = NFLAG_8(res);
philpem@0 5484 FLAG_Z = res;
philpem@0 5485 FLAG_V = VFLAG_CLEAR;
philpem@0 5486 FLAG_C = CFLAG_CLEAR;
philpem@0 5487 }
philpem@0 5488
philpem@0 5489
philpem@0 5490 M68KMAKE_OP(move, 8, pd7, d)
philpem@0 5491 {
philpem@0 5492 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5493 uint ea = EA_A7_PD_8();
philpem@0 5494
philpem@0 5495 m68ki_write_8(ea, res);
philpem@0 5496
philpem@0 5497 FLAG_N = NFLAG_8(res);
philpem@0 5498 FLAG_Z = res;
philpem@0 5499 FLAG_V = VFLAG_CLEAR;
philpem@0 5500 FLAG_C = CFLAG_CLEAR;
philpem@0 5501 }
philpem@0 5502
philpem@0 5503
philpem@0 5504 M68KMAKE_OP(move, 8, pd, d)
philpem@0 5505 {
philpem@0 5506 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5507 uint ea = EA_AX_PD_8();
philpem@0 5508
philpem@0 5509 m68ki_write_8(ea, res);
philpem@0 5510
philpem@0 5511 FLAG_N = NFLAG_8(res);
philpem@0 5512 FLAG_Z = res;
philpem@0 5513 FLAG_V = VFLAG_CLEAR;
philpem@0 5514 FLAG_C = CFLAG_CLEAR;
philpem@0 5515 }
philpem@0 5516
philpem@0 5517
philpem@0 5518 M68KMAKE_OP(move, 8, pd7, .)
philpem@0 5519 {
philpem@0 5520 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5521 uint ea = EA_A7_PD_8();
philpem@0 5522
philpem@0 5523 m68ki_write_8(ea, res);
philpem@0 5524
philpem@0 5525 FLAG_N = NFLAG_8(res);
philpem@0 5526 FLAG_Z = res;
philpem@0 5527 FLAG_V = VFLAG_CLEAR;
philpem@0 5528 FLAG_C = CFLAG_CLEAR;
philpem@0 5529 }
philpem@0 5530
philpem@0 5531
philpem@0 5532 M68KMAKE_OP(move, 8, pd, .)
philpem@0 5533 {
philpem@0 5534 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5535 uint ea = EA_AX_PD_8();
philpem@0 5536
philpem@0 5537 m68ki_write_8(ea, res);
philpem@0 5538
philpem@0 5539 FLAG_N = NFLAG_8(res);
philpem@0 5540 FLAG_Z = res;
philpem@0 5541 FLAG_V = VFLAG_CLEAR;
philpem@0 5542 FLAG_C = CFLAG_CLEAR;
philpem@0 5543 }
philpem@0 5544
philpem@0 5545
philpem@0 5546 M68KMAKE_OP(move, 8, di, d)
philpem@0 5547 {
philpem@0 5548 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5549 uint ea = EA_AX_DI_8();
philpem@0 5550
philpem@0 5551 m68ki_write_8(ea, res);
philpem@0 5552
philpem@0 5553 FLAG_N = NFLAG_8(res);
philpem@0 5554 FLAG_Z = res;
philpem@0 5555 FLAG_V = VFLAG_CLEAR;
philpem@0 5556 FLAG_C = CFLAG_CLEAR;
philpem@0 5557 }
philpem@0 5558
philpem@0 5559
philpem@0 5560 M68KMAKE_OP(move, 8, di, .)
philpem@0 5561 {
philpem@0 5562 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5563 uint ea = EA_AX_DI_8();
philpem@0 5564
philpem@0 5565 m68ki_write_8(ea, res);
philpem@0 5566
philpem@0 5567 FLAG_N = NFLAG_8(res);
philpem@0 5568 FLAG_Z = res;
philpem@0 5569 FLAG_V = VFLAG_CLEAR;
philpem@0 5570 FLAG_C = CFLAG_CLEAR;
philpem@0 5571 }
philpem@0 5572
philpem@0 5573
philpem@0 5574 M68KMAKE_OP(move, 8, ix, d)
philpem@0 5575 {
philpem@0 5576 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5577 uint ea = EA_AX_IX_8();
philpem@0 5578
philpem@0 5579 m68ki_write_8(ea, res);
philpem@0 5580
philpem@0 5581 FLAG_N = NFLAG_8(res);
philpem@0 5582 FLAG_Z = res;
philpem@0 5583 FLAG_V = VFLAG_CLEAR;
philpem@0 5584 FLAG_C = CFLAG_CLEAR;
philpem@0 5585 }
philpem@0 5586
philpem@0 5587
philpem@0 5588 M68KMAKE_OP(move, 8, ix, .)
philpem@0 5589 {
philpem@0 5590 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5591 uint ea = EA_AX_IX_8();
philpem@0 5592
philpem@0 5593 m68ki_write_8(ea, res);
philpem@0 5594
philpem@0 5595 FLAG_N = NFLAG_8(res);
philpem@0 5596 FLAG_Z = res;
philpem@0 5597 FLAG_V = VFLAG_CLEAR;
philpem@0 5598 FLAG_C = CFLAG_CLEAR;
philpem@0 5599 }
philpem@0 5600
philpem@0 5601
philpem@0 5602 M68KMAKE_OP(move, 8, aw, d)
philpem@0 5603 {
philpem@0 5604 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5605 uint ea = EA_AW_8();
philpem@0 5606
philpem@0 5607 m68ki_write_8(ea, res);
philpem@0 5608
philpem@0 5609 FLAG_N = NFLAG_8(res);
philpem@0 5610 FLAG_Z = res;
philpem@0 5611 FLAG_V = VFLAG_CLEAR;
philpem@0 5612 FLAG_C = CFLAG_CLEAR;
philpem@0 5613 }
philpem@0 5614
philpem@0 5615
philpem@0 5616 M68KMAKE_OP(move, 8, aw, .)
philpem@0 5617 {
philpem@0 5618 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5619 uint ea = EA_AW_8();
philpem@0 5620
philpem@0 5621 m68ki_write_8(ea, res);
philpem@0 5622
philpem@0 5623 FLAG_N = NFLAG_8(res);
philpem@0 5624 FLAG_Z = res;
philpem@0 5625 FLAG_V = VFLAG_CLEAR;
philpem@0 5626 FLAG_C = CFLAG_CLEAR;
philpem@0 5627 }
philpem@0 5628
philpem@0 5629
philpem@0 5630 M68KMAKE_OP(move, 8, al, d)
philpem@0 5631 {
philpem@0 5632 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 5633 uint ea = EA_AL_8();
philpem@0 5634
philpem@0 5635 m68ki_write_8(ea, res);
philpem@0 5636
philpem@0 5637 FLAG_N = NFLAG_8(res);
philpem@0 5638 FLAG_Z = res;
philpem@0 5639 FLAG_V = VFLAG_CLEAR;
philpem@0 5640 FLAG_C = CFLAG_CLEAR;
philpem@0 5641 }
philpem@0 5642
philpem@0 5643
philpem@0 5644 M68KMAKE_OP(move, 8, al, .)
philpem@0 5645 {
philpem@0 5646 uint res = M68KMAKE_GET_OPER_AY_8;
philpem@0 5647 uint ea = EA_AL_8();
philpem@0 5648
philpem@0 5649 m68ki_write_8(ea, res);
philpem@0 5650
philpem@0 5651 FLAG_N = NFLAG_8(res);
philpem@0 5652 FLAG_Z = res;
philpem@0 5653 FLAG_V = VFLAG_CLEAR;
philpem@0 5654 FLAG_C = CFLAG_CLEAR;
philpem@0 5655 }
philpem@0 5656
philpem@0 5657
philpem@0 5658 M68KMAKE_OP(move, 16, d, d)
philpem@0 5659 {
philpem@0 5660 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5661 uint* r_dst = &DX;
philpem@0 5662
philpem@0 5663 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5664
philpem@0 5665 FLAG_N = NFLAG_16(res);
philpem@0 5666 FLAG_Z = res;
philpem@0 5667 FLAG_V = VFLAG_CLEAR;
philpem@0 5668 FLAG_C = CFLAG_CLEAR;
philpem@0 5669 }
philpem@0 5670
philpem@0 5671
philpem@0 5672 M68KMAKE_OP(move, 16, d, a)
philpem@0 5673 {
philpem@0 5674 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5675 uint* r_dst = &DX;
philpem@0 5676
philpem@0 5677 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5678
philpem@0 5679 FLAG_N = NFLAG_16(res);
philpem@0 5680 FLAG_Z = res;
philpem@0 5681 FLAG_V = VFLAG_CLEAR;
philpem@0 5682 FLAG_C = CFLAG_CLEAR;
philpem@0 5683 }
philpem@0 5684
philpem@0 5685
philpem@0 5686 M68KMAKE_OP(move, 16, d, .)
philpem@0 5687 {
philpem@0 5688 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5689 uint* r_dst = &DX;
philpem@0 5690
philpem@0 5691 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 5692
philpem@0 5693 FLAG_N = NFLAG_16(res);
philpem@0 5694 FLAG_Z = res;
philpem@0 5695 FLAG_V = VFLAG_CLEAR;
philpem@0 5696 FLAG_C = CFLAG_CLEAR;
philpem@0 5697 }
philpem@0 5698
philpem@0 5699
philpem@0 5700 M68KMAKE_OP(move, 16, ai, d)
philpem@0 5701 {
philpem@0 5702 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5703 uint ea = EA_AX_AI_16();
philpem@0 5704
philpem@0 5705 m68ki_write_16(ea, res);
philpem@0 5706
philpem@0 5707 FLAG_N = NFLAG_16(res);
philpem@0 5708 FLAG_Z = res;
philpem@0 5709 FLAG_V = VFLAG_CLEAR;
philpem@0 5710 FLAG_C = CFLAG_CLEAR;
philpem@0 5711 }
philpem@0 5712
philpem@0 5713
philpem@0 5714 M68KMAKE_OP(move, 16, ai, a)
philpem@0 5715 {
philpem@0 5716 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5717 uint ea = EA_AX_AI_16();
philpem@0 5718
philpem@0 5719 m68ki_write_16(ea, res);
philpem@0 5720
philpem@0 5721 FLAG_N = NFLAG_16(res);
philpem@0 5722 FLAG_Z = res;
philpem@0 5723 FLAG_V = VFLAG_CLEAR;
philpem@0 5724 FLAG_C = CFLAG_CLEAR;
philpem@0 5725 }
philpem@0 5726
philpem@0 5727
philpem@0 5728 M68KMAKE_OP(move, 16, ai, .)
philpem@0 5729 {
philpem@0 5730 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5731 uint ea = EA_AX_AI_16();
philpem@0 5732
philpem@0 5733 m68ki_write_16(ea, res);
philpem@0 5734
philpem@0 5735 FLAG_N = NFLAG_16(res);
philpem@0 5736 FLAG_Z = res;
philpem@0 5737 FLAG_V = VFLAG_CLEAR;
philpem@0 5738 FLAG_C = CFLAG_CLEAR;
philpem@0 5739 }
philpem@0 5740
philpem@0 5741
philpem@0 5742 M68KMAKE_OP(move, 16, pi, d)
philpem@0 5743 {
philpem@0 5744 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5745 uint ea = EA_AX_PI_16();
philpem@0 5746
philpem@0 5747 m68ki_write_16(ea, res);
philpem@0 5748
philpem@0 5749 FLAG_N = NFLAG_16(res);
philpem@0 5750 FLAG_Z = res;
philpem@0 5751 FLAG_V = VFLAG_CLEAR;
philpem@0 5752 FLAG_C = CFLAG_CLEAR;
philpem@0 5753 }
philpem@0 5754
philpem@0 5755
philpem@0 5756 M68KMAKE_OP(move, 16, pi, a)
philpem@0 5757 {
philpem@0 5758 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5759 uint ea = EA_AX_PI_16();
philpem@0 5760
philpem@0 5761 m68ki_write_16(ea, res);
philpem@0 5762
philpem@0 5763 FLAG_N = NFLAG_16(res);
philpem@0 5764 FLAG_Z = res;
philpem@0 5765 FLAG_V = VFLAG_CLEAR;
philpem@0 5766 FLAG_C = CFLAG_CLEAR;
philpem@0 5767 }
philpem@0 5768
philpem@0 5769
philpem@0 5770 M68KMAKE_OP(move, 16, pi, .)
philpem@0 5771 {
philpem@0 5772 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5773 uint ea = EA_AX_PI_16();
philpem@0 5774
philpem@0 5775 m68ki_write_16(ea, res);
philpem@0 5776
philpem@0 5777 FLAG_N = NFLAG_16(res);
philpem@0 5778 FLAG_Z = res;
philpem@0 5779 FLAG_V = VFLAG_CLEAR;
philpem@0 5780 FLAG_C = CFLAG_CLEAR;
philpem@0 5781 }
philpem@0 5782
philpem@0 5783
philpem@0 5784 M68KMAKE_OP(move, 16, pd, d)
philpem@0 5785 {
philpem@0 5786 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5787 uint ea = EA_AX_PD_16();
philpem@0 5788
philpem@0 5789 m68ki_write_16(ea, res);
philpem@0 5790
philpem@0 5791 FLAG_N = NFLAG_16(res);
philpem@0 5792 FLAG_Z = res;
philpem@0 5793 FLAG_V = VFLAG_CLEAR;
philpem@0 5794 FLAG_C = CFLAG_CLEAR;
philpem@0 5795 }
philpem@0 5796
philpem@0 5797
philpem@0 5798 M68KMAKE_OP(move, 16, pd, a)
philpem@0 5799 {
philpem@0 5800 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5801 uint ea = EA_AX_PD_16();
philpem@0 5802
philpem@0 5803 m68ki_write_16(ea, res);
philpem@0 5804
philpem@0 5805 FLAG_N = NFLAG_16(res);
philpem@0 5806 FLAG_Z = res;
philpem@0 5807 FLAG_V = VFLAG_CLEAR;
philpem@0 5808 FLAG_C = CFLAG_CLEAR;
philpem@0 5809 }
philpem@0 5810
philpem@0 5811
philpem@0 5812 M68KMAKE_OP(move, 16, pd, .)
philpem@0 5813 {
philpem@0 5814 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5815 uint ea = EA_AX_PD_16();
philpem@0 5816
philpem@0 5817 m68ki_write_16(ea, res);
philpem@0 5818
philpem@0 5819 FLAG_N = NFLAG_16(res);
philpem@0 5820 FLAG_Z = res;
philpem@0 5821 FLAG_V = VFLAG_CLEAR;
philpem@0 5822 FLAG_C = CFLAG_CLEAR;
philpem@0 5823 }
philpem@0 5824
philpem@0 5825
philpem@0 5826 M68KMAKE_OP(move, 16, di, d)
philpem@0 5827 {
philpem@0 5828 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5829 uint ea = EA_AX_DI_16();
philpem@0 5830
philpem@0 5831 m68ki_write_16(ea, res);
philpem@0 5832
philpem@0 5833 FLAG_N = NFLAG_16(res);
philpem@0 5834 FLAG_Z = res;
philpem@0 5835 FLAG_V = VFLAG_CLEAR;
philpem@0 5836 FLAG_C = CFLAG_CLEAR;
philpem@0 5837 }
philpem@0 5838
philpem@0 5839
philpem@0 5840 M68KMAKE_OP(move, 16, di, a)
philpem@0 5841 {
philpem@0 5842 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5843 uint ea = EA_AX_DI_16();
philpem@0 5844
philpem@0 5845 m68ki_write_16(ea, res);
philpem@0 5846
philpem@0 5847 FLAG_N = NFLAG_16(res);
philpem@0 5848 FLAG_Z = res;
philpem@0 5849 FLAG_V = VFLAG_CLEAR;
philpem@0 5850 FLAG_C = CFLAG_CLEAR;
philpem@0 5851 }
philpem@0 5852
philpem@0 5853
philpem@0 5854 M68KMAKE_OP(move, 16, di, .)
philpem@0 5855 {
philpem@0 5856 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5857 uint ea = EA_AX_DI_16();
philpem@0 5858
philpem@0 5859 m68ki_write_16(ea, res);
philpem@0 5860
philpem@0 5861 FLAG_N = NFLAG_16(res);
philpem@0 5862 FLAG_Z = res;
philpem@0 5863 FLAG_V = VFLAG_CLEAR;
philpem@0 5864 FLAG_C = CFLAG_CLEAR;
philpem@0 5865 }
philpem@0 5866
philpem@0 5867
philpem@0 5868 M68KMAKE_OP(move, 16, ix, d)
philpem@0 5869 {
philpem@0 5870 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5871 uint ea = EA_AX_IX_16();
philpem@0 5872
philpem@0 5873 m68ki_write_16(ea, res);
philpem@0 5874
philpem@0 5875 FLAG_N = NFLAG_16(res);
philpem@0 5876 FLAG_Z = res;
philpem@0 5877 FLAG_V = VFLAG_CLEAR;
philpem@0 5878 FLAG_C = CFLAG_CLEAR;
philpem@0 5879 }
philpem@0 5880
philpem@0 5881
philpem@0 5882 M68KMAKE_OP(move, 16, ix, a)
philpem@0 5883 {
philpem@0 5884 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5885 uint ea = EA_AX_IX_16();
philpem@0 5886
philpem@0 5887 m68ki_write_16(ea, res);
philpem@0 5888
philpem@0 5889 FLAG_N = NFLAG_16(res);
philpem@0 5890 FLAG_Z = res;
philpem@0 5891 FLAG_V = VFLAG_CLEAR;
philpem@0 5892 FLAG_C = CFLAG_CLEAR;
philpem@0 5893 }
philpem@0 5894
philpem@0 5895
philpem@0 5896 M68KMAKE_OP(move, 16, ix, .)
philpem@0 5897 {
philpem@0 5898 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5899 uint ea = EA_AX_IX_16();
philpem@0 5900
philpem@0 5901 m68ki_write_16(ea, res);
philpem@0 5902
philpem@0 5903 FLAG_N = NFLAG_16(res);
philpem@0 5904 FLAG_Z = res;
philpem@0 5905 FLAG_V = VFLAG_CLEAR;
philpem@0 5906 FLAG_C = CFLAG_CLEAR;
philpem@0 5907 }
philpem@0 5908
philpem@0 5909
philpem@0 5910 M68KMAKE_OP(move, 16, aw, d)
philpem@0 5911 {
philpem@0 5912 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5913 uint ea = EA_AW_16();
philpem@0 5914
philpem@0 5915 m68ki_write_16(ea, res);
philpem@0 5916
philpem@0 5917 FLAG_N = NFLAG_16(res);
philpem@0 5918 FLAG_Z = res;
philpem@0 5919 FLAG_V = VFLAG_CLEAR;
philpem@0 5920 FLAG_C = CFLAG_CLEAR;
philpem@0 5921 }
philpem@0 5922
philpem@0 5923
philpem@0 5924 M68KMAKE_OP(move, 16, aw, a)
philpem@0 5925 {
philpem@0 5926 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5927 uint ea = EA_AW_16();
philpem@0 5928
philpem@0 5929 m68ki_write_16(ea, res);
philpem@0 5930
philpem@0 5931 FLAG_N = NFLAG_16(res);
philpem@0 5932 FLAG_Z = res;
philpem@0 5933 FLAG_V = VFLAG_CLEAR;
philpem@0 5934 FLAG_C = CFLAG_CLEAR;
philpem@0 5935 }
philpem@0 5936
philpem@0 5937
philpem@0 5938 M68KMAKE_OP(move, 16, aw, .)
philpem@0 5939 {
philpem@0 5940 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5941 uint ea = EA_AW_16();
philpem@0 5942
philpem@0 5943 m68ki_write_16(ea, res);
philpem@0 5944
philpem@0 5945 FLAG_N = NFLAG_16(res);
philpem@0 5946 FLAG_Z = res;
philpem@0 5947 FLAG_V = VFLAG_CLEAR;
philpem@0 5948 FLAG_C = CFLAG_CLEAR;
philpem@0 5949 }
philpem@0 5950
philpem@0 5951
philpem@0 5952 M68KMAKE_OP(move, 16, al, d)
philpem@0 5953 {
philpem@0 5954 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 5955 uint ea = EA_AL_16();
philpem@0 5956
philpem@0 5957 m68ki_write_16(ea, res);
philpem@0 5958
philpem@0 5959 FLAG_N = NFLAG_16(res);
philpem@0 5960 FLAG_Z = res;
philpem@0 5961 FLAG_V = VFLAG_CLEAR;
philpem@0 5962 FLAG_C = CFLAG_CLEAR;
philpem@0 5963 }
philpem@0 5964
philpem@0 5965
philpem@0 5966 M68KMAKE_OP(move, 16, al, a)
philpem@0 5967 {
philpem@0 5968 uint res = MASK_OUT_ABOVE_16(AY);
philpem@0 5969 uint ea = EA_AL_16();
philpem@0 5970
philpem@0 5971 m68ki_write_16(ea, res);
philpem@0 5972
philpem@0 5973 FLAG_N = NFLAG_16(res);
philpem@0 5974 FLAG_Z = res;
philpem@0 5975 FLAG_V = VFLAG_CLEAR;
philpem@0 5976 FLAG_C = CFLAG_CLEAR;
philpem@0 5977 }
philpem@0 5978
philpem@0 5979
philpem@0 5980 M68KMAKE_OP(move, 16, al, .)
philpem@0 5981 {
philpem@0 5982 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 5983 uint ea = EA_AL_16();
philpem@0 5984
philpem@0 5985 m68ki_write_16(ea, res);
philpem@0 5986
philpem@0 5987 FLAG_N = NFLAG_16(res);
philpem@0 5988 FLAG_Z = res;
philpem@0 5989 FLAG_V = VFLAG_CLEAR;
philpem@0 5990 FLAG_C = CFLAG_CLEAR;
philpem@0 5991 }
philpem@0 5992
philpem@0 5993
philpem@0 5994 M68KMAKE_OP(move, 32, d, d)
philpem@0 5995 {
philpem@0 5996 uint res = DY;
philpem@0 5997 uint* r_dst = &DX;
philpem@0 5998
philpem@0 5999 *r_dst = res;
philpem@0 6000
philpem@0 6001 FLAG_N = NFLAG_32(res);
philpem@0 6002 FLAG_Z = res;
philpem@0 6003 FLAG_V = VFLAG_CLEAR;
philpem@0 6004 FLAG_C = CFLAG_CLEAR;
philpem@0 6005 }
philpem@0 6006
philpem@0 6007
philpem@0 6008 M68KMAKE_OP(move, 32, d, a)
philpem@0 6009 {
philpem@0 6010 uint res = AY;
philpem@0 6011 uint* r_dst = &DX;
philpem@0 6012
philpem@0 6013 *r_dst = res;
philpem@0 6014
philpem@0 6015 FLAG_N = NFLAG_32(res);
philpem@0 6016 FLAG_Z = res;
philpem@0 6017 FLAG_V = VFLAG_CLEAR;
philpem@0 6018 FLAG_C = CFLAG_CLEAR;
philpem@0 6019 }
philpem@0 6020
philpem@0 6021
philpem@0 6022 M68KMAKE_OP(move, 32, d, .)
philpem@0 6023 {
philpem@0 6024 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6025 uint* r_dst = &DX;
philpem@0 6026
philpem@0 6027 *r_dst = res;
philpem@0 6028
philpem@0 6029 FLAG_N = NFLAG_32(res);
philpem@0 6030 FLAG_Z = res;
philpem@0 6031 FLAG_V = VFLAG_CLEAR;
philpem@0 6032 FLAG_C = CFLAG_CLEAR;
philpem@0 6033 }
philpem@0 6034
philpem@0 6035
philpem@0 6036 M68KMAKE_OP(move, 32, ai, d)
philpem@0 6037 {
philpem@0 6038 uint res = DY;
philpem@0 6039 uint ea = EA_AX_AI_32();
philpem@0 6040
philpem@0 6041 m68ki_write_32(ea, res);
philpem@0 6042
philpem@0 6043 FLAG_N = NFLAG_32(res);
philpem@0 6044 FLAG_Z = res;
philpem@0 6045 FLAG_V = VFLAG_CLEAR;
philpem@0 6046 FLAG_C = CFLAG_CLEAR;
philpem@0 6047 }
philpem@0 6048
philpem@0 6049
philpem@0 6050 M68KMAKE_OP(move, 32, ai, a)
philpem@0 6051 {
philpem@0 6052 uint res = AY;
philpem@0 6053 uint ea = EA_AX_AI_32();
philpem@0 6054
philpem@0 6055 m68ki_write_32(ea, res);
philpem@0 6056
philpem@0 6057 FLAG_N = NFLAG_32(res);
philpem@0 6058 FLAG_Z = res;
philpem@0 6059 FLAG_V = VFLAG_CLEAR;
philpem@0 6060 FLAG_C = CFLAG_CLEAR;
philpem@0 6061 }
philpem@0 6062
philpem@0 6063
philpem@0 6064 M68KMAKE_OP(move, 32, ai, .)
philpem@0 6065 {
philpem@0 6066 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6067 uint ea = EA_AX_AI_32();
philpem@0 6068
philpem@0 6069 m68ki_write_32(ea, res);
philpem@0 6070
philpem@0 6071 FLAG_N = NFLAG_32(res);
philpem@0 6072 FLAG_Z = res;
philpem@0 6073 FLAG_V = VFLAG_CLEAR;
philpem@0 6074 FLAG_C = CFLAG_CLEAR;
philpem@0 6075 }
philpem@0 6076
philpem@0 6077
philpem@0 6078 M68KMAKE_OP(move, 32, pi, d)
philpem@0 6079 {
philpem@0 6080 uint res = DY;
philpem@0 6081 uint ea = EA_AX_PI_32();
philpem@0 6082
philpem@0 6083 m68ki_write_32(ea, res);
philpem@0 6084
philpem@0 6085 FLAG_N = NFLAG_32(res);
philpem@0 6086 FLAG_Z = res;
philpem@0 6087 FLAG_V = VFLAG_CLEAR;
philpem@0 6088 FLAG_C = CFLAG_CLEAR;
philpem@0 6089 }
philpem@0 6090
philpem@0 6091
philpem@0 6092 M68KMAKE_OP(move, 32, pi, a)
philpem@0 6093 {
philpem@0 6094 uint res = AY;
philpem@0 6095 uint ea = EA_AX_PI_32();
philpem@0 6096
philpem@0 6097 m68ki_write_32(ea, res);
philpem@0 6098
philpem@0 6099 FLAG_N = NFLAG_32(res);
philpem@0 6100 FLAG_Z = res;
philpem@0 6101 FLAG_V = VFLAG_CLEAR;
philpem@0 6102 FLAG_C = CFLAG_CLEAR;
philpem@0 6103 }
philpem@0 6104
philpem@0 6105
philpem@0 6106 M68KMAKE_OP(move, 32, pi, .)
philpem@0 6107 {
philpem@0 6108 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6109 uint ea = EA_AX_PI_32();
philpem@0 6110
philpem@0 6111 m68ki_write_32(ea, res);
philpem@0 6112
philpem@0 6113 FLAG_N = NFLAG_32(res);
philpem@0 6114 FLAG_Z = res;
philpem@0 6115 FLAG_V = VFLAG_CLEAR;
philpem@0 6116 FLAG_C = CFLAG_CLEAR;
philpem@0 6117 }
philpem@0 6118
philpem@0 6119
philpem@0 6120 M68KMAKE_OP(move, 32, pd, d)
philpem@0 6121 {
philpem@0 6122 uint res = DY;
philpem@0 6123 uint ea = EA_AX_PD_32();
philpem@0 6124
philpem@0 6125 m68ki_write_32(ea, res);
philpem@0 6126
philpem@0 6127 FLAG_N = NFLAG_32(res);
philpem@0 6128 FLAG_Z = res;
philpem@0 6129 FLAG_V = VFLAG_CLEAR;
philpem@0 6130 FLAG_C = CFLAG_CLEAR;
philpem@0 6131 }
philpem@0 6132
philpem@0 6133
philpem@0 6134 M68KMAKE_OP(move, 32, pd, a)
philpem@0 6135 {
philpem@0 6136 uint res = AY;
philpem@0 6137 uint ea = EA_AX_PD_32();
philpem@0 6138
philpem@0 6139 m68ki_write_32(ea, res);
philpem@0 6140
philpem@0 6141 FLAG_N = NFLAG_32(res);
philpem@0 6142 FLAG_Z = res;
philpem@0 6143 FLAG_V = VFLAG_CLEAR;
philpem@0 6144 FLAG_C = CFLAG_CLEAR;
philpem@0 6145 }
philpem@0 6146
philpem@0 6147
philpem@0 6148 M68KMAKE_OP(move, 32, pd, .)
philpem@0 6149 {
philpem@0 6150 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6151 uint ea = EA_AX_PD_32();
philpem@0 6152
philpem@0 6153 m68ki_write_32(ea, res);
philpem@0 6154
philpem@0 6155 FLAG_N = NFLAG_32(res);
philpem@0 6156 FLAG_Z = res;
philpem@0 6157 FLAG_V = VFLAG_CLEAR;
philpem@0 6158 FLAG_C = CFLAG_CLEAR;
philpem@0 6159 }
philpem@0 6160
philpem@0 6161
philpem@0 6162 M68KMAKE_OP(move, 32, di, d)
philpem@0 6163 {
philpem@0 6164 uint res = DY;
philpem@0 6165 uint ea = EA_AX_DI_32();
philpem@0 6166
philpem@0 6167 m68ki_write_32(ea, res);
philpem@0 6168
philpem@0 6169 FLAG_N = NFLAG_32(res);
philpem@0 6170 FLAG_Z = res;
philpem@0 6171 FLAG_V = VFLAG_CLEAR;
philpem@0 6172 FLAG_C = CFLAG_CLEAR;
philpem@0 6173 }
philpem@0 6174
philpem@0 6175
philpem@0 6176 M68KMAKE_OP(move, 32, di, a)
philpem@0 6177 {
philpem@0 6178 uint res = AY;
philpem@0 6179 uint ea = EA_AX_DI_32();
philpem@0 6180
philpem@0 6181 m68ki_write_32(ea, res);
philpem@0 6182
philpem@0 6183 FLAG_N = NFLAG_32(res);
philpem@0 6184 FLAG_Z = res;
philpem@0 6185 FLAG_V = VFLAG_CLEAR;
philpem@0 6186 FLAG_C = CFLAG_CLEAR;
philpem@0 6187 }
philpem@0 6188
philpem@0 6189
philpem@0 6190 M68KMAKE_OP(move, 32, di, .)
philpem@0 6191 {
philpem@0 6192 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6193 uint ea = EA_AX_DI_32();
philpem@0 6194
philpem@0 6195 m68ki_write_32(ea, res);
philpem@0 6196
philpem@0 6197 FLAG_N = NFLAG_32(res);
philpem@0 6198 FLAG_Z = res;
philpem@0 6199 FLAG_V = VFLAG_CLEAR;
philpem@0 6200 FLAG_C = CFLAG_CLEAR;
philpem@0 6201 }
philpem@0 6202
philpem@0 6203
philpem@0 6204 M68KMAKE_OP(move, 32, ix, d)
philpem@0 6205 {
philpem@0 6206 uint res = DY;
philpem@0 6207 uint ea = EA_AX_IX_32();
philpem@0 6208
philpem@0 6209 m68ki_write_32(ea, res);
philpem@0 6210
philpem@0 6211 FLAG_N = NFLAG_32(res);
philpem@0 6212 FLAG_Z = res;
philpem@0 6213 FLAG_V = VFLAG_CLEAR;
philpem@0 6214 FLAG_C = CFLAG_CLEAR;
philpem@0 6215 }
philpem@0 6216
philpem@0 6217
philpem@0 6218 M68KMAKE_OP(move, 32, ix, a)
philpem@0 6219 {
philpem@0 6220 uint res = AY;
philpem@0 6221 uint ea = EA_AX_IX_32();
philpem@0 6222
philpem@0 6223 m68ki_write_32(ea, res);
philpem@0 6224
philpem@0 6225 FLAG_N = NFLAG_32(res);
philpem@0 6226 FLAG_Z = res;
philpem@0 6227 FLAG_V = VFLAG_CLEAR;
philpem@0 6228 FLAG_C = CFLAG_CLEAR;
philpem@0 6229 }
philpem@0 6230
philpem@0 6231
philpem@0 6232 M68KMAKE_OP(move, 32, ix, .)
philpem@0 6233 {
philpem@0 6234 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6235 uint ea = EA_AX_IX_32();
philpem@0 6236
philpem@0 6237 m68ki_write_32(ea, res);
philpem@0 6238
philpem@0 6239 FLAG_N = NFLAG_32(res);
philpem@0 6240 FLAG_Z = res;
philpem@0 6241 FLAG_V = VFLAG_CLEAR;
philpem@0 6242 FLAG_C = CFLAG_CLEAR;
philpem@0 6243 }
philpem@0 6244
philpem@0 6245
philpem@0 6246 M68KMAKE_OP(move, 32, aw, d)
philpem@0 6247 {
philpem@0 6248 uint res = DY;
philpem@0 6249 uint ea = EA_AW_32();
philpem@0 6250
philpem@0 6251 m68ki_write_32(ea, res);
philpem@0 6252
philpem@0 6253 FLAG_N = NFLAG_32(res);
philpem@0 6254 FLAG_Z = res;
philpem@0 6255 FLAG_V = VFLAG_CLEAR;
philpem@0 6256 FLAG_C = CFLAG_CLEAR;
philpem@0 6257 }
philpem@0 6258
philpem@0 6259
philpem@0 6260 M68KMAKE_OP(move, 32, aw, a)
philpem@0 6261 {
philpem@0 6262 uint res = AY;
philpem@0 6263 uint ea = EA_AW_32();
philpem@0 6264
philpem@0 6265 m68ki_write_32(ea, res);
philpem@0 6266
philpem@0 6267 FLAG_N = NFLAG_32(res);
philpem@0 6268 FLAG_Z = res;
philpem@0 6269 FLAG_V = VFLAG_CLEAR;
philpem@0 6270 FLAG_C = CFLAG_CLEAR;
philpem@0 6271 }
philpem@0 6272
philpem@0 6273
philpem@0 6274 M68KMAKE_OP(move, 32, aw, .)
philpem@0 6275 {
philpem@0 6276 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6277 uint ea = EA_AW_32();
philpem@0 6278
philpem@0 6279 m68ki_write_32(ea, res);
philpem@0 6280
philpem@0 6281 FLAG_N = NFLAG_32(res);
philpem@0 6282 FLAG_Z = res;
philpem@0 6283 FLAG_V = VFLAG_CLEAR;
philpem@0 6284 FLAG_C = CFLAG_CLEAR;
philpem@0 6285 }
philpem@0 6286
philpem@0 6287
philpem@0 6288 M68KMAKE_OP(move, 32, al, d)
philpem@0 6289 {
philpem@0 6290 uint res = DY;
philpem@0 6291 uint ea = EA_AL_32();
philpem@0 6292
philpem@0 6293 m68ki_write_32(ea, res);
philpem@0 6294
philpem@0 6295 FLAG_N = NFLAG_32(res);
philpem@0 6296 FLAG_Z = res;
philpem@0 6297 FLAG_V = VFLAG_CLEAR;
philpem@0 6298 FLAG_C = CFLAG_CLEAR;
philpem@0 6299 }
philpem@0 6300
philpem@0 6301
philpem@0 6302 M68KMAKE_OP(move, 32, al, a)
philpem@0 6303 {
philpem@0 6304 uint res = AY;
philpem@0 6305 uint ea = EA_AL_32();
philpem@0 6306
philpem@0 6307 m68ki_write_32(ea, res);
philpem@0 6308
philpem@0 6309 FLAG_N = NFLAG_32(res);
philpem@0 6310 FLAG_Z = res;
philpem@0 6311 FLAG_V = VFLAG_CLEAR;
philpem@0 6312 FLAG_C = CFLAG_CLEAR;
philpem@0 6313 }
philpem@0 6314
philpem@0 6315
philpem@0 6316 M68KMAKE_OP(move, 32, al, .)
philpem@0 6317 {
philpem@0 6318 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 6319 uint ea = EA_AL_32();
philpem@0 6320
philpem@0 6321 m68ki_write_32(ea, res);
philpem@0 6322
philpem@0 6323 FLAG_N = NFLAG_32(res);
philpem@0 6324 FLAG_Z = res;
philpem@0 6325 FLAG_V = VFLAG_CLEAR;
philpem@0 6326 FLAG_C = CFLAG_CLEAR;
philpem@0 6327 }
philpem@0 6328
philpem@0 6329
philpem@0 6330 M68KMAKE_OP(movea, 16, ., d)
philpem@0 6331 {
philpem@0 6332 AX = MAKE_INT_16(DY);
philpem@0 6333 }
philpem@0 6334
philpem@0 6335
philpem@0 6336 M68KMAKE_OP(movea, 16, ., a)
philpem@0 6337 {
philpem@0 6338 AX = MAKE_INT_16(AY);
philpem@0 6339 }
philpem@0 6340
philpem@0 6341
philpem@0 6342 M68KMAKE_OP(movea, 16, ., .)
philpem@0 6343 {
philpem@0 6344 AX = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
philpem@0 6345 }
philpem@0 6346
philpem@0 6347
philpem@0 6348 M68KMAKE_OP(movea, 32, ., d)
philpem@0 6349 {
philpem@0 6350 AX = DY;
philpem@0 6351 }
philpem@0 6352
philpem@0 6353
philpem@0 6354 M68KMAKE_OP(movea, 32, ., a)
philpem@0 6355 {
philpem@0 6356 AX = AY;
philpem@0 6357 }
philpem@0 6358
philpem@0 6359
philpem@0 6360 M68KMAKE_OP(movea, 32, ., .)
philpem@0 6361 {
philpem@0 6362 AX = M68KMAKE_GET_OPER_AY_32;
philpem@0 6363 }
philpem@0 6364
philpem@0 6365
philpem@0 6366 M68KMAKE_OP(move, 16, frc, d)
philpem@0 6367 {
philpem@0 6368 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6369 {
philpem@0 6370 DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr();
philpem@0 6371 return;
philpem@0 6372 }
philpem@0 6373 m68ki_exception_illegal();
philpem@0 6374 }
philpem@0 6375
philpem@0 6376
philpem@0 6377 M68KMAKE_OP(move, 16, frc, .)
philpem@0 6378 {
philpem@0 6379 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6380 {
philpem@0 6381 m68ki_write_16(M68KMAKE_GET_EA_AY_16, m68ki_get_ccr());
philpem@0 6382 return;
philpem@0 6383 }
philpem@0 6384 m68ki_exception_illegal();
philpem@0 6385 }
philpem@0 6386
philpem@0 6387
philpem@0 6388 M68KMAKE_OP(move, 16, toc, d)
philpem@0 6389 {
philpem@0 6390 m68ki_set_ccr(DY);
philpem@0 6391 }
philpem@0 6392
philpem@0 6393
philpem@0 6394 M68KMAKE_OP(move, 16, toc, .)
philpem@0 6395 {
philpem@0 6396 m68ki_set_ccr(M68KMAKE_GET_OPER_AY_16);
philpem@0 6397 }
philpem@0 6398
philpem@0 6399
philpem@0 6400 M68KMAKE_OP(move, 16, frs, d)
philpem@0 6401 {
philpem@0 6402 if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
philpem@0 6403 {
philpem@0 6404 DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr();
philpem@0 6405 return;
philpem@0 6406 }
philpem@0 6407 m68ki_exception_privilege_violation();
philpem@0 6408 }
philpem@0 6409
philpem@0 6410
philpem@0 6411 M68KMAKE_OP(move, 16, frs, .)
philpem@0 6412 {
philpem@0 6413 if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
philpem@0 6414 {
philpem@0 6415 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 6416 m68ki_write_16(ea, m68ki_get_sr());
philpem@0 6417 return;
philpem@0 6418 }
philpem@0 6419 m68ki_exception_privilege_violation();
philpem@0 6420 }
philpem@0 6421
philpem@0 6422
philpem@0 6423 M68KMAKE_OP(move, 16, tos, d)
philpem@0 6424 {
philpem@0 6425 if(FLAG_S)
philpem@0 6426 {
philpem@0 6427 m68ki_set_sr(DY);
philpem@0 6428 return;
philpem@0 6429 }
philpem@0 6430 m68ki_exception_privilege_violation();
philpem@0 6431 }
philpem@0 6432
philpem@0 6433
philpem@0 6434 M68KMAKE_OP(move, 16, tos, .)
philpem@0 6435 {
philpem@0 6436 if(FLAG_S)
philpem@0 6437 {
philpem@0 6438 uint new_sr = M68KMAKE_GET_OPER_AY_16;
philpem@0 6439 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6440 m68ki_set_sr(new_sr);
philpem@0 6441 return;
philpem@0 6442 }
philpem@0 6443 m68ki_exception_privilege_violation();
philpem@0 6444 }
philpem@0 6445
philpem@0 6446
philpem@0 6447 M68KMAKE_OP(move, 32, fru, .)
philpem@0 6448 {
philpem@0 6449 if(FLAG_S)
philpem@0 6450 {
philpem@0 6451 AY = REG_USP;
philpem@0 6452 return;
philpem@0 6453 }
philpem@0 6454 m68ki_exception_privilege_violation();
philpem@0 6455 }
philpem@0 6456
philpem@0 6457
philpem@0 6458 M68KMAKE_OP(move, 32, tou, .)
philpem@0 6459 {
philpem@0 6460 if(FLAG_S)
philpem@0 6461 {
philpem@0 6462 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6463 REG_USP = AY;
philpem@0 6464 return;
philpem@0 6465 }
philpem@0 6466 m68ki_exception_privilege_violation();
philpem@0 6467 }
philpem@0 6468
philpem@0 6469
philpem@0 6470 M68KMAKE_OP(movec, 32, cr, .)
philpem@0 6471 {
philpem@0 6472 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6473 {
philpem@0 6474 if(FLAG_S)
philpem@0 6475 {
philpem@0 6476 uint word2 = OPER_I_16();
philpem@0 6477
philpem@0 6478 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6479 switch (word2 & 0xfff)
philpem@0 6480 {
philpem@0 6481 case 0x000: /* SFC */
philpem@0 6482 REG_DA[(word2 >> 12) & 15] = REG_SFC;
philpem@0 6483 return;
philpem@0 6484 case 0x001: /* DFC */
philpem@0 6485 REG_DA[(word2 >> 12) & 15] = REG_DFC;
philpem@0 6486 return;
philpem@0 6487 case 0x002: /* CACR */
philpem@0 6488 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6489 {
philpem@0 6490 REG_DA[(word2 >> 12) & 15] = REG_CACR;
philpem@0 6491 return;
philpem@0 6492 }
philpem@0 6493 return;
philpem@0 6494 case 0x800: /* USP */
philpem@0 6495 REG_DA[(word2 >> 12) & 15] = REG_USP;
philpem@0 6496 return;
philpem@0 6497 case 0x801: /* VBR */
philpem@0 6498 REG_DA[(word2 >> 12) & 15] = REG_VBR;
philpem@0 6499 return;
philpem@0 6500 case 0x802: /* CAAR */
philpem@0 6501 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6502 {
philpem@0 6503 REG_DA[(word2 >> 12) & 15] = REG_CAAR;
philpem@0 6504 return;
philpem@0 6505 }
philpem@0 6506 m68ki_exception_illegal();
philpem@0 6507 break;
philpem@0 6508 case 0x803: /* MSP */
philpem@0 6509 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6510 {
philpem@0 6511 REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP;
philpem@0 6512 return;
philpem@0 6513 }
philpem@0 6514 m68ki_exception_illegal();
philpem@0 6515 return;
philpem@0 6516 case 0x804: /* ISP */
philpem@0 6517 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6518 {
philpem@0 6519 REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP;
philpem@0 6520 return;
philpem@0 6521 }
philpem@0 6522 m68ki_exception_illegal();
philpem@0 6523 return;
philpem@0 6524 default:
philpem@0 6525 m68ki_exception_illegal();
philpem@0 6526 return;
philpem@0 6527 }
philpem@0 6528 }
philpem@0 6529 m68ki_exception_privilege_violation();
philpem@0 6530 return;
philpem@0 6531 }
philpem@0 6532 m68ki_exception_illegal();
philpem@0 6533 }
philpem@0 6534
philpem@0 6535
philpem@0 6536 M68KMAKE_OP(movec, 32, rc, .)
philpem@0 6537 {
philpem@0 6538 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6539 {
philpem@0 6540 if(FLAG_S)
philpem@0 6541 {
philpem@0 6542 uint word2 = OPER_I_16();
philpem@0 6543
philpem@0 6544 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6545 switch (word2 & 0xfff)
philpem@0 6546 {
philpem@0 6547 case 0x000: /* SFC */
philpem@0 6548 REG_SFC = REG_DA[(word2 >> 12) & 15] & 7;
philpem@0 6549 return;
philpem@0 6550 case 0x001: /* DFC */
philpem@0 6551 REG_DFC = REG_DA[(word2 >> 12) & 15] & 7;
philpem@0 6552 return;
philpem@0 6553 case 0x002: /* CACR */
philpem@0 6554 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6555 {
philpem@0 6556 REG_CACR = REG_DA[(word2 >> 12) & 15];
philpem@0 6557 return;
philpem@0 6558 }
philpem@0 6559 m68ki_exception_illegal();
philpem@0 6560 return;
philpem@0 6561 case 0x800: /* USP */
philpem@0 6562 REG_USP = REG_DA[(word2 >> 12) & 15];
philpem@0 6563 return;
philpem@0 6564 case 0x801: /* VBR */
philpem@0 6565 REG_VBR = REG_DA[(word2 >> 12) & 15];
philpem@0 6566 return;
philpem@0 6567 case 0x802: /* CAAR */
philpem@0 6568 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6569 {
philpem@0 6570 REG_CAAR = REG_DA[(word2 >> 12) & 15];
philpem@0 6571 return;
philpem@0 6572 }
philpem@0 6573 m68ki_exception_illegal();
philpem@0 6574 return;
philpem@0 6575 case 0x803: /* MSP */
philpem@0 6576 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6577 {
philpem@0 6578 /* we are in supervisor mode so just check for M flag */
philpem@0 6579 if(!FLAG_M)
philpem@0 6580 {
philpem@0 6581 REG_MSP = REG_DA[(word2 >> 12) & 15];
philpem@0 6582 return;
philpem@0 6583 }
philpem@0 6584 REG_SP = REG_DA[(word2 >> 12) & 15];
philpem@0 6585 return;
philpem@0 6586 }
philpem@0 6587 m68ki_exception_illegal();
philpem@0 6588 return;
philpem@0 6589 case 0x804: /* ISP */
philpem@0 6590 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6591 {
philpem@0 6592 if(!FLAG_M)
philpem@0 6593 {
philpem@0 6594 REG_SP = REG_DA[(word2 >> 12) & 15];
philpem@0 6595 return;
philpem@0 6596 }
philpem@0 6597 REG_ISP = REG_DA[(word2 >> 12) & 15];
philpem@0 6598 return;
philpem@0 6599 }
philpem@0 6600 m68ki_exception_illegal();
philpem@0 6601 return;
philpem@0 6602 default:
philpem@0 6603 m68ki_exception_illegal();
philpem@0 6604 return;
philpem@0 6605 }
philpem@0 6606 }
philpem@0 6607 m68ki_exception_privilege_violation();
philpem@0 6608 return;
philpem@0 6609 }
philpem@0 6610 m68ki_exception_illegal();
philpem@0 6611 }
philpem@0 6612
philpem@0 6613
philpem@0 6614 M68KMAKE_OP(movem, 16, re, pd)
philpem@0 6615 {
philpem@0 6616 uint i = 0;
philpem@0 6617 uint register_list = OPER_I_16();
philpem@0 6618 uint ea = AY;
philpem@0 6619 uint count = 0;
philpem@0 6620
philpem@0 6621 for(; i < 16; i++)
philpem@0 6622 if(register_list & (1 << i))
philpem@0 6623 {
philpem@0 6624 ea -= 2;
philpem@0 6625 m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i]));
philpem@0 6626 count++;
philpem@0 6627 }
philpem@0 6628 AY = ea;
philpem@0 6629
philpem@0 6630 USE_CYCLES(count<<CYC_MOVEM_W);
philpem@0 6631 }
philpem@0 6632
philpem@0 6633
philpem@0 6634 M68KMAKE_OP(movem, 16, re, .)
philpem@0 6635 {
philpem@0 6636 uint i = 0;
philpem@0 6637 uint register_list = OPER_I_16();
philpem@0 6638 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 6639 uint count = 0;
philpem@0 6640
philpem@0 6641 for(; i < 16; i++)
philpem@0 6642 if(register_list & (1 << i))
philpem@0 6643 {
philpem@0 6644 m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
philpem@0 6645 ea += 2;
philpem@0 6646 count++;
philpem@0 6647 }
philpem@0 6648
philpem@0 6649 USE_CYCLES(count<<CYC_MOVEM_W);
philpem@0 6650 }
philpem@0 6651
philpem@0 6652
philpem@0 6653 M68KMAKE_OP(movem, 32, re, pd)
philpem@0 6654 {
philpem@0 6655 uint i = 0;
philpem@0 6656 uint register_list = OPER_I_16();
philpem@0 6657 uint ea = AY;
philpem@0 6658 uint count = 0;
philpem@0 6659
philpem@0 6660 for(; i < 16; i++)
philpem@0 6661 if(register_list & (1 << i))
philpem@0 6662 {
philpem@0 6663 ea -= 4;
philpem@0 6664 m68ki_write_32(ea, REG_DA[15-i]);
philpem@0 6665 count++;
philpem@0 6666 }
philpem@0 6667 AY = ea;
philpem@0 6668
philpem@0 6669 USE_CYCLES(count<<CYC_MOVEM_L);
philpem@0 6670 }
philpem@0 6671
philpem@0 6672
philpem@0 6673 M68KMAKE_OP(movem, 32, re, .)
philpem@0 6674 {
philpem@0 6675 uint i = 0;
philpem@0 6676 uint register_list = OPER_I_16();
philpem@0 6677 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 6678 uint count = 0;
philpem@0 6679
philpem@0 6680 for(; i < 16; i++)
philpem@0 6681 if(register_list & (1 << i))
philpem@0 6682 {
philpem@0 6683 m68ki_write_32(ea, REG_DA[i]);
philpem@0 6684 ea += 4;
philpem@0 6685 count++;
philpem@0 6686 }
philpem@0 6687
philpem@0 6688 USE_CYCLES(count<<CYC_MOVEM_L);
philpem@0 6689 }
philpem@0 6690
philpem@0 6691
philpem@0 6692 M68KMAKE_OP(movem, 16, er, pi)
philpem@0 6693 {
philpem@0 6694 uint i = 0;
philpem@0 6695 uint register_list = OPER_I_16();
philpem@0 6696 uint ea = AY;
philpem@0 6697 uint count = 0;
philpem@0 6698
philpem@0 6699 for(; i < 16; i++)
philpem@0 6700 if(register_list & (1 << i))
philpem@0 6701 {
philpem@0 6702 REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
philpem@0 6703 ea += 2;
philpem@0 6704 count++;
philpem@0 6705 }
philpem@0 6706 AY = ea;
philpem@0 6707
philpem@0 6708 USE_CYCLES(count<<CYC_MOVEM_W);
philpem@0 6709 }
philpem@0 6710
philpem@0 6711
philpem@0 6712 M68KMAKE_OP(movem, 16, er, .)
philpem@0 6713 {
philpem@0 6714 uint i = 0;
philpem@0 6715 uint register_list = OPER_I_16();
philpem@0 6716 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 6717 uint count = 0;
philpem@0 6718
philpem@0 6719 for(; i < 16; i++)
philpem@0 6720 if(register_list & (1 << i))
philpem@0 6721 {
philpem@0 6722 REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
philpem@0 6723 ea += 2;
philpem@0 6724 count++;
philpem@0 6725 }
philpem@0 6726
philpem@0 6727 USE_CYCLES(count<<CYC_MOVEM_W);
philpem@0 6728 }
philpem@0 6729
philpem@0 6730
philpem@0 6731 M68KMAKE_OP(movem, 32, er, pi)
philpem@0 6732 {
philpem@0 6733 uint i = 0;
philpem@0 6734 uint register_list = OPER_I_16();
philpem@0 6735 uint ea = AY;
philpem@0 6736 uint count = 0;
philpem@0 6737
philpem@0 6738 for(; i < 16; i++)
philpem@0 6739 if(register_list & (1 << i))
philpem@0 6740 {
philpem@0 6741 REG_DA[i] = m68ki_read_32(ea);
philpem@0 6742 ea += 4;
philpem@0 6743 count++;
philpem@0 6744 }
philpem@0 6745 AY = ea;
philpem@0 6746
philpem@0 6747 USE_CYCLES(count<<CYC_MOVEM_L);
philpem@0 6748 }
philpem@0 6749
philpem@0 6750
philpem@0 6751 M68KMAKE_OP(movem, 32, er, .)
philpem@0 6752 {
philpem@0 6753 uint i = 0;
philpem@0 6754 uint register_list = OPER_I_16();
philpem@0 6755 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 6756 uint count = 0;
philpem@0 6757
philpem@0 6758 for(; i < 16; i++)
philpem@0 6759 if(register_list & (1 << i))
philpem@0 6760 {
philpem@0 6761 REG_DA[i] = m68ki_read_32(ea);
philpem@0 6762 ea += 4;
philpem@0 6763 count++;
philpem@0 6764 }
philpem@0 6765
philpem@0 6766 USE_CYCLES(count<<CYC_MOVEM_L);
philpem@0 6767 }
philpem@0 6768
philpem@0 6769
philpem@0 6770 M68KMAKE_OP(movep, 16, re, .)
philpem@0 6771 {
philpem@0 6772 uint ea = EA_AY_DI_16();
philpem@0 6773 uint src = DX;
philpem@0 6774
philpem@0 6775 m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 8));
philpem@0 6776 m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));
philpem@0 6777 }
philpem@0 6778
philpem@0 6779
philpem@0 6780 M68KMAKE_OP(movep, 32, re, .)
philpem@0 6781 {
philpem@0 6782 uint ea = EA_AY_DI_32();
philpem@0 6783 uint src = DX;
philpem@0 6784
philpem@0 6785 m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24));
philpem@0 6786 m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16));
philpem@0 6787 m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8));
philpem@0 6788 m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));
philpem@0 6789 }
philpem@0 6790
philpem@0 6791
philpem@0 6792 M68KMAKE_OP(movep, 16, er, .)
philpem@0 6793 {
philpem@0 6794 uint ea = EA_AY_DI_16();
philpem@0 6795 uint* r_dst = &DX;
philpem@0 6796
philpem@0 6797 *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2));
philpem@0 6798 }
philpem@0 6799
philpem@0 6800
philpem@0 6801 M68KMAKE_OP(movep, 32, er, .)
philpem@0 6802 {
philpem@0 6803 uint ea = EA_AY_DI_32();
philpem@0 6804
philpem@0 6805 DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16)
philpem@0 6806 + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6);
philpem@0 6807 }
philpem@0 6808
philpem@0 6809
philpem@0 6810 M68KMAKE_OP(moves, 8, ., .)
philpem@0 6811 {
philpem@0 6812 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6813 {
philpem@0 6814 if(FLAG_S)
philpem@0 6815 {
philpem@0 6816 uint word2 = OPER_I_16();
philpem@0 6817 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 6818
philpem@0 6819 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6820 if(BIT_B(word2)) /* Register to memory */
philpem@0 6821 {
philpem@0 6822 m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
philpem@0 6823 return;
philpem@0 6824 }
philpem@0 6825 if(BIT_F(word2)) /* Memory to address register */
philpem@0 6826 {
philpem@0 6827 REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
philpem@0 6828 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 6829 USE_CYCLES(2);
philpem@0 6830 return;
philpem@0 6831 }
philpem@0 6832 /* Memory to data register */
philpem@0 6833 REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
philpem@0 6834 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 6835 USE_CYCLES(2);
philpem@0 6836 return;
philpem@0 6837 }
philpem@0 6838 m68ki_exception_privilege_violation();
philpem@0 6839 return;
philpem@0 6840 }
philpem@0 6841 m68ki_exception_illegal();
philpem@0 6842 }
philpem@0 6843
philpem@0 6844
philpem@0 6845 M68KMAKE_OP(moves, 16, ., .)
philpem@0 6846 {
philpem@0 6847 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6848 {
philpem@0 6849 if(FLAG_S)
philpem@0 6850 {
philpem@0 6851 uint word2 = OPER_I_16();
philpem@0 6852 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 6853
philpem@0 6854 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6855 if(BIT_B(word2)) /* Register to memory */
philpem@0 6856 {
philpem@0 6857 m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
philpem@0 6858 return;
philpem@0 6859 }
philpem@0 6860 if(BIT_F(word2)) /* Memory to address register */
philpem@0 6861 {
philpem@0 6862 REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
philpem@0 6863 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 6864 USE_CYCLES(2);
philpem@0 6865 return;
philpem@0 6866 }
philpem@0 6867 /* Memory to data register */
philpem@0 6868 REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
philpem@0 6869 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 6870 USE_CYCLES(2);
philpem@0 6871 return;
philpem@0 6872 }
philpem@0 6873 m68ki_exception_privilege_violation();
philpem@0 6874 return;
philpem@0 6875 }
philpem@0 6876 m68ki_exception_illegal();
philpem@0 6877 }
philpem@0 6878
philpem@0 6879
philpem@0 6880 M68KMAKE_OP(moves, 32, ., .)
philpem@0 6881 {
philpem@0 6882 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 6883 {
philpem@0 6884 if(FLAG_S)
philpem@0 6885 {
philpem@0 6886 uint word2 = OPER_I_16();
philpem@0 6887 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 6888
philpem@0 6889 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 6890 if(BIT_B(word2)) /* Register to memory */
philpem@0 6891 {
philpem@0 6892 m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
philpem@0 6893 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 6894 USE_CYCLES(2);
philpem@0 6895 return;
philpem@0 6896 }
philpem@0 6897 /* Memory to register */
philpem@0 6898 REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
philpem@0 6899 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 6900 USE_CYCLES(2);
philpem@0 6901 return;
philpem@0 6902 }
philpem@0 6903 m68ki_exception_privilege_violation();
philpem@0 6904 return;
philpem@0 6905 }
philpem@0 6906 m68ki_exception_illegal();
philpem@0 6907 }
philpem@0 6908
philpem@0 6909
philpem@0 6910 M68KMAKE_OP(moveq, 32, ., .)
philpem@0 6911 {
philpem@0 6912 uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR));
philpem@0 6913
philpem@0 6914 FLAG_N = NFLAG_32(res);
philpem@0 6915 FLAG_Z = res;
philpem@0 6916 FLAG_V = VFLAG_CLEAR;
philpem@0 6917 FLAG_C = CFLAG_CLEAR;
philpem@0 6918 }
philpem@0 6919
philpem@0 6920
philpem@0 6921 M68KMAKE_OP(muls, 16, ., d)
philpem@0 6922 {
philpem@0 6923 uint* r_dst = &DX;
philpem@0 6924 uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
philpem@0 6925
philpem@0 6926 *r_dst = res;
philpem@0 6927
philpem@0 6928 FLAG_Z = res;
philpem@0 6929 FLAG_N = NFLAG_32(res);
philpem@0 6930 FLAG_V = VFLAG_CLEAR;
philpem@0 6931 FLAG_C = CFLAG_CLEAR;
philpem@0 6932 }
philpem@0 6933
philpem@0 6934
philpem@0 6935 M68KMAKE_OP(muls, 16, ., .)
philpem@0 6936 {
philpem@0 6937 uint* r_dst = &DX;
philpem@0 6938 uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(M68KMAKE_GET_OPER_AY_16) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
philpem@0 6939
philpem@0 6940 *r_dst = res;
philpem@0 6941
philpem@0 6942 FLAG_Z = res;
philpem@0 6943 FLAG_N = NFLAG_32(res);
philpem@0 6944 FLAG_V = VFLAG_CLEAR;
philpem@0 6945 FLAG_C = CFLAG_CLEAR;
philpem@0 6946 }
philpem@0 6947
philpem@0 6948
philpem@0 6949 M68KMAKE_OP(mulu, 16, ., d)
philpem@0 6950 {
philpem@0 6951 uint* r_dst = &DX;
philpem@0 6952 uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst);
philpem@0 6953
philpem@0 6954 *r_dst = res;
philpem@0 6955
philpem@0 6956 FLAG_Z = res;
philpem@0 6957 FLAG_N = NFLAG_32(res);
philpem@0 6958 FLAG_V = VFLAG_CLEAR;
philpem@0 6959 FLAG_C = CFLAG_CLEAR;
philpem@0 6960 }
philpem@0 6961
philpem@0 6962
philpem@0 6963 M68KMAKE_OP(mulu, 16, ., .)
philpem@0 6964 {
philpem@0 6965 uint* r_dst = &DX;
philpem@0 6966 uint res = M68KMAKE_GET_OPER_AY_16 * MASK_OUT_ABOVE_16(*r_dst);
philpem@0 6967
philpem@0 6968 *r_dst = res;
philpem@0 6969
philpem@0 6970 FLAG_Z = res;
philpem@0 6971 FLAG_N = NFLAG_32(res);
philpem@0 6972 FLAG_V = VFLAG_CLEAR;
philpem@0 6973 FLAG_C = CFLAG_CLEAR;
philpem@0 6974 }
philpem@0 6975
philpem@0 6976
philpem@0 6977 M68KMAKE_OP(mull, 32, ., d)
philpem@0 6978 {
philpem@0 6979 #if M68K_USE_64_BIT
philpem@0 6980
philpem@0 6981 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 6982 {
philpem@0 6983 uint word2 = OPER_I_16();
philpem@0 6984 uint64 src = DY;
philpem@0 6985 uint64 dst = REG_D[(word2 >> 12) & 7];
philpem@0 6986 uint64 res;
philpem@0 6987
philpem@0 6988 FLAG_C = CFLAG_CLEAR;
philpem@0 6989
philpem@0 6990 if(BIT_B(word2)) /* signed */
philpem@0 6991 {
philpem@0 6992 res = (sint64)((sint32)src) * (sint64)((sint32)dst);
philpem@0 6993 if(!BIT_A(word2))
philpem@0 6994 {
philpem@0 6995 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 6996 FLAG_N = NFLAG_32(res);
philpem@0 6997 FLAG_V = ((sint64)res != (sint32)res)<<7;
philpem@0 6998 REG_D[(word2 >> 12) & 7] = FLAG_Z;
philpem@0 6999 return;
philpem@0 7000 }
philpem@0 7001 FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
philpem@0 7002 FLAG_N = NFLAG_64(res);
philpem@0 7003 FLAG_V = VFLAG_CLEAR;
philpem@0 7004 REG_D[word2 & 7] = (res >> 32);
philpem@0 7005 REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
philpem@0 7006 return;
philpem@0 7007 }
philpem@0 7008
philpem@0 7009 res = src * dst;
philpem@0 7010 if(!BIT_A(word2))
philpem@0 7011 {
philpem@0 7012 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 7013 FLAG_N = NFLAG_32(res);
philpem@0 7014 FLAG_V = (res > 0xffffffff)<<7;
philpem@0 7015 REG_D[(word2 >> 12) & 7] = FLAG_Z;
philpem@0 7016 return;
philpem@0 7017 }
philpem@0 7018 FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
philpem@0 7019 FLAG_N = NFLAG_64(res);
philpem@0 7020 FLAG_V = VFLAG_CLEAR;
philpem@0 7021 REG_D[word2 & 7] = (res >> 32);
philpem@0 7022 REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
philpem@0 7023 return;
philpem@0 7024 }
philpem@0 7025 m68ki_exception_illegal();
philpem@0 7026
philpem@0 7027 #else
philpem@0 7028
philpem@0 7029 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7030 {
philpem@0 7031 uint word2 = OPER_I_16();
philpem@0 7032 uint src = DY;
philpem@0 7033 uint dst = REG_D[(word2 >> 12) & 7];
philpem@0 7034 uint neg = GET_MSB_32(src ^ dst);
philpem@0 7035 uint src1;
philpem@0 7036 uint src2;
philpem@0 7037 uint dst1;
philpem@0 7038 uint dst2;
philpem@0 7039 uint r1;
philpem@0 7040 uint r2;
philpem@0 7041 uint r3;
philpem@0 7042 uint r4;
philpem@0 7043 uint lo;
philpem@0 7044 uint hi;
philpem@0 7045
philpem@0 7046 FLAG_C = CFLAG_CLEAR;
philpem@0 7047
philpem@0 7048 if(BIT_B(word2)) /* signed */
philpem@0 7049 {
philpem@0 7050 if(GET_MSB_32(src))
philpem@0 7051 src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
philpem@0 7052 if(GET_MSB_32(dst))
philpem@0 7053 dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
philpem@0 7054 }
philpem@0 7055
philpem@0 7056 src1 = MASK_OUT_ABOVE_16(src);
philpem@0 7057 src2 = src>>16;
philpem@0 7058 dst1 = MASK_OUT_ABOVE_16(dst);
philpem@0 7059 dst2 = dst>>16;
philpem@0 7060
philpem@0 7061
philpem@0 7062 r1 = src1 * dst1;
philpem@0 7063 r2 = src1 * dst2;
philpem@0 7064 r3 = src2 * dst1;
philpem@0 7065 r4 = src2 * dst2;
philpem@0 7066
philpem@0 7067 lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
philpem@0 7068 hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
philpem@0 7069
philpem@0 7070 if(BIT_B(word2) && neg)
philpem@0 7071 {
philpem@0 7072 hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
philpem@0 7073 lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
philpem@0 7074 }
philpem@0 7075
philpem@0 7076 if(BIT_A(word2))
philpem@0 7077 {
philpem@0 7078 REG_D[word2 & 7] = hi;
philpem@0 7079 REG_D[(word2 >> 12) & 7] = lo;
philpem@0 7080 FLAG_N = NFLAG_32(hi);
philpem@0 7081 FLAG_Z = hi | lo;
philpem@0 7082 FLAG_V = VFLAG_CLEAR;
philpem@0 7083 return;
philpem@0 7084 }
philpem@0 7085
philpem@0 7086 REG_D[(word2 >> 12) & 7] = lo;
philpem@0 7087 FLAG_N = NFLAG_32(lo);
philpem@0 7088 FLAG_Z = lo;
philpem@0 7089 if(BIT_B(word2))
philpem@0 7090 FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
philpem@0 7091 else
philpem@0 7092 FLAG_V = (hi != 0) << 7;
philpem@0 7093 return;
philpem@0 7094 }
philpem@0 7095 m68ki_exception_illegal();
philpem@0 7096
philpem@0 7097 #endif
philpem@0 7098 }
philpem@0 7099
philpem@0 7100
philpem@0 7101 M68KMAKE_OP(mull, 32, ., .)
philpem@0 7102 {
philpem@0 7103 #if M68K_USE_64_BIT
philpem@0 7104
philpem@0 7105 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7106 {
philpem@0 7107 uint word2 = OPER_I_16();
philpem@0 7108 uint64 src = M68KMAKE_GET_OPER_AY_32;
philpem@0 7109 uint64 dst = REG_D[(word2 >> 12) & 7];
philpem@0 7110 uint64 res;
philpem@0 7111
philpem@0 7112 FLAG_C = CFLAG_CLEAR;
philpem@0 7113
philpem@0 7114 if(BIT_B(word2)) /* signed */
philpem@0 7115 {
philpem@0 7116 res = (sint64)((sint32)src) * (sint64)((sint32)dst);
philpem@0 7117 if(!BIT_A(word2))
philpem@0 7118 {
philpem@0 7119 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 7120 FLAG_N = NFLAG_32(res);
philpem@0 7121 FLAG_V = ((sint64)res != (sint32)res)<<7;
philpem@0 7122 REG_D[(word2 >> 12) & 7] = FLAG_Z;
philpem@0 7123 return;
philpem@0 7124 }
philpem@0 7125 FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
philpem@0 7126 FLAG_N = NFLAG_64(res);
philpem@0 7127 FLAG_V = VFLAG_CLEAR;
philpem@0 7128 REG_D[word2 & 7] = (res >> 32);
philpem@0 7129 REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
philpem@0 7130 return;
philpem@0 7131 }
philpem@0 7132
philpem@0 7133 res = src * dst;
philpem@0 7134 if(!BIT_A(word2))
philpem@0 7135 {
philpem@0 7136 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 7137 FLAG_N = NFLAG_32(res);
philpem@0 7138 FLAG_V = (res > 0xffffffff)<<7;
philpem@0 7139 REG_D[(word2 >> 12) & 7] = FLAG_Z;
philpem@0 7140 return;
philpem@0 7141 }
philpem@0 7142 FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
philpem@0 7143 FLAG_N = NFLAG_64(res);
philpem@0 7144 FLAG_V = VFLAG_CLEAR;
philpem@0 7145 REG_D[word2 & 7] = (res >> 32);
philpem@0 7146 REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
philpem@0 7147 return;
philpem@0 7148 }
philpem@0 7149 m68ki_exception_illegal();
philpem@0 7150
philpem@0 7151 #else
philpem@0 7152
philpem@0 7153 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7154 {
philpem@0 7155 uint word2 = OPER_I_16();
philpem@0 7156 uint src = M68KMAKE_GET_OPER_AY_32;
philpem@0 7157 uint dst = REG_D[(word2 >> 12) & 7];
philpem@0 7158 uint neg = GET_MSB_32(src ^ dst);
philpem@0 7159 uint src1;
philpem@0 7160 uint src2;
philpem@0 7161 uint dst1;
philpem@0 7162 uint dst2;
philpem@0 7163 uint r1;
philpem@0 7164 uint r2;
philpem@0 7165 uint r3;
philpem@0 7166 uint r4;
philpem@0 7167 uint lo;
philpem@0 7168 uint hi;
philpem@0 7169
philpem@0 7170 FLAG_C = CFLAG_CLEAR;
philpem@0 7171
philpem@0 7172 if(BIT_B(word2)) /* signed */
philpem@0 7173 {
philpem@0 7174 if(GET_MSB_32(src))
philpem@0 7175 src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
philpem@0 7176 if(GET_MSB_32(dst))
philpem@0 7177 dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
philpem@0 7178 }
philpem@0 7179
philpem@0 7180 src1 = MASK_OUT_ABOVE_16(src);
philpem@0 7181 src2 = src>>16;
philpem@0 7182 dst1 = MASK_OUT_ABOVE_16(dst);
philpem@0 7183 dst2 = dst>>16;
philpem@0 7184
philpem@0 7185
philpem@0 7186 r1 = src1 * dst1;
philpem@0 7187 r2 = src1 * dst2;
philpem@0 7188 r3 = src2 * dst1;
philpem@0 7189 r4 = src2 * dst2;
philpem@0 7190
philpem@0 7191 lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
philpem@0 7192 hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
philpem@0 7193
philpem@0 7194 if(BIT_B(word2) && neg)
philpem@0 7195 {
philpem@0 7196 hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
philpem@0 7197 lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
philpem@0 7198 }
philpem@0 7199
philpem@0 7200 if(BIT_A(word2))
philpem@0 7201 {
philpem@0 7202 REG_D[word2 & 7] = hi;
philpem@0 7203 REG_D[(word2 >> 12) & 7] = lo;
philpem@0 7204 FLAG_N = NFLAG_32(hi);
philpem@0 7205 FLAG_Z = hi | lo;
philpem@0 7206 FLAG_V = VFLAG_CLEAR;
philpem@0 7207 return;
philpem@0 7208 }
philpem@0 7209
philpem@0 7210 REG_D[(word2 >> 12) & 7] = lo;
philpem@0 7211 FLAG_N = NFLAG_32(lo);
philpem@0 7212 FLAG_Z = lo;
philpem@0 7213 if(BIT_B(word2))
philpem@0 7214 FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
philpem@0 7215 else
philpem@0 7216 FLAG_V = (hi != 0) << 7;
philpem@0 7217 return;
philpem@0 7218 }
philpem@0 7219 m68ki_exception_illegal();
philpem@0 7220
philpem@0 7221 #endif
philpem@0 7222 }
philpem@0 7223
philpem@0 7224
philpem@0 7225 M68KMAKE_OP(nbcd, 8, ., d)
philpem@0 7226 {
philpem@0 7227 uint* r_dst = &DY;
philpem@0 7228 uint dst = *r_dst;
philpem@0 7229 uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
philpem@0 7230
philpem@0 7231 if(res != 0x9a)
philpem@0 7232 {
philpem@0 7233 if((res & 0x0f) == 0xa)
philpem@0 7234 res = (res & 0xf0) + 0x10;
philpem@0 7235
philpem@0 7236 res = MASK_OUT_ABOVE_8(res);
philpem@0 7237
philpem@0 7238 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 7239
philpem@0 7240 FLAG_Z |= res;
philpem@0 7241 FLAG_C = CFLAG_SET;
philpem@0 7242 FLAG_X = XFLAG_SET;
philpem@0 7243 }
philpem@0 7244 else
philpem@0 7245 {
philpem@0 7246 FLAG_C = CFLAG_CLEAR;
philpem@0 7247 FLAG_X = XFLAG_CLEAR;
philpem@0 7248 }
philpem@0 7249 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 7250 }
philpem@0 7251
philpem@0 7252
philpem@0 7253 M68KMAKE_OP(nbcd, 8, ., .)
philpem@0 7254 {
philpem@0 7255 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 7256 uint dst = m68ki_read_8(ea);
philpem@0 7257 uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
philpem@0 7258
philpem@0 7259 if(res != 0x9a)
philpem@0 7260 {
philpem@0 7261 if((res & 0x0f) == 0xa)
philpem@0 7262 res = (res & 0xf0) + 0x10;
philpem@0 7263
philpem@0 7264 res = MASK_OUT_ABOVE_8(res);
philpem@0 7265
philpem@0 7266 m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
philpem@0 7267
philpem@0 7268 FLAG_Z |= res;
philpem@0 7269 FLAG_C = CFLAG_SET;
philpem@0 7270 FLAG_X = XFLAG_SET;
philpem@0 7271 }
philpem@0 7272 else
philpem@0 7273 {
philpem@0 7274 FLAG_C = CFLAG_CLEAR;
philpem@0 7275 FLAG_X = XFLAG_CLEAR;
philpem@0 7276 }
philpem@0 7277 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 7278 }
philpem@0 7279
philpem@0 7280
philpem@0 7281 M68KMAKE_OP(neg, 8, ., d)
philpem@0 7282 {
philpem@0 7283 uint* r_dst = &DY;
philpem@0 7284 uint res = 0 - MASK_OUT_ABOVE_8(*r_dst);
philpem@0 7285
philpem@0 7286 FLAG_N = NFLAG_8(res);
philpem@0 7287 FLAG_C = FLAG_X = CFLAG_8(res);
philpem@0 7288 FLAG_V = *r_dst & res;
philpem@0 7289 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 7290
philpem@0 7291 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 7292 }
philpem@0 7293
philpem@0 7294
philpem@0 7295 M68KMAKE_OP(neg, 8, ., .)
philpem@0 7296 {
philpem@0 7297 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 7298 uint src = m68ki_read_8(ea);
philpem@0 7299 uint res = 0 - src;
philpem@0 7300
philpem@0 7301 FLAG_N = NFLAG_8(res);
philpem@0 7302 FLAG_C = FLAG_X = CFLAG_8(res);
philpem@0 7303 FLAG_V = src & res;
philpem@0 7304 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 7305
philpem@0 7306 m68ki_write_8(ea, FLAG_Z);
philpem@0 7307 }
philpem@0 7308
philpem@0 7309
philpem@0 7310 M68KMAKE_OP(neg, 16, ., d)
philpem@0 7311 {
philpem@0 7312 uint* r_dst = &DY;
philpem@0 7313 uint res = 0 - MASK_OUT_ABOVE_16(*r_dst);
philpem@0 7314
philpem@0 7315 FLAG_N = NFLAG_16(res);
philpem@0 7316 FLAG_C = FLAG_X = CFLAG_16(res);
philpem@0 7317 FLAG_V = (*r_dst & res)>>8;
philpem@0 7318 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 7319
philpem@0 7320 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 7321 }
philpem@0 7322
philpem@0 7323
philpem@0 7324 M68KMAKE_OP(neg, 16, ., .)
philpem@0 7325 {
philpem@0 7326 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 7327 uint src = m68ki_read_16(ea);
philpem@0 7328 uint res = 0 - src;
philpem@0 7329
philpem@0 7330 FLAG_N = NFLAG_16(res);
philpem@0 7331 FLAG_C = FLAG_X = CFLAG_16(res);
philpem@0 7332 FLAG_V = (src & res)>>8;
philpem@0 7333 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 7334
philpem@0 7335 m68ki_write_16(ea, FLAG_Z);
philpem@0 7336 }
philpem@0 7337
philpem@0 7338
philpem@0 7339 M68KMAKE_OP(neg, 32, ., d)
philpem@0 7340 {
philpem@0 7341 uint* r_dst = &DY;
philpem@0 7342 uint res = 0 - *r_dst;
philpem@0 7343
philpem@0 7344 FLAG_N = NFLAG_32(res);
philpem@0 7345 FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res);
philpem@0 7346 FLAG_V = (*r_dst & res)>>24;
philpem@0 7347 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 7348
philpem@0 7349 *r_dst = FLAG_Z;
philpem@0 7350 }
philpem@0 7351
philpem@0 7352
philpem@0 7353 M68KMAKE_OP(neg, 32, ., .)
philpem@0 7354 {
philpem@0 7355 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 7356 uint src = m68ki_read_32(ea);
philpem@0 7357 uint res = 0 - src;
philpem@0 7358
philpem@0 7359 FLAG_N = NFLAG_32(res);
philpem@0 7360 FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
philpem@0 7361 FLAG_V = (src & res)>>24;
philpem@0 7362 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 7363
philpem@0 7364 m68ki_write_32(ea, FLAG_Z);
philpem@0 7365 }
philpem@0 7366
philpem@0 7367
philpem@0 7368 M68KMAKE_OP(negx, 8, ., d)
philpem@0 7369 {
philpem@0 7370 uint* r_dst = &DY;
philpem@0 7371 uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1();
philpem@0 7372
philpem@0 7373 FLAG_N = NFLAG_8(res);
philpem@0 7374 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 7375 FLAG_V = *r_dst & res;
philpem@0 7376
philpem@0 7377 res = MASK_OUT_ABOVE_8(res);
philpem@0 7378 FLAG_Z |= res;
philpem@0 7379
philpem@0 7380 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 7381 }
philpem@0 7382
philpem@0 7383
philpem@0 7384 M68KMAKE_OP(negx, 8, ., .)
philpem@0 7385 {
philpem@0 7386 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 7387 uint src = m68ki_read_8(ea);
philpem@0 7388 uint res = 0 - src - XFLAG_AS_1();
philpem@0 7389
philpem@0 7390 FLAG_N = NFLAG_8(res);
philpem@0 7391 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 7392 FLAG_V = src & res;
philpem@0 7393
philpem@0 7394 res = MASK_OUT_ABOVE_8(res);
philpem@0 7395 FLAG_Z |= res;
philpem@0 7396
philpem@0 7397 m68ki_write_8(ea, res);
philpem@0 7398 }
philpem@0 7399
philpem@0 7400
philpem@0 7401 M68KMAKE_OP(negx, 16, ., d)
philpem@0 7402 {
philpem@0 7403 uint* r_dst = &DY;
philpem@0 7404 uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1();
philpem@0 7405
philpem@0 7406 FLAG_N = NFLAG_16(res);
philpem@0 7407 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 7408 FLAG_V = (*r_dst & res)>>8;
philpem@0 7409
philpem@0 7410 res = MASK_OUT_ABOVE_16(res);
philpem@0 7411 FLAG_Z |= res;
philpem@0 7412
philpem@0 7413 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 7414 }
philpem@0 7415
philpem@0 7416
philpem@0 7417 M68KMAKE_OP(negx, 16, ., .)
philpem@0 7418 {
philpem@0 7419 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 7420 uint src = m68ki_read_16(ea);
philpem@0 7421 uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
philpem@0 7422
philpem@0 7423 FLAG_N = NFLAG_16(res);
philpem@0 7424 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 7425 FLAG_V = (src & res)>>8;
philpem@0 7426
philpem@0 7427 res = MASK_OUT_ABOVE_16(res);
philpem@0 7428 FLAG_Z |= res;
philpem@0 7429
philpem@0 7430 m68ki_write_16(ea, res);
philpem@0 7431 }
philpem@0 7432
philpem@0 7433
philpem@0 7434 M68KMAKE_OP(negx, 32, ., d)
philpem@0 7435 {
philpem@0 7436 uint* r_dst = &DY;
philpem@0 7437 uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1();
philpem@0 7438
philpem@0 7439 FLAG_N = NFLAG_32(res);
philpem@0 7440 FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res);
philpem@0 7441 FLAG_V = (*r_dst & res)>>24;
philpem@0 7442
philpem@0 7443 res = MASK_OUT_ABOVE_32(res);
philpem@0 7444 FLAG_Z |= res;
philpem@0 7445
philpem@0 7446 *r_dst = res;
philpem@0 7447 }
philpem@0 7448
philpem@0 7449
philpem@0 7450 M68KMAKE_OP(negx, 32, ., .)
philpem@0 7451 {
philpem@0 7452 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 7453 uint src = m68ki_read_32(ea);
philpem@0 7454 uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
philpem@0 7455
philpem@0 7456 FLAG_N = NFLAG_32(res);
philpem@0 7457 FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
philpem@0 7458 FLAG_V = (src & res)>>24;
philpem@0 7459
philpem@0 7460 res = MASK_OUT_ABOVE_32(res);
philpem@0 7461 FLAG_Z |= res;
philpem@0 7462
philpem@0 7463 m68ki_write_32(ea, res);
philpem@0 7464 }
philpem@0 7465
philpem@0 7466
philpem@0 7467 M68KMAKE_OP(nop, 0, ., .)
philpem@0 7468 {
philpem@0 7469 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 7470 }
philpem@0 7471
philpem@0 7472
philpem@0 7473 M68KMAKE_OP(not, 8, ., d)
philpem@0 7474 {
philpem@0 7475 uint* r_dst = &DY;
philpem@0 7476 uint res = MASK_OUT_ABOVE_8(~*r_dst);
philpem@0 7477
philpem@0 7478 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 7479
philpem@0 7480 FLAG_N = NFLAG_8(res);
philpem@0 7481 FLAG_Z = res;
philpem@0 7482 FLAG_C = CFLAG_CLEAR;
philpem@0 7483 FLAG_V = VFLAG_CLEAR;
philpem@0 7484 }
philpem@0 7485
philpem@0 7486
philpem@0 7487 M68KMAKE_OP(not, 8, ., .)
philpem@0 7488 {
philpem@0 7489 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 7490 uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
philpem@0 7491
philpem@0 7492 m68ki_write_8(ea, res);
philpem@0 7493
philpem@0 7494 FLAG_N = NFLAG_8(res);
philpem@0 7495 FLAG_Z = res;
philpem@0 7496 FLAG_C = CFLAG_CLEAR;
philpem@0 7497 FLAG_V = VFLAG_CLEAR;
philpem@0 7498 }
philpem@0 7499
philpem@0 7500
philpem@0 7501 M68KMAKE_OP(not, 16, ., d)
philpem@0 7502 {
philpem@0 7503 uint* r_dst = &DY;
philpem@0 7504 uint res = MASK_OUT_ABOVE_16(~*r_dst);
philpem@0 7505
philpem@0 7506 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 7507
philpem@0 7508 FLAG_N = NFLAG_16(res);
philpem@0 7509 FLAG_Z = res;
philpem@0 7510 FLAG_C = CFLAG_CLEAR;
philpem@0 7511 FLAG_V = VFLAG_CLEAR;
philpem@0 7512 }
philpem@0 7513
philpem@0 7514
philpem@0 7515 M68KMAKE_OP(not, 16, ., .)
philpem@0 7516 {
philpem@0 7517 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 7518 uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
philpem@0 7519
philpem@0 7520 m68ki_write_16(ea, res);
philpem@0 7521
philpem@0 7522 FLAG_N = NFLAG_16(res);
philpem@0 7523 FLAG_Z = res;
philpem@0 7524 FLAG_C = CFLAG_CLEAR;
philpem@0 7525 FLAG_V = VFLAG_CLEAR;
philpem@0 7526 }
philpem@0 7527
philpem@0 7528
philpem@0 7529 M68KMAKE_OP(not, 32, ., d)
philpem@0 7530 {
philpem@0 7531 uint* r_dst = &DY;
philpem@0 7532 uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst);
philpem@0 7533
philpem@0 7534 FLAG_N = NFLAG_32(res);
philpem@0 7535 FLAG_Z = res;
philpem@0 7536 FLAG_C = CFLAG_CLEAR;
philpem@0 7537 FLAG_V = VFLAG_CLEAR;
philpem@0 7538 }
philpem@0 7539
philpem@0 7540
philpem@0 7541 M68KMAKE_OP(not, 32, ., .)
philpem@0 7542 {
philpem@0 7543 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 7544 uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
philpem@0 7545
philpem@0 7546 m68ki_write_32(ea, res);
philpem@0 7547
philpem@0 7548 FLAG_N = NFLAG_32(res);
philpem@0 7549 FLAG_Z = res;
philpem@0 7550 FLAG_C = CFLAG_CLEAR;
philpem@0 7551 FLAG_V = VFLAG_CLEAR;
philpem@0 7552 }
philpem@0 7553
philpem@0 7554
philpem@0 7555 M68KMAKE_OP(or, 8, er, d)
philpem@0 7556 {
philpem@0 7557 uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY)));
philpem@0 7558
philpem@0 7559 FLAG_N = NFLAG_8(res);
philpem@0 7560 FLAG_Z = res;
philpem@0 7561 FLAG_C = CFLAG_CLEAR;
philpem@0 7562 FLAG_V = VFLAG_CLEAR;
philpem@0 7563 }
philpem@0 7564
philpem@0 7565
philpem@0 7566 M68KMAKE_OP(or, 8, er, .)
philpem@0 7567 {
philpem@0 7568 uint res = MASK_OUT_ABOVE_8((DX |= M68KMAKE_GET_OPER_AY_8));
philpem@0 7569
philpem@0 7570 FLAG_N = NFLAG_8(res);
philpem@0 7571 FLAG_Z = res;
philpem@0 7572 FLAG_C = CFLAG_CLEAR;
philpem@0 7573 FLAG_V = VFLAG_CLEAR;
philpem@0 7574 }
philpem@0 7575
philpem@0 7576
philpem@0 7577 M68KMAKE_OP(or, 16, er, d)
philpem@0 7578 {
philpem@0 7579 uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY)));
philpem@0 7580
philpem@0 7581 FLAG_N = NFLAG_16(res);
philpem@0 7582 FLAG_Z = res;
philpem@0 7583 FLAG_C = CFLAG_CLEAR;
philpem@0 7584 FLAG_V = VFLAG_CLEAR;
philpem@0 7585 }
philpem@0 7586
philpem@0 7587
philpem@0 7588 M68KMAKE_OP(or, 16, er, .)
philpem@0 7589 {
philpem@0 7590 uint res = MASK_OUT_ABOVE_16((DX |= M68KMAKE_GET_OPER_AY_16));
philpem@0 7591
philpem@0 7592 FLAG_N = NFLAG_16(res);
philpem@0 7593 FLAG_Z = res;
philpem@0 7594 FLAG_C = CFLAG_CLEAR;
philpem@0 7595 FLAG_V = VFLAG_CLEAR;
philpem@0 7596 }
philpem@0 7597
philpem@0 7598
philpem@0 7599 M68KMAKE_OP(or, 32, er, d)
philpem@0 7600 {
philpem@0 7601 uint res = DX |= DY;
philpem@0 7602
philpem@0 7603 FLAG_N = NFLAG_32(res);
philpem@0 7604 FLAG_Z = res;
philpem@0 7605 FLAG_C = CFLAG_CLEAR;
philpem@0 7606 FLAG_V = VFLAG_CLEAR;
philpem@0 7607 }
philpem@0 7608
philpem@0 7609
philpem@0 7610 M68KMAKE_OP(or, 32, er, .)
philpem@0 7611 {
philpem@0 7612 uint res = DX |= M68KMAKE_GET_OPER_AY_32;
philpem@0 7613
philpem@0 7614 FLAG_N = NFLAG_32(res);
philpem@0 7615 FLAG_Z = res;
philpem@0 7616 FLAG_C = CFLAG_CLEAR;
philpem@0 7617 FLAG_V = VFLAG_CLEAR;
philpem@0 7618 }
philpem@0 7619
philpem@0 7620
philpem@0 7621 M68KMAKE_OP(or, 8, re, .)
philpem@0 7622 {
philpem@0 7623 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 7624 uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
philpem@0 7625
philpem@0 7626 m68ki_write_8(ea, res);
philpem@0 7627
philpem@0 7628 FLAG_N = NFLAG_8(res);
philpem@0 7629 FLAG_Z = res;
philpem@0 7630 FLAG_C = CFLAG_CLEAR;
philpem@0 7631 FLAG_V = VFLAG_CLEAR;
philpem@0 7632 }
philpem@0 7633
philpem@0 7634
philpem@0 7635 M68KMAKE_OP(or, 16, re, .)
philpem@0 7636 {
philpem@0 7637 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 7638 uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
philpem@0 7639
philpem@0 7640 m68ki_write_16(ea, res);
philpem@0 7641
philpem@0 7642 FLAG_N = NFLAG_16(res);
philpem@0 7643 FLAG_Z = res;
philpem@0 7644 FLAG_C = CFLAG_CLEAR;
philpem@0 7645 FLAG_V = VFLAG_CLEAR;
philpem@0 7646 }
philpem@0 7647
philpem@0 7648
philpem@0 7649 M68KMAKE_OP(or, 32, re, .)
philpem@0 7650 {
philpem@0 7651 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 7652 uint res = DX | m68ki_read_32(ea);
philpem@0 7653
philpem@0 7654 m68ki_write_32(ea, res);
philpem@0 7655
philpem@0 7656 FLAG_N = NFLAG_32(res);
philpem@0 7657 FLAG_Z = res;
philpem@0 7658 FLAG_C = CFLAG_CLEAR;
philpem@0 7659 FLAG_V = VFLAG_CLEAR;
philpem@0 7660 }
philpem@0 7661
philpem@0 7662
philpem@0 7663 M68KMAKE_OP(ori, 8, ., d)
philpem@0 7664 {
philpem@0 7665 uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8()));
philpem@0 7666
philpem@0 7667 FLAG_N = NFLAG_8(res);
philpem@0 7668 FLAG_Z = res;
philpem@0 7669 FLAG_C = CFLAG_CLEAR;
philpem@0 7670 FLAG_V = VFLAG_CLEAR;
philpem@0 7671 }
philpem@0 7672
philpem@0 7673
philpem@0 7674 M68KMAKE_OP(ori, 8, ., .)
philpem@0 7675 {
philpem@0 7676 uint src = OPER_I_8();
philpem@0 7677 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 7678 uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
philpem@0 7679
philpem@0 7680 m68ki_write_8(ea, res);
philpem@0 7681
philpem@0 7682 FLAG_N = NFLAG_8(res);
philpem@0 7683 FLAG_Z = res;
philpem@0 7684 FLAG_C = CFLAG_CLEAR;
philpem@0 7685 FLAG_V = VFLAG_CLEAR;
philpem@0 7686 }
philpem@0 7687
philpem@0 7688
philpem@0 7689 M68KMAKE_OP(ori, 16, ., d)
philpem@0 7690 {
philpem@0 7691 uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16());
philpem@0 7692
philpem@0 7693 FLAG_N = NFLAG_16(res);
philpem@0 7694 FLAG_Z = res;
philpem@0 7695 FLAG_C = CFLAG_CLEAR;
philpem@0 7696 FLAG_V = VFLAG_CLEAR;
philpem@0 7697 }
philpem@0 7698
philpem@0 7699
philpem@0 7700 M68KMAKE_OP(ori, 16, ., .)
philpem@0 7701 {
philpem@0 7702 uint src = OPER_I_16();
philpem@0 7703 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 7704 uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
philpem@0 7705
philpem@0 7706 m68ki_write_16(ea, res);
philpem@0 7707
philpem@0 7708 FLAG_N = NFLAG_16(res);
philpem@0 7709 FLAG_Z = res;
philpem@0 7710 FLAG_C = CFLAG_CLEAR;
philpem@0 7711 FLAG_V = VFLAG_CLEAR;
philpem@0 7712 }
philpem@0 7713
philpem@0 7714
philpem@0 7715 M68KMAKE_OP(ori, 32, ., d)
philpem@0 7716 {
philpem@0 7717 uint res = DY |= OPER_I_32();
philpem@0 7718
philpem@0 7719 FLAG_N = NFLAG_32(res);
philpem@0 7720 FLAG_Z = res;
philpem@0 7721 FLAG_C = CFLAG_CLEAR;
philpem@0 7722 FLAG_V = VFLAG_CLEAR;
philpem@0 7723 }
philpem@0 7724
philpem@0 7725
philpem@0 7726 M68KMAKE_OP(ori, 32, ., .)
philpem@0 7727 {
philpem@0 7728 uint src = OPER_I_32();
philpem@0 7729 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 7730 uint res = src | m68ki_read_32(ea);
philpem@0 7731
philpem@0 7732 m68ki_write_32(ea, res);
philpem@0 7733
philpem@0 7734 FLAG_N = NFLAG_32(res);
philpem@0 7735 FLAG_Z = res;
philpem@0 7736 FLAG_C = CFLAG_CLEAR;
philpem@0 7737 FLAG_V = VFLAG_CLEAR;
philpem@0 7738 }
philpem@0 7739
philpem@0 7740
philpem@0 7741 M68KMAKE_OP(ori, 16, toc, .)
philpem@0 7742 {
philpem@0 7743 m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16());
philpem@0 7744 }
philpem@0 7745
philpem@0 7746
philpem@0 7747 M68KMAKE_OP(ori, 16, tos, .)
philpem@0 7748 {
philpem@0 7749 if(FLAG_S)
philpem@0 7750 {
philpem@0 7751 uint src = OPER_I_16();
philpem@0 7752 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 7753 m68ki_set_sr(m68ki_get_sr() | src);
philpem@0 7754 return;
philpem@0 7755 }
philpem@0 7756 m68ki_exception_privilege_violation();
philpem@0 7757 }
philpem@0 7758
philpem@0 7759
philpem@0 7760 M68KMAKE_OP(pack, 16, rr, .)
philpem@0 7761 {
philpem@0 7762 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7763 {
philpem@0 7764 /* Note: DX and DY are reversed in Motorola's docs */
philpem@0 7765 uint src = DY + OPER_I_16();
philpem@0 7766 uint* r_dst = &DX;
philpem@0 7767
philpem@0 7768 *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f);
philpem@0 7769 return;
philpem@0 7770 }
philpem@0 7771 m68ki_exception_illegal();
philpem@0 7772 }
philpem@0 7773
philpem@0 7774
philpem@0 7775 M68KMAKE_OP(pack, 16, mm, ax7)
philpem@0 7776 {
philpem@0 7777 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7778 {
philpem@0 7779 /* Note: AX and AY are reversed in Motorola's docs */
philpem@0 7780 uint ea_src = EA_AY_PD_8();
philpem@0 7781 uint src = m68ki_read_8(ea_src);
philpem@0 7782 ea_src = EA_AY_PD_8();
philpem@0 7783 src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
philpem@0 7784
philpem@0 7785 m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
philpem@0 7786 return;
philpem@0 7787 }
philpem@0 7788 m68ki_exception_illegal();
philpem@0 7789 }
philpem@0 7790
philpem@0 7791
philpem@0 7792 M68KMAKE_OP(pack, 16, mm, ay7)
philpem@0 7793 {
philpem@0 7794 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7795 {
philpem@0 7796 /* Note: AX and AY are reversed in Motorola's docs */
philpem@0 7797 uint ea_src = EA_A7_PD_8();
philpem@0 7798 uint src = m68ki_read_8(ea_src);
philpem@0 7799 ea_src = EA_A7_PD_8();
philpem@0 7800 src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
philpem@0 7801
philpem@0 7802 m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
philpem@0 7803 return;
philpem@0 7804 }
philpem@0 7805 m68ki_exception_illegal();
philpem@0 7806 }
philpem@0 7807
philpem@0 7808
philpem@0 7809 M68KMAKE_OP(pack, 16, mm, axy7)
philpem@0 7810 {
philpem@0 7811 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7812 {
philpem@0 7813 uint ea_src = EA_A7_PD_8();
philpem@0 7814 uint src = m68ki_read_8(ea_src);
philpem@0 7815 ea_src = EA_A7_PD_8();
philpem@0 7816 src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
philpem@0 7817
philpem@0 7818 m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
philpem@0 7819 return;
philpem@0 7820 }
philpem@0 7821 m68ki_exception_illegal();
philpem@0 7822 }
philpem@0 7823
philpem@0 7824
philpem@0 7825 M68KMAKE_OP(pack, 16, mm, .)
philpem@0 7826 {
philpem@0 7827 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 7828 {
philpem@0 7829 /* Note: AX and AY are reversed in Motorola's docs */
philpem@0 7830 uint ea_src = EA_AY_PD_8();
philpem@0 7831 uint src = m68ki_read_8(ea_src);
philpem@0 7832 ea_src = EA_AY_PD_8();
philpem@0 7833 src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
philpem@0 7834
philpem@0 7835 m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
philpem@0 7836 return;
philpem@0 7837 }
philpem@0 7838 m68ki_exception_illegal();
philpem@0 7839 }
philpem@0 7840
philpem@0 7841
philpem@0 7842 M68KMAKE_OP(pea, 32, ., .)
philpem@0 7843 {
philpem@0 7844 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 7845
philpem@0 7846 m68ki_push_32(ea);
philpem@0 7847 }
philpem@0 7848
philpem@0 7849
philpem@0 7850 M68KMAKE_OP(reset, 0, ., .)
philpem@0 7851 {
philpem@0 7852 if(FLAG_S)
philpem@0 7853 {
philpem@0 7854 m68ki_output_reset(); /* auto-disable (see m68kcpu.h) */
philpem@0 7855 USE_CYCLES(CYC_RESET);
philpem@0 7856 return;
philpem@0 7857 }
philpem@0 7858 m68ki_exception_privilege_violation();
philpem@0 7859 }
philpem@0 7860
philpem@0 7861
philpem@0 7862 M68KMAKE_OP(ror, 8, s, .)
philpem@0 7863 {
philpem@0 7864 uint* r_dst = &DY;
philpem@0 7865 uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 7866 uint shift = orig_shift & 7;
philpem@0 7867 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 7868 uint res = ROR_8(src, shift);
philpem@0 7869
philpem@0 7870 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 7871
philpem@0 7872 FLAG_N = NFLAG_8(res);
philpem@0 7873 FLAG_Z = res;
philpem@0 7874 FLAG_C = src << (9-orig_shift);
philpem@0 7875 FLAG_V = VFLAG_CLEAR;
philpem@0 7876 }
philpem@0 7877
philpem@0 7878
philpem@0 7879 M68KMAKE_OP(ror, 16, s, .)
philpem@0 7880 {
philpem@0 7881 uint* r_dst = &DY;
philpem@0 7882 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 7883 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 7884 uint res = ROR_16(src, shift);
philpem@0 7885
philpem@0 7886 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 7887
philpem@0 7888 FLAG_N = NFLAG_16(res);
philpem@0 7889 FLAG_Z = res;
philpem@0 7890 FLAG_C = src << (9-shift);
philpem@0 7891 FLAG_V = VFLAG_CLEAR;
philpem@0 7892 }
philpem@0 7893
philpem@0 7894
philpem@0 7895 M68KMAKE_OP(ror, 32, s, .)
philpem@0 7896 {
philpem@0 7897 uint* r_dst = &DY;
philpem@0 7898 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 7899 uint64 src = *r_dst;
philpem@0 7900 uint res = ROR_32(src, shift);
philpem@0 7901
philpem@0 7902 *r_dst = res;
philpem@0 7903
philpem@0 7904 FLAG_N = NFLAG_32(res);
philpem@0 7905 FLAG_Z = res;
philpem@0 7906 FLAG_C = src << (9-shift);
philpem@0 7907 FLAG_V = VFLAG_CLEAR;
philpem@0 7908 }
philpem@0 7909
philpem@0 7910
philpem@0 7911 M68KMAKE_OP(ror, 8, r, .)
philpem@0 7912 {
philpem@0 7913 uint* r_dst = &DY;
philpem@0 7914 uint orig_shift = DX & 0x3f;
philpem@0 7915 uint shift = orig_shift & 7;
philpem@0 7916 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 7917 uint res = ROR_8(src, shift);
philpem@0 7918
philpem@0 7919 if(orig_shift != 0)
philpem@0 7920 {
philpem@0 7921 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 7922
philpem@0 7923 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 7924 FLAG_C = src << (8-((shift-1)&7));
philpem@0 7925 FLAG_N = NFLAG_8(res);
philpem@0 7926 FLAG_Z = res;
philpem@0 7927 FLAG_V = VFLAG_CLEAR;
philpem@0 7928 return;
philpem@0 7929 }
philpem@0 7930
philpem@0 7931 FLAG_C = CFLAG_CLEAR;
philpem@0 7932 FLAG_N = NFLAG_8(src);
philpem@0 7933 FLAG_Z = src;
philpem@0 7934 FLAG_V = VFLAG_CLEAR;
philpem@0 7935 }
philpem@0 7936
philpem@0 7937
philpem@0 7938 M68KMAKE_OP(ror, 16, r, .)
philpem@0 7939 {
philpem@0 7940 uint* r_dst = &DY;
philpem@0 7941 uint orig_shift = DX & 0x3f;
philpem@0 7942 uint shift = orig_shift & 15;
philpem@0 7943 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 7944 uint res = ROR_16(src, shift);
philpem@0 7945
philpem@0 7946 if(orig_shift != 0)
philpem@0 7947 {
philpem@0 7948 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 7949
philpem@0 7950 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 7951 FLAG_C = (src >> ((shift - 1) & 15)) << 8;
philpem@0 7952 FLAG_N = NFLAG_16(res);
philpem@0 7953 FLAG_Z = res;
philpem@0 7954 FLAG_V = VFLAG_CLEAR;
philpem@0 7955 return;
philpem@0 7956 }
philpem@0 7957
philpem@0 7958 FLAG_C = CFLAG_CLEAR;
philpem@0 7959 FLAG_N = NFLAG_16(src);
philpem@0 7960 FLAG_Z = src;
philpem@0 7961 FLAG_V = VFLAG_CLEAR;
philpem@0 7962 }
philpem@0 7963
philpem@0 7964
philpem@0 7965 M68KMAKE_OP(ror, 32, r, .)
philpem@0 7966 {
philpem@0 7967 uint* r_dst = &DY;
philpem@0 7968 uint orig_shift = DX & 0x3f;
philpem@0 7969 uint shift = orig_shift & 31;
philpem@0 7970 uint64 src = *r_dst;
philpem@0 7971 uint res = ROR_32(src, shift);
philpem@0 7972
philpem@0 7973 if(orig_shift != 0)
philpem@0 7974 {
philpem@0 7975 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 7976
philpem@0 7977 *r_dst = res;
philpem@0 7978 FLAG_C = (src >> ((shift - 1) & 31)) << 8;
philpem@0 7979 FLAG_N = NFLAG_32(res);
philpem@0 7980 FLAG_Z = res;
philpem@0 7981 FLAG_V = VFLAG_CLEAR;
philpem@0 7982 return;
philpem@0 7983 }
philpem@0 7984
philpem@0 7985 FLAG_C = CFLAG_CLEAR;
philpem@0 7986 FLAG_N = NFLAG_32(src);
philpem@0 7987 FLAG_Z = src;
philpem@0 7988 FLAG_V = VFLAG_CLEAR;
philpem@0 7989 }
philpem@0 7990
philpem@0 7991
philpem@0 7992 M68KMAKE_OP(ror, 16, ., .)
philpem@0 7993 {
philpem@0 7994 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 7995 uint src = m68ki_read_16(ea);
philpem@0 7996 uint res = ROR_16(src, 1);
philpem@0 7997
philpem@0 7998 m68ki_write_16(ea, res);
philpem@0 7999
philpem@0 8000 FLAG_N = NFLAG_16(res);
philpem@0 8001 FLAG_Z = res;
philpem@0 8002 FLAG_C = src << 8;
philpem@0 8003 FLAG_V = VFLAG_CLEAR;
philpem@0 8004 }
philpem@0 8005
philpem@0 8006
philpem@0 8007 M68KMAKE_OP(rol, 8, s, .)
philpem@0 8008 {
philpem@0 8009 uint* r_dst = &DY;
philpem@0 8010 uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8011 uint shift = orig_shift & 7;
philpem@0 8012 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8013 uint res = ROL_8(src, shift);
philpem@0 8014
philpem@0 8015 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8016
philpem@0 8017 FLAG_N = NFLAG_8(res);
philpem@0 8018 FLAG_Z = res;
philpem@0 8019 FLAG_C = src << orig_shift;
philpem@0 8020 FLAG_V = VFLAG_CLEAR;
philpem@0 8021 }
philpem@0 8022
philpem@0 8023
philpem@0 8024 M68KMAKE_OP(rol, 16, s, .)
philpem@0 8025 {
philpem@0 8026 uint* r_dst = &DY;
philpem@0 8027 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8028 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8029 uint res = ROL_16(src, shift);
philpem@0 8030
philpem@0 8031 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 8032
philpem@0 8033 FLAG_N = NFLAG_16(res);
philpem@0 8034 FLAG_Z = res;
philpem@0 8035 FLAG_C = src >> (8-shift);
philpem@0 8036 FLAG_V = VFLAG_CLEAR;
philpem@0 8037 }
philpem@0 8038
philpem@0 8039
philpem@0 8040 M68KMAKE_OP(rol, 32, s, .)
philpem@0 8041 {
philpem@0 8042 uint* r_dst = &DY;
philpem@0 8043 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8044 uint64 src = *r_dst;
philpem@0 8045 uint res = ROL_32(src, shift);
philpem@0 8046
philpem@0 8047 *r_dst = res;
philpem@0 8048
philpem@0 8049 FLAG_N = NFLAG_32(res);
philpem@0 8050 FLAG_Z = res;
philpem@0 8051 FLAG_C = src >> (24-shift);
philpem@0 8052 FLAG_V = VFLAG_CLEAR;
philpem@0 8053 }
philpem@0 8054
philpem@0 8055
philpem@0 8056 M68KMAKE_OP(rol, 8, r, .)
philpem@0 8057 {
philpem@0 8058 uint* r_dst = &DY;
philpem@0 8059 uint orig_shift = DX & 0x3f;
philpem@0 8060 uint shift = orig_shift & 7;
philpem@0 8061 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8062 uint res = ROL_8(src, shift);
philpem@0 8063
philpem@0 8064 if(orig_shift != 0)
philpem@0 8065 {
philpem@0 8066 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8067
philpem@0 8068 if(shift != 0)
philpem@0 8069 {
philpem@0 8070 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8071 FLAG_C = src << shift;
philpem@0 8072 FLAG_N = NFLAG_8(res);
philpem@0 8073 FLAG_Z = res;
philpem@0 8074 FLAG_V = VFLAG_CLEAR;
philpem@0 8075 return;
philpem@0 8076 }
philpem@0 8077 FLAG_C = (src & 1)<<8;
philpem@0 8078 FLAG_N = NFLAG_8(src);
philpem@0 8079 FLAG_Z = src;
philpem@0 8080 FLAG_V = VFLAG_CLEAR;
philpem@0 8081 return;
philpem@0 8082 }
philpem@0 8083
philpem@0 8084 FLAG_C = CFLAG_CLEAR;
philpem@0 8085 FLAG_N = NFLAG_8(src);
philpem@0 8086 FLAG_Z = src;
philpem@0 8087 FLAG_V = VFLAG_CLEAR;
philpem@0 8088 }
philpem@0 8089
philpem@0 8090
philpem@0 8091 M68KMAKE_OP(rol, 16, r, .)
philpem@0 8092 {
philpem@0 8093 uint* r_dst = &DY;
philpem@0 8094 uint orig_shift = DX & 0x3f;
philpem@0 8095 uint shift = orig_shift & 15;
philpem@0 8096 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8097 uint res = MASK_OUT_ABOVE_16(ROL_16(src, shift));
philpem@0 8098
philpem@0 8099 if(orig_shift != 0)
philpem@0 8100 {
philpem@0 8101 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8102
philpem@0 8103 if(shift != 0)
philpem@0 8104 {
philpem@0 8105 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 8106 FLAG_C = (src << shift) >> 8;
philpem@0 8107 FLAG_N = NFLAG_16(res);
philpem@0 8108 FLAG_Z = res;
philpem@0 8109 FLAG_V = VFLAG_CLEAR;
philpem@0 8110 return;
philpem@0 8111 }
philpem@0 8112 FLAG_C = (src & 1)<<8;
philpem@0 8113 FLAG_N = NFLAG_16(src);
philpem@0 8114 FLAG_Z = src;
philpem@0 8115 FLAG_V = VFLAG_CLEAR;
philpem@0 8116 return;
philpem@0 8117 }
philpem@0 8118
philpem@0 8119 FLAG_C = CFLAG_CLEAR;
philpem@0 8120 FLAG_N = NFLAG_16(src);
philpem@0 8121 FLAG_Z = src;
philpem@0 8122 FLAG_V = VFLAG_CLEAR;
philpem@0 8123 }
philpem@0 8124
philpem@0 8125
philpem@0 8126 M68KMAKE_OP(rol, 32, r, .)
philpem@0 8127 {
philpem@0 8128 uint* r_dst = &DY;
philpem@0 8129 uint orig_shift = DX & 0x3f;
philpem@0 8130 uint shift = orig_shift & 31;
philpem@0 8131 uint64 src = *r_dst;
philpem@0 8132 uint res = ROL_32(src, shift);
philpem@0 8133
philpem@0 8134 if(orig_shift != 0)
philpem@0 8135 {
philpem@0 8136 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8137
philpem@0 8138 *r_dst = res;
philpem@0 8139
philpem@0 8140 FLAG_C = (src >> (32 - shift)) << 8;
philpem@0 8141 FLAG_N = NFLAG_32(res);
philpem@0 8142 FLAG_Z = res;
philpem@0 8143 FLAG_V = VFLAG_CLEAR;
philpem@0 8144 return;
philpem@0 8145 }
philpem@0 8146
philpem@0 8147 FLAG_C = CFLAG_CLEAR;
philpem@0 8148 FLAG_N = NFLAG_32(src);
philpem@0 8149 FLAG_Z = src;
philpem@0 8150 FLAG_V = VFLAG_CLEAR;
philpem@0 8151 }
philpem@0 8152
philpem@0 8153
philpem@0 8154 M68KMAKE_OP(rol, 16, ., .)
philpem@0 8155 {
philpem@0 8156 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 8157 uint src = m68ki_read_16(ea);
philpem@0 8158 uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
philpem@0 8159
philpem@0 8160 m68ki_write_16(ea, res);
philpem@0 8161
philpem@0 8162 FLAG_N = NFLAG_16(res);
philpem@0 8163 FLAG_Z = res;
philpem@0 8164 FLAG_C = src >> 7;
philpem@0 8165 FLAG_V = VFLAG_CLEAR;
philpem@0 8166 }
philpem@0 8167
philpem@0 8168
philpem@0 8169 M68KMAKE_OP(roxr, 8, s, .)
philpem@0 8170 {
philpem@0 8171 uint* r_dst = &DY;
philpem@0 8172 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8173 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8174 uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
philpem@0 8175
philpem@0 8176 FLAG_C = FLAG_X = res;
philpem@0 8177 res = MASK_OUT_ABOVE_8(res);
philpem@0 8178
philpem@0 8179 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8180
philpem@0 8181 FLAG_N = NFLAG_8(res);
philpem@0 8182 FLAG_Z = res;
philpem@0 8183 FLAG_V = VFLAG_CLEAR;
philpem@0 8184 }
philpem@0 8185
philpem@0 8186
philpem@0 8187 M68KMAKE_OP(roxr, 16, s, .)
philpem@0 8188 {
philpem@0 8189 uint* r_dst = &DY;
philpem@0 8190 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8191 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8192 uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
philpem@0 8193
philpem@0 8194 FLAG_C = FLAG_X = res >> 8;
philpem@0 8195 res = MASK_OUT_ABOVE_16(res);
philpem@0 8196
philpem@0 8197 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 8198
philpem@0 8199 FLAG_N = NFLAG_16(res);
philpem@0 8200 FLAG_Z = res;
philpem@0 8201 FLAG_V = VFLAG_CLEAR;
philpem@0 8202 }
philpem@0 8203
philpem@0 8204
philpem@0 8205 M68KMAKE_OP(roxr, 32, s, .)
philpem@0 8206 {
philpem@0 8207 #if M68K_USE_64_BIT
philpem@0 8208
philpem@0 8209 uint* r_dst = &DY;
philpem@0 8210 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8211 uint64 src = *r_dst;
philpem@0 8212 uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
philpem@0 8213
philpem@0 8214 res = ROR_33_64(res, shift);
philpem@0 8215
philpem@0 8216 FLAG_C = FLAG_X = res >> 24;
philpem@0 8217 res = MASK_OUT_ABOVE_32(res);
philpem@0 8218
philpem@0 8219 *r_dst = res;
philpem@0 8220
philpem@0 8221 FLAG_N = NFLAG_32(res);
philpem@0 8222 FLAG_Z = res;
philpem@0 8223 FLAG_V = VFLAG_CLEAR;
philpem@0 8224
philpem@0 8225 #else
philpem@0 8226
philpem@0 8227 uint* r_dst = &DY;
philpem@0 8228 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8229 uint src = *r_dst;
philpem@0 8230 uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
philpem@0 8231 uint new_x_flag = src & (1 << (shift - 1));
philpem@0 8232
philpem@0 8233 *r_dst = res;
philpem@0 8234
philpem@0 8235 FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
philpem@0 8236 FLAG_N = NFLAG_32(res);
philpem@0 8237 FLAG_Z = res;
philpem@0 8238 FLAG_V = VFLAG_CLEAR;
philpem@0 8239
philpem@0 8240 #endif
philpem@0 8241 }
philpem@0 8242
philpem@0 8243
philpem@0 8244 M68KMAKE_OP(roxr, 8, r, .)
philpem@0 8245 {
philpem@0 8246 uint* r_dst = &DY;
philpem@0 8247 uint orig_shift = DX & 0x3f;
philpem@0 8248
philpem@0 8249 if(orig_shift != 0)
philpem@0 8250 {
philpem@0 8251 uint shift = orig_shift % 9;
philpem@0 8252 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8253 uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
philpem@0 8254
philpem@0 8255 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8256
philpem@0 8257 FLAG_C = FLAG_X = res;
philpem@0 8258 res = MASK_OUT_ABOVE_8(res);
philpem@0 8259
philpem@0 8260 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8261 FLAG_N = NFLAG_8(res);
philpem@0 8262 FLAG_Z = res;
philpem@0 8263 FLAG_V = VFLAG_CLEAR;
philpem@0 8264 return;
philpem@0 8265 }
philpem@0 8266
philpem@0 8267 FLAG_C = FLAG_X;
philpem@0 8268 FLAG_N = NFLAG_8(*r_dst);
philpem@0 8269 FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8270 FLAG_V = VFLAG_CLEAR;
philpem@0 8271 }
philpem@0 8272
philpem@0 8273
philpem@0 8274 M68KMAKE_OP(roxr, 16, r, .)
philpem@0 8275 {
philpem@0 8276 uint* r_dst = &DY;
philpem@0 8277 uint orig_shift = DX & 0x3f;
philpem@0 8278
philpem@0 8279 if(orig_shift != 0)
philpem@0 8280 {
philpem@0 8281 uint shift = orig_shift % 17;
philpem@0 8282 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8283 uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
philpem@0 8284
philpem@0 8285 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8286
philpem@0 8287 FLAG_C = FLAG_X = res >> 8;
philpem@0 8288 res = MASK_OUT_ABOVE_16(res);
philpem@0 8289
philpem@0 8290 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 8291 FLAG_N = NFLAG_16(res);
philpem@0 8292 FLAG_Z = res;
philpem@0 8293 FLAG_V = VFLAG_CLEAR;
philpem@0 8294 return;
philpem@0 8295 }
philpem@0 8296
philpem@0 8297 FLAG_C = FLAG_X;
philpem@0 8298 FLAG_N = NFLAG_16(*r_dst);
philpem@0 8299 FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8300 FLAG_V = VFLAG_CLEAR;
philpem@0 8301 }
philpem@0 8302
philpem@0 8303
philpem@0 8304 M68KMAKE_OP(roxr, 32, r, .)
philpem@0 8305 {
philpem@0 8306 #if M68K_USE_64_BIT
philpem@0 8307
philpem@0 8308 uint* r_dst = &DY;
philpem@0 8309 uint orig_shift = DX & 0x3f;
philpem@0 8310
philpem@0 8311 if(orig_shift != 0)
philpem@0 8312 {
philpem@0 8313 uint shift = orig_shift % 33;
philpem@0 8314 uint64 src = *r_dst;
philpem@0 8315 uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
philpem@0 8316
philpem@0 8317 res = ROR_33_64(res, shift);
philpem@0 8318
philpem@0 8319 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8320
philpem@0 8321 FLAG_C = FLAG_X = res >> 24;
philpem@0 8322 res = MASK_OUT_ABOVE_32(res);
philpem@0 8323
philpem@0 8324 *r_dst = res;
philpem@0 8325 FLAG_N = NFLAG_32(res);
philpem@0 8326 FLAG_Z = res;
philpem@0 8327 FLAG_V = VFLAG_CLEAR;
philpem@0 8328 return;
philpem@0 8329 }
philpem@0 8330
philpem@0 8331 FLAG_C = FLAG_X;
philpem@0 8332 FLAG_N = NFLAG_32(*r_dst);
philpem@0 8333 FLAG_Z = *r_dst;
philpem@0 8334 FLAG_V = VFLAG_CLEAR;
philpem@0 8335
philpem@0 8336 #else
philpem@0 8337
philpem@0 8338 uint* r_dst = &DY;
philpem@0 8339 uint orig_shift = DX & 0x3f;
philpem@0 8340 uint shift = orig_shift % 33;
philpem@0 8341 uint src = *r_dst;
philpem@0 8342 uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
philpem@0 8343 uint new_x_flag = src & (1 << (shift - 1));
philpem@0 8344
philpem@0 8345 if(orig_shift != 0)
philpem@0 8346 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8347
philpem@0 8348 if(shift != 0)
philpem@0 8349 {
philpem@0 8350 *r_dst = res;
philpem@0 8351 FLAG_X = (new_x_flag != 0)<<8;
philpem@0 8352 }
philpem@0 8353 else
philpem@0 8354 res = src;
philpem@0 8355 FLAG_C = FLAG_X;
philpem@0 8356 FLAG_N = NFLAG_32(res);
philpem@0 8357 FLAG_Z = res;
philpem@0 8358 FLAG_V = VFLAG_CLEAR;
philpem@0 8359
philpem@0 8360 #endif
philpem@0 8361 }
philpem@0 8362
philpem@0 8363
philpem@0 8364 M68KMAKE_OP(roxr, 16, ., .)
philpem@0 8365 {
philpem@0 8366 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 8367 uint src = m68ki_read_16(ea);
philpem@0 8368 uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
philpem@0 8369
philpem@0 8370 FLAG_C = FLAG_X = res >> 8;
philpem@0 8371 res = MASK_OUT_ABOVE_16(res);
philpem@0 8372
philpem@0 8373 m68ki_write_16(ea, res);
philpem@0 8374
philpem@0 8375 FLAG_N = NFLAG_16(res);
philpem@0 8376 FLAG_Z = res;
philpem@0 8377 FLAG_V = VFLAG_CLEAR;
philpem@0 8378 }
philpem@0 8379
philpem@0 8380
philpem@0 8381 M68KMAKE_OP(roxl, 8, s, .)
philpem@0 8382 {
philpem@0 8383 uint* r_dst = &DY;
philpem@0 8384 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8385 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8386 uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
philpem@0 8387
philpem@0 8388 FLAG_C = FLAG_X = res;
philpem@0 8389 res = MASK_OUT_ABOVE_8(res);
philpem@0 8390
philpem@0 8391 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8392
philpem@0 8393 FLAG_N = NFLAG_8(res);
philpem@0 8394 FLAG_Z = res;
philpem@0 8395 FLAG_V = VFLAG_CLEAR;
philpem@0 8396 }
philpem@0 8397
philpem@0 8398
philpem@0 8399 M68KMAKE_OP(roxl, 16, s, .)
philpem@0 8400 {
philpem@0 8401 uint* r_dst = &DY;
philpem@0 8402 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8403 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8404 uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
philpem@0 8405
philpem@0 8406 FLAG_C = FLAG_X = res >> 8;
philpem@0 8407 res = MASK_OUT_ABOVE_16(res);
philpem@0 8408
philpem@0 8409 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 8410
philpem@0 8411 FLAG_N = NFLAG_16(res);
philpem@0 8412 FLAG_Z = res;
philpem@0 8413 FLAG_V = VFLAG_CLEAR;
philpem@0 8414 }
philpem@0 8415
philpem@0 8416
philpem@0 8417 M68KMAKE_OP(roxl, 32, s, .)
philpem@0 8418 {
philpem@0 8419 #if M68K_USE_64_BIT
philpem@0 8420
philpem@0 8421 uint* r_dst = &DY;
philpem@0 8422 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8423 uint64 src = *r_dst;
philpem@0 8424 uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
philpem@0 8425
philpem@0 8426 res = ROL_33_64(res, shift);
philpem@0 8427
philpem@0 8428 FLAG_C = FLAG_X = res >> 24;
philpem@0 8429 res = MASK_OUT_ABOVE_32(res);
philpem@0 8430
philpem@0 8431 *r_dst = res;
philpem@0 8432
philpem@0 8433 FLAG_N = NFLAG_32(res);
philpem@0 8434 FLAG_Z = res;
philpem@0 8435 FLAG_V = VFLAG_CLEAR;
philpem@0 8436
philpem@0 8437 #else
philpem@0 8438
philpem@0 8439 uint* r_dst = &DY;
philpem@0 8440 uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 8441 uint src = *r_dst;
philpem@0 8442 uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
philpem@0 8443 uint new_x_flag = src & (1 << (32 - shift));
philpem@0 8444
philpem@0 8445 *r_dst = res;
philpem@0 8446
philpem@0 8447 FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
philpem@0 8448 FLAG_N = NFLAG_32(res);
philpem@0 8449 FLAG_Z = res;
philpem@0 8450 FLAG_V = VFLAG_CLEAR;
philpem@0 8451
philpem@0 8452 #endif
philpem@0 8453 }
philpem@0 8454
philpem@0 8455
philpem@0 8456 M68KMAKE_OP(roxl, 8, r, .)
philpem@0 8457 {
philpem@0 8458 uint* r_dst = &DY;
philpem@0 8459 uint orig_shift = DX & 0x3f;
philpem@0 8460
philpem@0 8461
philpem@0 8462 if(orig_shift != 0)
philpem@0 8463 {
philpem@0 8464 uint shift = orig_shift % 9;
philpem@0 8465 uint src = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8466 uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
philpem@0 8467
philpem@0 8468 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8469
philpem@0 8470 FLAG_C = FLAG_X = res;
philpem@0 8471 res = MASK_OUT_ABOVE_8(res);
philpem@0 8472
philpem@0 8473 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8474 FLAG_N = NFLAG_8(res);
philpem@0 8475 FLAG_Z = res;
philpem@0 8476 FLAG_V = VFLAG_CLEAR;
philpem@0 8477 return;
philpem@0 8478 }
philpem@0 8479
philpem@0 8480 FLAG_C = FLAG_X;
philpem@0 8481 FLAG_N = NFLAG_8(*r_dst);
philpem@0 8482 FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8483 FLAG_V = VFLAG_CLEAR;
philpem@0 8484 }
philpem@0 8485
philpem@0 8486
philpem@0 8487 M68KMAKE_OP(roxl, 16, r, .)
philpem@0 8488 {
philpem@0 8489 uint* r_dst = &DY;
philpem@0 8490 uint orig_shift = DX & 0x3f;
philpem@0 8491
philpem@0 8492 if(orig_shift != 0)
philpem@0 8493 {
philpem@0 8494 uint shift = orig_shift % 17;
philpem@0 8495 uint src = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8496 uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
philpem@0 8497
philpem@0 8498 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8499
philpem@0 8500 FLAG_C = FLAG_X = res >> 8;
philpem@0 8501 res = MASK_OUT_ABOVE_16(res);
philpem@0 8502
philpem@0 8503 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 8504 FLAG_N = NFLAG_16(res);
philpem@0 8505 FLAG_Z = res;
philpem@0 8506 FLAG_V = VFLAG_CLEAR;
philpem@0 8507 return;
philpem@0 8508 }
philpem@0 8509
philpem@0 8510 FLAG_C = FLAG_X;
philpem@0 8511 FLAG_N = NFLAG_16(*r_dst);
philpem@0 8512 FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8513 FLAG_V = VFLAG_CLEAR;
philpem@0 8514 }
philpem@0 8515
philpem@0 8516
philpem@0 8517 M68KMAKE_OP(roxl, 32, r, .)
philpem@0 8518 {
philpem@0 8519 #if M68K_USE_64_BIT
philpem@0 8520
philpem@0 8521 uint* r_dst = &DY;
philpem@0 8522 uint orig_shift = DX & 0x3f;
philpem@0 8523
philpem@0 8524 if(orig_shift != 0)
philpem@0 8525 {
philpem@0 8526 uint shift = orig_shift % 33;
philpem@0 8527 uint64 src = *r_dst;
philpem@0 8528 uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
philpem@0 8529
philpem@0 8530 res = ROL_33_64(res, shift);
philpem@0 8531
philpem@0 8532 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8533
philpem@0 8534 FLAG_C = FLAG_X = res >> 24;
philpem@0 8535 res = MASK_OUT_ABOVE_32(res);
philpem@0 8536
philpem@0 8537 *r_dst = res;
philpem@0 8538 FLAG_N = NFLAG_32(res);
philpem@0 8539 FLAG_Z = res;
philpem@0 8540 FLAG_V = VFLAG_CLEAR;
philpem@0 8541 return;
philpem@0 8542 }
philpem@0 8543
philpem@0 8544 FLAG_C = FLAG_X;
philpem@0 8545 FLAG_N = NFLAG_32(*r_dst);
philpem@0 8546 FLAG_Z = *r_dst;
philpem@0 8547 FLAG_V = VFLAG_CLEAR;
philpem@0 8548
philpem@0 8549 #else
philpem@0 8550
philpem@0 8551 uint* r_dst = &DY;
philpem@0 8552 uint orig_shift = DX & 0x3f;
philpem@0 8553 uint shift = orig_shift % 33;
philpem@0 8554 uint src = *r_dst;
philpem@0 8555 uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
philpem@0 8556 uint new_x_flag = src & (1 << (32 - shift));
philpem@0 8557
philpem@0 8558 if(orig_shift != 0)
philpem@0 8559 USE_CYCLES(orig_shift<<CYC_SHIFT);
philpem@0 8560
philpem@0 8561 if(shift != 0)
philpem@0 8562 {
philpem@0 8563 *r_dst = res;
philpem@0 8564 FLAG_X = (new_x_flag != 0)<<8;
philpem@0 8565 }
philpem@0 8566 else
philpem@0 8567 res = src;
philpem@0 8568 FLAG_C = FLAG_X;
philpem@0 8569 FLAG_N = NFLAG_32(res);
philpem@0 8570 FLAG_Z = res;
philpem@0 8571 FLAG_V = VFLAG_CLEAR;
philpem@0 8572
philpem@0 8573 #endif
philpem@0 8574 }
philpem@0 8575
philpem@0 8576
philpem@0 8577 M68KMAKE_OP(roxl, 16, ., .)
philpem@0 8578 {
philpem@0 8579 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 8580 uint src = m68ki_read_16(ea);
philpem@0 8581 uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
philpem@0 8582
philpem@0 8583 FLAG_C = FLAG_X = res >> 8;
philpem@0 8584 res = MASK_OUT_ABOVE_16(res);
philpem@0 8585
philpem@0 8586 m68ki_write_16(ea, res);
philpem@0 8587
philpem@0 8588 FLAG_N = NFLAG_16(res);
philpem@0 8589 FLAG_Z = res;
philpem@0 8590 FLAG_V = VFLAG_CLEAR;
philpem@0 8591 }
philpem@0 8592
philpem@0 8593
philpem@0 8594 M68KMAKE_OP(rtd, 32, ., .)
philpem@0 8595 {
philpem@0 8596 if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
philpem@0 8597 {
philpem@0 8598 uint new_pc = m68ki_pull_32();
philpem@0 8599
philpem@0 8600 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 8601 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
philpem@0 8602 m68ki_jump(new_pc);
philpem@0 8603 return;
philpem@0 8604 }
philpem@0 8605 m68ki_exception_illegal();
philpem@0 8606 }
philpem@0 8607
philpem@0 8608
philpem@0 8609 M68KMAKE_OP(rte, 32, ., .)
philpem@0 8610 {
philpem@0 8611 if(FLAG_S)
philpem@0 8612 {
philpem@0 8613 uint new_sr;
philpem@0 8614 uint new_pc;
philpem@0 8615 uint format_word;
philpem@0 8616
philpem@0 8617 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 8618
philpem@0 8619 if(CPU_TYPE_IS_000(CPU_TYPE))
philpem@0 8620 {
philpem@0 8621 new_sr = m68ki_pull_16();
philpem@0 8622 new_pc = m68ki_pull_32();
philpem@0 8623 m68ki_jump(new_pc);
philpem@0 8624 m68ki_set_sr(new_sr);
philpem@0 8625 return;
philpem@0 8626 }
philpem@0 8627
philpem@0 8628 if(CPU_TYPE_IS_010(CPU_TYPE))
philpem@0 8629 {
philpem@0 8630 format_word = m68ki_read_16(REG_A[7]+6) >> 12;
philpem@0 8631 if(format_word == 0)
philpem@0 8632 {
philpem@0 8633 new_sr = m68ki_pull_16();
philpem@0 8634 new_pc = m68ki_pull_32();
philpem@0 8635 m68ki_fake_pull_16(); /* format word */
philpem@0 8636 m68ki_jump(new_pc);
philpem@0 8637 m68ki_set_sr(new_sr);
philpem@0 8638 return;
philpem@0 8639 }
philpem@0 8640 /* Not handling bus fault (9) */
philpem@0 8641 m68ki_exception_format_error();
philpem@0 8642 return;
philpem@0 8643 }
philpem@0 8644
philpem@0 8645 /* Otherwise it's 020 */
philpem@0 8646 rte_loop:
philpem@0 8647 format_word = m68ki_read_16(REG_A[7]+6) >> 12;
philpem@0 8648 switch(format_word)
philpem@0 8649 {
philpem@0 8650 case 0: /* Normal */
philpem@0 8651 new_sr = m68ki_pull_16();
philpem@0 8652 new_pc = m68ki_pull_32();
philpem@0 8653 m68ki_fake_pull_16(); /* format word */
philpem@0 8654 m68ki_jump(new_pc);
philpem@0 8655 m68ki_set_sr(new_sr);
philpem@0 8656 return;
philpem@0 8657 case 1: /* Throwaway */
philpem@0 8658 new_sr = m68ki_pull_16();
philpem@0 8659 m68ki_fake_pull_32(); /* program counter */
philpem@0 8660 m68ki_fake_pull_16(); /* format word */
philpem@0 8661 m68ki_set_sr_noint(new_sr);
philpem@0 8662 goto rte_loop;
philpem@0 8663 case 2: /* Trap */
philpem@0 8664 new_sr = m68ki_pull_16();
philpem@0 8665 new_pc = m68ki_pull_32();
philpem@0 8666 m68ki_fake_pull_16(); /* format word */
philpem@0 8667 m68ki_fake_pull_32(); /* address */
philpem@0 8668 m68ki_jump(new_pc);
philpem@0 8669 m68ki_set_sr(new_sr);
philpem@0 8670 return;
philpem@0 8671 }
philpem@0 8672 /* Not handling long or short bus fault */
philpem@0 8673 m68ki_exception_format_error();
philpem@0 8674 return;
philpem@0 8675 }
philpem@0 8676 m68ki_exception_privilege_violation();
philpem@0 8677 }
philpem@0 8678
philpem@0 8679
philpem@0 8680 M68KMAKE_OP(rtm, 32, ., .)
philpem@0 8681 {
philpem@0 8682 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
philpem@0 8683 {
philpem@0 8684 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 8685 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
philpem@0 8686 m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
philpem@0 8687 m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
philpem@0 8688 return;
philpem@0 8689 }
philpem@0 8690 m68ki_exception_illegal();
philpem@0 8691 }
philpem@0 8692
philpem@0 8693
philpem@0 8694 M68KMAKE_OP(rtr, 32, ., .)
philpem@0 8695 {
philpem@0 8696 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 8697 m68ki_set_ccr(m68ki_pull_16());
philpem@0 8698 m68ki_jump(m68ki_pull_32());
philpem@0 8699 }
philpem@0 8700
philpem@0 8701
philpem@0 8702 M68KMAKE_OP(rts, 32, ., .)
philpem@0 8703 {
philpem@0 8704 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 8705 m68ki_jump(m68ki_pull_32());
philpem@0 8706 }
philpem@0 8707
philpem@0 8708
philpem@0 8709 M68KMAKE_OP(sbcd, 8, rr, .)
philpem@0 8710 {
philpem@0 8711 uint* r_dst = &DX;
philpem@0 8712 uint src = DY;
philpem@0 8713 uint dst = *r_dst;
philpem@0 8714 uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
philpem@0 8715
philpem@0 8716 if(res > 9)
philpem@0 8717 res -= 6;
philpem@0 8718 res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
philpem@0 8719 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 8720 if(FLAG_C)
philpem@0 8721 res += 0xa0;
philpem@0 8722
philpem@0 8723 res = MASK_OUT_ABOVE_8(res);
philpem@0 8724
philpem@0 8725 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 8726 FLAG_Z |= res;
philpem@0 8727
philpem@0 8728 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 8729 }
philpem@0 8730
philpem@0 8731
philpem@0 8732 M68KMAKE_OP(sbcd, 8, mm, ax7)
philpem@0 8733 {
philpem@0 8734 uint src = OPER_AY_PD_8();
philpem@0 8735 uint ea = EA_A7_PD_8();
philpem@0 8736 uint dst = m68ki_read_8(ea);
philpem@0 8737 uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
philpem@0 8738
philpem@0 8739 if(res > 9)
philpem@0 8740 res -= 6;
philpem@0 8741 res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
philpem@0 8742 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 8743 if(FLAG_C)
philpem@0 8744 res += 0xa0;
philpem@0 8745
philpem@0 8746 res = MASK_OUT_ABOVE_8(res);
philpem@0 8747
philpem@0 8748 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 8749 FLAG_Z |= res;
philpem@0 8750
philpem@0 8751 m68ki_write_8(ea, res);
philpem@0 8752 }
philpem@0 8753
philpem@0 8754
philpem@0 8755 M68KMAKE_OP(sbcd, 8, mm, ay7)
philpem@0 8756 {
philpem@0 8757 uint src = OPER_A7_PD_8();
philpem@0 8758 uint ea = EA_AX_PD_8();
philpem@0 8759 uint dst = m68ki_read_8(ea);
philpem@0 8760 uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
philpem@0 8761
philpem@0 8762 if(res > 9)
philpem@0 8763 res -= 6;
philpem@0 8764 res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
philpem@0 8765 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 8766 if(FLAG_C)
philpem@0 8767 res += 0xa0;
philpem@0 8768
philpem@0 8769 res = MASK_OUT_ABOVE_8(res);
philpem@0 8770
philpem@0 8771 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 8772 FLAG_Z |= res;
philpem@0 8773
philpem@0 8774 m68ki_write_8(ea, res);
philpem@0 8775 }
philpem@0 8776
philpem@0 8777
philpem@0 8778 M68KMAKE_OP(sbcd, 8, mm, axy7)
philpem@0 8779 {
philpem@0 8780 uint src = OPER_A7_PD_8();
philpem@0 8781 uint ea = EA_A7_PD_8();
philpem@0 8782 uint dst = m68ki_read_8(ea);
philpem@0 8783 uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
philpem@0 8784
philpem@0 8785 if(res > 9)
philpem@0 8786 res -= 6;
philpem@0 8787 res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
philpem@0 8788 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 8789 if(FLAG_C)
philpem@0 8790 res += 0xa0;
philpem@0 8791
philpem@0 8792 res = MASK_OUT_ABOVE_8(res);
philpem@0 8793
philpem@0 8794 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 8795 FLAG_Z |= res;
philpem@0 8796
philpem@0 8797 m68ki_write_8(ea, res);
philpem@0 8798 }
philpem@0 8799
philpem@0 8800
philpem@0 8801 M68KMAKE_OP(sbcd, 8, mm, .)
philpem@0 8802 {
philpem@0 8803 uint src = OPER_AY_PD_8();
philpem@0 8804 uint ea = EA_AX_PD_8();
philpem@0 8805 uint dst = m68ki_read_8(ea);
philpem@0 8806 uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
philpem@0 8807
philpem@0 8808 if(res > 9)
philpem@0 8809 res -= 6;
philpem@0 8810 res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
philpem@0 8811 FLAG_X = FLAG_C = (res > 0x99) << 8;
philpem@0 8812 if(FLAG_C)
philpem@0 8813 res += 0xa0;
philpem@0 8814
philpem@0 8815 res = MASK_OUT_ABOVE_8(res);
philpem@0 8816
philpem@0 8817 FLAG_N = NFLAG_8(res); /* officially undefined */
philpem@0 8818 FLAG_Z |= res;
philpem@0 8819
philpem@0 8820 m68ki_write_8(ea, res);
philpem@0 8821 }
philpem@0 8822
philpem@0 8823
philpem@0 8824 M68KMAKE_OP(st, 8, ., d)
philpem@0 8825 {
philpem@0 8826 DY |= 0xff;
philpem@0 8827 }
philpem@0 8828
philpem@0 8829
philpem@0 8830 M68KMAKE_OP(st, 8, ., .)
philpem@0 8831 {
philpem@0 8832 m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0xff);
philpem@0 8833 }
philpem@0 8834
philpem@0 8835
philpem@0 8836 M68KMAKE_OP(sf, 8, ., d)
philpem@0 8837 {
philpem@0 8838 DY &= 0xffffff00;
philpem@0 8839 }
philpem@0 8840
philpem@0 8841
philpem@0 8842 M68KMAKE_OP(sf, 8, ., .)
philpem@0 8843 {
philpem@0 8844 m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0);
philpem@0 8845 }
philpem@0 8846
philpem@0 8847
philpem@0 8848 M68KMAKE_OP(scc, 8, ., d)
philpem@0 8849 {
philpem@0 8850 if(M68KMAKE_CC)
philpem@0 8851 {
philpem@0 8852 DY |= 0xff;
philpem@0 8853 return;
philpem@0 8854 }
philpem@0 8855 DY &= 0xffffff00;
philpem@0 8856 }
philpem@0 8857
philpem@0 8858
philpem@0 8859 M68KMAKE_OP(scc, 8, ., .)
philpem@0 8860 {
philpem@0 8861 m68ki_write_8(M68KMAKE_GET_EA_AY_8, M68KMAKE_CC ? 0xff : 0);
philpem@0 8862 }
philpem@0 8863
philpem@0 8864
philpem@0 8865 M68KMAKE_OP(stop, 0, ., .)
philpem@0 8866 {
philpem@0 8867 if(FLAG_S)
philpem@0 8868 {
philpem@0 8869 uint new_sr = OPER_I_16();
philpem@0 8870 m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
philpem@0 8871 CPU_STOPPED |= STOP_LEVEL_STOP;
philpem@0 8872 m68ki_set_sr(new_sr);
philpem@0 8873 m68ki_remaining_cycles = 0;
philpem@0 8874 return;
philpem@0 8875 }
philpem@0 8876 m68ki_exception_privilege_violation();
philpem@0 8877 }
philpem@0 8878
philpem@0 8879
philpem@0 8880 M68KMAKE_OP(sub, 8, er, d)
philpem@0 8881 {
philpem@0 8882 uint* r_dst = &DX;
philpem@0 8883 uint src = MASK_OUT_ABOVE_8(DY);
philpem@0 8884 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8885 uint res = dst - src;
philpem@0 8886
philpem@0 8887 FLAG_N = NFLAG_8(res);
philpem@0 8888 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 8889 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 8890 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 8891
philpem@0 8892 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 8893 }
philpem@0 8894
philpem@0 8895
philpem@0 8896 M68KMAKE_OP(sub, 8, er, .)
philpem@0 8897 {
philpem@0 8898 uint* r_dst = &DX;
philpem@0 8899 uint src = M68KMAKE_GET_OPER_AY_8;
philpem@0 8900 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 8901 uint res = dst - src;
philpem@0 8902
philpem@0 8903 FLAG_N = NFLAG_8(res);
philpem@0 8904 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 8905 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 8906 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 8907
philpem@0 8908 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 8909 }
philpem@0 8910
philpem@0 8911
philpem@0 8912 M68KMAKE_OP(sub, 16, er, d)
philpem@0 8913 {
philpem@0 8914 uint* r_dst = &DX;
philpem@0 8915 uint src = MASK_OUT_ABOVE_16(DY);
philpem@0 8916 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8917 uint res = dst - src;
philpem@0 8918
philpem@0 8919 FLAG_N = NFLAG_16(res);
philpem@0 8920 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 8921 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 8922 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 8923
philpem@0 8924 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 8925 }
philpem@0 8926
philpem@0 8927
philpem@0 8928 M68KMAKE_OP(sub, 16, er, a)
philpem@0 8929 {
philpem@0 8930 uint* r_dst = &DX;
philpem@0 8931 uint src = MASK_OUT_ABOVE_16(AY);
philpem@0 8932 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8933 uint res = dst - src;
philpem@0 8934
philpem@0 8935 FLAG_N = NFLAG_16(res);
philpem@0 8936 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 8937 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 8938 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 8939
philpem@0 8940 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 8941 }
philpem@0 8942
philpem@0 8943
philpem@0 8944 M68KMAKE_OP(sub, 16, er, .)
philpem@0 8945 {
philpem@0 8946 uint* r_dst = &DX;
philpem@0 8947 uint src = M68KMAKE_GET_OPER_AY_16;
philpem@0 8948 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 8949 uint res = dst - src;
philpem@0 8950
philpem@0 8951 FLAG_N = NFLAG_16(res);
philpem@0 8952 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 8953 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 8954 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 8955
philpem@0 8956 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 8957 }
philpem@0 8958
philpem@0 8959
philpem@0 8960 M68KMAKE_OP(sub, 32, er, d)
philpem@0 8961 {
philpem@0 8962 uint* r_dst = &DX;
philpem@0 8963 uint src = DY;
philpem@0 8964 uint dst = *r_dst;
philpem@0 8965 uint res = dst - src;
philpem@0 8966
philpem@0 8967 FLAG_N = NFLAG_32(res);
philpem@0 8968 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 8969 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 8970 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 8971
philpem@0 8972 *r_dst = FLAG_Z;
philpem@0 8973 }
philpem@0 8974
philpem@0 8975
philpem@0 8976 M68KMAKE_OP(sub, 32, er, a)
philpem@0 8977 {
philpem@0 8978 uint* r_dst = &DX;
philpem@0 8979 uint src = AY;
philpem@0 8980 uint dst = *r_dst;
philpem@0 8981 uint res = dst - src;
philpem@0 8982
philpem@0 8983 FLAG_N = NFLAG_32(res);
philpem@0 8984 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 8985 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 8986 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 8987
philpem@0 8988 *r_dst = FLAG_Z;
philpem@0 8989 }
philpem@0 8990
philpem@0 8991
philpem@0 8992 M68KMAKE_OP(sub, 32, er, .)
philpem@0 8993 {
philpem@0 8994 uint* r_dst = &DX;
philpem@0 8995 uint src = M68KMAKE_GET_OPER_AY_32;
philpem@0 8996 uint dst = *r_dst;
philpem@0 8997 uint res = dst - src;
philpem@0 8998
philpem@0 8999 FLAG_N = NFLAG_32(res);
philpem@0 9000 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9001 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9002 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 9003
philpem@0 9004 *r_dst = FLAG_Z;
philpem@0 9005 }
philpem@0 9006
philpem@0 9007
philpem@0 9008 M68KMAKE_OP(sub, 8, re, .)
philpem@0 9009 {
philpem@0 9010 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 9011 uint src = MASK_OUT_ABOVE_8(DX);
philpem@0 9012 uint dst = m68ki_read_8(ea);
philpem@0 9013 uint res = dst - src;
philpem@0 9014
philpem@0 9015 FLAG_N = NFLAG_8(res);
philpem@0 9016 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 9017 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9018 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9019
philpem@0 9020 m68ki_write_8(ea, FLAG_Z);
philpem@0 9021 }
philpem@0 9022
philpem@0 9023
philpem@0 9024 M68KMAKE_OP(sub, 16, re, .)
philpem@0 9025 {
philpem@0 9026 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 9027 uint src = MASK_OUT_ABOVE_16(DX);
philpem@0 9028 uint dst = m68ki_read_16(ea);
philpem@0 9029 uint res = dst - src;
philpem@0 9030
philpem@0 9031 FLAG_N = NFLAG_16(res);
philpem@0 9032 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 9033 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9034 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9035
philpem@0 9036 m68ki_write_16(ea, FLAG_Z);
philpem@0 9037 }
philpem@0 9038
philpem@0 9039
philpem@0 9040 M68KMAKE_OP(sub, 32, re, .)
philpem@0 9041 {
philpem@0 9042 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 9043 uint src = DX;
philpem@0 9044 uint dst = m68ki_read_32(ea);
philpem@0 9045 uint res = dst - src;
philpem@0 9046
philpem@0 9047 FLAG_N = NFLAG_32(res);
philpem@0 9048 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 9049 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9050 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9051
philpem@0 9052 m68ki_write_32(ea, FLAG_Z);
philpem@0 9053 }
philpem@0 9054
philpem@0 9055
philpem@0 9056 M68KMAKE_OP(suba, 16, ., d)
philpem@0 9057 {
philpem@0 9058 uint* r_dst = &AX;
philpem@0 9059
philpem@0 9060 *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY));
philpem@0 9061 }
philpem@0 9062
philpem@0 9063
philpem@0 9064 M68KMAKE_OP(suba, 16, ., a)
philpem@0 9065 {
philpem@0 9066 uint* r_dst = &AX;
philpem@0 9067
philpem@0 9068 *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY));
philpem@0 9069 }
philpem@0 9070
philpem@0 9071
philpem@0 9072 M68KMAKE_OP(suba, 16, ., .)
philpem@0 9073 {
philpem@0 9074 uint* r_dst = &AX;
philpem@0 9075
philpem@0 9076 *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));
philpem@0 9077 }
philpem@0 9078
philpem@0 9079
philpem@0 9080 M68KMAKE_OP(suba, 32, ., d)
philpem@0 9081 {
philpem@0 9082 uint* r_dst = &AX;
philpem@0 9083
philpem@0 9084 *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY);
philpem@0 9085 }
philpem@0 9086
philpem@0 9087
philpem@0 9088 M68KMAKE_OP(suba, 32, ., a)
philpem@0 9089 {
philpem@0 9090 uint* r_dst = &AX;
philpem@0 9091
philpem@0 9092 *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY);
philpem@0 9093 }
philpem@0 9094
philpem@0 9095
philpem@0 9096 M68KMAKE_OP(suba, 32, ., .)
philpem@0 9097 {
philpem@0 9098 uint* r_dst = &AX;
philpem@0 9099
philpem@0 9100 *r_dst = MASK_OUT_ABOVE_32(*r_dst - M68KMAKE_GET_OPER_AY_32);
philpem@0 9101 }
philpem@0 9102
philpem@0 9103
philpem@0 9104 M68KMAKE_OP(subi, 8, ., d)
philpem@0 9105 {
philpem@0 9106 uint* r_dst = &DY;
philpem@0 9107 uint src = OPER_I_8();
philpem@0 9108 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 9109 uint res = dst - src;
philpem@0 9110
philpem@0 9111 FLAG_N = NFLAG_8(res);
philpem@0 9112 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 9113 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9114 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9115
philpem@0 9116 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 9117 }
philpem@0 9118
philpem@0 9119
philpem@0 9120 M68KMAKE_OP(subi, 8, ., .)
philpem@0 9121 {
philpem@0 9122 uint src = OPER_I_8();
philpem@0 9123 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 9124 uint dst = m68ki_read_8(ea);
philpem@0 9125 uint res = dst - src;
philpem@0 9126
philpem@0 9127 FLAG_N = NFLAG_8(res);
philpem@0 9128 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 9129 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9130 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9131
philpem@0 9132 m68ki_write_8(ea, FLAG_Z);
philpem@0 9133 }
philpem@0 9134
philpem@0 9135
philpem@0 9136 M68KMAKE_OP(subi, 16, ., d)
philpem@0 9137 {
philpem@0 9138 uint* r_dst = &DY;
philpem@0 9139 uint src = OPER_I_16();
philpem@0 9140 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 9141 uint res = dst - src;
philpem@0 9142
philpem@0 9143 FLAG_N = NFLAG_16(res);
philpem@0 9144 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 9145 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9146 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9147
philpem@0 9148 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 9149 }
philpem@0 9150
philpem@0 9151
philpem@0 9152 M68KMAKE_OP(subi, 16, ., .)
philpem@0 9153 {
philpem@0 9154 uint src = OPER_I_16();
philpem@0 9155 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 9156 uint dst = m68ki_read_16(ea);
philpem@0 9157 uint res = dst - src;
philpem@0 9158
philpem@0 9159 FLAG_N = NFLAG_16(res);
philpem@0 9160 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 9161 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9162 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9163
philpem@0 9164 m68ki_write_16(ea, FLAG_Z);
philpem@0 9165 }
philpem@0 9166
philpem@0 9167
philpem@0 9168 M68KMAKE_OP(subi, 32, ., d)
philpem@0 9169 {
philpem@0 9170 uint* r_dst = &DY;
philpem@0 9171 uint src = OPER_I_32();
philpem@0 9172 uint dst = *r_dst;
philpem@0 9173 uint res = dst - src;
philpem@0 9174
philpem@0 9175 FLAG_N = NFLAG_32(res);
philpem@0 9176 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 9177 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9178 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9179
philpem@0 9180 *r_dst = FLAG_Z;
philpem@0 9181 }
philpem@0 9182
philpem@0 9183
philpem@0 9184 M68KMAKE_OP(subi, 32, ., .)
philpem@0 9185 {
philpem@0 9186 uint src = OPER_I_32();
philpem@0 9187 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 9188 uint dst = m68ki_read_32(ea);
philpem@0 9189 uint res = dst - src;
philpem@0 9190
philpem@0 9191 FLAG_N = NFLAG_32(res);
philpem@0 9192 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 9193 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9194 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9195
philpem@0 9196 m68ki_write_32(ea, FLAG_Z);
philpem@0 9197 }
philpem@0 9198
philpem@0 9199
philpem@0 9200 M68KMAKE_OP(subq, 8, ., d)
philpem@0 9201 {
philpem@0 9202 uint* r_dst = &DY;
philpem@0 9203 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 9204 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 9205 uint res = dst - src;
philpem@0 9206
philpem@0 9207 FLAG_N = NFLAG_8(res);
philpem@0 9208 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 9209 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9210 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9211
philpem@0 9212 *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
philpem@0 9213 }
philpem@0 9214
philpem@0 9215
philpem@0 9216 M68KMAKE_OP(subq, 8, ., .)
philpem@0 9217 {
philpem@0 9218 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 9219 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 9220 uint dst = m68ki_read_8(ea);
philpem@0 9221 uint res = dst - src;
philpem@0 9222
philpem@0 9223 FLAG_N = NFLAG_8(res);
philpem@0 9224 FLAG_Z = MASK_OUT_ABOVE_8(res);
philpem@0 9225 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9226 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9227
philpem@0 9228 m68ki_write_8(ea, FLAG_Z);
philpem@0 9229 }
philpem@0 9230
philpem@0 9231
philpem@0 9232 M68KMAKE_OP(subq, 16, ., d)
philpem@0 9233 {
philpem@0 9234 uint* r_dst = &DY;
philpem@0 9235 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 9236 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 9237 uint res = dst - src;
philpem@0 9238
philpem@0 9239 FLAG_N = NFLAG_16(res);
philpem@0 9240 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 9241 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9242 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9243
philpem@0 9244 *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
philpem@0 9245 }
philpem@0 9246
philpem@0 9247
philpem@0 9248 M68KMAKE_OP(subq, 16, ., a)
philpem@0 9249 {
philpem@0 9250 uint* r_dst = &AY;
philpem@0 9251
philpem@0 9252 *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
philpem@0 9253 }
philpem@0 9254
philpem@0 9255
philpem@0 9256 M68KMAKE_OP(subq, 16, ., .)
philpem@0 9257 {
philpem@0 9258 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 9259 uint ea = M68KMAKE_GET_EA_AY_16;
philpem@0 9260 uint dst = m68ki_read_16(ea);
philpem@0 9261 uint res = dst - src;
philpem@0 9262
philpem@0 9263 FLAG_N = NFLAG_16(res);
philpem@0 9264 FLAG_Z = MASK_OUT_ABOVE_16(res);
philpem@0 9265 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9266 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9267
philpem@0 9268 m68ki_write_16(ea, FLAG_Z);
philpem@0 9269 }
philpem@0 9270
philpem@0 9271
philpem@0 9272 M68KMAKE_OP(subq, 32, ., d)
philpem@0 9273 {
philpem@0 9274 uint* r_dst = &DY;
philpem@0 9275 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 9276 uint dst = *r_dst;
philpem@0 9277 uint res = dst - src;
philpem@0 9278
philpem@0 9279 FLAG_N = NFLAG_32(res);
philpem@0 9280 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 9281 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9282 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9283
philpem@0 9284 *r_dst = FLAG_Z;
philpem@0 9285 }
philpem@0 9286
philpem@0 9287
philpem@0 9288 M68KMAKE_OP(subq, 32, ., a)
philpem@0 9289 {
philpem@0 9290 uint* r_dst = &AY;
philpem@0 9291
philpem@0 9292 *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
philpem@0 9293 }
philpem@0 9294
philpem@0 9295
philpem@0 9296 M68KMAKE_OP(subq, 32, ., .)
philpem@0 9297 {
philpem@0 9298 uint src = (((REG_IR >> 9) - 1) & 7) + 1;
philpem@0 9299 uint ea = M68KMAKE_GET_EA_AY_32;
philpem@0 9300 uint dst = m68ki_read_32(ea);
philpem@0 9301 uint res = dst - src;
philpem@0 9302
philpem@0 9303 FLAG_N = NFLAG_32(res);
philpem@0 9304 FLAG_Z = MASK_OUT_ABOVE_32(res);
philpem@0 9305 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9306 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9307
philpem@0 9308 m68ki_write_32(ea, FLAG_Z);
philpem@0 9309 }
philpem@0 9310
philpem@0 9311
philpem@0 9312 M68KMAKE_OP(subx, 8, rr, .)
philpem@0 9313 {
philpem@0 9314 uint* r_dst = &DX;
philpem@0 9315 uint src = MASK_OUT_ABOVE_8(DY);
philpem@0 9316 uint dst = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 9317 uint res = dst - src - XFLAG_AS_1();
philpem@0 9318
philpem@0 9319 FLAG_N = NFLAG_8(res);
philpem@0 9320 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9321 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9322
philpem@0 9323 res = MASK_OUT_ABOVE_8(res);
philpem@0 9324 FLAG_Z |= res;
philpem@0 9325
philpem@0 9326 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
philpem@0 9327 }
philpem@0 9328
philpem@0 9329
philpem@0 9330 M68KMAKE_OP(subx, 16, rr, .)
philpem@0 9331 {
philpem@0 9332 uint* r_dst = &DX;
philpem@0 9333 uint src = MASK_OUT_ABOVE_16(DY);
philpem@0 9334 uint dst = MASK_OUT_ABOVE_16(*r_dst);
philpem@0 9335 uint res = dst - src - XFLAG_AS_1();
philpem@0 9336
philpem@0 9337 FLAG_N = NFLAG_16(res);
philpem@0 9338 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9339 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9340
philpem@0 9341 res = MASK_OUT_ABOVE_16(res);
philpem@0 9342 FLAG_Z |= res;
philpem@0 9343
philpem@0 9344 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
philpem@0 9345 }
philpem@0 9346
philpem@0 9347
philpem@0 9348 M68KMAKE_OP(subx, 32, rr, .)
philpem@0 9349 {
philpem@0 9350 uint* r_dst = &DX;
philpem@0 9351 uint src = DY;
philpem@0 9352 uint dst = *r_dst;
philpem@0 9353 uint res = dst - src - XFLAG_AS_1();
philpem@0 9354
philpem@0 9355 FLAG_N = NFLAG_32(res);
philpem@0 9356 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9357 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9358
philpem@0 9359 res = MASK_OUT_ABOVE_32(res);
philpem@0 9360 FLAG_Z |= res;
philpem@0 9361
philpem@0 9362 *r_dst = res;
philpem@0 9363 }
philpem@0 9364
philpem@0 9365
philpem@0 9366 M68KMAKE_OP(subx, 8, mm, ax7)
philpem@0 9367 {
philpem@0 9368 uint src = OPER_AY_PD_8();
philpem@0 9369 uint ea = EA_A7_PD_8();
philpem@0 9370 uint dst = m68ki_read_8(ea);
philpem@0 9371 uint res = dst - src - XFLAG_AS_1();
philpem@0 9372
philpem@0 9373 FLAG_N = NFLAG_8(res);
philpem@0 9374 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9375 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9376
philpem@0 9377 res = MASK_OUT_ABOVE_8(res);
philpem@0 9378 FLAG_Z |= res;
philpem@0 9379
philpem@0 9380 m68ki_write_8(ea, res);
philpem@0 9381 }
philpem@0 9382
philpem@0 9383
philpem@0 9384 M68KMAKE_OP(subx, 8, mm, ay7)
philpem@0 9385 {
philpem@0 9386 uint src = OPER_A7_PD_8();
philpem@0 9387 uint ea = EA_AX_PD_8();
philpem@0 9388 uint dst = m68ki_read_8(ea);
philpem@0 9389 uint res = dst - src - XFLAG_AS_1();
philpem@0 9390
philpem@0 9391 FLAG_N = NFLAG_8(res);
philpem@0 9392 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9393 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9394
philpem@0 9395 res = MASK_OUT_ABOVE_8(res);
philpem@0 9396 FLAG_Z |= res;
philpem@0 9397
philpem@0 9398 m68ki_write_8(ea, res);
philpem@0 9399 }
philpem@0 9400
philpem@0 9401
philpem@0 9402 M68KMAKE_OP(subx, 8, mm, axy7)
philpem@0 9403 {
philpem@0 9404 uint src = OPER_A7_PD_8();
philpem@0 9405 uint ea = EA_A7_PD_8();
philpem@0 9406 uint dst = m68ki_read_8(ea);
philpem@0 9407 uint res = dst - src - XFLAG_AS_1();
philpem@0 9408
philpem@0 9409 FLAG_N = NFLAG_8(res);
philpem@0 9410 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9411 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9412
philpem@0 9413 res = MASK_OUT_ABOVE_8(res);
philpem@0 9414 FLAG_Z |= res;
philpem@0 9415
philpem@0 9416 m68ki_write_8(ea, res);
philpem@0 9417 }
philpem@0 9418
philpem@0 9419
philpem@0 9420 M68KMAKE_OP(subx, 8, mm, .)
philpem@0 9421 {
philpem@0 9422 uint src = OPER_AY_PD_8();
philpem@0 9423 uint ea = EA_AX_PD_8();
philpem@0 9424 uint dst = m68ki_read_8(ea);
philpem@0 9425 uint res = dst - src - XFLAG_AS_1();
philpem@0 9426
philpem@0 9427 FLAG_N = NFLAG_8(res);
philpem@0 9428 FLAG_X = FLAG_C = CFLAG_8(res);
philpem@0 9429 FLAG_V = VFLAG_SUB_8(src, dst, res);
philpem@0 9430
philpem@0 9431 res = MASK_OUT_ABOVE_8(res);
philpem@0 9432 FLAG_Z |= res;
philpem@0 9433
philpem@0 9434 m68ki_write_8(ea, res);
philpem@0 9435 }
philpem@0 9436
philpem@0 9437
philpem@0 9438 M68KMAKE_OP(subx, 16, mm, .)
philpem@0 9439 {
philpem@0 9440 uint src = OPER_AY_PD_16();
philpem@0 9441 uint ea = EA_AX_PD_16();
philpem@0 9442 uint dst = m68ki_read_16(ea);
philpem@0 9443 uint res = dst - src - XFLAG_AS_1();
philpem@0 9444
philpem@0 9445 FLAG_N = NFLAG_16(res);
philpem@0 9446 FLAG_X = FLAG_C = CFLAG_16(res);
philpem@0 9447 FLAG_V = VFLAG_SUB_16(src, dst, res);
philpem@0 9448
philpem@0 9449 res = MASK_OUT_ABOVE_16(res);
philpem@0 9450 FLAG_Z |= res;
philpem@0 9451
philpem@0 9452 m68ki_write_16(ea, res);
philpem@0 9453 }
philpem@0 9454
philpem@0 9455
philpem@0 9456 M68KMAKE_OP(subx, 32, mm, .)
philpem@0 9457 {
philpem@0 9458 uint src = OPER_AY_PD_32();
philpem@0 9459 uint ea = EA_AX_PD_32();
philpem@0 9460 uint dst = m68ki_read_32(ea);
philpem@0 9461 uint res = dst - src - XFLAG_AS_1();
philpem@0 9462
philpem@0 9463 FLAG_N = NFLAG_32(res);
philpem@0 9464 FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
philpem@0 9465 FLAG_V = VFLAG_SUB_32(src, dst, res);
philpem@0 9466
philpem@0 9467 res = MASK_OUT_ABOVE_32(res);
philpem@0 9468 FLAG_Z |= res;
philpem@0 9469
philpem@0 9470 m68ki_write_32(ea, res);
philpem@0 9471 }
philpem@0 9472
philpem@0 9473
philpem@0 9474 M68KMAKE_OP(swap, 32, ., .)
philpem@0 9475 {
philpem@0 9476 uint* r_dst = &DY;
philpem@0 9477
philpem@0 9478 FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16);
philpem@0 9479 *r_dst = (*r_dst>>16) | FLAG_Z;
philpem@0 9480
philpem@0 9481 FLAG_Z = *r_dst;
philpem@0 9482 FLAG_N = NFLAG_32(*r_dst);
philpem@0 9483 FLAG_C = CFLAG_CLEAR;
philpem@0 9484 FLAG_V = VFLAG_CLEAR;
philpem@0 9485 }
philpem@0 9486
philpem@0 9487
philpem@0 9488 M68KMAKE_OP(tas, 8, ., d)
philpem@0 9489 {
philpem@0 9490 uint* r_dst = &DY;
philpem@0 9491
philpem@0 9492 FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
philpem@0 9493 FLAG_N = NFLAG_8(*r_dst);
philpem@0 9494 FLAG_V = VFLAG_CLEAR;
philpem@0 9495 FLAG_C = CFLAG_CLEAR;
philpem@0 9496 *r_dst |= 0x80;
philpem@0 9497 }
philpem@0 9498
philpem@0 9499
philpem@0 9500 M68KMAKE_OP(tas, 8, ., .)
philpem@0 9501 {
philpem@0 9502 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 9503 uint dst = m68ki_read_8(ea);
philpem@0 9504
philpem@0 9505 FLAG_Z = dst;
philpem@0 9506 FLAG_N = NFLAG_8(dst);
philpem@0 9507 FLAG_V = VFLAG_CLEAR;
philpem@0 9508 FLAG_C = CFLAG_CLEAR;
philpem@0 9509 m68ki_write_8(ea, dst | 0x80);
philpem@0 9510 }
philpem@0 9511
philpem@0 9512
philpem@0 9513 M68KMAKE_OP(trap, 0, ., .)
philpem@0 9514 {
philpem@0 9515 /* Trap#n stacks exception frame type 0 */
philpem@0 9516 m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf)); /* HJB 990403 */
philpem@0 9517 }
philpem@0 9518
philpem@0 9519
philpem@0 9520 M68KMAKE_OP(trapt, 0, ., .)
philpem@0 9521 {
philpem@0 9522 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9523 {
philpem@0 9524 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9525 return;
philpem@0 9526 }
philpem@0 9527 m68ki_exception_illegal();
philpem@0 9528 }
philpem@0 9529
philpem@0 9530
philpem@0 9531 M68KMAKE_OP(trapt, 16, ., .)
philpem@0 9532 {
philpem@0 9533 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9534 {
philpem@0 9535 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9536 return;
philpem@0 9537 }
philpem@0 9538 m68ki_exception_illegal();
philpem@0 9539 }
philpem@0 9540
philpem@0 9541
philpem@0 9542 M68KMAKE_OP(trapt, 32, ., .)
philpem@0 9543 {
philpem@0 9544 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9545 {
philpem@0 9546 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9547 return;
philpem@0 9548 }
philpem@0 9549 m68ki_exception_illegal();
philpem@0 9550 }
philpem@0 9551
philpem@0 9552
philpem@0 9553 M68KMAKE_OP(trapf, 0, ., .)
philpem@0 9554 {
philpem@0 9555 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9556 {
philpem@0 9557 return;
philpem@0 9558 }
philpem@0 9559 m68ki_exception_illegal();
philpem@0 9560 }
philpem@0 9561
philpem@0 9562
philpem@0 9563 M68KMAKE_OP(trapf, 16, ., .)
philpem@0 9564 {
philpem@0 9565 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9566 {
philpem@0 9567 REG_PC += 2;
philpem@0 9568 return;
philpem@0 9569 }
philpem@0 9570 m68ki_exception_illegal();
philpem@0 9571 }
philpem@0 9572
philpem@0 9573
philpem@0 9574 M68KMAKE_OP(trapf, 32, ., .)
philpem@0 9575 {
philpem@0 9576 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9577 {
philpem@0 9578 REG_PC += 4;
philpem@0 9579 return;
philpem@0 9580 }
philpem@0 9581 m68ki_exception_illegal();
philpem@0 9582 }
philpem@0 9583
philpem@0 9584
philpem@0 9585 M68KMAKE_OP(trapcc, 0, ., .)
philpem@0 9586 {
philpem@0 9587 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9588 {
philpem@0 9589 if(M68KMAKE_CC)
philpem@0 9590 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9591 return;
philpem@0 9592 }
philpem@0 9593 m68ki_exception_illegal();
philpem@0 9594 }
philpem@0 9595
philpem@0 9596
philpem@0 9597 M68KMAKE_OP(trapcc, 16, ., .)
philpem@0 9598 {
philpem@0 9599 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9600 {
philpem@0 9601 if(M68KMAKE_CC)
philpem@0 9602 {
philpem@0 9603 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9604 return;
philpem@0 9605 }
philpem@0 9606 REG_PC += 2;
philpem@0 9607 return;
philpem@0 9608 }
philpem@0 9609 m68ki_exception_illegal();
philpem@0 9610 }
philpem@0 9611
philpem@0 9612
philpem@0 9613 M68KMAKE_OP(trapcc, 32, ., .)
philpem@0 9614 {
philpem@0 9615 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9616 {
philpem@0 9617 if(M68KMAKE_CC)
philpem@0 9618 {
philpem@0 9619 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9620 return;
philpem@0 9621 }
philpem@0 9622 REG_PC += 4;
philpem@0 9623 return;
philpem@0 9624 }
philpem@0 9625 m68ki_exception_illegal();
philpem@0 9626 }
philpem@0 9627
philpem@0 9628
philpem@0 9629 M68KMAKE_OP(trapv, 0, ., .)
philpem@0 9630 {
philpem@0 9631 if(COND_VC())
philpem@0 9632 {
philpem@0 9633 return;
philpem@0 9634 }
philpem@0 9635 m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
philpem@0 9636 }
philpem@0 9637
philpem@0 9638
philpem@0 9639 M68KMAKE_OP(tst, 8, ., d)
philpem@0 9640 {
philpem@0 9641 uint res = MASK_OUT_ABOVE_8(DY);
philpem@0 9642
philpem@0 9643 FLAG_N = NFLAG_8(res);
philpem@0 9644 FLAG_Z = res;
philpem@0 9645 FLAG_V = VFLAG_CLEAR;
philpem@0 9646 FLAG_C = CFLAG_CLEAR;
philpem@0 9647 }
philpem@0 9648
philpem@0 9649
philpem@0 9650 M68KMAKE_OP(tst, 8, ., .)
philpem@0 9651 {
philpem@0 9652 uint ea = M68KMAKE_GET_EA_AY_8;
philpem@0 9653 uint res = m68ki_read_8(ea);
philpem@0 9654
philpem@0 9655 FLAG_N = NFLAG_8(res);
philpem@0 9656 FLAG_Z = res;
philpem@0 9657 FLAG_V = VFLAG_CLEAR;
philpem@0 9658 FLAG_C = CFLAG_CLEAR;
philpem@0 9659 }
philpem@0 9660
philpem@0 9661
philpem@0 9662 M68KMAKE_OP(tst, 8, ., pcdi)
philpem@0 9663 {
philpem@0 9664 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9665 {
philpem@0 9666 uint res = OPER_PCDI_8();
philpem@0 9667
philpem@0 9668 FLAG_N = NFLAG_8(res);
philpem@0 9669 FLAG_Z = res;
philpem@0 9670 FLAG_V = VFLAG_CLEAR;
philpem@0 9671 FLAG_C = CFLAG_CLEAR;
philpem@0 9672 return;
philpem@0 9673 }
philpem@0 9674 m68ki_exception_illegal();
philpem@0 9675 }
philpem@0 9676
philpem@0 9677
philpem@0 9678 M68KMAKE_OP(tst, 8, ., pcix)
philpem@0 9679 {
philpem@0 9680 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9681 {
philpem@0 9682 uint res = OPER_PCIX_8();
philpem@0 9683
philpem@0 9684 FLAG_N = NFLAG_8(res);
philpem@0 9685 FLAG_Z = res;
philpem@0 9686 FLAG_V = VFLAG_CLEAR;
philpem@0 9687 FLAG_C = CFLAG_CLEAR;
philpem@0 9688 return;
philpem@0 9689 }
philpem@0 9690 m68ki_exception_illegal();
philpem@0 9691 }
philpem@0 9692
philpem@0 9693
philpem@0 9694 M68KMAKE_OP(tst, 8, ., i)
philpem@0 9695 {
philpem@0 9696 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9697 {
philpem@0 9698 uint res = OPER_I_8();
philpem@0 9699
philpem@0 9700 FLAG_N = NFLAG_8(res);
philpem@0 9701 FLAG_Z = res;
philpem@0 9702 FLAG_V = VFLAG_CLEAR;
philpem@0 9703 FLAG_C = CFLAG_CLEAR;
philpem@0 9704 return;
philpem@0 9705 }
philpem@0 9706 m68ki_exception_illegal();
philpem@0 9707 }
philpem@0 9708
philpem@0 9709
philpem@0 9710 M68KMAKE_OP(tst, 16, ., d)
philpem@0 9711 {
philpem@0 9712 uint res = MASK_OUT_ABOVE_16(DY);
philpem@0 9713
philpem@0 9714 FLAG_N = NFLAG_16(res);
philpem@0 9715 FLAG_Z = res;
philpem@0 9716 FLAG_V = VFLAG_CLEAR;
philpem@0 9717 FLAG_C = CFLAG_CLEAR;
philpem@0 9718 }
philpem@0 9719
philpem@0 9720
philpem@0 9721 M68KMAKE_OP(tst, 16, ., a)
philpem@0 9722 {
philpem@0 9723 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9724 {
philpem@0 9725 uint res = MAKE_INT_16(AY);
philpem@0 9726
philpem@0 9727 FLAG_N = NFLAG_16(res);
philpem@0 9728 FLAG_Z = res;
philpem@0 9729 FLAG_V = VFLAG_CLEAR;
philpem@0 9730 FLAG_C = CFLAG_CLEAR;
philpem@0 9731 return;
philpem@0 9732 }
philpem@0 9733 m68ki_exception_illegal();
philpem@0 9734 }
philpem@0 9735
philpem@0 9736
philpem@0 9737 M68KMAKE_OP(tst, 16, ., .)
philpem@0 9738 {
philpem@0 9739 uint res = M68KMAKE_GET_OPER_AY_16;
philpem@0 9740
philpem@0 9741 FLAG_N = NFLAG_16(res);
philpem@0 9742 FLAG_Z = res;
philpem@0 9743 FLAG_V = VFLAG_CLEAR;
philpem@0 9744 FLAG_C = CFLAG_CLEAR;
philpem@0 9745 }
philpem@0 9746
philpem@0 9747
philpem@0 9748 M68KMAKE_OP(tst, 16, ., pcdi)
philpem@0 9749 {
philpem@0 9750 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9751 {
philpem@0 9752 uint res = OPER_PCDI_16();
philpem@0 9753
philpem@0 9754 FLAG_N = NFLAG_16(res);
philpem@0 9755 FLAG_Z = res;
philpem@0 9756 FLAG_V = VFLAG_CLEAR;
philpem@0 9757 FLAG_C = CFLAG_CLEAR;
philpem@0 9758 return;
philpem@0 9759 }
philpem@0 9760 m68ki_exception_illegal();
philpem@0 9761 }
philpem@0 9762
philpem@0 9763
philpem@0 9764 M68KMAKE_OP(tst, 16, ., pcix)
philpem@0 9765 {
philpem@0 9766 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9767 {
philpem@0 9768 uint res = OPER_PCIX_16();
philpem@0 9769
philpem@0 9770 FLAG_N = NFLAG_16(res);
philpem@0 9771 FLAG_Z = res;
philpem@0 9772 FLAG_V = VFLAG_CLEAR;
philpem@0 9773 FLAG_C = CFLAG_CLEAR;
philpem@0 9774 return;
philpem@0 9775 }
philpem@0 9776 m68ki_exception_illegal();
philpem@0 9777 }
philpem@0 9778
philpem@0 9779
philpem@0 9780 M68KMAKE_OP(tst, 16, ., i)
philpem@0 9781 {
philpem@0 9782 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9783 {
philpem@0 9784 uint res = OPER_I_16();
philpem@0 9785
philpem@0 9786 FLAG_N = NFLAG_16(res);
philpem@0 9787 FLAG_Z = res;
philpem@0 9788 FLAG_V = VFLAG_CLEAR;
philpem@0 9789 FLAG_C = CFLAG_CLEAR;
philpem@0 9790 return;
philpem@0 9791 }
philpem@0 9792 m68ki_exception_illegal();
philpem@0 9793 }
philpem@0 9794
philpem@0 9795
philpem@0 9796 M68KMAKE_OP(tst, 32, ., d)
philpem@0 9797 {
philpem@0 9798 uint res = DY;
philpem@0 9799
philpem@0 9800 FLAG_N = NFLAG_32(res);
philpem@0 9801 FLAG_Z = res;
philpem@0 9802 FLAG_V = VFLAG_CLEAR;
philpem@0 9803 FLAG_C = CFLAG_CLEAR;
philpem@0 9804 }
philpem@0 9805
philpem@0 9806
philpem@0 9807 M68KMAKE_OP(tst, 32, ., a)
philpem@0 9808 {
philpem@0 9809 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9810 {
philpem@0 9811 uint res = AY;
philpem@0 9812
philpem@0 9813 FLAG_N = NFLAG_32(res);
philpem@0 9814 FLAG_Z = res;
philpem@0 9815 FLAG_V = VFLAG_CLEAR;
philpem@0 9816 FLAG_C = CFLAG_CLEAR;
philpem@0 9817 return;
philpem@0 9818 }
philpem@0 9819 m68ki_exception_illegal();
philpem@0 9820 }
philpem@0 9821
philpem@0 9822
philpem@0 9823 M68KMAKE_OP(tst, 32, ., .)
philpem@0 9824 {
philpem@0 9825 uint res = M68KMAKE_GET_OPER_AY_32;
philpem@0 9826
philpem@0 9827 FLAG_N = NFLAG_32(res);
philpem@0 9828 FLAG_Z = res;
philpem@0 9829 FLAG_V = VFLAG_CLEAR;
philpem@0 9830 FLAG_C = CFLAG_CLEAR;
philpem@0 9831 }
philpem@0 9832
philpem@0 9833
philpem@0 9834 M68KMAKE_OP(tst, 32, ., pcdi)
philpem@0 9835 {
philpem@0 9836 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9837 {
philpem@0 9838 uint res = OPER_PCDI_32();
philpem@0 9839
philpem@0 9840 FLAG_N = NFLAG_32(res);
philpem@0 9841 FLAG_Z = res;
philpem@0 9842 FLAG_V = VFLAG_CLEAR;
philpem@0 9843 FLAG_C = CFLAG_CLEAR;
philpem@0 9844 return;
philpem@0 9845 }
philpem@0 9846 m68ki_exception_illegal();
philpem@0 9847 }
philpem@0 9848
philpem@0 9849
philpem@0 9850 M68KMAKE_OP(tst, 32, ., pcix)
philpem@0 9851 {
philpem@0 9852 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9853 {
philpem@0 9854 uint res = OPER_PCIX_32();
philpem@0 9855
philpem@0 9856 FLAG_N = NFLAG_32(res);
philpem@0 9857 FLAG_Z = res;
philpem@0 9858 FLAG_V = VFLAG_CLEAR;
philpem@0 9859 FLAG_C = CFLAG_CLEAR;
philpem@0 9860 return;
philpem@0 9861 }
philpem@0 9862 m68ki_exception_illegal();
philpem@0 9863 }
philpem@0 9864
philpem@0 9865
philpem@0 9866 M68KMAKE_OP(tst, 32, ., i)
philpem@0 9867 {
philpem@0 9868 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9869 {
philpem@0 9870 uint res = OPER_I_32();
philpem@0 9871
philpem@0 9872 FLAG_N = NFLAG_32(res);
philpem@0 9873 FLAG_Z = res;
philpem@0 9874 FLAG_V = VFLAG_CLEAR;
philpem@0 9875 FLAG_C = CFLAG_CLEAR;
philpem@0 9876 return;
philpem@0 9877 }
philpem@0 9878 m68ki_exception_illegal();
philpem@0 9879 }
philpem@0 9880
philpem@0 9881
philpem@0 9882 M68KMAKE_OP(unlk, 32, ., a7)
philpem@0 9883 {
philpem@0 9884 REG_A[7] = m68ki_read_32(REG_A[7]);
philpem@0 9885 }
philpem@0 9886
philpem@0 9887
philpem@0 9888 M68KMAKE_OP(unlk, 32, ., .)
philpem@0 9889 {
philpem@0 9890 uint* r_dst = &AY;
philpem@0 9891
philpem@0 9892 REG_A[7] = *r_dst;
philpem@0 9893 *r_dst = m68ki_pull_32();
philpem@0 9894 }
philpem@0 9895
philpem@0 9896
philpem@0 9897 M68KMAKE_OP(unpk, 16, rr, .)
philpem@0 9898 {
philpem@0 9899 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9900 {
philpem@0 9901 /* Note: DX and DY are reversed in Motorola's docs */
philpem@0 9902 uint src = DY;
philpem@0 9903 uint* r_dst = &DX;
philpem@0 9904
philpem@0 9905 *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16()) & 0xffff);
philpem@0 9906 return;
philpem@0 9907 }
philpem@0 9908 m68ki_exception_illegal();
philpem@0 9909 }
philpem@0 9910
philpem@0 9911
philpem@0 9912 M68KMAKE_OP(unpk, 16, mm, ax7)
philpem@0 9913 {
philpem@0 9914 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9915 {
philpem@0 9916 /* Note: AX and AY are reversed in Motorola's docs */
philpem@0 9917 uint src = OPER_AY_PD_8();
philpem@0 9918 uint ea_dst;
philpem@0 9919
philpem@0 9920 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
philpem@0 9921 ea_dst = EA_A7_PD_8();
philpem@0 9922 m68ki_write_8(ea_dst, (src >> 8) & 0xff);
philpem@0 9923 ea_dst = EA_A7_PD_8();
philpem@0 9924 m68ki_write_8(ea_dst, src & 0xff);
philpem@0 9925 return;
philpem@0 9926 }
philpem@0 9927 m68ki_exception_illegal();
philpem@0 9928 }
philpem@0 9929
philpem@0 9930
philpem@0 9931 M68KMAKE_OP(unpk, 16, mm, ay7)
philpem@0 9932 {
philpem@0 9933 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9934 {
philpem@0 9935 /* Note: AX and AY are reversed in Motorola's docs */
philpem@0 9936 uint src = OPER_A7_PD_8();
philpem@0 9937 uint ea_dst;
philpem@0 9938
philpem@0 9939 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
philpem@0 9940 ea_dst = EA_AX_PD_8();
philpem@0 9941 m68ki_write_8(ea_dst, (src >> 8) & 0xff);
philpem@0 9942 ea_dst = EA_AX_PD_8();
philpem@0 9943 m68ki_write_8(ea_dst, src & 0xff);
philpem@0 9944 return;
philpem@0 9945 }
philpem@0 9946 m68ki_exception_illegal();
philpem@0 9947 }
philpem@0 9948
philpem@0 9949
philpem@0 9950 M68KMAKE_OP(unpk, 16, mm, axy7)
philpem@0 9951 {
philpem@0 9952 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9953 {
philpem@0 9954 uint src = OPER_A7_PD_8();
philpem@0 9955 uint ea_dst;
philpem@0 9956
philpem@0 9957 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
philpem@0 9958 ea_dst = EA_A7_PD_8();
philpem@0 9959 m68ki_write_8(ea_dst, (src >> 8) & 0xff);
philpem@0 9960 ea_dst = EA_A7_PD_8();
philpem@0 9961 m68ki_write_8(ea_dst, src & 0xff);
philpem@0 9962 return;
philpem@0 9963 }
philpem@0 9964 m68ki_exception_illegal();
philpem@0 9965 }
philpem@0 9966
philpem@0 9967
philpem@0 9968 M68KMAKE_OP(unpk, 16, mm, .)
philpem@0 9969 {
philpem@0 9970 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
philpem@0 9971 {
philpem@0 9972 /* Note: AX and AY are reversed in Motorola's docs */
philpem@0 9973 uint src = OPER_AY_PD_8();
philpem@0 9974 uint ea_dst;
philpem@0 9975
philpem@0 9976 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
philpem@0 9977 ea_dst = EA_AX_PD_8();
philpem@0 9978 m68ki_write_8(ea_dst, (src >> 8) & 0xff);
philpem@0 9979 ea_dst = EA_AX_PD_8();
philpem@0 9980 m68ki_write_8(ea_dst, src & 0xff);
philpem@0 9981 return;
philpem@0 9982 }
philpem@0 9983 m68ki_exception_illegal();
philpem@0 9984 }
philpem@0 9985
philpem@0 9986
philpem@0 9987
philpem@0 9988 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
philpem@0 9989 M68KMAKE_END