codegen_instruction_definitions/
codegen_instruction_definitions.rs

1use 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}