@henols/vice-mcp 0.1.10 → 0.1.11

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,464 @@
1
+ // disasm-opcodes.ts
2
+ //
3
+ // The committed 256-entry 6502/6510 opcode table -- one entry per opcode
4
+ // byte, indexed by that byte (`OPCODES[0xa9]` is `lda #`). Pure data, zero
5
+ // imports, zero I/O, no build step: this is a container-side `.ts` run
6
+ // directly under Node's native type-stripping (see this package's
7
+ // README/CLAUDE.md), not a host-bound `.mts` -- `build.ts` and
8
+ // `resources-sync.test.ts` do not apply to it.
9
+ //
10
+ // ---------------------------------------------------------------------------
11
+ // Attribution / provenance (D-07, criterion 5)
12
+ // ---------------------------------------------------------------------------
13
+ // Transcribed by hand from cc65's `src/da65/opc6502x.c`, fetched raw
14
+ // (`curl -s https://raw.githubusercontent.com/cc65/cc65/master/src/da65/opc6502x.c`)
15
+ // against `master` @ commit `547d923588d870aacf0b0016c67d0f6a92a70f83`
16
+ // (2026-07-11); the table itself was last touched at commit
17
+ // `02e79d35d73efd31522b5eab986d1919e3560bba` (2025-06-19, "making da65
18
+ // produce the same mnemonics as ca65 uses"). cc65 is zlib-licensed
19
+ // (`(C) 2003-2011, Ullrich von Bassewitz` -- see the header of the source
20
+ // file itself for the full zlib licence text: free use, alteration and
21
+ // redistribution permitted, with the origin-must-not-be-misrepresented and
22
+ // altered-versions-must-be-marked obligations). This transcription satisfies
23
+ // those obligations via this comment.
24
+ //
25
+ // Cross-checked, reference-only (no code taken from either), against
26
+ // masswerk.at's 6502 instruction-set reference and
27
+ // www.oxyron.de/html/opcodes02.html for the illegal-opcode addressing modes,
28
+ // lengths and alternate mnemonics.
29
+ //
30
+ // Nothing in this file is sourced from VICE (its licence is GPL-2, incompatible with this MIT repo). No
31
+ // opcode fact, comment or naming choice here traces to any `vice/src` file,
32
+ // `monitor.c`, `mon_*.c`, or any other VICE source.
33
+ //
34
+ // `fluffy-6502`, named in ROADMAP.md and carried into
35
+ // `04-CONTEXT.md` D-06 as an MIT cross-check source, could not be located
36
+ // under that name on GitHub or the general web (04-RESEARCH.md Assumptions
37
+ // Log A1, Common Pitfalls Pitfall 5). It is recorded here as an
38
+ // **unavailable** source, not cited as one. D-06's bit-pattern derivation
39
+ // test (`disasm-opcodes.test.ts`) and 04-06's byte-exact real-ACME
40
+ // round-trip carry the entire independent cross-check burden instead.
41
+ //
42
+ // ---------------------------------------------------------------------------
43
+ // Mnemonic naming: two deliberate departures from cc65's own spelling
44
+ // ---------------------------------------------------------------------------
45
+ // cc65 spells two illegal opcodes differently from ACME's verified
46
+ // `!cpu 6510` mnemonic set (`.claude/skills/acme-build/SKILL.md`: `lax dcp
47
+ // sax slo rla sre rra isc anc alr arr sbx las tas sha shx shy jam`). This
48
+ // table follows ACME's names, not cc65's, at exactly these two opcodes, so
49
+ // that `acmeExpressible` below can be computed by simple set membership
50
+ // against that verified list:
51
+ // - `$AB` -- cc65 calls this "lax" (an immediate-mode ANE/ATX/LXA/OAL
52
+ // family member). Renamed here to "lxa" so it is never confused with the
53
+ // genuine indexed-addressing LAX family (`$A3/$A7/$AF/$B3/$B7/$BF`),
54
+ // which ACME DOES accept as "lax". 04-06's real-ACME round-trip found
55
+ // that ACME 0.97 ("Zem") ALSO accepts "lxa" (with a documented "unstable
56
+ // LXA #NONZERO" warning, not an error) and reproduces exactly `$AB` --
57
+ // this entry's `acmeExpressible` is `true`, corrected from an earlier,
58
+ // untested `false` seed.
59
+ // - `$CB` -- cc65 calls this "axs". Renamed here to "sbx" (SBX/AXS/SAX2
60
+ // are all names for the same opcode; masswerk.at and oxyron.de both use
61
+ // "SBX"), matching ACME's verified list. `acmeExpressible` is `true`.
62
+ // No other mnemonic in this table differs from cc65's spelling.
63
+ //
64
+ // ---------------------------------------------------------------------------
65
+ // `acmeExpressible` corrections made by 04-06's real-ACME round-trip
66
+ // ---------------------------------------------------------------------------
67
+ // D-09 says the seed above is not the authority -- `disasm-roundtrip.test.ts`
68
+ // asserting against a real installed ACME 0.97 ("Zem") is. Two duplicate
69
+ // (mnemonic, addressing-mode) groups exist among the illegal opcodes, where
70
+ // ACME's assembler resolves the bare mnemonic to exactly ONE canonical
71
+ // opcode byte regardless of which of the several opcodes sharing that
72
+ // mnemonic+mode a decoder produced it from -- so only that one canonical
73
+ // member can be `true`; every other member of the group is unfaithful
74
+ // (ACME accepts the syntax but silently emits the WRONG opcode byte) and
75
+ // must be `false`:
76
+ // - `jam` (implicit, no operand -- 12 opcodes: $02 $12 $22 $32 $42 $52 $62
77
+ // $72 $92 $B2 $D2 $F2): ACME always assembles bare `jam` to `$02`.
78
+ // Corrected: only `$02` is `true`; the other 11 are `false`.
79
+ // - `anc` (immediate -- $0B and $2B): ACME always assembles `anc #imm` to
80
+ // `$0B`. Corrected: `$0B` stays `true`; `$2B` is now `false`.
81
+ // A third group -- the illegal `nop` family, which spans FIVE duplicate
82
+ // (mode) subgroups (immediate: $80/$82/$89/$C2/$E2; zeropage: $04/$44/$64;
83
+ // zeropage,X: $14/$34/$54/$74/$D4/$F4; absolute,X: $1C/$3C/$5C/$7C/$DC/$FC;
84
+ // implied: $1A/$3A/$5A/$7A/$DA/$FA) -- was already ALL-`false` in the
85
+ // original seed, but for four of those five subgroups that was
86
+ // over-conservative: ACME's bare `nop <operand>` DOES faithfully reproduce
87
+ // the group's lowest-numbered member. Corrected: `$04`, `$14`, `$1C`, `$80`
88
+ // (each the lowest opcode in its subgroup) are now `true`; every other
89
+ // member of those same four subgroups stays `false`. The implied subgroup
90
+ // ($1A/$3A/.../$FA) stays entirely `false` for a different reason: ACME's
91
+ // bare `nop` mnemonic with NO operand always resolves to the pre-existing
92
+ // LEGAL opcode `$EA`, never to any illegal implied-mode member, so none of
93
+ // them can ever be faithfully expressed via the plain "nop" mnemonic.
94
+ // `nop` absolute ($0C) has no duplicate partner at all (it is the only
95
+ // illegal absolute-mode nop) and was ALSO corrected from `false` to `true`
96
+ // -- it was unconditionally byte-faithful and unambiguous; the original
97
+ // `false` was simply an untested, over-conservative seed value, not a
98
+ // disagreement about ambiguity.
99
+ //
100
+ // ---------------------------------------------------------------------------
101
+ // WHY THIS FILE EXISTS
102
+ // ---------------------------------------------------------------------------
103
+ // This is the one table the decoder (04-03), Phase 5's backtrace (DERIV-02)
104
+ // and Phase 6's CPU-history decode (GAIN-01) all read instruction lengths
105
+ // from. A wrong length here silently desynchronises every instruction after
106
+ // it in every one of those consumers (criterion 2's own wording) -- there is
107
+ // no runtime check downstream that would catch a transcription typo on its
108
+ // own; that is what `disasm-opcodes.test.ts`'s independent bit-pattern
109
+ // derivation is for.
110
+ //
111
+ // ---------------------------------------------------------------------------
112
+ // Correction carried from ROADMAP.md / 04-CONTEXT.md D-09
113
+ // ---------------------------------------------------------------------------
114
+ // ROADMAP.md criterion 2 and 04-CONTEXT.md D-09 both say "twelve NOP
115
+ // variants." That figure does not match any standard 6502/6510 opcode
116
+ // enumeration. The real illegal-NOP class is **27 opcodes across 6
117
+ // addressing-mode groups** (verified against cc65's live source, masswerk.at
118
+ // and oxyron.de this session):
119
+ // implied/1-byte: 1A 3A 5A 7A DA FA (6)
120
+ // immediate/2-byte: 80 82 89 C2 E2 (5)
121
+ // zeropage/2-byte: 04 44 64 (3)
122
+ // zeropage,X/2-byte: 14 34 54 74 D4 F4 (6)
123
+ // absolute/3-byte: 0C (1)
124
+ // absolute,X/3-byte: 1C 3C 5C 7C DC FC (6)
125
+ // `disasm-opcodes.test.ts` asserts this corrected 27/6-group enumeration
126
+ // exhaustively, not a hardcoded "twelve".
127
+ //
128
+ // ---------------------------------------------------------------------------
129
+ // WHAT NOT TO DO
130
+ // ---------------------------------------------------------------------------
131
+ // - Never add an `import` to this file. It is pure data (D-05, DISASM-07)
132
+ // -- `disasm-opcodes.test.ts` asserts zero import statements on the
133
+ // comment-stripped source.
134
+ // - Never source an opcode fact from VICE.
135
+ // - Never edit `acmeExpressible` by hand to make 04-06's real-ACME
136
+ // assertion test pass. That test is the authority; a disagreement means
137
+ // the seed below was wrong, not the test.
138
+ // - Never re-derive a second opcode table anywhere else in this tree.
139
+
140
+ /**
141
+ * The 13 6502/6510 addressing modes this table distinguishes. `indirect`
142
+ * covers only `JMP ($xxxx)` ($6C) -- there is no other indirect-without-
143
+ * index addressing mode on this CPU.
144
+ */
145
+ export type AddressingMode =
146
+ | "implicit"
147
+ | "accumulator"
148
+ | "immediate"
149
+ | "zeropage"
150
+ | "zeropage_x"
151
+ | "zeropage_y"
152
+ | "absolute"
153
+ | "absolute_x"
154
+ | "absolute_y"
155
+ | "indirect"
156
+ | "indirect_x"
157
+ | "indirect_y"
158
+ | "relative";
159
+
160
+ /**
161
+ * The canonical instruction length, in bytes, for each addressing mode.
162
+ * Every `OpcodeEntry.length` below must equal `LENGTH_FOR_MODE[entry.mode]`
163
+ * -- `disasm-opcodes.test.ts`'s shape suite asserts this for all 256
164
+ * entries.
165
+ */
166
+ export const LENGTH_FOR_MODE: Readonly<Record<AddressingMode, 1 | 2 | 3>> = {
167
+ implicit: 1,
168
+ accumulator: 1,
169
+ immediate: 2,
170
+ zeropage: 2,
171
+ zeropage_x: 2,
172
+ zeropage_y: 2,
173
+ indirect_x: 2,
174
+ indirect_y: 2,
175
+ relative: 2,
176
+ absolute: 3,
177
+ absolute_x: 3,
178
+ absolute_y: 3,
179
+ indirect: 3,
180
+ };
181
+
182
+ /** One 6502/6510 opcode's decode facts. */
183
+ export interface OpcodeEntry {
184
+ /** Lowercase three-letter canonical 6502/6510 mnemonic (ACME source is
185
+ * lowercase, and the renderer (04-04) emits this verbatim). */
186
+ mnemonic: string;
187
+ mode: AddressingMode;
188
+ length: 1 | 2 | 3;
189
+ /** `true` for every opcode outside the documented NMOS 6502 set. */
190
+ illegal: boolean;
191
+ /**
192
+ * Whether ACME's `!cpu 6510` accepts `mnemonic` in this addressing mode.
193
+ * This field is a SEED, not an authority: 04-06's substitution-membership
194
+ * assertion test against a real installed ACME is the authority for every
195
+ * value here (D-09 -- "the exact set is determined by the assertion test
196
+ * against the installed ACME, not by this list"). 04-06 corrects any
197
+ * entry ACME disagrees with; never hand-edit this field to force that
198
+ * test to pass.
199
+ */
200
+ acmeExpressible: boolean;
201
+ }
202
+
203
+ /**
204
+ * All 256 6502/6510 opcodes, indexed by opcode byte -- `OPCODES[0xa9]` is
205
+ * `lda #`. No sparse holes, no `undefined`.
206
+ */
207
+ export const OPCODES: readonly OpcodeEntry[] = [
208
+ { mnemonic: "brk", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $00
209
+ { mnemonic: "ora", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $01
210
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: true }, // $02
211
+ { mnemonic: "slo", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $03
212
+ { mnemonic: "nop", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $04 (04-06: canonical zeropage nop, ACME's "nop $xx" always yields this byte)
213
+ { mnemonic: "ora", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $05
214
+ { mnemonic: "asl", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $06
215
+ { mnemonic: "slo", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $07
216
+ { mnemonic: "php", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $08
217
+ { mnemonic: "ora", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $09
218
+ { mnemonic: "asl", mode: "accumulator", length: 1, illegal: false, acmeExpressible: true }, // $0a
219
+ { mnemonic: "anc", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $0b
220
+ { mnemonic: "nop", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $0c (04-06: unique, unambiguous, ACME reproduces exactly)
221
+ { mnemonic: "ora", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $0d
222
+ { mnemonic: "asl", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $0e
223
+ { mnemonic: "slo", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $0f
224
+ { mnemonic: "bpl", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $10
225
+ { mnemonic: "ora", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $11
226
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $12 (04-06: bare "jam" always assembles to $02, not this byte)
227
+ { mnemonic: "slo", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $13
228
+ { mnemonic: "nop", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $14 (04-06: canonical zeropage,x nop)
229
+ { mnemonic: "ora", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $15
230
+ { mnemonic: "asl", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $16
231
+ { mnemonic: "slo", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $17
232
+ { mnemonic: "clc", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $18
233
+ { mnemonic: "ora", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $19
234
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $1a
235
+ { mnemonic: "slo", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $1b
236
+ { mnemonic: "nop", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $1c (04-06: canonical absolute,x nop)
237
+ { mnemonic: "ora", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $1d
238
+ { mnemonic: "asl", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $1e
239
+ { mnemonic: "slo", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $1f
240
+ { mnemonic: "jsr", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $20
241
+ { mnemonic: "and", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $21
242
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $22 (04-06: bare "jam" always assembles to $02, not this byte)
243
+ { mnemonic: "rla", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $23
244
+ { mnemonic: "bit", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $24
245
+ { mnemonic: "and", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $25
246
+ { mnemonic: "rol", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $26
247
+ { mnemonic: "rla", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $27
248
+ { mnemonic: "plp", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $28
249
+ { mnemonic: "and", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $29
250
+ { mnemonic: "rol", mode: "accumulator", length: 1, illegal: false, acmeExpressible: true }, // $2a
251
+ { mnemonic: "anc", mode: "immediate", length: 2, illegal: true, acmeExpressible: false }, // $2b (04-06: "anc #imm" always assembles to $0b, not this byte)
252
+ { mnemonic: "bit", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $2c
253
+ { mnemonic: "and", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $2d
254
+ { mnemonic: "rol", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $2e
255
+ { mnemonic: "rla", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $2f
256
+ { mnemonic: "bmi", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $30
257
+ { mnemonic: "and", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $31
258
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $32 (04-06: bare "jam" always assembles to $02, not this byte)
259
+ { mnemonic: "rla", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $33
260
+ { mnemonic: "nop", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: false }, // $34
261
+ { mnemonic: "and", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $35
262
+ { mnemonic: "rol", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $36
263
+ { mnemonic: "rla", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $37
264
+ { mnemonic: "sec", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $38
265
+ { mnemonic: "and", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $39
266
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $3a
267
+ { mnemonic: "rla", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $3b
268
+ { mnemonic: "nop", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: false }, // $3c
269
+ { mnemonic: "and", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $3d
270
+ { mnemonic: "rol", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $3e
271
+ { mnemonic: "rla", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $3f
272
+ { mnemonic: "rti", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $40
273
+ { mnemonic: "eor", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $41
274
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $42 (04-06: bare "jam" always assembles to $02, not this byte)
275
+ { mnemonic: "sre", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $43
276
+ { mnemonic: "nop", mode: "zeropage", length: 2, illegal: true, acmeExpressible: false }, // $44
277
+ { mnemonic: "eor", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $45
278
+ { mnemonic: "lsr", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $46
279
+ { mnemonic: "sre", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $47
280
+ { mnemonic: "pha", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $48
281
+ { mnemonic: "eor", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $49
282
+ { mnemonic: "lsr", mode: "accumulator", length: 1, illegal: false, acmeExpressible: true }, // $4a
283
+ { mnemonic: "alr", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $4b
284
+ { mnemonic: "jmp", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $4c
285
+ { mnemonic: "eor", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $4d
286
+ { mnemonic: "lsr", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $4e
287
+ { mnemonic: "sre", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $4f
288
+ { mnemonic: "bvc", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $50
289
+ { mnemonic: "eor", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $51
290
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $52 (04-06: bare "jam" always assembles to $02, not this byte)
291
+ { mnemonic: "sre", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $53
292
+ { mnemonic: "nop", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: false }, // $54
293
+ { mnemonic: "eor", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $55
294
+ { mnemonic: "lsr", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $56
295
+ { mnemonic: "sre", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $57
296
+ { mnemonic: "cli", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $58
297
+ { mnemonic: "eor", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $59
298
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $5a
299
+ { mnemonic: "sre", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $5b
300
+ { mnemonic: "nop", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: false }, // $5c
301
+ { mnemonic: "eor", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $5d
302
+ { mnemonic: "lsr", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $5e
303
+ { mnemonic: "sre", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $5f
304
+ { mnemonic: "rts", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $60
305
+ { mnemonic: "adc", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $61
306
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $62 (04-06: bare "jam" always assembles to $02, not this byte)
307
+ { mnemonic: "rra", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $63
308
+ { mnemonic: "nop", mode: "zeropage", length: 2, illegal: true, acmeExpressible: false }, // $64
309
+ { mnemonic: "adc", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $65
310
+ { mnemonic: "ror", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $66
311
+ { mnemonic: "rra", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $67
312
+ { mnemonic: "pla", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $68
313
+ { mnemonic: "adc", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $69
314
+ { mnemonic: "ror", mode: "accumulator", length: 1, illegal: false, acmeExpressible: true }, // $6a
315
+ { mnemonic: "arr", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $6b
316
+ { mnemonic: "jmp", mode: "indirect", length: 3, illegal: false, acmeExpressible: true }, // $6c
317
+ { mnemonic: "adc", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $6d
318
+ { mnemonic: "ror", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $6e
319
+ { mnemonic: "rra", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $6f
320
+ { mnemonic: "bvs", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $70
321
+ { mnemonic: "adc", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $71
322
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $72 (04-06: bare "jam" always assembles to $02, not this byte)
323
+ { mnemonic: "rra", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $73
324
+ { mnemonic: "nop", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: false }, // $74
325
+ { mnemonic: "adc", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $75
326
+ { mnemonic: "ror", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $76
327
+ { mnemonic: "rra", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $77
328
+ { mnemonic: "sei", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $78
329
+ { mnemonic: "adc", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $79
330
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $7a
331
+ { mnemonic: "rra", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $7b
332
+ { mnemonic: "nop", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: false }, // $7c
333
+ { mnemonic: "adc", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $7d
334
+ { mnemonic: "ror", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $7e
335
+ { mnemonic: "rra", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $7f
336
+ { mnemonic: "nop", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $80 (04-06: canonical immediate nop)
337
+ { mnemonic: "sta", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $81
338
+ { mnemonic: "nop", mode: "immediate", length: 2, illegal: true, acmeExpressible: false }, // $82
339
+ { mnemonic: "sax", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $83
340
+ { mnemonic: "sty", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $84
341
+ { mnemonic: "sta", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $85
342
+ { mnemonic: "stx", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $86
343
+ { mnemonic: "sax", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $87
344
+ { mnemonic: "dey", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $88
345
+ { mnemonic: "nop", mode: "immediate", length: 2, illegal: true, acmeExpressible: false }, // $89
346
+ { mnemonic: "txa", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $8a
347
+ { mnemonic: "ane", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $8b (04-06: ACME accepts "ane #imm" with a documented "unstable" warning, not an error, and reproduces $8b exactly)
348
+ { mnemonic: "sty", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $8c
349
+ { mnemonic: "sta", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $8d
350
+ { mnemonic: "stx", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $8e
351
+ { mnemonic: "sax", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $8f
352
+ { mnemonic: "bcc", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $90
353
+ { mnemonic: "sta", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $91
354
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $92 (04-06: bare "jam" always assembles to $02, not this byte)
355
+ { mnemonic: "sha", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $93
356
+ { mnemonic: "sty", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $94
357
+ { mnemonic: "sta", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $95
358
+ { mnemonic: "stx", mode: "zeropage_y", length: 2, illegal: false, acmeExpressible: true }, // $96
359
+ { mnemonic: "sax", mode: "zeropage_y", length: 2, illegal: true, acmeExpressible: true }, // $97
360
+ { mnemonic: "tya", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $98
361
+ { mnemonic: "sta", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $99
362
+ { mnemonic: "txs", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $9a
363
+ { mnemonic: "tas", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $9b
364
+ { mnemonic: "shy", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $9c
365
+ { mnemonic: "sta", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $9d
366
+ { mnemonic: "shx", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $9e
367
+ { mnemonic: "sha", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $9f
368
+ { mnemonic: "ldy", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $a0
369
+ { mnemonic: "lda", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $a1
370
+ { mnemonic: "ldx", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $a2
371
+ { mnemonic: "lax", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $a3
372
+ { mnemonic: "ldy", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $a4
373
+ { mnemonic: "lda", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $a5
374
+ { mnemonic: "ldx", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $a6
375
+ { mnemonic: "lax", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $a7
376
+ { mnemonic: "tay", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $a8
377
+ { mnemonic: "lda", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $a9
378
+ { mnemonic: "tax", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $aa
379
+ { mnemonic: "lxa", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $ab (04-06: ACME accepts "lxa #imm" with a documented "unstable" warning, not an error, and reproduces $ab exactly)
380
+ { mnemonic: "ldy", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ac
381
+ { mnemonic: "lda", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ad
382
+ { mnemonic: "ldx", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ae
383
+ { mnemonic: "lax", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $af
384
+ { mnemonic: "bcs", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $b0
385
+ { mnemonic: "lda", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $b1
386
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $b2 (04-06: bare "jam" always assembles to $02, not this byte)
387
+ { mnemonic: "lax", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $b3
388
+ { mnemonic: "ldy", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $b4
389
+ { mnemonic: "lda", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $b5
390
+ { mnemonic: "ldx", mode: "zeropage_y", length: 2, illegal: false, acmeExpressible: true }, // $b6
391
+ { mnemonic: "lax", mode: "zeropage_y", length: 2, illegal: true, acmeExpressible: true }, // $b7
392
+ { mnemonic: "clv", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $b8
393
+ { mnemonic: "lda", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $b9
394
+ { mnemonic: "tsx", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $ba
395
+ { mnemonic: "las", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $bb
396
+ { mnemonic: "ldy", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $bc
397
+ { mnemonic: "lda", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $bd
398
+ { mnemonic: "ldx", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $be
399
+ { mnemonic: "lax", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $bf
400
+ { mnemonic: "cpy", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $c0
401
+ { mnemonic: "cmp", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $c1
402
+ { mnemonic: "nop", mode: "immediate", length: 2, illegal: true, acmeExpressible: false }, // $c2
403
+ { mnemonic: "dcp", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $c3
404
+ { mnemonic: "cpy", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $c4
405
+ { mnemonic: "cmp", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $c5
406
+ { mnemonic: "dec", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $c6
407
+ { mnemonic: "dcp", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $c7
408
+ { mnemonic: "iny", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $c8
409
+ { mnemonic: "cmp", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $c9
410
+ { mnemonic: "dex", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $ca
411
+ { mnemonic: "sbx", mode: "immediate", length: 2, illegal: true, acmeExpressible: true }, // $cb
412
+ { mnemonic: "cpy", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $cc
413
+ { mnemonic: "cmp", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $cd
414
+ { mnemonic: "dec", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ce
415
+ { mnemonic: "dcp", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $cf
416
+ { mnemonic: "bne", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $d0
417
+ { mnemonic: "cmp", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $d1
418
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $d2 (04-06: bare "jam" always assembles to $02, not this byte)
419
+ { mnemonic: "dcp", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $d3
420
+ { mnemonic: "nop", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: false }, // $d4
421
+ { mnemonic: "cmp", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $d5
422
+ { mnemonic: "dec", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $d6
423
+ { mnemonic: "dcp", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $d7
424
+ { mnemonic: "cld", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $d8
425
+ { mnemonic: "cmp", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $d9
426
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $da
427
+ { mnemonic: "dcp", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $db
428
+ { mnemonic: "nop", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: false }, // $dc
429
+ { mnemonic: "cmp", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $dd
430
+ { mnemonic: "dec", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $de
431
+ { mnemonic: "dcp", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $df
432
+ { mnemonic: "cpx", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $e0
433
+ { mnemonic: "sbc", mode: "indirect_x", length: 2, illegal: false, acmeExpressible: true }, // $e1
434
+ { mnemonic: "nop", mode: "immediate", length: 2, illegal: true, acmeExpressible: false }, // $e2
435
+ { mnemonic: "isc", mode: "indirect_x", length: 2, illegal: true, acmeExpressible: true }, // $e3
436
+ { mnemonic: "cpx", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $e4
437
+ { mnemonic: "sbc", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $e5
438
+ { mnemonic: "inc", mode: "zeropage", length: 2, illegal: false, acmeExpressible: true }, // $e6
439
+ { mnemonic: "isc", mode: "zeropage", length: 2, illegal: true, acmeExpressible: true }, // $e7
440
+ { mnemonic: "inx", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $e8
441
+ { mnemonic: "sbc", mode: "immediate", length: 2, illegal: false, acmeExpressible: true }, // $e9
442
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $ea
443
+ { mnemonic: "sbc", mode: "immediate", length: 2, illegal: true, acmeExpressible: false }, // $eb
444
+ { mnemonic: "cpx", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ec
445
+ { mnemonic: "sbc", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ed
446
+ { mnemonic: "inc", mode: "absolute", length: 3, illegal: false, acmeExpressible: true }, // $ee
447
+ { mnemonic: "isc", mode: "absolute", length: 3, illegal: true, acmeExpressible: true }, // $ef
448
+ { mnemonic: "beq", mode: "relative", length: 2, illegal: false, acmeExpressible: true }, // $f0
449
+ { mnemonic: "sbc", mode: "indirect_y", length: 2, illegal: false, acmeExpressible: true }, // $f1
450
+ { mnemonic: "jam", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $f2 (04-06: bare "jam" always assembles to $02, not this byte)
451
+ { mnemonic: "isc", mode: "indirect_y", length: 2, illegal: true, acmeExpressible: true }, // $f3
452
+ { mnemonic: "nop", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: false }, // $f4
453
+ { mnemonic: "sbc", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $f5
454
+ { mnemonic: "inc", mode: "zeropage_x", length: 2, illegal: false, acmeExpressible: true }, // $f6
455
+ { mnemonic: "isc", mode: "zeropage_x", length: 2, illegal: true, acmeExpressible: true }, // $f7
456
+ { mnemonic: "sed", mode: "implicit", length: 1, illegal: false, acmeExpressible: true }, // $f8
457
+ { mnemonic: "sbc", mode: "absolute_y", length: 3, illegal: false, acmeExpressible: true }, // $f9
458
+ { mnemonic: "nop", mode: "implicit", length: 1, illegal: true, acmeExpressible: false }, // $fa
459
+ { mnemonic: "isc", mode: "absolute_y", length: 3, illegal: true, acmeExpressible: true }, // $fb
460
+ { mnemonic: "nop", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: false }, // $fc
461
+ { mnemonic: "sbc", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $fd
462
+ { mnemonic: "inc", mode: "absolute_x", length: 3, illegal: false, acmeExpressible: true }, // $fe
463
+ { mnemonic: "isc", mode: "absolute_x", length: 3, illegal: true, acmeExpressible: true }, // $ff
464
+ ];