@gba-kit/arm-emulator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,617 @@
1
+ /**
2
+ * ARM7TDMI Disassembler — ARM and Thumb instruction disassembly
3
+ *
4
+ * Produces clean, readable output matching standard ARM assembly notation.
5
+ * Used by the debugger for instruction display.
6
+ */
7
+ import { bit, bits, signExtend } from './utils.js';
8
+ // ─── Condition Code Strings ─────────────────────────────────────────
9
+ const COND_NAMES = [
10
+ 'eq',
11
+ 'ne',
12
+ 'cs',
13
+ 'cc',
14
+ 'mi',
15
+ 'pl',
16
+ 'vs',
17
+ 'vc',
18
+ 'hi',
19
+ 'ls',
20
+ 'ge',
21
+ 'lt',
22
+ 'gt',
23
+ 'le',
24
+ '',
25
+ 'nv',
26
+ ];
27
+ /** ARM data processing opcode names */
28
+ const DP_NAMES = [
29
+ 'and',
30
+ 'eor',
31
+ 'sub',
32
+ 'rsb',
33
+ 'add',
34
+ 'adc',
35
+ 'sbc',
36
+ 'rsc',
37
+ 'tst',
38
+ 'teq',
39
+ 'cmp',
40
+ 'cmn',
41
+ 'orr',
42
+ 'mov',
43
+ 'bic',
44
+ 'mvn',
45
+ ];
46
+ const SHIFT_NAMES = ['lsl', 'lsr', 'asr', 'ror'];
47
+ const REG_NAMES = [
48
+ 'r0',
49
+ 'r1',
50
+ 'r2',
51
+ 'r3',
52
+ 'r4',
53
+ 'r5',
54
+ 'r6',
55
+ 'r7',
56
+ 'r8',
57
+ 'r9',
58
+ 'r10',
59
+ 'r11',
60
+ 'r12',
61
+ 'sp',
62
+ 'lr',
63
+ 'pc',
64
+ ];
65
+ /** Format a register name */
66
+ function reg(r) {
67
+ return REG_NAMES[r & 0xf];
68
+ }
69
+ /** Format a hex value */
70
+ function hex(v) {
71
+ if (v < 0) {
72
+ return `-#0x${(-v >>> 0).toString(16)}`;
73
+ }
74
+ return `#0x${(v >>> 0).toString(16)}`;
75
+ }
76
+ /** Format an address */
77
+ function addr(v) {
78
+ return `0x${(v >>> 0).toString(16).padStart(8, '0')}`;
79
+ }
80
+ /** Build a register list string like {r0, r2, r4-r7} */
81
+ function regList(mask, maxReg = 16) {
82
+ const parts = [];
83
+ let i = 0;
84
+ while (i < maxReg) {
85
+ if (mask & (1 << i)) {
86
+ const start = i;
87
+ while (i + 1 < maxReg && mask & (1 << (i + 1))) {
88
+ i++;
89
+ }
90
+ if (i === start) {
91
+ parts.push(reg(start));
92
+ }
93
+ else if (i === start + 1) {
94
+ parts.push(reg(start));
95
+ parts.push(reg(i));
96
+ }
97
+ else {
98
+ parts.push(`${reg(start)}-${reg(i)}`);
99
+ }
100
+ }
101
+ i++;
102
+ }
103
+ return `{${parts.join(', ')}}`;
104
+ }
105
+ // ─── Thumb Disassembler ─────────────────────────────────────────────
106
+ /**
107
+ * Disassemble a 16-bit Thumb instruction.
108
+ *
109
+ * @param instruction - The 16-bit instruction word
110
+ * @param address - The address of the instruction (for PC-relative calculations)
111
+ * @returns A human-readable disassembly string
112
+ */
113
+ export function disassembleThumb(instruction, address) {
114
+ const instr = instruction & 0xffff;
115
+ // Format 19: Long Branch with Link
116
+ if ((instr & 0xf800) === 0xf000) {
117
+ const offset11 = signExtend(instr & 0x7ff, 11);
118
+ return `bl (prefix) ${hex(offset11 << 12)}`;
119
+ }
120
+ if ((instr & 0xf800) === 0xf800) {
121
+ const offset11 = (instr & 0x7ff) << 1;
122
+ return `bl (suffix) ${hex(offset11)}`;
123
+ }
124
+ // Format 18: Unconditional Branch
125
+ if ((instr & 0xf800) === 0xe000) {
126
+ const offset = signExtend(instr & 0x7ff, 11) * 2;
127
+ const target = (address + 4 + offset) >>> 0;
128
+ return `b ${addr(target)}`;
129
+ }
130
+ // Format 17: SWI
131
+ if ((instr & 0xff00) === 0xdf00) {
132
+ return `swi ${hex(instr & 0xff)}`;
133
+ }
134
+ // Format 16: Conditional Branch
135
+ if ((instr & 0xf000) === 0xd000) {
136
+ const cond = bits(instr, 11, 8);
137
+ const offset = signExtend(instr & 0xff, 8) * 2;
138
+ const target = (address + 4 + offset) >>> 0;
139
+ return `b${COND_NAMES[cond]} ${addr(target)}`;
140
+ }
141
+ // Format 15: Multiple Load/Store
142
+ if ((instr & 0xf000) === 0xc000) {
143
+ const l = bit(instr, 11);
144
+ const rb = bits(instr, 10, 8);
145
+ const rlist = instr & 0xff;
146
+ const op = l ? 'ldmia' : 'stmia';
147
+ return `${op} ${reg(rb)}!, ${regList(rlist, 8)}`;
148
+ }
149
+ // Format 14: Push/Pop
150
+ if ((instr & 0xf600) === 0xb400) {
151
+ const l = bit(instr, 11);
152
+ const r = bit(instr, 8);
153
+ let rlist = instr & 0xff;
154
+ if (l) {
155
+ if (r) {
156
+ rlist |= 1 << 15;
157
+ } // PC
158
+ return `pop ${regList(rlist)}`;
159
+ }
160
+ else {
161
+ if (r) {
162
+ rlist |= 1 << 14;
163
+ } // LR
164
+ return `push ${regList(rlist)}`;
165
+ }
166
+ }
167
+ // Format 13: Add offset to SP
168
+ if (((instr >>> 8) & 0xff) === 0xb0) {
169
+ const s = bit(instr, 7);
170
+ const offset = (instr & 0x7f) << 2;
171
+ if (s === 0) {
172
+ return `add sp, ${hex(offset)}`;
173
+ }
174
+ else {
175
+ return `sub sp, ${hex(offset)}`;
176
+ }
177
+ }
178
+ // Format 12: Load Address
179
+ if ((instr & 0xf000) === 0xa000) {
180
+ const sp = bit(instr, 11);
181
+ const rd = bits(instr, 10, 8);
182
+ const offset = (instr & 0xff) << 2;
183
+ if (sp === 0) {
184
+ return `add ${reg(rd)}, pc, ${hex(offset)}`;
185
+ }
186
+ else {
187
+ return `add ${reg(rd)}, sp, ${hex(offset)}`;
188
+ }
189
+ }
190
+ // Format 11: SP-relative Load/Store
191
+ if ((instr & 0xf000) === 0x9000) {
192
+ const l = bit(instr, 11);
193
+ const rd = bits(instr, 10, 8);
194
+ const offset = (instr & 0xff) << 2;
195
+ const op = l ? 'ldr' : 'str';
196
+ return `${op} ${reg(rd)}, [sp, ${hex(offset)}]`;
197
+ }
198
+ // Format 10: Halfword Load/Store Immediate
199
+ if ((instr & 0xf000) === 0x8000) {
200
+ const l = bit(instr, 11);
201
+ const offset = bits(instr, 10, 6) << 1;
202
+ const rb = bits(instr, 5, 3);
203
+ const rd = bits(instr, 2, 0);
204
+ const op = l ? 'ldrh' : 'strh';
205
+ return `${op} ${reg(rd)}, [${reg(rb)}, ${hex(offset)}]`;
206
+ }
207
+ // Format 9: Load/Store Immediate Offset
208
+ if ((instr & 0xe000) === 0x6000) {
209
+ const b = bit(instr, 12);
210
+ const l = bit(instr, 11);
211
+ const offset5 = bits(instr, 10, 6);
212
+ const rb = bits(instr, 5, 3);
213
+ const rd = bits(instr, 2, 0);
214
+ const offset = b === 0 ? offset5 << 2 : offset5;
215
+ const suffix = b ? 'b' : '';
216
+ const op = l ? 'ldr' : 'str';
217
+ return `${op}${suffix} ${reg(rd)}, [${reg(rb)}, ${hex(offset)}]`;
218
+ }
219
+ // Format 8: Sign-Extended Load/Store
220
+ if ((instr & 0xf200) === 0x5200) {
221
+ const h = bit(instr, 11);
222
+ const s = bit(instr, 10);
223
+ const ro = bits(instr, 8, 6);
224
+ const rb = bits(instr, 5, 3);
225
+ const rd = bits(instr, 2, 0);
226
+ let op;
227
+ if (s === 0 && h === 0) {
228
+ op = 'strh';
229
+ }
230
+ else if (s === 0 && h === 1) {
231
+ op = 'ldrh';
232
+ }
233
+ else if (s === 1 && h === 0) {
234
+ op = 'ldrsb';
235
+ }
236
+ else {
237
+ op = 'ldrsh';
238
+ }
239
+ return `${op} ${reg(rd)}, [${reg(rb)}, ${reg(ro)}]`;
240
+ }
241
+ // Format 7: Register Offset Load/Store
242
+ if ((instr & 0xf200) === 0x5000) {
243
+ const l = bit(instr, 11);
244
+ const b = bit(instr, 10);
245
+ const ro = bits(instr, 8, 6);
246
+ const rb = bits(instr, 5, 3);
247
+ const rd = bits(instr, 2, 0);
248
+ const suffix = b ? 'b' : '';
249
+ const op = l ? 'ldr' : 'str';
250
+ return `${op}${suffix} ${reg(rd)}, [${reg(rb)}, ${reg(ro)}]`;
251
+ }
252
+ // Format 6: PC-Relative Load
253
+ if ((instr & 0xf800) === 0x4800) {
254
+ const rd = bits(instr, 10, 8);
255
+ const offset = (instr & 0xff) << 2;
256
+ const target = (((address + 4) & ~3) + offset) >>> 0;
257
+ return `ldr ${reg(rd)}, [pc, ${hex(offset)}] ; =${addr(target)}`;
258
+ }
259
+ // Format 5: Hi Register Ops / BX
260
+ if ((instr & 0xfc00) === 0x4400) {
261
+ const op = bits(instr, 9, 8);
262
+ const hd = bit(instr, 7);
263
+ const hs = bit(instr, 6);
264
+ const rs = bits(instr, 5, 3) | (hs << 3);
265
+ const rd = bits(instr, 2, 0) | (hd << 3);
266
+ switch (op) {
267
+ case 0:
268
+ return `add ${reg(rd)}, ${reg(rs)}`;
269
+ case 1:
270
+ return `cmp ${reg(rd)}, ${reg(rs)}`;
271
+ case 2:
272
+ return `mov ${reg(rd)}, ${reg(rs)}`;
273
+ case 3:
274
+ return `bx ${reg(rs)}`;
275
+ }
276
+ }
277
+ // Format 4: ALU Operations
278
+ if ((instr & 0xfc00) === 0x4000) {
279
+ const op = bits(instr, 9, 6);
280
+ const rs = bits(instr, 5, 3);
281
+ const rd = bits(instr, 2, 0);
282
+ const aluOps = [
283
+ 'ands',
284
+ 'eors',
285
+ 'lsls',
286
+ 'lsrs',
287
+ 'asrs',
288
+ 'adcs',
289
+ 'sbcs',
290
+ 'rors',
291
+ 'tst',
292
+ 'negs',
293
+ 'cmp',
294
+ 'cmn',
295
+ 'orrs',
296
+ 'muls',
297
+ 'bics',
298
+ 'mvns',
299
+ ];
300
+ return `${aluOps[op]} ${reg(rd)}, ${reg(rs)}`;
301
+ }
302
+ // Format 3: Move/Compare/Add/Sub Immediate
303
+ if ((instr & 0xe000) === 0x2000) {
304
+ const op = bits(instr, 12, 11);
305
+ const rd = bits(instr, 10, 8);
306
+ const imm = instr & 0xff;
307
+ const ops = ['movs', 'cmp', 'adds', 'subs'];
308
+ return `${ops[op]} ${reg(rd)}, ${hex(imm)}`;
309
+ }
310
+ // Format 2: Add/Subtract
311
+ if ((instr & 0xf800) === 0x1800) {
312
+ const i = bit(instr, 10);
313
+ const op = bit(instr, 9);
314
+ const rn = bits(instr, 8, 6);
315
+ const rs = bits(instr, 5, 3);
316
+ const rd = bits(instr, 2, 0);
317
+ const opName = op ? 'subs' : 'adds';
318
+ if (i) {
319
+ return `${opName} ${reg(rd)}, ${reg(rs)}, ${hex(rn)}`;
320
+ }
321
+ else {
322
+ return `${opName} ${reg(rd)}, ${reg(rs)}, ${reg(rn)}`;
323
+ }
324
+ }
325
+ // Format 1: Move Shifted Register
326
+ if ((instr & 0xe000) === 0x0000) {
327
+ const op = bits(instr, 12, 11);
328
+ const offset5 = bits(instr, 10, 6);
329
+ const rs = bits(instr, 5, 3);
330
+ const rd = bits(instr, 2, 0);
331
+ const shiftOps = ['lsls', 'lsrs', 'asrs'];
332
+ if (op < 3) {
333
+ return `${shiftOps[op]} ${reg(rd)}, ${reg(rs)}, ${hex(offset5)}`;
334
+ }
335
+ }
336
+ return `dw 0x${instr.toString(16).padStart(4, '0')}`;
337
+ }
338
+ // ─── ARM Disassembler ───────────────────────────────────────────────
339
+ /** Format a barrel shifter operand for data processing */
340
+ function formatShifterOperand(instr, isImm) {
341
+ if (isImm) {
342
+ const imm8 = instr & 0xff;
343
+ const rotate = ((instr >>> 8) & 0xf) * 2;
344
+ if (rotate === 0) {
345
+ return `#0x${imm8.toString(16)}`;
346
+ }
347
+ const value = ((imm8 >>> rotate) | (imm8 << (32 - rotate))) >>> 0;
348
+ return `#0x${value.toString(16)}`;
349
+ }
350
+ const rm = instr & 0xf;
351
+ const shiftType = (instr >>> 5) & 3;
352
+ const regShift = bit(instr, 4);
353
+ if (regShift) {
354
+ const rsReg = (instr >>> 8) & 0xf;
355
+ return `${reg(rm)}, ${SHIFT_NAMES[shiftType]} ${reg(rsReg)}`;
356
+ }
357
+ const amount = (instr >>> 7) & 0x1f;
358
+ if (amount === 0) {
359
+ if (shiftType === 0) {
360
+ return reg(rm); // LSL #0 is just Rm
361
+ }
362
+ if (shiftType === 3) {
363
+ return `${reg(rm)}, rrx`;
364
+ }
365
+ // LSR #0 = LSR #32, ASR #0 = ASR #32
366
+ return `${reg(rm)}, ${SHIFT_NAMES[shiftType]} #32`;
367
+ }
368
+ return `${reg(rm)}, ${SHIFT_NAMES[shiftType]} #${amount}`;
369
+ }
370
+ /**
371
+ * Disassemble a 32-bit ARM instruction.
372
+ *
373
+ * @param instruction - The 32-bit instruction word
374
+ * @param address - The address of the instruction (for PC-relative calculations)
375
+ * @returns A human-readable disassembly string
376
+ */
377
+ export function disassembleArm(instruction, address) {
378
+ const instr = instruction >>> 0;
379
+ const cond = (instr >>> 28) & 0xf;
380
+ const condStr = COND_NAMES[cond];
381
+ // SWI
382
+ if ((instr & 0x0f000000) === 0x0f000000) {
383
+ const swiNum = instr & 0x00ffffff;
384
+ return `swi${condStr} ${hex(swiNum)}`;
385
+ }
386
+ // Branch (B/BL)
387
+ if ((instr & 0x0e000000) === 0x0a000000) {
388
+ const link = bit(instr, 24);
389
+ const offset = signExtend(instr & 0x00ffffff, 24) << 2;
390
+ const target = (address + 8 + offset) >>> 0;
391
+ return `${link ? 'bl' : 'b'}${condStr} ${addr(target)}`;
392
+ }
393
+ // Block Data Transfer (LDM/STM)
394
+ if ((instr & 0x0e000000) === 0x08000000) {
395
+ const pre = bit(instr, 24);
396
+ const up = bit(instr, 23);
397
+ const s = bit(instr, 22);
398
+ const wb = bit(instr, 21);
399
+ const load = bit(instr, 20);
400
+ const rn = bits(instr, 19, 16);
401
+ const rlist = instr & 0xffff;
402
+ let suffix;
403
+ if (load) {
404
+ suffix = up ? (pre ? 'ib' : 'ia') : pre ? 'db' : 'da';
405
+ }
406
+ else {
407
+ suffix = up ? (pre ? 'ib' : 'ia') : pre ? 'db' : 'da';
408
+ }
409
+ const op = load ? 'ldm' : 'stm';
410
+ const wbStr = wb ? '!' : '';
411
+ const sStr = s ? '^' : '';
412
+ return `${op}${condStr}${suffix} ${reg(rn)}${wbStr}, ${regList(rlist)}${sStr}`;
413
+ }
414
+ // Single Data Transfer (LDR/STR) — immediate offset (bit 25=0)
415
+ if ((instr & 0x0c000000) === 0x04000000) {
416
+ const isRegOffset = bit(instr, 25);
417
+ const pre = bit(instr, 24);
418
+ const up = bit(instr, 23);
419
+ const byteMode = bit(instr, 22);
420
+ const wb = bit(instr, 21);
421
+ const load = bit(instr, 20);
422
+ const rn = bits(instr, 19, 16);
423
+ const rd = bits(instr, 15, 12);
424
+ const op = load ? 'ldr' : 'str';
425
+ const suffix = byteMode ? 'b' : '';
426
+ const sign = up ? '' : '-';
427
+ let offsetStr;
428
+ if (isRegOffset) {
429
+ const rm = instr & 0xf;
430
+ const shiftType = (instr >>> 5) & 3;
431
+ const shiftAmount = (instr >>> 7) & 0x1f;
432
+ if (shiftAmount === 0 && shiftType === 0) {
433
+ offsetStr = `${sign}${reg(rm)}`;
434
+ }
435
+ else {
436
+ offsetStr = `${sign}${reg(rm)}, ${SHIFT_NAMES[shiftType]} #${shiftAmount}`;
437
+ }
438
+ }
439
+ else {
440
+ const offset = instr & 0xfff;
441
+ offsetStr = offset === 0 ? '' : `${sign}#0x${offset.toString(16)}`;
442
+ }
443
+ if (pre) {
444
+ const wbStr = wb ? '!' : '';
445
+ if (offsetStr === '') {
446
+ return `${op}${condStr}${suffix} ${reg(rd)}, [${reg(rn)}]${wbStr}`;
447
+ }
448
+ return `${op}${condStr}${suffix} ${reg(rd)}, [${reg(rn)}, ${offsetStr}]${wbStr}`;
449
+ }
450
+ else {
451
+ return `${op}${condStr}${suffix} ${reg(rd)}, [${reg(rn)}], ${offsetStr}`;
452
+ }
453
+ }
454
+ // BX
455
+ if ((instr & 0x0ffffff0) === 0x012fff10) {
456
+ const rm = instr & 0xf;
457
+ return `bx${condStr} ${reg(rm)}`;
458
+ }
459
+ // Multiply (MUL/MLA)
460
+ if ((instr & 0x0fc000f0) === 0x00000090) {
461
+ const accumulate = bit(instr, 21);
462
+ const setFlags = bit(instr, 20);
463
+ const rd = bits(instr, 19, 16);
464
+ const rn = bits(instr, 15, 12);
465
+ const rs = bits(instr, 11, 8);
466
+ const rm = instr & 0xf;
467
+ const sStr = setFlags ? 's' : '';
468
+ if (accumulate) {
469
+ return `mla${condStr}${sStr} ${reg(rd)}, ${reg(rm)}, ${reg(rs)}, ${reg(rn)}`;
470
+ }
471
+ else {
472
+ return `mul${condStr}${sStr} ${reg(rd)}, ${reg(rm)}, ${reg(rs)}`;
473
+ }
474
+ }
475
+ // Long Multiply (UMULL/UMLAL/SMULL/SMLAL)
476
+ if ((instr & 0x0f8000f0) === 0x00800090) {
477
+ const isSigned = bit(instr, 22);
478
+ const accumulate = bit(instr, 21);
479
+ const setFlags = bit(instr, 20);
480
+ const rdHi = bits(instr, 19, 16);
481
+ const rdLo = bits(instr, 15, 12);
482
+ const rs = bits(instr, 11, 8);
483
+ const rm = instr & 0xf;
484
+ const sStr = setFlags ? 's' : '';
485
+ let op;
486
+ if (isSigned) {
487
+ op = accumulate ? 'smlal' : 'smull';
488
+ }
489
+ else {
490
+ op = accumulate ? 'umlal' : 'umull';
491
+ }
492
+ return `${op}${condStr}${sStr} ${reg(rdLo)}, ${reg(rdHi)}, ${reg(rm)}, ${reg(rs)}`;
493
+ }
494
+ // SWP/SWPB
495
+ if ((instr & 0x0fb00ff0) === 0x01000090) {
496
+ const byteMode = bit(instr, 22);
497
+ const rn = bits(instr, 19, 16);
498
+ const rd = bits(instr, 15, 12);
499
+ const rm = instr & 0xf;
500
+ const suffix = byteMode ? 'b' : '';
501
+ return `swp${condStr}${suffix} ${reg(rd)}, ${reg(rm)}, [${reg(rn)}]`;
502
+ }
503
+ // Halfword transfers (LDRH/STRH/LDRSB/LDRSH)
504
+ if ((instr & 0x0e000090) === 0x00000090 && (instr & 0x00000060) !== 0) {
505
+ // Check it's not a multiply
506
+ const pre = bit(instr, 24);
507
+ const up = bit(instr, 23);
508
+ const immOffset = bit(instr, 22);
509
+ const wb = bit(instr, 21);
510
+ const load = bit(instr, 20);
511
+ const rn = bits(instr, 19, 16);
512
+ const rd = bits(instr, 15, 12);
513
+ const sh = bits(instr, 6, 5);
514
+ const sign = up ? '' : '-';
515
+ let opName;
516
+ if (load) {
517
+ switch (sh) {
518
+ case 0b01:
519
+ opName = 'ldrh';
520
+ break;
521
+ case 0b10:
522
+ opName = 'ldrsb';
523
+ break;
524
+ case 0b11:
525
+ opName = 'ldrsh';
526
+ break;
527
+ default:
528
+ opName = 'ldr?';
529
+ }
530
+ }
531
+ else {
532
+ opName = 'strh';
533
+ }
534
+ let offsetStr;
535
+ if (immOffset) {
536
+ const offset = ((instr >>> 4) & 0xf0) | (instr & 0xf);
537
+ offsetStr = offset === 0 ? '' : `${sign}#0x${offset.toString(16)}`;
538
+ }
539
+ else {
540
+ const rm = instr & 0xf;
541
+ offsetStr = `${sign}${reg(rm)}`;
542
+ }
543
+ if (pre) {
544
+ const wbStr = wb ? '!' : '';
545
+ if (offsetStr === '') {
546
+ return `${opName}${condStr} ${reg(rd)}, [${reg(rn)}]${wbStr}`;
547
+ }
548
+ return `${opName}${condStr} ${reg(rd)}, [${reg(rn)}, ${offsetStr}]${wbStr}`;
549
+ }
550
+ else {
551
+ return `${opName}${condStr} ${reg(rd)}, [${reg(rn)}], ${offsetStr}`;
552
+ }
553
+ }
554
+ // MRS
555
+ if ((instr & 0x0fbf0fff) === 0x010f0000) {
556
+ const useSPSR = bit(instr, 22);
557
+ const rd = bits(instr, 15, 12);
558
+ return `mrs${condStr} ${reg(rd)}, ${useSPSR ? 'spsr' : 'cpsr'}`;
559
+ }
560
+ // MSR (register)
561
+ if ((instr & 0x0fbffff0) === 0x0129f000) {
562
+ const useSPSR = bit(instr, 22);
563
+ const rm = instr & 0xf;
564
+ const fieldMask = bits(instr, 19, 16);
565
+ const fields = formatPsrFields(fieldMask);
566
+ return `msr${condStr} ${useSPSR ? 'spsr' : 'cpsr'}${fields}, ${reg(rm)}`;
567
+ }
568
+ // MSR (immediate)
569
+ if ((instr & 0x0dbff000) === 0x0128f000) {
570
+ const useSPSR = bit(instr, 22);
571
+ const fieldMask = bits(instr, 19, 16);
572
+ const imm8 = instr & 0xff;
573
+ const rotate = ((instr >>> 8) & 0xf) * 2;
574
+ const value = rotate === 0 ? imm8 : ((imm8 >>> rotate) | (imm8 << (32 - rotate))) >>> 0;
575
+ const fields = formatPsrFields(fieldMask);
576
+ return `msr${condStr} ${useSPSR ? 'spsr' : 'cpsr'}${fields}, #0x${value.toString(16)}`;
577
+ }
578
+ // Data Processing
579
+ if ((instr & 0x0c000000) === 0x00000000) {
580
+ const isImm = bit(instr, 25);
581
+ const opcode = bits(instr, 24, 21);
582
+ const setFlags = bit(instr, 20);
583
+ const rn = bits(instr, 19, 16);
584
+ const rd = bits(instr, 15, 12);
585
+ const sStr = setFlags ? 's' : '';
586
+ const op = DP_NAMES[opcode];
587
+ const operand2 = formatShifterOperand(instr, isImm === 1);
588
+ // Test instructions (don't write to Rd)
589
+ if (opcode >= 0x8 && opcode <= 0xb) {
590
+ return `${op}${condStr} ${reg(rn)}, ${operand2}`;
591
+ }
592
+ // MOV/MVN (don't use Rn)
593
+ if (opcode === 0xd || opcode === 0xf) {
594
+ return `${op}${condStr}${sStr} ${reg(rd)}, ${operand2}`;
595
+ }
596
+ return `${op}${condStr}${sStr} ${reg(rd)}, ${reg(rn)}, ${operand2}`;
597
+ }
598
+ return `dw 0x${instr.toString(16).padStart(8, '0')}`;
599
+ }
600
+ /** Format PSR field mask for MSR instructions */
601
+ function formatPsrFields(mask) {
602
+ let fields = '_';
603
+ if (mask & 1) {
604
+ fields += 'c';
605
+ }
606
+ if (mask & 2) {
607
+ fields += 'x';
608
+ }
609
+ if (mask & 4) {
610
+ fields += 's';
611
+ }
612
+ if (mask & 8) {
613
+ fields += 'f';
614
+ }
615
+ return fields;
616
+ }
617
+ //# sourceMappingURL=disassembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disassembler.js","sourceRoot":"","sources":["../src/disassembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ARM7TDMI Emulator — Public API
3
+ */
4
+ export { GbaMemory } from './memory.js';
5
+ export type { CpsrFlags, DebugAction, DebugHooks, ExecutionResult, ExternalCall, MemoryBus, MemoryWrite, } from './types.js';
6
+ export { LR, PC, SP, SENTINEL_ADDR } from './types.js';
7
+ export type { CpuSnapshot } from './cpu-snapshot.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ARM7TDMI Emulator — Public API
3
+ */
4
+ export { GbaMemory } from './memory.js';
5
+ export { LR, PC, SP, SENTINEL_ADDR } from './types.js';
6
+ //# sourceMappingURL=index.js.map