codegen_instruction_definitions/
codegen_instruction_definitions.rs1use c64_assembler_6502::{
2 instruction::InstructionDef,
3 isa_6502,
4 opcodes::{
5 OpCode, NO_ABSOLUTE, NO_ABSOLUTE_X, NO_ABSOLUTE_Y, NO_ACCUMULATOR, NO_IMMEDIATE, NO_IMPLIED,
6 NO_INDEXED_INDIRECT, NO_INDIRECT, NO_INDIRECT_INDEXED, NO_RELATIVE, NO_ZEROPAGE, NO_ZEROPAGE_X, NO_ZEROPAGE_Y,
7 },
8};
9
10fn main() {
11 fn format(def: &InstructionDef, op_code: OpCode, no_opcode: OpCode, opcode_str: &str) -> String {
12 if op_code == no_opcode {
13 format!("NO_{}", opcode_str)
14 } else {
15 format!("{}_{}", def.instruction.to_uppercase(), opcode_str)
16 }
17 }
18
19 fn format_opcodes(result: &mut Vec<String>, def: &InstructionDef) {
20 let line = format!(
21 "
22/// Instruction definition for {1}
23///
24/// Includes the instruction name and its [OpCode] for a address mode.
25pub const OPCODES_{0}:InstructionDef = InstructionDef {{
26 instruction: \"{1}\",
27 implied: {2},
28 immediate: {3},
29 accumulator: {4},
30 absolute: {5},
31 absolute_x: {6},
32 absolute_y: {7},
33 zeropage: {8},
34 zeropage_x: {9},
35 zeropage_y: {10},
36 relative: {11},
37 indirect: {12},
38 indexed_indirect: {13},
39 indirect_indexed: {14},
40}};",
41 def.instruction.to_uppercase(),
42 def.instruction.to_string(),
43 format(def, def.implied, NO_IMPLIED, "IMPLIED"),
44 format(def, def.immediate, NO_IMMEDIATE, "IMMEDIATE"),
45 format(def, def.accumulator, NO_ACCUMULATOR, "ACCUMULATOR"),
46 format(def, def.absolute, NO_ABSOLUTE, "ABSOLUTE"),
47 format(def, def.absolute_x, NO_ABSOLUTE_X, "ABSOLUTE_X"),
48 format(def, def.absolute_y, NO_ABSOLUTE_Y, "ABSOLUTE_Y"),
49 format(def, def.zeropage, NO_ZEROPAGE, "ZEROPAGE"),
50 format(def, def.zeropage_x, NO_ZEROPAGE_X, "ZEROPAGE_X"),
51 format(def, def.zeropage_y, NO_ZEROPAGE_Y, "ZEROPAGE_Y"),
52 format(def, def.relative, NO_RELATIVE, "RELATIVE"),
53 format(def, def.indirect, NO_INDIRECT, "INDIRECT"),
54 format(def, def.indexed_indirect, NO_INDEXED_INDIRECT, "INDEXED_INDIRECT"),
55 format(def, def.indirect_indexed, NO_INDIRECT_INDEXED, "INDIRECT_INDEXED"),
56 );
57 result.push(line);
58 }
59
60 let mut lines = Vec::<String>::default();
61 for def in &isa_6502() {
62 format_opcodes(&mut lines, def);
63 }
64
65 println!("{}", lines.join("\n"));
66}