a2kit 4.4.2

Retro disk image and language utility
Documentation
use super::super::disassembly::{DasmRange, Disassembler};
use super::super::ProcessorType;

fn test_disassembler(hex: &str, expected: &str) {
    let img = hex::decode(hex).expect("hex error");
    let mut disassembler = Disassembler::new();
    let actual = disassembler
        .disassemble(&img, DasmRange::All, ProcessorType::_65c02, "none")
        .expect("dasm error");
    assert_eq!(actual, expected);
}

fn test_disassembler_with_labeling(hex: &str, expected: &str, org: usize) {
    let img = [vec![0;org],hex::decode(hex).expect("hex error")].concat();
    let mut disassembler = Disassembler::new();
    let actual = disassembler
        .disassemble(&img, DasmRange::Range([org,img.len()]), ProcessorType::_65c02, "all")
        .expect("dasm error");
    assert_eq!(actual, expected);
}

mod octet {
    #[test]
    fn adc() {
        let hex = "7200";
        let mut expected = String::new();
        expected += "         ADC   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn and() {
        let hex = "3200";
        let mut expected = String::new();
        expected += "         AND   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn cmp() {
        let hex = "d200";
        let mut expected = String::new();
        expected += "         CMP   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn eor() {
        let hex = "5200";
        let mut expected = String::new();
        expected += "         EOR   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn lda() {
        let hex = "b200";
        let mut expected = String::new();
        expected += "         LDA   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn ora() {
        let hex = "1200";
        let mut expected = String::new();
        expected += "         ORA   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn sbc() {
        let hex = "f200";
        let mut expected = String::new();
        expected += "         SBC   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
}

mod store {
    #[test]
    fn sta() {
        let hex = "9200";
        let mut expected = String::new();
        expected += "         STA   ($00)\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn stz() {
        let hex = "640074009c00109e0010";
        let mut expected = String::new();
        expected += "         STZ   $00\n";
        expected += "         STZ   $00,X\n";
        expected += "         STZ   $1000\n";
        expected += "         STZ   $1000,X\n";
        super::test_disassembler(hex, &expected);
    }
}

mod branching {
    #[test]
    fn relative() {
        let hex = "8000";
        let mut expected = String::new();
        expected += "         BRA   $0002\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn jumping() {
        let hex = "7c0010";
        let mut expected = String::new();
        expected += "         JMP   ($1000,X)\n";
        super::test_disassembler(hex, &expected);
    }
}

mod short {
    #[test]
    fn stack() {
        let hex = "5a7adafa";
        let mut expected = String::new();
        expected += "         PHY\n";
        expected += "         PLY\n";
        expected += "         PHX\n";
        expected += "         PLX\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn increment() {
        let hex = "1a3a";
        let mut expected = String::new();
        expected += "         INC\n";
        expected += "         DEC\n";
        super::test_disassembler(hex, &expected);
    }
}

mod bitwise {
    #[test]
    fn bit() {
        let hex = "340089003c0010";
        let mut expected = String::new();
        expected += "         BIT   $00,X\n";
        expected += "         BIT   #$00\n";
        expected += "         BIT   $1000,X\n";
        super::test_disassembler(hex, &expected);
    }
    #[test]
    fn tsb_trb() {
        let hex = "040014000c00101c0010";
        let mut expected = String::new();
        expected += "         TSB   $00\n";
        expected += "         TRB   $00\n";
        expected += "         TSB   $1000\n";
        expected += "         TRB   $1000\n";
        super::test_disassembler(hex, &expected);
    }
}

mod label_substitution {
    #[test]
    fn bit() {
        let hex = "340089003c0003";
        let mut expected = String::new();
        expected += "_0300    BIT   $00,X\n";
        expected += "_0302    BIT   #$00\n";
        expected += "_0304    BIT   _0300,X\n";
        super::test_disassembler_with_labeling(hex, &expected, 0x300);
    }
    #[test]
    fn stz() {
        let hex = "640074009c00109e0203";
        let mut expected = String::new();
        expected += "_0300    STZ   $00\n";
        expected += "_0302    STZ   $00,X\n";
        expected += "_0304    STZ   $1000\n";
        expected += "_0307    STZ   _0302,X\n";
        super::test_disassembler_with_labeling(hex, &expected, 0x300);
    }
}