twoapple-reboot/src/cpu/data_d6502.d

191 lines
8.5 KiB
D

module cpu.data_d6502;
// Opcode names.
immutable OP_NAMES_6502 = [
"BRK", "ORA", "KIL", "SLO", "NOP", "ORA", "ASL", "SLO",
"PHP", "ORA", "ASL", "ANC", "NOP", "ORA", "ASL", "SLO",
"BPL", "ORA", "KIL", "SLO", "NOP", "ORA", "ASL", "SLO",
"CLC", "ORA", "NOP", "SLO", "NOP", "ORA", "ASL", "SLO",
"JSR", "AND", "KIL", "RLA", "BIT", "AND", "ROL", "RLA",
"PLP", "AND", "ROL", "ANC", "BIT", "AND", "ROL", "RLA",
"BMI", "AND", "KIL", "RLA", "NOP", "AND", "ROL", "RLA",
"SEC", "AND", "NOP", "RLA", "NOP", "AND", "ROL", "RLA",
"RTI", "EOR", "KIL", "SRE", "NOP", "EOR", "LSR", "SRE",
"PHA", "EOR", "LSR", "ALR", "JMP", "EOR", "LSR", "SRE",
"BVC", "EOR", "KIL", "SRE", "NOP", "EOR", "LSR", "SRE",
"CLI", "EOR", "NOP", "SRE", "NOP", "EOR", "LSR", "SRE",
"RTS", "ADC", "KIL", "RRA", "NOP", "ADC", "ROR", "RRA",
"PLA", "ADC", "ROR", "ARR", "JMP", "ADC", "ROR", "RRA",
"BVS", "ADC", "KIL", "RRA", "NOP", "ADC", "ROR", "RRA",
"SEI", "ADC", "NOP", "RRA", "NOP", "ADC", "ROR", "RRA",
"NOP", "STA", "NOP", "SAX", "STY", "STA", "STX", "SAX",
"DEY", "NOP", "TXA", "XAA", "STY", "STA", "STX", "SAX",
"BCC", "STA", "KIL", "AHX", "STY", "STA", "STX", "SAX",
"TYA", "STA", "TXS", "TAS", "SHY", "STA", "SHX", "AHX",
"LDY", "LDA", "LDX", "LAX", "LDY", "LDA", "LDX", "LAX",
"TAY", "LDA", "TAX", "LAX", "LDY", "LDA", "LDX", "LAX",
"BCS", "LDA", "KIL", "LAX", "LDY", "LDA", "LDX", "LAX",
"CLV", "LDA", "TSX", "LAS", "LDY", "LDA", "LDX", "LAX",
"CPY", "CMP", "NOP", "DCP", "CPY", "CMP", "DEC", "DCP",
"INY", "CMP", "DEX", "AXS", "CPY", "CMP", "DEC", "DCP",
"BNE", "CMP", "KIL", "DCP", "NOP", "CMP", "DEC", "DCP",
"CLD", "CMP", "NOP", "DCP", "NOP", "CMP", "DEC", "DCP",
"CPX", "SBC", "NOP", "ISC", "CPX", "SBC", "INC", "ISC",
"INX", "SBC", "NOP", "SBC", "CPX", "SBC", "INC", "ISC",
"BEQ", "SBC", "KIL", "ISC", "NOP", "SBC", "INC", "ISC",
"SED", "SBC", "NOP", "ISC", "NOP", "SBC", "INC", "ISC"
];
immutable OP_NAMES_65C02 = [
"BRK", "ORA", "NOP", "NOP", "TSB", "ORA", "ASL", "NOP",
"PHP", "ORA", "ASL", "NOP", "TSB", "ORA", "ASL", "NOP",
"BPL", "ORA", "ORA", "NOP", "TRB", "ORA", "ASL", "NOP",
"CLC", "ORA", "INC", "NOP", "TRB", "ORA", "ASL", "NOP",
"JSR", "AND", "NOP", "NOP", "BIT", "AND", "ROL", "NOP",
"PLP", "AND", "ROL", "NOP", "BIT", "AND", "ROL", "NOP",
"BMI", "AND", "AND", "NOP", "BIT", "AND", "ROL", "NOP",
"SEC", "AND", "DEC", "NOP", "BIT", "AND", "ROL", "NOP",
"RTI", "EOR", "NOP", "NOP", "NOP", "EOR", "LSR", "NOP",
"PHA", "EOR", "LSR", "NOP", "JMP", "EOR", "LSR", "NOP",
"BVC", "EOR", "EOR", "NOP", "NOP", "EOR", "LSR", "NOP",
"CLI", "EOR", "PHY", "NOP", "NOP", "EOR", "LSR", "NOP",
"RTS", "ADC", "NOP", "NOP", "STZ", "ADC", "ROR", "NOP",
"PLA", "ADC", "ROR", "NOP", "JMP", "ADC", "ROR", "NOP",
"BVS", "ADC", "ADC", "NOP", "STZ", "ADC", "ROR", "NOP",
"SEI", "ADC", "PLY", "NOP", "JMP", "ADC", "ROR", "NOP",
"BRA", "STA", "NOP", "NOP", "STY", "STA", "STX", "NOP",
"DEY", "BIT", "TXA", "NOP", "STY", "STA", "STX", "NOP",
"BCC", "STA", "STA", "NOP", "STY", "STA", "STX", "NOP",
"TYA", "STA", "TXS", "NOP", "STZ", "STA", "STZ", "NOP",
"LDY", "LDA", "LDX", "NOP", "LDY", "LDA", "LDX", "NOP",
"TAY", "LDA", "TAX", "NOP", "LDY", "LDA", "LDX", "NOP",
"BCS", "LDA", "LDA", "NOP", "LDY", "LDA", "LDX", "NOP",
"CLV", "LDA", "TSX", "NOP", "LDY", "LDA", "LDX", "NOP",
"CPY", "CMP", "NOP", "NOP", "CPY", "CMP", "DEC", "NOP",
"INY", "CMP", "DEX", "NOP", "CPY", "CMP", "DEC", "NOP",
"BNE", "CMP", "CMP", "NOP", "NOP", "CMP", "DEC", "NOP",
"CLD", "CMP", "PHX", "NOP", "NOP", "CMP", "DEC", "NOP",
"CPX", "SBC", "NOP", "NOP", "CPX", "SBC", "INC", "NOP",
"INX", "SBC", "NOP", "NOP", "CPX", "SBC", "INC", "NOP",
"BEQ", "SBC", "SBC", "NOP", "NOP", "SBC", "INC", "NOP",
"SED", "SBC", "PLX", "NOP", "NOP", "SBC", "INC", "NOP"
];
// Addressing modes.
enum { IMP, IMM, ZP, ZPX, ZPY, IZX, IZY, ABS, ABX, ABY, IND, REL,
ZPI, ABI, NP1, NP8, KIL }
immutable ADDR_MODES_6502 = [
IMP, IZX, KIL, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPX, ZPX,
IMP, ABY, IMP, ABY, ABX, ABX, ABX, ABX,
ABS, IZX, KIL, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPX, ZPX,
IMP, ABY, IMP, ABY, ABX, ABX, ABX, ABX,
IMP, IZX, KIL, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPX, ZPX,
IMP, ABY, IMP, ABY, ABX, ABX, ABX, ABX,
IMP, IZX, KIL, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, IND, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPX, ZPX,
IMP, ABY, IMP, ABY, ABX, ABX, ABX, ABX,
IMM, IZX, IMM, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPY, ZPY,
IMP, ABY, IMP, ABY, ABX, ABX, ABY, ABY,
IMM, IZX, IMM, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPY, ZPY,
IMP, ABY, IMP, ABY, ABX, ABX, ABY, ABY,
IMM, IZX, IMM, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPX, ZPX,
IMP, ABY, IMP, ABY, ABX, ABX, ABX, ABX,
IMM, IZX, IMM, IZX, ZP, ZP, ZP, ZP,
IMP, IMM, IMP, IMM, ABS, ABS, ABS, ABS,
REL, IZY, KIL, IZY, ZPX, ZPX, ZPX, ZPX,
IMP, ABY, IMP, ABY, ABX, ABX, ABX, ABX
];
immutable ADDR_MODES_65C02 = [
IMP, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZP, ZPX, ZPX, NP1,
IMP, ABY, IMP, NP1, ABS, ABX, ABX, NP1,
ABS, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPX, NP1,
IMP, ABY, IMP, NP1, ABX, ABX, ABX, NP1,
IMP, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPX, NP1,
IMP, ABY, IMP, NP1, NP8, ABX, ABX, NP1,
IMP, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, IND, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPX, NP1,
IMP, ABY, IMP, NP1, ABI, ABX, ABX, NP1,
REL, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPY, NP1,
IMP, ABY, IMP, NP1, ABX, ABX, ABX, NP1,
IMM, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPY, NP1,
IMP, ABY, IMP, NP1, ABX, ABX, ABY, NP1,
IMM, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPX, NP1,
IMP, ABY, IMP, NP1, ABX, ABX, ABX, NP1,
IMM, IZX, IMM, NP1, ZP, ZP, ZP, NP1,
IMP, IMM, IMP, NP1, ABS, ABS, ABS, NP1,
REL, IZY, ZPI, NP1, ZPX, ZPX, ZPX, NP1,
IMP, ABY, IMP, NP1, ABX, ABX, ABX, NP1
];
// Page-crossing extra cycles.
immutable EXTRA_CYCLES_6502 = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
];
immutable EXTRA_CYCLES_65C02 = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
];