mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-20 09:02:32 +00:00
128 lines
4.4 KiB
Odin
128 lines
4.4 KiB
Odin
package rexcode_mos6502
|
|
|
|
// =============================================================================
|
|
// MOS 6502 family mnemonics
|
|
// =============================================================================
|
|
//
|
|
// Covers the four CPU tiers we target:
|
|
// - NMOS official 6502 (56 mnemonics)
|
|
// - NMOS undocumented opcodes (~24, widely used on NES & Apple II)
|
|
// - 65C02 additions (Rockwell/WDC), incl. RMB/SMB/BBR/BBS bit ops
|
|
// - HuC6280 (PC Engine) additions: block xfer, swap regs, MMR ops
|
|
//
|
|
// The undocumented NMOS SAX (store A&X) collides in mnemonic with the
|
|
// HuC6280 SAX (swap A,X). To keep both, the NMOS undocumented form is
|
|
// named `SAX_NMOS` (sometimes written as AAX or SAX-undoc elsewhere).
|
|
|
|
Mnemonic :: enum u16 {
|
|
INVALID = 0,
|
|
|
|
// -------------------------------------------------------------------------
|
|
// NMOS official
|
|
// -------------------------------------------------------------------------
|
|
|
|
// Arithmetic / logical
|
|
ADC, AND, ASL,
|
|
BIT,
|
|
CMP, CPX, CPY,
|
|
DEC, DEX, DEY,
|
|
EOR,
|
|
INC, INX, INY,
|
|
LSR,
|
|
ORA,
|
|
ROL, ROR,
|
|
SBC,
|
|
|
|
// Branches
|
|
BCC, BCS, BEQ, BMI, BNE, BPL, BVC, BVS,
|
|
|
|
// Jumps / subroutines / interrupts
|
|
JMP, JSR, RTI, RTS,
|
|
BRK,
|
|
|
|
// Flag ops
|
|
CLC, CLD, CLI, CLV,
|
|
SEC, SED, SEI,
|
|
|
|
// Loads / stores
|
|
LDA, LDX, LDY,
|
|
STA, STX, STY,
|
|
|
|
// Stack / transfer
|
|
PHA, PHP, PLA, PLP,
|
|
TAX, TAY, TSX, TXA, TXS, TYA,
|
|
|
|
// NOP
|
|
NOP,
|
|
|
|
// -------------------------------------------------------------------------
|
|
// NMOS undocumented (common subset used on NES & Apple II)
|
|
// -------------------------------------------------------------------------
|
|
|
|
LAX, // LDA + LDX (load A and X from memory)
|
|
SAX_NMOS, // store A AND X to memory (also called AAX / AXS-undoc)
|
|
DCP, // DEC + CMP (memory)
|
|
ISC, // INC + SBC (also ISB)
|
|
RLA, // ROL + AND
|
|
RRA, // ROR + ADC
|
|
SLO, // ASL + ORA
|
|
SRE, // LSR + EOR
|
|
ALR, // AND #imm + LSR A
|
|
ANC, // AND #imm with carry from N
|
|
ARR, // AND #imm + ROR A
|
|
AXS, // X = (A AND X) - imm (also SBX)
|
|
LAS, // LDA / TSX / AND with stack pointer
|
|
ANE, // A = (A | $EE) AND X AND imm -- unstable (also XAA)
|
|
LXA, // A = X = (A | $EE) AND imm -- unstable
|
|
SHA, // store A AND X AND high+1
|
|
SHX, // store X AND high+1
|
|
SHY, // store Y AND high+1
|
|
TAS, // S = A AND X; store S AND high+1
|
|
JAM, // halt the CPU (also KIL / HLT)
|
|
USBC, // same as SBC #imm but at $EB (an undocumented alias)
|
|
DOP, // double NOP (skips one operand byte)
|
|
TOP, // triple NOP (skips two operand bytes)
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 65C02 additions (Rockwell + WDC)
|
|
// -------------------------------------------------------------------------
|
|
|
|
BRA, // branch always
|
|
INA, // INC A
|
|
DEA, // DEC A
|
|
PHX, PHY,
|
|
PLX, PLY,
|
|
STZ, // store zero
|
|
TRB, TSB, // test-and-reset / test-and-set bits
|
|
STP, WAI, // WDC: stop, wait-for-interrupt
|
|
|
|
// 65C02 Rockwell bit ops -- 32 distinct opcodes
|
|
RMB0, RMB1, RMB2, RMB3, RMB4, RMB5, RMB6, RMB7,
|
|
SMB0, SMB1, SMB2, SMB3, SMB4, SMB5, SMB6, SMB7,
|
|
BBR0, BBR1, BBR2, BBR3, BBR4, BBR5, BBR6, BBR7,
|
|
BBS0, BBS1, BBS2, BBS3, BBS4, BBS5, BBS6, BBS7,
|
|
|
|
// -------------------------------------------------------------------------
|
|
// HuC6280 (PC Engine / TurboGrafx-16)
|
|
// -------------------------------------------------------------------------
|
|
|
|
SXY, // swap X, Y
|
|
SAX, // swap A, X (NB: distinct from undocumented NMOS SAX_NMOS)
|
|
SAY, // swap A, Y
|
|
CLA, CLX, CLY, // clear A / X / Y
|
|
CSH, CSL, // CPU speed high / low (7.16 MHz vs 1.79 MHz)
|
|
SET, // set T flag (next op uses zp address as accumulator)
|
|
ST0, ST1, ST2, // store immediate to MMR0/1/2
|
|
TAM, TMA, // transfer A to/from MMR (immediate-selected)
|
|
TST, // bit test of immediate against memory
|
|
BSR, // branch to subroutine (PC-relative)
|
|
|
|
// HuC6280 block transfer instructions (7-byte encoding)
|
|
// src(2) -> dst(2), len(2) bytes
|
|
TII, // transfer increment-increment (memcpy ascending)
|
|
TDD, // transfer decrement-decrement (memcpy descending)
|
|
TIN, // transfer increment-no-change (fill from src)
|
|
TIA, // transfer increment-alternate (interleaved)
|
|
TAI, // transfer alternate-increment (interleaved)
|
|
}
|