#![feature(slice_as_array)]

use core::constants::constants_system::SIZE_32KB;
use core::constants::constants_isa_op::*;
use std::fs;
use std::path::Path;

fn le_swap(to_swap: &[u8; SIZE_32KB]) -> [u8; 32768] {

    let mut work: [u8; SIZE_32KB] = [0x00; SIZE_32KB];

    for i in (0..SIZE_32KB).step_by(2) {
        work[i] = to_swap[i+1];
        work[i + 1] = to_swap[i];
    }
    work
}

fn main() {
    // make the rom data in memory.
    // Fill with 0xea -> NOP
    let mut vec: [u8; SIZE_32KB] = [ISA_OP_NOP; SIZE_32KB];

    // Load to A
    vec[0] = ISA_OP_LDA_I; // LDA #$ab
    vec[1] = 0b1010_1011; //      1010 1011
    // Jump to rotate cycle
    vec[2] = 0x02; // --
    vec[3] = 0x03; // --

    // Jump to Main
    vec[0x2210] = ISA_OP_JMP_ABS;
    vec[0x2211] = 0x00;
    vec[0x2212] = 0x40;

    // load to a
    vec[0x4000] = ISA_OP_LDA_I;
    vec[0x4001] = 0b0101_0100;
    // jump to top of load to a
    vec[0x4002] = ISA_OP_JMP_ABS;
    vec[0x4003] = 0x00;
    vec[0x4004] = 0x40;
    vec[0x4005] = ISA_OP_NOP;

    vec[0x7ffa] = 0x22; // NMI Vector
    vec[0x7ffb] = 0x11;
    vec[0x7ffc] = 0x12; // Reset Vector
    vec[0x7ffd] = 0x34;
    vec[0x7ffe] = 0x43; // Interrupt Vector
    vec[0x7fff] = 0x21;

    vec = le_swap(&vec);

    // write the rom to disk
    fs::write("outputfile.bin", &vec[..]).expect("TODO: panic message");
}
