1
0
mirror of https://github.com/mre/mos6502.git synced 2025-02-26 18:29:14 +00:00

Merge pull request #14 from senden9/feature/num_fixes

Some style fixes and stabilisation
This commit is contained in:
Matthias Endler 2018-10-30 13:15:21 +01:00 committed by GitHub
commit 797f27e333
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 30 deletions

View File

@ -42,8 +42,7 @@ impl Add<AddressDiff> for Address {
fn add(self, AddressDiff(rhs): AddressDiff) -> Address { fn add(self, AddressDiff(rhs): AddressDiff) -> Address {
let Address(lhs) = self; let Address(lhs) = self;
// TODO akeeton: Do a checked cast. Address(((i32::from(lhs)) + rhs) as u16)
Address(((lhs as i32) + rhs) as u16)
} }
} }

View File

@ -109,17 +109,17 @@ impl CPU {
} }
(Instruction::BCC, OpInput::UseRelative(rel)) => { (Instruction::BCC, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
self.branch_if_carry_clear(addr); self.branch_if_carry_clear(addr);
} }
(Instruction::BCS, OpInput::UseRelative(rel)) => { (Instruction::BCS, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
self.branch_if_carry_set(addr); self.branch_if_carry_set(addr);
} }
(Instruction::BEQ, OpInput::UseRelative(rel)) => { (Instruction::BEQ, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
self.branch_if_equal(addr); self.branch_if_equal(addr);
} }
@ -149,23 +149,23 @@ impl CPU {
} }
(Instruction::BMI, OpInput::UseRelative(rel)) => { (Instruction::BMI, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
debug!("branch if minus relative. address: {:?}", addr); debug!("branch if minus relative. address: {:?}", addr);
self.branch_if_minus(addr); self.branch_if_minus(addr);
} }
(Instruction::BPL, OpInput::UseRelative(rel)) => { (Instruction::BPL, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
self.branch_if_positive(addr); self.branch_if_positive(addr);
} }
(Instruction::BVC, OpInput::UseRelative(rel)) => { (Instruction::BVC, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
self.branch_if_overflow_clear(addr); self.branch_if_overflow_clear(addr);
} }
(Instruction::BVS, OpInput::UseRelative(rel)) => { (Instruction::BVS, OpInput::UseRelative(rel)) => {
let addr = self.registers.program_counter + AddressDiff(rel as i32); let addr = self.registers.program_counter + AddressDiff(i32::from(rel));
self.branch_if_overflow_set(addr); self.branch_if_overflow_set(addr);
} }
@ -448,7 +448,7 @@ impl CPU {
fn shift_right_with_flags(p_val: &mut u8, status: &mut Status) { fn shift_right_with_flags(p_val: &mut u8, status: &mut Status) {
let mask = 1; let mask = 1;
let is_bit_0_set = (*p_val & mask) == mask; let is_bit_0_set = (*p_val & mask) == mask;
*p_val = *p_val >> 1; *p_val >>= 1;
status.set_with_mask( status.set_with_mask(
PS_CARRY, PS_CARRY,
Status::new(StatusArgs { Status::new(StatusArgs {

View File

@ -139,7 +139,7 @@ pub enum AddressingMode {
fn arr_to_addr(arr: &[u8]) -> Address { fn arr_to_addr(arr: &[u8]) -> Address {
debug_assert!(arr.len() == 2); debug_assert!(arr.len() == 2);
let x = (arr[0] as u16) + ((arr[1] as u16) << 8usize); let x = u16::from(arr[0]) + (u16::from(arr[1]) << 8usize);
Address(x) Address(x)
} }
@ -187,19 +187,19 @@ impl AddressingMode {
// Use [u8, ..1] from instruction // Use [u8, ..1] from instruction
// Interpret as zero page address // Interpret as zero page address
// (Output: an 8-bit zero-page address) // (Output: an 8-bit zero-page address)
OpInput::UseAddress(Address(arr[0] as u16)) OpInput::UseAddress(Address(u16::from(arr[0])))
} }
AddressingMode::ZeroPageX => { AddressingMode::ZeroPageX => {
// Use [u8, ..1] from instruction // Use [u8, ..1] from instruction
// Add to X register (as u8 -- the final address is in 0-page) // Add to X register (as u8 -- the final address is in 0-page)
// (Output: an 8-bit zero-page address) // (Output: an 8-bit zero-page address)
OpInput::UseAddress(Address((arr[0] + x) as u16)) OpInput::UseAddress(Address(u16::from(arr[0] + x)))
} }
AddressingMode::ZeroPageY => { AddressingMode::ZeroPageY => {
// Use [u8, ..1] from instruction // Use [u8, ..1] from instruction
// Add to Y register (as u8 -- the final address is in 0-page) // Add to Y register (as u8 -- the final address is in 0-page)
// (Output: an 8-bit zero-page address) // (Output: an 8-bit zero-page address)
OpInput::UseAddress(Address((arr[0] + y) as u16)) OpInput::UseAddress(Address(u16::from(arr[0] + y)))
} }
AddressingMode::Relative => { AddressingMode::Relative => {
// Use [u8, ..1] from instruction // Use [u8, ..1] from instruction
@ -214,12 +214,12 @@ impl AddressingMode {
AddressingMode::AbsoluteX => { AddressingMode::AbsoluteX => {
// Use [u8, ..2] from instruction as address, add X // Use [u8, ..2] from instruction as address, add X
// (Output: a 16-bit address) // (Output: a 16-bit address)
OpInput::UseAddress(arr_to_addr(arr) + AddressDiff(x as i32)) OpInput::UseAddress(arr_to_addr(arr) + AddressDiff(i32::from(x)))
} }
AddressingMode::AbsoluteY => { AddressingMode::AbsoluteY => {
// Use [u8, ..2] from instruction as address, add Y // Use [u8, ..2] from instruction as address, add Y
// (Output: a 16-bit address) // (Output: a 16-bit address)
OpInput::UseAddress(arr_to_addr(arr) + AddressDiff(y as i32)) OpInput::UseAddress(arr_to_addr(arr) + AddressDiff(i32::from(y)))
} }
AddressingMode::Indirect => { AddressingMode::Indirect => {
// Use [u8, ..2] from instruction as an address. Interpret the // Use [u8, ..2] from instruction as an address. Interpret the
@ -234,7 +234,7 @@ impl AddressingMode {
// This is where the absolute (16-bit) target address is stored. // This is where the absolute (16-bit) target address is stored.
// (Output: a 16-bit address) // (Output: a 16-bit address)
let start = arr[0] + x; let start = arr[0] + x;
let slice = memory.get_slice(Address(start as u16), AddressDiff(2)); let slice = memory.get_slice(Address(u16::from(start)), AddressDiff(2));
OpInput::UseAddress(arr_to_addr(slice)) OpInput::UseAddress(arr_to_addr(slice))
} }
AddressingMode::IndirectIndexedY => { AddressingMode::IndirectIndexedY => {
@ -243,8 +243,8 @@ impl AddressingMode {
// Add Y register to this address to get the final address // Add Y register to this address to get the final address
// (Output: a 16-bit address) // (Output: a 16-bit address)
let start = arr[0]; let start = arr[0];
let slice = memory.get_slice(Address(start as u16), AddressDiff(2)); let slice = memory.get_slice(Address(u16::from(start)), AddressDiff(2));
OpInput::UseAddress(arr_to_addr(slice) + AddressDiff(y as i32)) OpInput::UseAddress(arr_to_addr(slice) + AddressDiff(i32::from(y)))
} }
} }
} }

View File

@ -100,39 +100,39 @@ impl Status {
let mut out = Status::empty(); let mut out = Status::empty();
if negative { if negative {
out = out | PS_NEGATIVE out |= PS_NEGATIVE
} }
if overflow { if overflow {
out = out | PS_OVERFLOW out |= PS_OVERFLOW
} }
if unused { if unused {
out = out | PS_UNUSED out |= PS_UNUSED
} }
if brk { if brk {
out = out | PS_BRK out |= PS_BRK
} }
if decimal_mode { if decimal_mode {
out = out | PS_DECIMAL_MODE out |= PS_DECIMAL_MODE
} }
if disable_interrupts { if disable_interrupts {
out = out | PS_DISABLE_INTERRUPTS out |= PS_DISABLE_INTERRUPTS
} }
if zero { if zero {
out = out | PS_ZERO out |= PS_ZERO
} }
if carry { if carry {
out = out | PS_CARRY out |= PS_CARRY
} }
out out
} }
pub fn and(&mut self, rhs: Status) { pub fn and(&mut self, rhs: Status) {
*self = *self & rhs; *self &= rhs;
} }
pub fn or(&mut self, rhs: Status) { pub fn or(&mut self, rhs: Status) {
*self = *self | rhs; *self |= rhs;
} }
pub fn set_with_mask(&mut self, mask: Status, rhs: Status) { pub fn set_with_mask(&mut self, mask: Status, rhs: Status) {
@ -146,7 +146,7 @@ pub struct StackPointer(pub u8);
impl StackPointer { impl StackPointer {
pub fn to_address(&self) -> Address { pub fn to_address(&self) -> Address {
let StackPointer(sp) = *self; let StackPointer(sp) = *self;
STACK_ADDRESS_LO + AddressDiff(sp as i32) STACK_ADDRESS_LO + AddressDiff(i32::from(sp))
} }
// JAM: FIXME: Should we prevent overflow here? What would a 6502 do? // JAM: FIXME: Should we prevent overflow here? What would a 6502 do?