mirror of
https://github.com/mre/mos6502.git
synced 2024-11-28 07:49:19 +00:00
Implement JMP instruction.
This commit is contained in:
parent
6d7388c779
commit
1c1353127a
@ -29,7 +29,7 @@ use log;
|
|||||||
|
|
||||||
use std;
|
use std;
|
||||||
|
|
||||||
use address::{AddressDiff};
|
use address::{Address, AddressDiff};
|
||||||
use instruction;
|
use instruction;
|
||||||
use instruction::{DecodedInstr};
|
use instruction::{DecodedInstr};
|
||||||
use memory::Memory;
|
use memory::Memory;
|
||||||
@ -48,7 +48,7 @@ impl Machine {
|
|||||||
memory: Memory::new()
|
memory: Memory::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reset(&mut self) {
|
pub fn reset(&mut self) {
|
||||||
*self = Machine::new();
|
*self = Machine::new();
|
||||||
}
|
}
|
||||||
@ -92,7 +92,11 @@ impl Machine {
|
|||||||
|
|
||||||
(instruction::DEX, instruction::UseImplied) => {
|
(instruction::DEX, instruction::UseImplied) => {
|
||||||
self.dec_x();
|
self.dec_x();
|
||||||
}
|
},
|
||||||
|
|
||||||
|
(instruction::JMP, instruction::UseAddress(addr)) => {
|
||||||
|
self.jump(addr)
|
||||||
|
},
|
||||||
|
|
||||||
(instruction::LDA, instruction::UseImmediate(val)) => {
|
(instruction::LDA, instruction::UseImmediate(val)) => {
|
||||||
log!(log::DEBUG, "load A immediate: {}", val);
|
log!(log::DEBUG, "load A immediate: {}", val);
|
||||||
@ -208,6 +212,10 @@ impl Machine {
|
|||||||
let val = self.registers.index_x;
|
let val = self.registers.index_x;
|
||||||
self.load_x_register(val - 1);
|
self.load_x_register(val - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn jump(&mut self, addr: Address) {
|
||||||
|
self.registers.program_counter = addr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Show for Machine {
|
impl std::fmt::Show for Machine {
|
||||||
@ -242,7 +250,7 @@ fn add_with_carry_test() {
|
|||||||
assert_eq!(machine.registers.status.contains(PS_ZERO), false);
|
assert_eq!(machine.registers.status.contains(PS_ZERO), false);
|
||||||
assert_eq!(machine.registers.status.contains(PS_NEGATIVE), false);
|
assert_eq!(machine.registers.status.contains(PS_NEGATIVE), false);
|
||||||
assert_eq!(machine.registers.status.contains(PS_OVERFLOW), false);
|
assert_eq!(machine.registers.status.contains(PS_OVERFLOW), false);
|
||||||
|
|
||||||
let mut machine = Machine::new();
|
let mut machine = Machine::new();
|
||||||
|
|
||||||
machine.add_with_carry(127);
|
machine.add_with_carry(127);
|
||||||
@ -335,3 +343,12 @@ fn dec_x_test() {
|
|||||||
assert_eq!(machine.registers.status.contains(PS_NEGATIVE), true);
|
assert_eq!(machine.registers.status.contains(PS_NEGATIVE), true);
|
||||||
assert_eq!(machine.registers.status.contains(PS_OVERFLOW), false);
|
assert_eq!(machine.registers.status.contains(PS_OVERFLOW), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn jump_test() {
|
||||||
|
let mut machine = Machine::new();
|
||||||
|
let addr = Address(0xA1B1);
|
||||||
|
|
||||||
|
machine.jump(addr);
|
||||||
|
assert_eq!(machine.registers.program_counter, addr);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user