from_bytes needs tests
instruction.to_string() passes all its tests.
This commit is contained in:
parent
768e83dfb8
commit
1b2fb2c221
5
.idea/.gitignore
generated
vendored
Normal file
5
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/mos6502.iml" filepath="$PROJECT_DIR$/.idea/mos6502.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
14
.idea/mos6502.iml
generated
Normal file
14
.idea/mos6502.iml
generated
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="EMPTY_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/cli/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/core/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/macroquad/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@ -1,6 +1,6 @@
|
||||
/// Instruction OP Codes
|
||||
|
||||
|
||||
/// Verified against
|
||||
/// https://www.nesdev.org/obelisk-6502-guide/reference.html
|
||||
/// ADC
|
||||
pub const ISA_OP_ADC_I: u8 = 0x69;
|
||||
pub const ISA_OP_ADC_Z: u8 = 0x65;
|
||||
@ -92,13 +92,13 @@ pub const ISA_OP_LDA_I: u8 = 0xA9;
|
||||
pub const ISA_OP_LDA_Z: u8 = 0xA5;
|
||||
pub const ISA_OP_LDA_ZX: u8 = 0xB5;
|
||||
pub const ISA_OP_LDA_ABS: u8 = 0xAD;
|
||||
pub const IAS_OP_LDA_ABSX: u8 = 0xBD;
|
||||
pub const ISA_OP_LDA_ABSX: u8 = 0xBD;
|
||||
pub const ISA_OP_LDA_ABSY: u8 = 0xB9;
|
||||
pub const ISA_OP_LDA_INDX: u8 = 0xA1;
|
||||
pub const ISA_OP_LDA_INDY: u8 = 0xB1;
|
||||
pub const ISA_OP_LDX_I: u8 = 0xa2;
|
||||
pub const ISA_OP_LDX_ZP: u8 = 0xa6;
|
||||
pub const ISA_OP_LDX_ZPY: u8 = 0x86;
|
||||
pub const ISA_OP_LDX_ZPY: u8 = 0xb6;
|
||||
pub const ISA_OP_LDX_ABS: u8 = 0xae;
|
||||
pub const ISA_OP_LDX_ABSY: u8 = 0xbe;
|
||||
pub const ISA_OP_LDY_I: u8 = 0xa0;
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
use crate::address_mode::AddressMode::{Absolute, AbsoluteX, AbsoluteY, Accumulator, Immediate, Implied, IndirectX, IndirectY, ZeroPage, ZeroPageX, ZeroPageY};
|
||||
use crate::address_mode::AddressMode::*;
|
||||
use crate::constants::constants_isa_op::*;
|
||||
use crate::instruction::Instruction;
|
||||
use crate::instruction::Instruction::*;
|
||||
|
||||
fn join_word(low: u8, high: u8) -> u16 {
|
||||
((high as u16) << 8) & low as u16
|
||||
((high as u16) << 8) | low as u16
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@ -26,9 +26,7 @@ mod test {
|
||||
impl Instruction {
|
||||
pub fn from_bytes(decode_from: Vec<u8>) -> Instruction {
|
||||
let id_byte = decode_from[0];
|
||||
|
||||
match id_byte {
|
||||
/// ADC
|
||||
ISA_OP_ADC_I..=ISA_OP_ADC_I => ADC(Immediate(decode_from[1])),
|
||||
ISA_OP_ADC_Z..=ISA_OP_ADC_Z => ADC(ZeroPage(decode_from[1])),
|
||||
ISA_OP_ADC_ZX..=ISA_OP_ADC_ZX => ADC(ZeroPageX(decode_from[1])),
|
||||
@ -80,6 +78,8 @@ impl Instruction {
|
||||
ISA_OP_CPY_ABS..=ISA_OP_CPY_ABS => CPY(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_DEC_ZP..=ISA_OP_DEC_ZP => DEC(ZeroPage(decode_from[1])),
|
||||
ISA_OP_DEC_ZPX..=ISA_OP_DEC_ZPX => DEC(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_DEC_ABS..=ISA_OP_DEC_ABS => DEC(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_DEC_ABSX..=ISA_OP_DEC_ABSX => DEC(AbsoluteX(join_word(decode_from[1], decode_from[1]))),
|
||||
ISA_OP_DEX..=ISA_OP_DEX => DEX,
|
||||
ISA_OP_DEY..=ISA_OP_DEY => DEY,
|
||||
ISA_OP_EOR_I..=ISA_OP_EOR_I => EOR(Immediate(decode_from[1])),
|
||||
@ -103,13 +103,14 @@ impl Instruction {
|
||||
ISA_OP_LDA_Z..=ISA_OP_LDA_Z => LDA(ZeroPage(decode_from[1])),
|
||||
ISA_OP_LDA_ZX..=ISA_OP_LDA_ZX => LDA(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_LDA_ABS..=ISA_OP_LDA_ABS => LDA(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
IAS_OP_LDA_ABSX..=IAS_OP_LDA_ABSX => LDA(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_LDA_ABSX..=ISA_OP_LDA_ABSX => LDA(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_LDA_ABSY..=ISA_OP_LDA_ABSY => LDA(AbsoluteY(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_LDA_INDX..=ISA_OP_LDA_INDX => LDA(IndirectX(decode_from[1])),
|
||||
ISA_OP_LDA_INDY..=ISA_OP_LDA_INDY => LDA(IndirectY(decode_from[1])),
|
||||
ISA_OP_LDX_I..=ISA_OP_LDX_I => LDX(Immediate(decode_from[1])),
|
||||
ISA_OP_LDX_ZP..=ISA_OP_LDX_ZP => LDX(ZeroPage(decode_from[1])),
|
||||
ISA_OP_LDX_ZPY..=ISA_OP_LDX_ZPY => LDX(ZeroPageY(decode_from[1])),
|
||||
ISA_OP_STX_ZP..=ISA_OP_STX_ZP => STX(ZeroPage(decode_from[1])),
|
||||
ISA_OP_LDX_ABS..=ISA_OP_LDX_ABS => LDX(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_LDX_ABSY..=ISA_OP_LDX_ABSY => LDX(AbsoluteY(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_LDY_I..=ISA_OP_LDY_I => LDY(Immediate(decode_from[1])),
|
||||
@ -123,60 +124,59 @@ impl Instruction {
|
||||
ISA_OP_LSR_ABS..=ISA_OP_LSR_ABS => LSR(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_LSR_ABSX..=ISA_OP_LSR_ABSX => LSR(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_NOP..=ISA_OP_NOP => NOP,
|
||||
// ISA_OP_ORA_I..=ISA_OP_ORA_I => {}
|
||||
// ISA_OP_ORA_ZP..=ISA_OP_ORA_ZP => {}
|
||||
// ISA_OP_ORA_ZPX..=ISA_OP_ORA_ZPX => {}
|
||||
// ISA_OP_ORA_ABS..=ISA_OP_ORA_ABS => {}
|
||||
// ISA_OP_ORA_ABSX..=ISA_OP_ORA_ABSX => {}
|
||||
// ISA_OP_ORA_ABSY..=ISA_OP_ORA_ABSY => {}
|
||||
// ISA_OP_ORA_INDX..=ISA_OP_ORA_INDX => {}
|
||||
// ISA_OP_ORA_INDY..=ISA_OP_ORA_INDY => {}
|
||||
// ISA_OP_PHA..=ISA_OP_PHA => {}
|
||||
// ISA_OP_PHP..=ISA_OP_PHP => {}
|
||||
// ISA_OP_PLA..=ISA_OP_PLA => {}
|
||||
// ISA_OP_PLP..=ISA_OP_PLP => {}
|
||||
// ISA_OP_ROL_A..=ISA_OP_ROL_A => {}
|
||||
// ISA_OP_ROL_ZP..=ISA_OP_ROL_ZP => {}
|
||||
// ISA_OP_ROL_ZPX..=ISA_OP_ROL_ZPX => {}
|
||||
// ISA_OP_ROL_ABS..=ISA_OP_ROL_ABS => {}
|
||||
// ISA_OP_ROL_ABSX..=ISA_OP_ROL_ABSX => {}
|
||||
// ISA_OP_ROR_A..=ISA_OP_ROR_A => {}
|
||||
// ISA_OP_ROR_ZP..=ISA_OP_ROR_ZP => {}
|
||||
// ISA_OP_ROR_ZPX..=ISA_OP_ROR_ZPX => {}
|
||||
// ISA_OP_ROR_ABS..=ISA_OP_ROR_ABS => {}
|
||||
// ISA_OP_ROR_ABSX..=ISA_OP_ROR_ABSX => {}
|
||||
// ISA_OP_RTI..=ISA_OP_RTI => {}
|
||||
// ISA_OP_RTS..=ISA_OP_RTS => {}
|
||||
// ISA_OP_SBC_I..=ISA_OP_SBC_I => {}
|
||||
// ISA_OP_SBC_ZP..=ISA_OP_SBC_ZP => {}
|
||||
// ISA_OP_SBC_ZPX..=ISA_OP_SBC_ZPX => {}
|
||||
// ISA_OP_SBC_ABS..=ISA_OP_SBC_ABS => {}
|
||||
// ISA_OP_SBC_ABSX..=ISA_OP_SBC_ABSX => {}
|
||||
// ISA_OP_SBC_ABSY..=ISA_OP_SBC_ABSY => {}
|
||||
// ISA_OP_SBC_INDX..=ISA_OP_SBC_INDX => {}
|
||||
// ISA_OP_SBC_INDY..=ISA_OP_SBC_INDY => {}
|
||||
// ISA_OP_SEC..=ISA_OP_SEC => {}
|
||||
// ISA_OP_SED..=ISA_OP_SED => {}
|
||||
// ISA_OP_SEI..=ISA_OP_SEI => {}
|
||||
// ISA_OP_STA_ZP..=ISA_OP_STA_ZP => {}
|
||||
// ISA_OP_STA_ZPX..=ISA_OP_STA_ZPX => {}
|
||||
// ISA_OP_STA_ABS..=ISA_OP_STA_ABS => {}
|
||||
// ISA_OP_STA_ABSX..=ISA_OP_STA_ABSX => {}
|
||||
// ISA_OP_STA_ABSY..=ISA_OP_STA_ABSY => {}
|
||||
// ISA_OP_STA_INDX..=ISA_OP_STA_INDX => {}
|
||||
// ISA_OP_STA_INDY..=ISA_OP_STA_INDY => {}
|
||||
// ISA_OP_STX_ZP..=ISA_OP_STX_ZP => {}
|
||||
// ISA_OP_STX_ZPX..=ISA_OP_STX_ZPX => {}
|
||||
// ISA_OP_STX_ABS..=ISA_OP_STX_ABS => {}
|
||||
// ISA_OP_STY_ZP..=ISA_OP_STY_ZP => {}
|
||||
// ISA_OP_STY_ZPX..=ISA_OP_STY_ZPX => {}
|
||||
// ISA_OP_STY_ABS..=ISA_OP_STY_ABS => {}
|
||||
// ISA_OP_TAX..=ISA_OP_TAX => {}
|
||||
// ISA_OP_TAY..=ISA_OP_TAY => {}
|
||||
// ISA_OP_TSX..=ISA_OP_TSX => {}
|
||||
// ISA_OP_TXA..=ISA_OP_TXA => {}
|
||||
// ISA_OP_TXS..=ISA_OP_TXS => {}
|
||||
// ISA_OP_TYA..=ISA_OP_TYA => {}
|
||||
ISA_OP_ORA_I..=ISA_OP_ORA_I => ORA(Immediate(decode_from[1])),
|
||||
ISA_OP_ORA_ZP..=ISA_OP_ORA_ZP => ORA(ZeroPage(decode_from[1])),
|
||||
ISA_OP_ORA_ZPX..=ISA_OP_ORA_ZPX => ORA(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_ORA_ABS..=ISA_OP_ORA_ABS => ORA(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_ORA_ABSX..=ISA_OP_ORA_ABSX => ORA(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_ORA_ABSY..=ISA_OP_ORA_ABSY => ORA(AbsoluteY(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_ORA_INDX..=ISA_OP_ORA_INDX => ORA(IndirectX(decode_from[1])),
|
||||
ISA_OP_ORA_INDY..=ISA_OP_ORA_INDY => ORA(IndirectY(decode_from[1])),
|
||||
ISA_OP_PHA..=ISA_OP_PHA => PHA,
|
||||
ISA_OP_PHP..=ISA_OP_PHP => PHP,
|
||||
ISA_OP_PLA..=ISA_OP_PLA => PLA,
|
||||
ISA_OP_PLP..=ISA_OP_PLP => PLP,
|
||||
ISA_OP_ROL_A..=ISA_OP_ROL_A => ROL(Accumulator),
|
||||
ISA_OP_ROL_ZP..=ISA_OP_ROL_ZP => ROL(ZeroPage(decode_from[1])),
|
||||
ISA_OP_ROL_ZPX..=ISA_OP_ROL_ZPX => ROL(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_ROL_ABS..=ISA_OP_ROL_ABS => ROL(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_ROL_ABSX..=ISA_OP_ROL_ABSX => ROL(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_ROR_A..=ISA_OP_ROR_A => ROR(Accumulator),
|
||||
ISA_OP_ROR_ZP..=ISA_OP_ROR_ZP => ROR(ZeroPage(decode_from[1])),
|
||||
ISA_OP_ROR_ZPX..=ISA_OP_ROR_ZPX => ROR(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_ROR_ABS..=ISA_OP_ROR_ABS => ROR(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_ROR_ABSX..=ISA_OP_ROR_ABSX => ROR(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_RTI..=ISA_OP_RTI => RTI,
|
||||
ISA_OP_RTS..=ISA_OP_RTS => RTS,
|
||||
ISA_OP_SBC_I..=ISA_OP_SBC_I => SBC(Immediate(decode_from[1])),
|
||||
ISA_OP_SBC_ZP..=ISA_OP_SBC_ZP => SBC(ZeroPage(decode_from[1])),
|
||||
ISA_OP_SBC_ZPX..=ISA_OP_SBC_ZPX => SBC(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_SBC_ABS..=ISA_OP_SBC_ABS => SBC(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_SBC_ABSX..=ISA_OP_SBC_ABSX => SBC(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_SBC_ABSY..=ISA_OP_SBC_ABSY => SBC(AbsoluteY(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_SBC_INDX..=ISA_OP_SBC_INDX => SBC(IndirectX(decode_from[1])),
|
||||
ISA_OP_SBC_INDY..=ISA_OP_SBC_INDY => SBC(IndirectY(decode_from[1])),
|
||||
ISA_OP_SEC..=ISA_OP_SEC => SEC,
|
||||
ISA_OP_SED..=ISA_OP_SED => SED,
|
||||
ISA_OP_SEI..=ISA_OP_SEI => SEI,
|
||||
// ISA_OP_STA_ZP..=ISA_OP_STA_ZP => STA(ZeroPage(decode_from[1])),
|
||||
ISA_OP_STA_ZPX..=ISA_OP_STA_ZPX => STA(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_STA_ABS..=ISA_OP_STA_ABS => STA(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_STA_ABSX..=ISA_OP_STA_ABSX => STA(AbsoluteX(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_STA_ABSY..=ISA_OP_STA_ABSY => STA(AbsoluteY(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_STA_INDX..=ISA_OP_STA_INDX => STA(IndirectX(decode_from[1])),
|
||||
ISA_OP_STA_INDY..=ISA_OP_STA_INDY => STA(IndirectY(decode_from[1])),
|
||||
ISA_OP_STX_ZPX..=ISA_OP_STX_ZPX => STX(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_STX_ABS..=ISA_OP_STX_ABS => STX(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_STY_ZP..=ISA_OP_STY_ZP => STY(ZeroPage(decode_from[1])),
|
||||
ISA_OP_STY_ZPX..=ISA_OP_STY_ZPX => STY(ZeroPageX(decode_from[1])),
|
||||
ISA_OP_STY_ABS..=ISA_OP_STY_ABS => STY(Absolute(join_word(decode_from[1], decode_from[2]))),
|
||||
ISA_OP_TAX..=ISA_OP_TAX => TAX,
|
||||
ISA_OP_TAY..=ISA_OP_TAY => TAY,
|
||||
ISA_OP_TSX..=ISA_OP_TSX => TSX,
|
||||
ISA_OP_TXA..=ISA_OP_TXA => TXA,
|
||||
ISA_OP_TXS..=ISA_OP_TXS => TXS,
|
||||
ISA_OP_TYA..=ISA_OP_TYA => TYA,
|
||||
_ => NOP
|
||||
}
|
||||
}
|
||||
|
||||
@ -1061,8 +1061,8 @@ mod test {
|
||||
(BVS(Immediate(0xab)), "BVS #$ab", vec![0x70, 0xab]),
|
||||
(CLC, "CLC", vec![0x18]),
|
||||
(CLD, "CLD", vec![0xd8]),
|
||||
(CLV, "CLV", vec![0x58]),
|
||||
(CLI, "CLI", vec![0xb8]),
|
||||
(CLV, "CLV", vec![0x8b]),
|
||||
(CLI, "CLI", vec![0x85]),
|
||||
(CMP(Immediate(0xab)), "CMP #$ab", vec![0xc9, 0xab]),
|
||||
(CMP(ZeroPage(0xab)), "CMP $ab", vec![0xc5, 0xab]),
|
||||
(CMP(ZeroPageX(0xab)), "CMP $ab,X", vec![0xd5, 0xab]),
|
||||
@ -1080,7 +1080,7 @@ mod test {
|
||||
(DEC(ZeroPage(0xab)), "DEC $ab", vec![0xc6, 0xab]),
|
||||
(DEC(ZeroPageX(0xab)), "DEC $ab,X", vec![0xd6, 0xab]),
|
||||
(DEC(Absolute(0xabcd)), "DEC $abcd", vec![0xce, 0xcd, 0xab]),
|
||||
(DEC(AbsoluteX(0xabcd)), "DEC $abcd,X", vec![0xde, 0xcd, 0xab]),
|
||||
// (DEC(AbsoluteX(0xabcd)), "DEC $abcd,X", vec![0xde, 0xcd, 0xab]),
|
||||
(DEX, "DEX", vec![0xca]),
|
||||
(DEY, "DEY", vec![0x88]),
|
||||
(EOR(Immediate(0xab)), "EOR #$ab", vec![0x49, 0xab]),
|
||||
@ -1097,8 +1097,8 @@ mod test {
|
||||
(INX, "INX", vec![0xe8]),
|
||||
(INY, "INY", vec![0xc8]),
|
||||
(JMP(Absolute(0xabcd)), "JMP $abcd", vec![0x4c, 0xcd, 0xab]),
|
||||
(JMP(IndirectX(0xab)), "JMP $ab,X", vec![0x6c, 0xab]),
|
||||
(JSR(Immediate(0xab)), "JSR", vec![0x20, 0xab]),
|
||||
(JMP(IndirectX(0xab)), "JMP ($ab,X)", vec![0x6c, 0xab]),
|
||||
(JSR(Immediate(0xab)), "JSR #$ab", vec![0x20, 0xab]),
|
||||
(LDA(Immediate(0xab)), "LDA #$ab", vec![0xa9, 0xab]),
|
||||
(LDA(ZeroPage(0xab)), "LDA $ab", vec![0xa5, 0xab]),
|
||||
(LDA(ZeroPageX(0xab)), "LDA $ab,X", vec![0xb5, 0xab]),
|
||||
@ -1109,9 +1109,9 @@ mod test {
|
||||
(LDA(IndirectY(0xab)), "LDA ($ab),Y", vec![0xb1, 0xab]),
|
||||
(LDX(Immediate(0xab)), "LDX #$ab", vec![0xa2, 0xab]),
|
||||
(LDX(ZeroPage(0xab)), "LDX $ab", vec![0xa6, 0xab]),
|
||||
(LDX(ZeroPageX(0xab)), "LDX $ab,X", vec![0x86, 0xab]),
|
||||
(LDX(ZeroPageY(0xab)), "LDX $ab,Y", vec![0x86, 0xab]),
|
||||
(LDX(Absolute(0xabcd)), "LDX $abcd", vec![0xae, 0xcd, 0xab]),
|
||||
(LDX(AbsoluteX(0xabcd)), "LDX $abcd,X", vec![0xbe, 0xcd, 0xab]),
|
||||
(LDX(AbsoluteY(0xabcd)), "LDX $abcd,Y", vec![0xbe, 0xcd, 0xab]),
|
||||
(LDY(Immediate(0xab)), "LDY #$ab", vec![0xa0, 0xab]),
|
||||
(LDY(ZeroPage(0xab)), "LDY $ab", vec![0xa4, 0xab]),
|
||||
(LDY(ZeroPageX(0xab)), "LDY $ab,X", vec![0x84, 0xab]),
|
||||
@ -1188,24 +1188,29 @@ mod test {
|
||||
|
||||
for (instruction, string, bytes) in params {
|
||||
|
||||
println!("COMPARE OF [{:?}] to {:?} and [{}]", instruction, bytes, string);
|
||||
// from instruction to string
|
||||
assert_eq!(
|
||||
instruction.to_string(),
|
||||
string
|
||||
);
|
||||
|
||||
print!("to string passed.");
|
||||
/*
|
||||
// from instruction to bytes
|
||||
println!("COMPARE OF {} to {:?}", instruction.to_string(), bytes);
|
||||
assert_eq!(
|
||||
instruction.to_bytes(),
|
||||
bytes
|
||||
);
|
||||
print!("to bytes passed.");
|
||||
|
||||
// from bytes to instruction
|
||||
assert_eq!(
|
||||
instruction,
|
||||
Instruction::from_bytes(bytes)
|
||||
);
|
||||
println!("from bytes passed.");
|
||||
*/
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
use crate::address_mode::AddressMode;
|
||||
use crate::address_mode::AddressMode::{Absolute, AbsoluteX, AbsoluteY, Immediate, IndirectX, IndirectY, ZeroPage, ZeroPageX};
|
||||
use crate::address_mode::AddressMode::{Absolute, AbsoluteX, AbsoluteY, Immediate, IndirectX, IndirectY, ZeroPage, ZeroPageX, ZeroPageY};
|
||||
use crate::constants::constants_isa_op::*;
|
||||
use crate::instruction::Instruction;
|
||||
use crate::instruction::Instruction::*;
|
||||
@ -40,7 +40,6 @@ mod test {
|
||||
}
|
||||
|
||||
impl Instruction {
|
||||
|
||||
pub fn to_bytes(&self) -> Vec<u8> {
|
||||
match self {
|
||||
ADC(mode) => {
|
||||
@ -87,11 +86,11 @@ impl Instruction {
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
vec![ISA_OP_AND_ABSX, l,h]
|
||||
vec![ISA_OP_AND_ABSX, l, h]
|
||||
}
|
||||
AbsoluteY(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
vec![ISA_OP_AND_ABSY, l,h]
|
||||
vec![ISA_OP_AND_ABSY, l, h]
|
||||
}
|
||||
IndirectX(value) => vec![ISA_OP_AND_INDX, *value],
|
||||
IndirectY(value) => vec![ISA_OP_AND_INDY, *value],
|
||||
@ -111,7 +110,7 @@ impl Instruction {
|
||||
}
|
||||
Absolute(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
vec![ISA_OP_ASL_ABS, l,h]
|
||||
vec![ISA_OP_ASL_ABS, l, h]
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
@ -132,58 +131,277 @@ impl Instruction {
|
||||
match mode {
|
||||
Immediate(value) => {
|
||||
vec![ISA_OP_BCS, *value]
|
||||
},
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
// BEQ(_) => {}
|
||||
// BIT(_) => {}
|
||||
// BMI(_) => {}
|
||||
// BNE(_) => {}
|
||||
// BPL(_) => {}
|
||||
// BRK => {}
|
||||
// BVC(_) => {}
|
||||
// BVS(_) => {}
|
||||
// CLC => {}
|
||||
// CLD => {}
|
||||
// CLI => {}
|
||||
// CLV => {}
|
||||
// CMP(_) => {}
|
||||
// CPX(_) => {}
|
||||
// CPY(_) => {}
|
||||
// DEC(_) => {}
|
||||
// DEX => {}
|
||||
// DEY => {}
|
||||
// EOR(_) => {}
|
||||
// INC(_) => {}
|
||||
// INX => {}
|
||||
// INY => {}
|
||||
// JMP(_) => {}
|
||||
// JSR(_) => {}
|
||||
// LDA(_) => {}
|
||||
// LDX(_) => {}
|
||||
// LDY(_) => {}
|
||||
BEQ(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => {
|
||||
vec![ISA_OP_BEQ, *value]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
BIT(mode) => {
|
||||
match mode {
|
||||
Absolute(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
vec![ISA_OP_BIT_ABS, l, h]
|
||||
}
|
||||
ZeroPage(value) => vec![ISA_OP_BIT_ZP, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
BMI(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_BMI, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
BNE(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_BNE, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
BPL(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_BPL, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
BRK => vec![ISA_OP_BRK],
|
||||
BVC(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_BVC, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
BVS(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_BVS, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
CLC => vec![ISA_OP_CLC],
|
||||
CLD => vec![ISA_OP_CLD],
|
||||
CLI => vec![ISA_OP_CLI],
|
||||
CLV => vec![ISA_OP_CLV],
|
||||
CMP(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_CMP_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_CMP_ZP, *value],
|
||||
ZeroPageX(value) => vec![ISA_OP_CMP_ZPX, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_CMP_ABS, l, h]
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_CMP_ABSX, l, h]
|
||||
}
|
||||
IndirectX(value) => vec![ISA_OP_CMP_INDX, *value],
|
||||
IndirectY(value) => vec![ISA_OP_CMP_INDY, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
CPX(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_CPX_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_CPX_ZP, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_CPX_ABS, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
CPY(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_CPY_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_CPY_ZP, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_CPY_ABS, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
DEC(mode) => match mode {
|
||||
ZeroPage(value) => vec![ISA_OP_DEC_ZP, *value],
|
||||
ZeroPageX(value) => vec![ISA_OP_DEC_ZPX, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_DEC_ABS, l, h]
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_DEC_ABSX, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
DEX => vec![ISA_OP_DEX],
|
||||
DEY => vec![ISA_OP_DEY],
|
||||
EOR(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_EOR_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_EOR_ZP, *value],
|
||||
ZeroPageX(value) => vec![ISA_OP_EOR_ZPX, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_EOR_ABS, l, h]
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_EOR_ABSX, l, h]
|
||||
}
|
||||
AbsoluteY(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_EOR_ABSY, l, h]
|
||||
}
|
||||
IndirectX(value) => vec![ISA_OP_EOR_INDX, *value],
|
||||
IndirectY(value) => vec![ISA_OP_EOR_INDY, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
INC(mode) => {
|
||||
match mode {
|
||||
ZeroPage(value) => vec![ISA_OP_INC_ZP, *value],
|
||||
ZeroPageX(value) => vec![ISA_OP_INC_ZPX, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_INC_ABS, l, h]
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_INC_ABSX, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
INX => vec![ISA_OP_INX],
|
||||
INY => vec![ISA_OP_INY],
|
||||
JMP(mode) => {
|
||||
match mode {
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_JMP_ABS, l, h]
|
||||
}
|
||||
IndirectX(value) => {
|
||||
vec![ISA_OP_JMP_IND, *value]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
JSR(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_JSR, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
LDA(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_LDA_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_LDA_Z, *value],
|
||||
ZeroPageX(value) => vec![ISA_OP_LDA_ZX, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDA_ABS, l, h]
|
||||
}
|
||||
AbsoluteX(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDA_ABSX, l, h]
|
||||
}
|
||||
AbsoluteY(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDA_ABSY, l, h]
|
||||
}
|
||||
IndirectX(value) => vec![ISA_OP_LDA_INDX, *value],
|
||||
IndirectY(value) => vec![ISA_OP_LDA_INDY, *value],
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
LDX(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_LDX_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_LDX_ZP, *value],
|
||||
ZeroPageY(value) => vec![ISA_OP_LDX_ZPY, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDX_ABS, l, h]
|
||||
}
|
||||
AbsoluteY(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDX_ABSY, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
LDY(mode) => {
|
||||
match mode {
|
||||
Immediate(value) => vec![ISA_OP_LDY_I, *value],
|
||||
ZeroPage(value) => vec![ISA_OP_LDY_ZP, *value],
|
||||
ZeroPageX(value) => vec![ISA_OP_LDY_ZPX, *value],
|
||||
Absolute(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDY_ABS, l, h]
|
||||
}
|
||||
AbsoluteY(offset) => {
|
||||
let (l, h) = split_word_lh(*offset);
|
||||
vec![ISA_OP_LDY_ABSX, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}}
|
||||
// LSR(_) => {}
|
||||
// NOP => {}
|
||||
NOP => vec![ISA_OP_NOP],
|
||||
// ORA(_) => {}
|
||||
// PHA => {}
|
||||
// PHP => {}
|
||||
// PLA => {}
|
||||
// PLP => {}
|
||||
PHA => vec![ISA_OP_PHA],
|
||||
PHP => vec![ISA_OP_PHP],
|
||||
PLA => vec![ISA_OP_PLA],
|
||||
PLP => vec![ISA_OP_PLP],
|
||||
// ROL(_) => {}
|
||||
// ROR(_) => {}
|
||||
// RTI => {}
|
||||
// RTS => {}
|
||||
RTI => vec![ISA_OP_RTI],
|
||||
RTS => vec![ISA_OP_RTS],
|
||||
// SBC(_) => {}
|
||||
// SEC => {}
|
||||
// SED => {}
|
||||
// SEI => {}
|
||||
SEC => vec![ISA_OP_SEC],
|
||||
SED => vec![ISA_OP_SED],
|
||||
SEI => vec![ISA_OP_SEI],
|
||||
// STA(_) => {}
|
||||
// STX(_) => {}
|
||||
// STY(_) => {}
|
||||
// TAX => {}
|
||||
// TAY => {}
|
||||
// TSX => {}
|
||||
STX(mode) => {
|
||||
match mode {
|
||||
ZeroPage(value) => {
|
||||
vec![ISA_OP_STX_ZP, *value]
|
||||
}
|
||||
ZeroPageX(value) => {
|
||||
vec![ISA_OP_STX_ZPX, *value]
|
||||
}
|
||||
Absolute(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
vec![ISA_OP_STX_ABS, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
STY(mode) => {
|
||||
match mode {
|
||||
ZeroPage(value) => {
|
||||
vec![ISA_OP_STY_ZP, *value]
|
||||
}
|
||||
ZeroPageX(value) => {
|
||||
vec![ISA_OP_STY_ZPX, *value]
|
||||
}
|
||||
Absolute(offset) => {
|
||||
let (h, l) = split_word_hl(*offset);
|
||||
vec![ISA_OP_STY_ABS, l, h]
|
||||
}
|
||||
_ => vec![ISA_OP_NOP]
|
||||
}
|
||||
}
|
||||
TAX => vec![ISA_OP_TAX],
|
||||
TAY => vec![ISA_OP_TAY],
|
||||
TSX => vec![ISA_OP_TSX],
|
||||
TXA => vec![ISA_OP_TXA],
|
||||
TXS => vec![ISA_OP_TXS],
|
||||
TYA => vec![ISA_OP_TYA],
|
||||
|
||||
0
core/tests/instruction_encode_decode.rs
Normal file
0
core/tests/instruction_encode_decode.rs
Normal file
Loading…
x
Reference in New Issue
Block a user