Skip to content

Commit 78c5e0c

Browse files
committed
[MC68000] Add missing BKPT instruction
1 parent 2ae799a commit 78c5e0c

10 files changed

+67
-27
lines changed

src/asm_mc68000.cpp

+16-7
Original file line numberDiff line numberDiff line change
@@ -450,13 +450,22 @@ Error AsmMc68000::encodeOperand(
450450
break;
451451
}
452452
if (mode == M_IM3) {
453-
// "Zero means 2^3" unsigned 3-bit.
454-
if (op.val.overflow(8))
455-
insn.setErrorIf(op, OVERFLOW_RANGE);
456-
if (op.val.isZero())
457-
insn.setErrorIf(op, OPERAND_NOT_ALLOWED);
458-
const auto count = (val32 & 7); // 8 is encoded to 0.
459-
insn.embed(count << 9);
453+
if (pos == OP__3) {
454+
// ADDQ/SUBQ/shift/rotate
455+
// "Zero means 2^3" unsigned 3-bit.
456+
if (op.val.overflow(8))
457+
insn.setErrorIf(op, OVERFLOW_RANGE);
458+
if (op.val.isZero())
459+
insn.setErrorIf(op, OPERAND_NOT_ALLOWED);
460+
const auto count = (val32 & 7); // 8 is encoded to 0.
461+
insn.embed(count << 9);
462+
} else if (pos == OP__0) {
463+
// BKPT
464+
if (op.val.overflow(7))
465+
insn.setErrorIf(op, OVERFLOW_RANGE);
466+
const auto vector = (val32 & 7);
467+
insn.embed(vector);
468+
}
460469
break;
461470
}
462471
if (mode == M_IM8) {

src/dis_mc68000.cpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -569,9 +569,15 @@ void DisMc68000::decodeOperand(DisInsn &insn, StrBuffer &out, AddrMode mode, Opr
569569
decodeEffectiveAddr(insn, out, M_DREG, decodeDataReg(r), size);
570570
break;
571571
case M_IM3:
572-
r = (insn.opCode() >> 9) & 7;
573-
if (r == 0)
574-
r = 8;
572+
if (pos == OP__3) {
573+
// ADDQ/SUBQ/shift/rotate
574+
r = (insn.opCode() >> 9) & 7;
575+
if (r == 0)
576+
r = 8;
577+
} else if (pos == OP__0) {
578+
// BKPT
579+
r = insn.opCode() & 7;
580+
}
575581
outDec(out.letter('#'), r, 4);
576582
break;
577583
case M_IM8:

src/entry_mc68000.h

-2
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,6 @@ struct Entry final : entry::Base<Config::opcode_t> {
175175
return 0xFF;
176176
if (mode == M_IMVEC)
177177
return 0xF;
178-
if (mode == M_IM3)
179-
return 07000;
180178
if (mode == M_KFACT || mode == M_KDREG)
181179
return 00077; // OP_10
182180
return 0;

src/table_mc68000.cpp

+17-14
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ constexpr Entry MC68000_TABLE[] PROGMEM = {
144144
E1(0056700, TEXT_SLT, ISZ_NONE, M_WDATA, OP_10, SZ_BYTE),
145145
E1(0057300, TEXT_SGT, ISZ_NONE, M_WDATA, OP_10, SZ_BYTE),
146146
E1(0057700, TEXT_SLE, ISZ_NONE, M_WDATA, OP_10, SZ_BYTE),
147-
E2(0050000, TEXT_ADDQ, ISZ_DATA, M_IM3, M_WADDR, OP___, OP_10, SZ_DATA),
148-
E2(0050400, TEXT_SUBQ, ISZ_DATA, M_IM3, M_WADDR, OP___, OP_10, SZ_DATA),
147+
E2(0050000, TEXT_ADDQ, ISZ_DATA, M_IM3, M_WADDR, OP__3, OP_10, SZ_DATA),
148+
E2(0050400, TEXT_SUBQ, ISZ_DATA, M_IM3, M_WADDR, OP__3, OP_10, SZ_DATA),
149149
E1(0060000, TEXT_BRA, ISZ_NONE, M_REL8, OP___, SZ_BYTE),
150150
E1(0060000, TEXT_BRA, ISZ_NONE, M_REL16, OP___, SZ_WORD),
151151
E1(0060000, TEXT_BT, ISZ_NONE, M_REL8, OP___, SZ_BYTE),
@@ -223,21 +223,21 @@ constexpr Entry MC68000_TABLE[] PROGMEM = {
223223
E1(0162700, TEXT_ROXL, ISZ_DATA, M_WMEM, OP_10, SZ_WORD),
224224
E1(0163300, TEXT_ROR, ISZ_DATA, M_WMEM, OP_10, SZ_WORD),
225225
E1(0163700, TEXT_ROL, ISZ_DATA, M_WMEM, OP_10, SZ_WORD),
226-
E2(0160000, TEXT_ASR, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
226+
E2(0160000, TEXT_ASR, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
227227
E2(0160040, TEXT_ASR, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
228-
E2(0160400, TEXT_ASL, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
228+
E2(0160400, TEXT_ASL, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
229229
E2(0160440, TEXT_ASL, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
230-
E2(0160010, TEXT_LSR, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
230+
E2(0160010, TEXT_LSR, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
231231
E2(0160050, TEXT_LSR, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
232-
E2(0160410, TEXT_LSL, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
232+
E2(0160410, TEXT_LSL, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
233233
E2(0160450, TEXT_LSL, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
234-
E2(0160020, TEXT_ROXR, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
234+
E2(0160020, TEXT_ROXR, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
235235
E2(0160060, TEXT_ROXR, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
236-
E2(0160420, TEXT_ROXL, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
236+
E2(0160420, TEXT_ROXL, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
237237
E2(0160460, TEXT_ROXL, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
238-
E2(0160030, TEXT_ROR, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
238+
E2(0160030, TEXT_ROR, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
239239
E2(0160070, TEXT_ROR, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
240-
E2(0160430, TEXT_ROL, ISZ_DATA, M_IM3, M_DREG, OP___, OP__0, SZ_DATA),
240+
E2(0160430, TEXT_ROL, ISZ_DATA, M_IM3, M_DREG, OP__3, OP__0, SZ_DATA),
241241
E2(0160470, TEXT_ROL, ISZ_DATA, M_DREG, M_DREG, OP__3, OP__0, SZ_DATA),
242242
A2(0020100, TEXT_MOVE, ISZ_LONG, M_RADDR, M_AREG, OP_10, OP__3, SZ_LONG),
243243
A2(0030100, TEXT_MOVE, ISZ_WORD, M_RADDR, M_AREG, OP_10, OP__3, SZ_WORD),
@@ -459,6 +459,7 @@ constexpr uint8_t MC68000_INDEX[] PROGMEM = {
459459
};
460460

461461
constexpr Entry MC68010_TABLE[] PROGMEM = {
462+
E1(0044110, TEXT_BKPT, ISZ_NONE, M_IM3, OP__0, SZ_NONE),
462463
E1(0047164, TEXT_RTD, ISZ_NONE, M_IMDAT, OP___, SZ_WORD),
463464
P2(0047172, TEXT_MOVEC, ISZ_NONE, M_CREG, M_DREG, EX_RC, EX_RR, SZ_LONG, 0x0000),
464465
P2(0047172, TEXT_MOVEC, ISZ_NONE, M_CREG, M_AREG, EX_RC, EX_RR, SZ_LONG, 0x8000),
@@ -471,15 +472,16 @@ constexpr Entry MC68010_TABLE[] PROGMEM = {
471472
};
472473

473474
constexpr uint8_t MC68010_INDEX[] PROGMEM = {
474-
1, // TEXT_MOVEC
475+
0, // TEXT_BKPT
475476
2, // TEXT_MOVEC
476477
3, // TEXT_MOVEC
477478
4, // TEXT_MOVEC
478-
5, // TEXT_MOVES
479+
5, // TEXT_MOVEC
479480
6, // TEXT_MOVES
480481
7, // TEXT_MOVES
481482
8, // TEXT_MOVES
482-
0, // TEXT_RTD
483+
9, // TEXT_MOVES
484+
1, // TEXT_RTD
483485
};
484486

485487
#if !defined(LIBASM_MC68000_NOFPU)
@@ -1222,8 +1224,8 @@ constexpr EntryPage MC68000_PAGES[] PROGMEM = {
12221224
};
12231225

12241226
constexpr EntryPage MC68010_PAGES[] PROGMEM = {
1225-
{ARRAY_RANGE(MC68000_TABLE), ARRAY_RANGE(MC68000_INDEX)},
12261227
{ARRAY_RANGE(MC68010_TABLE), ARRAY_RANGE(MC68010_INDEX)},
1228+
{ARRAY_RANGE(MC68000_TABLE), ARRAY_RANGE(MC68000_INDEX)},
12271229
};
12281230

12291231
#if !defined(LIBASM_MC68000_NOFPU)
@@ -1416,6 +1418,7 @@ bool matchOpCode(DisInsn &insn, const Entry *entry, const EntryPage *) {
14161418
opc &= ~07000; // clear co-processor ID
14171419
if (opc != entry->readOpCode())
14181420
return false;
1421+
// Check illegal addressing mode
14191422
opc = insn.opCode();
14201423
if (invalidModeReg(opc, flags.src(), flags.srcPos(), flags.oprSize()))
14211424
return false;

src/text_mc68000.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ constexpr char TEXT_REG_CCR[] PROGMEM = "CCR";
178178
constexpr char TEXT_REG_USP[] PROGMEM = "USP";
179179

180180
// MC68010
181+
constexpr char TEXT_BKPT[] PROGMEM = "BKPT";
181182
constexpr char TEXT_MOVEC[] PROGMEM = "MOVEC";
182183
constexpr char TEXT_MOVES[] PROGMEM = "MOVES";
183184
constexpr char TEXT_RTD[] PROGMEM = "RTD";

src/text_mc68000.h

+1
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ extern const char TEXT_REG_CCR[] PROGMEM;
184184
extern const char TEXT_REG_USP[] PROGMEM;
185185

186186
// MC68010
187+
extern const char TEXT_BKPT[] PROGMEM;
187188
extern const char TEXT_MOVEC[] PROGMEM;
188189
extern const char TEXT_MOVES[] PROGMEM;
189190
extern const char TEXT_RTD[] PROGMEM;

test/autogen/gen_m68k10.inc

+1
Original file line numberDiff line numberDiff line change
@@ -2617,6 +2617,7 @@
26172617
nbcd (0x4939).w
26182618
nbcd (0x4a3b).l
26192619
swap d0
2620+
bkpt #0
26202621
pea (a0)
26212622
pea (0x4969,a0)
26222623
pea (-0x8000,a0)

test/autogen/gen_mc68010.inc

+1
Original file line numberDiff line numberDiff line change
@@ -2617,6 +2617,7 @@
26172617
NBCD ($004939).W
26182618
NBCD ($3A4A3B).L
26192619
SWAP D0
2620+
BKPT #0
26202621
PEA (A0)
26212622
PEA ($4969,A0)
26222623
PEA (-$8000,A0)

test/test_asm_mc68000.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ using namespace libasm::test;
2323
AsmMc68000 as68000;
2424
Assembler &assembler(as68000);
2525

26+
bool mc68k00() {
27+
return strcmp_P("68000", assembler.config().cpu_P()) == 0;
28+
}
29+
2630
bool mc68010() {
2731
return strcmp_P("68010", assembler.config().cpu_P()) == 0;
2832
}
@@ -2862,6 +2866,14 @@ void test_system() {
28622866
ERUI("MOVEC VBR, A4");
28632867
}
28642868

2869+
if (mc68k00()) {
2870+
ERUI("BKPT #0");
2871+
} else {
2872+
TEST("BKPT #0", 0044110);
2873+
TEST("BKPT #7", 0044117);
2874+
ERRT("BKPT #8", OVERFLOW_RANGE, "#8", 0044110);
2875+
}
2876+
28652877
// CHK src,Dn: 004|Dn|Sz|M|Rn, Sz:W=6/L=7
28662878
TEST("CHK D2,D7", 0047602);
28672879
TEST("CHK.W D2,D7", 0047602);

test/test_dis_mc68000.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ using namespace libasm::test;
2424
DisMc68000 dis68000;
2525
Disassembler &disassembler(dis68000);
2626

27+
bool mc68k00() {
28+
return strcmp_P("68000", disassembler.config().cpu_P()) == 0;
29+
}
30+
2731
bool mc68010() {
2832
return strcmp_P("68010", disassembler.config().cpu_P()) == 0;
2933
}
@@ -577,7 +581,11 @@ void test_data_move() {
577581

578582
// PEA src: 00441|M|Rn
579583
TEST("SWAP", "D2", 0044102); // SWAP
580-
UNKN( 0044112); // A2
584+
if (mc68k00()) {
585+
UNKN( 0044112); // A2
586+
} else {
587+
TEST("BKPT", "#2", 0044112);
588+
}
581589
TEST("PEA", "(A2)", 0044122);
582590
UNKN( 0044132); // (A2)+
583591
UNKN( 0044142); // -(A2)

0 commit comments

Comments
 (0)