refactor: with clippy
Former-commit-id: c57ef7336468ec1b2386a1c3faa753468b45eeb3 Former-commit-id: a98ec18b83a192c371cedbf3cd0efbb1586c4552
This commit is contained in:
parent
4179b0ec28
commit
cacf71b61c
|
@ -9,7 +9,7 @@ members = [
|
||||||
"platform/rustboyadvance-jni",
|
"platform/rustboyadvance-jni",
|
||||||
"fps_bench"
|
"fps_bench"
|
||||||
]
|
]
|
||||||
|
resolver = "1"
|
||||||
default-members = ["platform/rustboyadvance-sdl2"]
|
default-members = ["platform/rustboyadvance-sdl2"]
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
|
|
|
@ -42,7 +42,7 @@ fn thumb_decode(i: u16) -> (&'static str, String) {
|
||||||
} else if i & 0xfc00 == 0x4000 {
|
} else if i & 0xfc00 == 0x4000 {
|
||||||
(
|
(
|
||||||
"AluOps",
|
"AluOps",
|
||||||
format!("exec_thumb_alu_ops::<{OP}>", OP = i.bit_range(6..10) as u16),
|
format!("exec_thumb_alu_ops::<{OP}>", OP = i.bit_range(6..10)),
|
||||||
)
|
)
|
||||||
} else if i & 0xfc00 == 0x4400 {
|
} else if i & 0xfc00 == 0x4400 {
|
||||||
(
|
(
|
||||||
|
@ -424,11 +424,11 @@ fn main() {
|
||||||
// TODO - don't do this in the build script and use `const fn` instead when it becomes stable
|
// TODO - don't do this in the build script and use `const fn` instead when it becomes stable
|
||||||
let out_dir = env::var_os("OUT_DIR").unwrap();
|
let out_dir = env::var_os("OUT_DIR").unwrap();
|
||||||
let thumb_lut_path = Path::new(&out_dir).join("thumb_lut.rs");
|
let thumb_lut_path = Path::new(&out_dir).join("thumb_lut.rs");
|
||||||
let mut thumb_lut_file = fs::File::create(&thumb_lut_path).expect("failed to create file");
|
let mut thumb_lut_file = fs::File::create(thumb_lut_path).expect("failed to create file");
|
||||||
generate_thumb_lut(&mut thumb_lut_file).expect("failed to generate thumb table");
|
generate_thumb_lut(&mut thumb_lut_file).expect("failed to generate thumb table");
|
||||||
|
|
||||||
let arm_lut_path = Path::new(&out_dir).join("arm_lut.rs");
|
let arm_lut_path = Path::new(&out_dir).join("arm_lut.rs");
|
||||||
let mut arm_lut_file = fs::File::create(&arm_lut_path).expect("failed to create file");
|
let mut arm_lut_file = fs::File::create(arm_lut_path).expect("failed to create file");
|
||||||
generate_arm_lut(&mut arm_lut_file).expect("failed to generate arm table");
|
generate_arm_lut(&mut arm_lut_file).expect("failed to generate arm table");
|
||||||
|
|
||||||
println!("cargo:rerun-if-changed=build.rs");
|
println!("cargo:rerun-if-changed=build.rs");
|
||||||
|
|
|
@ -77,7 +77,7 @@ impl BarrelShifterValue {
|
||||||
/// Decode operand2 as an immediate value
|
/// Decode operand2 as an immediate value
|
||||||
pub fn decode_rotated_immediate(&self) -> Option<u32> {
|
pub fn decode_rotated_immediate(&self) -> Option<u32> {
|
||||||
if let BarrelShifterValue::RotatedImmediate(immediate, rotate) = self {
|
if let BarrelShifterValue::RotatedImmediate(immediate, rotate) = self {
|
||||||
return Some(immediate.rotate_right(*rotate) as u32);
|
return Some(immediate.rotate_right(*rotate));
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
pub fn rrx(&mut self, val: u32, carry: &mut bool) -> u32 {
|
pub fn rrx(&mut self, val: u32, carry: &mut bool) -> u32 {
|
||||||
let old_c = *carry as i32;
|
let old_c = *carry as i32;
|
||||||
*carry = val & 0b1 != 0;
|
*carry = val & 0b1 != 0;
|
||||||
(((val as u32) >> 1) as i32 | (old_c << 31)) as u32
|
((val >> 1) as i32 | (old_c << 31)) as u32
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ror(
|
pub fn ror(
|
||||||
|
@ -189,7 +189,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
} else {
|
} else {
|
||||||
val
|
val
|
||||||
};
|
};
|
||||||
*carry = (val as u32).bit(31);
|
*carry = (val).bit(31);
|
||||||
val
|
val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,7 +265,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
let rs = offset.bit_range(8..12) as usize;
|
let rs = offset.bit_range(8..12) as usize;
|
||||||
self.shift_by_register(op, reg, rs, carry)
|
self.shift_by_register(op, reg, rs, carry)
|
||||||
} else {
|
} else {
|
||||||
let amount = offset.bit_range(7..12) as u32;
|
let amount = offset.bit_range(7..12);
|
||||||
self.barrel_shift_op(op, self.get_reg(reg), amount, carry, true)
|
self.barrel_shift_op(op, self.get_reg(reg), amount, carry, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,12 +284,12 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
pub fn get_barrel_shifted_value(&mut self, sval: &BarrelShifterValue, carry: &mut bool) -> u32 {
|
pub fn get_barrel_shifted_value(&mut self, sval: &BarrelShifterValue, carry: &mut bool) -> u32 {
|
||||||
// TODO decide if error handling or panic here
|
// TODO decide if error handling or panic here
|
||||||
match sval {
|
match sval {
|
||||||
BarrelShifterValue::ImmediateValue(offset) => *offset as u32,
|
BarrelShifterValue::ImmediateValue(offset) => *offset,
|
||||||
BarrelShifterValue::ShiftedRegister(shifted_reg) => {
|
BarrelShifterValue::ShiftedRegister(shifted_reg) => {
|
||||||
let added = (*shifted_reg).added.unwrap_or(true);
|
let added = (shifted_reg).added.unwrap_or(true);
|
||||||
let abs = self.register_shift(shifted_reg, carry) as u32;
|
let abs = self.register_shift(shifted_reg, carry);
|
||||||
if added {
|
if added {
|
||||||
abs as u32
|
abs
|
||||||
} else {
|
} else {
|
||||||
(-(abs as i32)) as u32
|
(-(abs as i32)) as u32
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ use crate::{
|
||||||
|
|
||||||
use MemoryAccess::*;
|
use MemoryAccess::*;
|
||||||
|
|
||||||
use super::ArmDecodeHelper;
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
|
@ -177,7 +176,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
let rs = insn.bit_range(8..12) as usize;
|
let rs = insn.bit_range(8..12) as usize;
|
||||||
ShiftRegisterBy::ByRegister(rs)
|
ShiftRegisterBy::ByRegister(rs)
|
||||||
} else {
|
} else {
|
||||||
let amount = insn.bit_range(7..12) as u32;
|
let amount = insn.bit_range(7..12);
|
||||||
ShiftRegisterBy::ByAmount(amount)
|
ShiftRegisterBy::ByAmount(amount)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -240,7 +239,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
|
|
||||||
let mut result = CpuAction::AdvancePC(Seq);
|
let mut result = CpuAction::AdvancePC(Seq);
|
||||||
if let Some(alu_res) = alu_res {
|
if let Some(alu_res) = alu_res {
|
||||||
self.set_reg(rd, alu_res as u32);
|
self.set_reg(rd, alu_res);
|
||||||
if rd == REG_PC {
|
if rd == REG_PC {
|
||||||
// T bit might have changed
|
// T bit might have changed
|
||||||
match self.cpsr.state() {
|
match self.cpsr.state() {
|
||||||
|
@ -290,7 +289,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
self.register_shift_const::<BS_OP, SHIFT_BY_REG>(offset, rm as usize, &mut carry);
|
self.register_shift_const::<BS_OP, SHIFT_BY_REG>(offset, rm as usize, &mut carry);
|
||||||
}
|
}
|
||||||
let offset = if ADD {
|
let offset = if ADD {
|
||||||
offset as u32
|
offset
|
||||||
} else {
|
} else {
|
||||||
(-(offset as i32)) as u32
|
(-(offset as i32)) as u32
|
||||||
};
|
};
|
||||||
|
@ -411,7 +410,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
|
|
||||||
if LOAD {
|
if LOAD {
|
||||||
let data = match transfer_type {
|
let data = match transfer_type {
|
||||||
ArmHalfwordTransferType::SignedByte => self.load_8(addr, NonSeq) as u8 as i8 as u32,
|
ArmHalfwordTransferType::SignedByte => self.load_8(addr, NonSeq) as u32,
|
||||||
ArmHalfwordTransferType::SignedHalfwords => self.ldr_sign_half(addr, NonSeq),
|
ArmHalfwordTransferType::SignedHalfwords => self.ldr_sign_half(addr, NonSeq),
|
||||||
ArmHalfwordTransferType::UnsignedHalfwords => self.ldr_half(addr, NonSeq),
|
ArmHalfwordTransferType::UnsignedHalfwords => self.ldr_half(addr, NonSeq),
|
||||||
};
|
};
|
||||||
|
@ -599,7 +598,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if writeback {
|
if writeback {
|
||||||
self.set_reg(base_reg, addr as u32);
|
self.set_reg(base_reg, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
result
|
||||||
|
@ -705,7 +704,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
} else {
|
} else {
|
||||||
let t = self.ldr_word(base_addr, NonSeq);
|
let t = self.ldr_word(base_addr, NonSeq);
|
||||||
self.store_aligned_32(base_addr, self.get_reg(insn.rm()), Seq);
|
self.store_aligned_32(base_addr, self.get_reg(insn.rm()), Seq);
|
||||||
self.set_reg(rd, t as u32);
|
self.set_reg(rd, t);
|
||||||
}
|
}
|
||||||
self.idle_cycle();
|
self.idle_cycle();
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use log::debug;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use bit::BitIndex;
|
use bit::BitIndex;
|
||||||
use num::FromPrimitive;
|
use num::FromPrimitive;
|
||||||
use ansi_term::{Colour, Style};
|
use ansi_term::{Style};
|
||||||
|
|
||||||
use rustboyadvance_utils::{Shared, WeakPointer};
|
use rustboyadvance_utils::{Shared, WeakPointer};
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ where
|
||||||
let mut line = String::new();
|
let mut line = String::new();
|
||||||
|
|
||||||
let addr = self.base + self.pos as Addr;
|
let addr = self.base + self.pos as Addr;
|
||||||
let decoded: D = D::decode_from_bytes(&self.bytes[(self.pos as usize)..], addr);
|
let decoded: D = D::decode_from_bytes(&self.bytes[(self.pos)..], addr);
|
||||||
let decoded_raw = decoded.get_raw();
|
let decoded_raw = decoded.get_raw();
|
||||||
self.pos += self.word_size;
|
self.pos += self.word_size;
|
||||||
write!(&mut line, "{addr:8x}:\t{decoded_raw:08x} \t{decoded}").unwrap();
|
write!(&mut line, "{addr:8x}:\t{decoded_raw:08x} \t{decoded}").unwrap();
|
||||||
|
|
|
@ -5,9 +5,6 @@ use crate::{
|
||||||
Arm7tdmiCore, CpuAction,
|
Arm7tdmiCore, CpuAction,
|
||||||
};
|
};
|
||||||
|
|
||||||
use bit::BitIndex;
|
|
||||||
|
|
||||||
use super::ThumbDecodeHelper;
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use MemoryAccess::*;
|
use MemoryAccess::*;
|
||||||
|
|
||||||
|
@ -59,7 +56,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
self.alu_add_flags(op1, op2, &mut carry, &mut overflow)
|
self.alu_add_flags(op1, op2, &mut carry, &mut overflow)
|
||||||
};
|
};
|
||||||
self.alu_update_flags(result, true, carry, overflow);
|
self.alu_update_flags(result, true, carry, overflow);
|
||||||
self.set_reg(rd, result as u32);
|
self.set_reg(rd, result);
|
||||||
|
|
||||||
CpuAction::AdvancePC(Seq)
|
CpuAction::AdvancePC(Seq)
|
||||||
}
|
}
|
||||||
|
@ -84,7 +81,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
let arithmetic = op == ADD || op == SUB;
|
let arithmetic = op == ADD || op == SUB;
|
||||||
self.alu_update_flags(result, arithmetic, carry, overflow);
|
self.alu_update_flags(result, arithmetic, carry, overflow);
|
||||||
if op != CMP {
|
if op != CMP {
|
||||||
self.gpr[RD] = result as u32;
|
self.gpr[RD] = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
CpuAction::AdvancePC(Seq)
|
CpuAction::AdvancePC(Seq)
|
||||||
|
@ -144,7 +141,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
self.alu_update_flags(result, op.is_arithmetic(), carry, overflow);
|
self.alu_update_flags(result, op.is_arithmetic(), carry, overflow);
|
||||||
|
|
||||||
if !op.is_setting_flags() {
|
if !op.is_setting_flags() {
|
||||||
self.set_reg(rd, result as u32);
|
self.set_reg(rd, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CpuAction::AdvancePC(Seq)
|
CpuAction::AdvancePC(Seq)
|
||||||
|
@ -189,7 +186,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
self.alu_update_flags(result, true, carry, overflow);
|
self.alu_update_flags(result, true, carry, overflow);
|
||||||
}
|
}
|
||||||
OpFormat5::MOV => {
|
OpFormat5::MOV => {
|
||||||
self.set_reg(dst_reg, op2 as u32);
|
self.set_reg(dst_reg, op2);
|
||||||
if dst_reg == REG_PC {
|
if dst_reg == REG_PC {
|
||||||
self.reload_pipeline16();
|
self.reload_pipeline16();
|
||||||
result = CpuAction::PipelineFlushed;
|
result = CpuAction::PipelineFlushed;
|
||||||
|
@ -333,7 +330,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
if LOAD {
|
if LOAD {
|
||||||
let data = self.ldr_half(addr, NonSeq);
|
let data = self.ldr_half(addr, NonSeq);
|
||||||
self.idle_cycle();
|
self.idle_cycle();
|
||||||
self.gpr[rd] = data as u32;
|
self.gpr[rd] = data;
|
||||||
CpuAction::AdvancePC(Seq)
|
CpuAction::AdvancePC(Seq)
|
||||||
} else {
|
} else {
|
||||||
self.store_aligned_16(addr, self.gpr[rd] as u16, NonSeq);
|
self.store_aligned_16(addr, self.gpr[rd] as u16, NonSeq);
|
||||||
|
@ -541,7 +538,7 @@ impl<I: MemoryInterface> Arm7tdmiCore<I> {
|
||||||
/// Format 18
|
/// Format 18
|
||||||
/// Execution Time: 2S+1N
|
/// Execution Time: 2S+1N
|
||||||
pub(in super::super) fn exec_thumb_branch(&mut self, insn: u16) -> CpuAction {
|
pub(in super::super) fn exec_thumb_branch(&mut self, insn: u16) -> CpuAction {
|
||||||
let offset = ((insn.offset11() << 21) >> 20) as i32;
|
let offset = (insn.offset11() << 21) >> 20;
|
||||||
self.pc = (self.pc as i32).wrapping_add(offset) as u32;
|
self.pc = (self.pc as i32).wrapping_add(offset) as u32;
|
||||||
self.reload_pipeline16(); // 2S + 1N
|
self.reload_pipeline16(); // 2S + 1N
|
||||||
CpuAction::PipelineFlushed
|
CpuAction::PipelineFlushed
|
||||||
|
|
|
@ -57,7 +57,7 @@ impl BusIO for Bios {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn read_16(&mut self, addr: Addr) -> u16 {
|
fn read_16(&mut self, addr: Addr) -> u16 {
|
||||||
if self.read_allowed() {
|
if self.read_allowed() {
|
||||||
self.rom.read_16(addr) as u16
|
self.rom.read_16(addr)
|
||||||
} else {
|
} else {
|
||||||
(self.last_opcode >> ((addr & 2) << 3)) as u16
|
(self.last_opcode >> ((addr & 2) << 3)) as u16
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,7 +81,7 @@ impl BackupFile {
|
||||||
let mut _file = OpenOptions::new()
|
let mut _file = OpenOptions::new()
|
||||||
.read(true)
|
.read(true)
|
||||||
.write(true)
|
.write(true)
|
||||||
.open(&path)
|
.open(path)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let mut buffer = Vec::new();
|
let mut buffer = Vec::new();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use super::{BackupFile, BackupMemoryInterface};
|
use super::{BackupFile, BackupMemoryInterface};
|
||||||
|
|
||||||
use bytesize;
|
|
||||||
use num::FromPrimitive;
|
use num::FromPrimitive;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
@ -66,12 +65,6 @@ enum SpiState {
|
||||||
RxData,
|
RxData,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for SpiState {
|
|
||||||
fn default() -> SpiState {
|
|
||||||
SpiState::RxInstruction
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct EepromChip {
|
pub struct EepromChip {
|
||||||
memory: BackupFile,
|
memory: BackupFile,
|
||||||
|
@ -255,10 +248,7 @@ impl EepromChip {
|
||||||
|
|
||||||
pub(crate) fn is_transmitting(&self) -> bool {
|
pub(crate) fn is_transmitting(&self) -> bool {
|
||||||
use SpiState::*;
|
use SpiState::*;
|
||||||
match self.state {
|
matches!(self.state, TxData | TxDummy)
|
||||||
TxData | TxDummy => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn reset(&mut self) {
|
pub(crate) fn reset(&mut self) {
|
||||||
|
@ -288,7 +278,7 @@ impl EepromController {
|
||||||
let mut detect = true;
|
let mut detect = true;
|
||||||
let mut eeprom_type = EepromType::Eeprom512;
|
let mut eeprom_type = EepromType::Eeprom512;
|
||||||
if let Some(path) = &path {
|
if let Some(path) = &path {
|
||||||
if let Ok(metadata) = fs::metadata(&path) {
|
if let Ok(metadata) = fs::metadata(path) {
|
||||||
let human_size = bytesize::ByteSize::b(metadata.len());
|
let human_size = bytesize::ByteSize::b(metadata.len());
|
||||||
let assumed_type = match metadata.len() {
|
let assumed_type = match metadata.len() {
|
||||||
512 => EepromType::Eeprom512,
|
512 => EepromType::Eeprom512,
|
||||||
|
|
|
@ -39,9 +39,9 @@ pub enum FlashSize {
|
||||||
Flash128k,
|
Flash128k,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<usize> for FlashSize {
|
impl From<FlashSize> for usize {
|
||||||
fn into(self) -> usize {
|
fn from(val: FlashSize) -> Self {
|
||||||
match self {
|
match val {
|
||||||
FlashSize::Flash64k => 64 * 1024,
|
FlashSize::Flash64k => 64 * 1024,
|
||||||
FlashSize::Flash128k => 128 * 1024,
|
FlashSize::Flash128k => 128 * 1024,
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ impl Flash {
|
||||||
/// Returns the phyiscal offset inside the flash file according to the selected bank
|
/// Returns the phyiscal offset inside the flash file according to the selected bank
|
||||||
#[inline]
|
#[inline]
|
||||||
fn flash_offset(&self, offset: usize) -> usize {
|
fn flash_offset(&self, offset: usize) -> usize {
|
||||||
let offset = (offset & 0xffff) as usize;
|
let offset = offset & 0xffff;
|
||||||
self.bank * BANK_SIZE + offset
|
self.bank * BANK_SIZE + offset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,12 @@ pub struct GamepakBuilder {
|
||||||
create_backup_file: bool,
|
create_backup_file: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for GamepakBuilder {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl GamepakBuilder {
|
impl GamepakBuilder {
|
||||||
pub fn new() -> GamepakBuilder {
|
pub fn new() -> GamepakBuilder {
|
||||||
GamepakBuilder {
|
GamepakBuilder {
|
||||||
|
@ -199,11 +205,7 @@ impl GamepakBuilder {
|
||||||
|
|
||||||
const BACKUP_FILE_EXT: &str = "sav";
|
const BACKUP_FILE_EXT: &str = "sav";
|
||||||
fn create_backup(backup_type: BackupType, rom_path: Option<PathBuf>) -> BackupMedia {
|
fn create_backup(backup_type: BackupType, rom_path: Option<PathBuf>) -> BackupMedia {
|
||||||
let backup_path = if let Some(rom_path) = rom_path {
|
let backup_path = rom_path.map(|rom_path| rom_path.with_extension(BACKUP_FILE_EXT));
|
||||||
Some(rom_path.with_extension(BACKUP_FILE_EXT))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
match backup_type {
|
match backup_type {
|
||||||
BackupType::Flash | BackupType::Flash512 => {
|
BackupType::Flash | BackupType::Flash512 => {
|
||||||
BackupMedia::Flash(Flash::new(backup_path, FlashSize::Flash64k))
|
BackupMedia::Flash(Flash::new(backup_path, FlashSize::Flash64k))
|
||||||
|
@ -220,10 +222,7 @@ fn detect_backup_type(bytes: &[u8]) -> Option<BackupType> {
|
||||||
|
|
||||||
for i in 0..5 {
|
for i in 0..5 {
|
||||||
let search = TwoWaySearcher::new(ID_STRINGS[i].as_bytes());
|
let search = TwoWaySearcher::new(ID_STRINGS[i].as_bytes());
|
||||||
match search.search_in(bytes) {
|
if let Some(_) = search.search_in(bytes) { return Some(BackupType::from_u8(i as u8).unwrap()) }
|
||||||
Some(_) => return Some(BackupType::from_u8(i as u8).unwrap()),
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,10 +103,7 @@ use super::sysbus::consts::*;
|
||||||
pub const EEPROM_BASE_ADDR: u32 = 0x0DFF_FF00;
|
pub const EEPROM_BASE_ADDR: u32 = 0x0DFF_FF00;
|
||||||
|
|
||||||
fn is_gpio_access(addr: u32) -> bool {
|
fn is_gpio_access(addr: u32) -> bool {
|
||||||
match addr & 0x1ff_ffff {
|
matches!(addr & 0x1ff_ffff, GPIO_PORT_DATA | GPIO_PORT_DIRECTION | GPIO_PORT_CONTROL)
|
||||||
GPIO_PORT_DATA | GPIO_PORT_DIRECTION | GPIO_PORT_CONTROL => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BusIO for Cartridge {
|
impl BusIO for Cartridge {
|
||||||
|
@ -122,7 +119,7 @@ impl BusIO for Cartridge {
|
||||||
if offset >= self.size {
|
if offset >= self.size {
|
||||||
self.read_unused(addr)
|
self.read_unused(addr)
|
||||||
} else {
|
} else {
|
||||||
unsafe { *self.bytes.get_unchecked(offset as usize) }
|
unsafe { *self.bytes.get_unchecked(offset) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,10 +223,7 @@ impl Rtc {
|
||||||
|
|
||||||
fn serial_transfer_in_progress(&self) -> bool {
|
fn serial_transfer_in_progress(&self) -> bool {
|
||||||
use RtcState::*;
|
use RtcState::*;
|
||||||
match self.state {
|
!matches!(self.state, Idle | WaitForChipSelectHigh)
|
||||||
Idle | WaitForChipSelectHigh => false,
|
|
||||||
_ => true,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a register contents into an internal buffer
|
/// Loads a register contents into an internal buffer
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use bincode;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::gdb_support::{gdb_thread::start_gdb_server_thread, DebuggerRequestHandler};
|
use crate::gdb_support::{gdb_thread::start_gdb_server_thread, DebuggerRequestHandler};
|
||||||
|
@ -19,7 +18,7 @@ use super::timer::Timers;
|
||||||
|
|
||||||
use super::sound::interface::DynAudioInterface;
|
use super::sound::interface::DynAudioInterface;
|
||||||
|
|
||||||
use arm7tdmi::{self, Arm7tdmiCore};
|
use arm7tdmi::{Arm7tdmiCore};
|
||||||
use rustboyadvance_utils::Shared;
|
use rustboyadvance_utils::Shared;
|
||||||
|
|
||||||
pub struct GameBoyAdvance {
|
pub struct GameBoyAdvance {
|
||||||
|
|
|
@ -111,7 +111,7 @@ impl DebuggerRequestHandler {
|
||||||
data.len(),
|
data.len(),
|
||||||
addr
|
addr
|
||||||
);
|
);
|
||||||
gba.cpu.write_addrs(*addr, &data)?;
|
gba.cpu.write_addrs(*addr, data)?;
|
||||||
self.complete_request(None)
|
self.complete_request(None)
|
||||||
}
|
}
|
||||||
Interrupt => {
|
Interrupt => {
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
use num::FromPrimitive;
|
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[derive(Primitive, Debug, Ord, Eq, PartialOrd, PartialEq, Clone, Copy)]
|
#[derive(Primitive, Debug, Ord, Eq, PartialOrd, PartialEq, Clone, Copy)]
|
||||||
|
|
|
@ -367,8 +367,8 @@ impl Gpu {
|
||||||
self.render_scanline();
|
self.render_scanline();
|
||||||
// update BG2/3 reference points on the end of a scanline
|
// update BG2/3 reference points on the end of a scanline
|
||||||
for i in 0..2 {
|
for i in 0..2 {
|
||||||
self.bg_aff[i].internal_x += self.bg_aff[i].pb as i16 as i32;
|
self.bg_aff[i].internal_x += self.bg_aff[i].pb as i32;
|
||||||
self.bg_aff[i].internal_y += self.bg_aff[i].pd as i16 as i32;
|
self.bg_aff[i].internal_y += self.bg_aff[i].pd as i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
(GpuEvent::HDraw, CYCLES_HDRAW)
|
(GpuEvent::HDraw, CYCLES_HDRAW)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
use regs::RegMosaic;
|
|
||||||
|
|
||||||
impl RegMosaic {
|
impl RegMosaic {
|
||||||
fn is_enabled_for_bg(&self) -> bool {
|
fn is_enabled_for_bg(&self) -> bool {
|
||||||
|
|
|
@ -278,7 +278,7 @@ impl Gpu {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_obj_pixel(&mut self, x: usize, y: usize, pixel_color: Rgb15, attrs: &ObjAttrs) {
|
fn write_obj_pixel(&mut self, x: usize, y: usize, pixel_color: Rgb15, attrs: &ObjAttrs) {
|
||||||
let mut current_obj = self.obj_buffer_get_mut(x, y);
|
let current_obj = self.obj_buffer_get_mut(x, y);
|
||||||
let obj_mode = attrs.0.objmode();
|
let obj_mode = attrs.0.objmode();
|
||||||
match obj_mode {
|
match obj_mode {
|
||||||
ObjMode::Normal | ObjMode::Sfx => {
|
ObjMode::Normal | ObjMode::Sfx => {
|
||||||
|
@ -315,7 +315,7 @@ pub enum ObjMode {
|
||||||
|
|
||||||
impl From<u16> for ObjMode {
|
impl From<u16> for ObjMode {
|
||||||
fn from(v: u16) -> ObjMode {
|
fn from(v: u16) -> ObjMode {
|
||||||
ObjMode::from_u16(v as u16).unwrap()
|
ObjMode::from_u16(v).unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ enum ObjType {
|
||||||
|
|
||||||
impl From<u16> for ObjType {
|
impl From<u16> for ObjType {
|
||||||
fn from(v: u16) -> ObjType {
|
fn from(v: u16) -> ObjType {
|
||||||
ObjType::from_u16(v as u16).unwrap()
|
ObjType::from_u16(v).unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,14 +37,14 @@ impl Gpu {
|
||||||
(256, 512) => bg_y / 256,
|
(256, 512) => bg_y / 256,
|
||||||
(512, 512) => index2d!(u32, bg_x / 256, bg_y / 256, 2),
|
(512, 512) => index2d!(u32, bg_x / 256, bg_y / 256, 2),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
} as u32;
|
};
|
||||||
|
|
||||||
let mut se_row = (bg_x / 8) % 32;
|
let mut se_row = (bg_x / 8) % 32;
|
||||||
let se_column = (bg_y / 8) % 32;
|
let se_column = (bg_y / 8) % 32;
|
||||||
|
|
||||||
// this will be non-zero if the h-scroll lands in a middle of a tile
|
// this will be non-zero if the h-scroll lands in a middle of a tile
|
||||||
let mut start_tile_x = bg_x % 8;
|
let mut start_tile_x = bg_x % 8;
|
||||||
let tile_py = (bg_y % 8) as u32;
|
let tile_py = bg_y % 8;
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
macro_rules! render_loop {
|
macro_rules! render_loop {
|
||||||
|
@ -98,8 +98,8 @@ impl Gpu {
|
||||||
let viewport = ViewPort::new(texture_size, texture_size);
|
let viewport = ViewPort::new(texture_size, texture_size);
|
||||||
|
|
||||||
let ref_point = self.get_ref_point(bg);
|
let ref_point = self.get_ref_point(bg);
|
||||||
let pa = self.bg_aff[bg - 2].pa as i16 as i32;
|
let pa = self.bg_aff[bg - 2].pa as i32;
|
||||||
let pc = self.bg_aff[bg - 2].pc as i16 as i32;
|
let pc = self.bg_aff[bg - 2].pc as i32;
|
||||||
|
|
||||||
let screen_block = self.bgcnt[bg].screen_block();
|
let screen_block = self.bgcnt[bg].screen_block();
|
||||||
let char_block = self.bgcnt[bg].char_block();
|
let char_block = self.bgcnt[bg].char_block();
|
||||||
|
|
|
@ -3,8 +3,6 @@ use std::cmp;
|
||||||
use arm7tdmi::memory::{Addr, BusIO, DebugRead};
|
use arm7tdmi::memory::{Addr, BusIO, DebugRead};
|
||||||
|
|
||||||
use super::dma::DmaController;
|
use super::dma::DmaController;
|
||||||
use super::gpu::regs::GpuMemoryMappedIO;
|
|
||||||
use super::gpu::regs::WindowFlags;
|
|
||||||
use super::gpu::*;
|
use super::gpu::*;
|
||||||
use super::interrupt::{InterruptConnect, InterruptController, SharedInterruptFlags};
|
use super::interrupt::{InterruptConnect, InterruptController, SharedInterruptFlags};
|
||||||
use super::keypad;
|
use super::keypad;
|
||||||
|
@ -109,22 +107,22 @@ impl BusIO for IoDevices {
|
||||||
REG_BG1CNT => io.gpu.bgcnt[1].read(),
|
REG_BG1CNT => io.gpu.bgcnt[1].read(),
|
||||||
REG_BG2CNT => io.gpu.bgcnt[2].read(),
|
REG_BG2CNT => io.gpu.bgcnt[2].read(),
|
||||||
REG_BG3CNT => io.gpu.bgcnt[3].read(),
|
REG_BG3CNT => io.gpu.bgcnt[3].read(),
|
||||||
REG_WIN0H => ((io.gpu.win0.left as u16) << 8 | (io.gpu.win0.right as u16)),
|
REG_WIN0H => (io.gpu.win0.left as u16) << 8 | (io.gpu.win0.right as u16),
|
||||||
REG_WIN1H => ((io.gpu.win1.left as u16) << 8 | (io.gpu.win1.right as u16)),
|
REG_WIN1H => (io.gpu.win1.left as u16) << 8 | (io.gpu.win1.right as u16),
|
||||||
REG_WIN0V => ((io.gpu.win0.top as u16) << 8 | (io.gpu.win0.bottom as u16)),
|
REG_WIN0V => (io.gpu.win0.top as u16) << 8 | (io.gpu.win0.bottom as u16),
|
||||||
REG_WIN1V => ((io.gpu.win1.top as u16) << 8 | (io.gpu.win1.bottom as u16)),
|
REG_WIN1V => (io.gpu.win1.top as u16) << 8 | (io.gpu.win1.bottom as u16),
|
||||||
REG_WININ => {
|
REG_WININ => {
|
||||||
((io.gpu.win1.flags.bits() as u16) << 8) | (io.gpu.win0.flags.bits() as u16)
|
(io.gpu.win1.flags.bits() << 8) | io.gpu.win0.flags.bits()
|
||||||
}
|
}
|
||||||
REG_WINOUT => {
|
REG_WINOUT => {
|
||||||
((io.gpu.winobj_flags.bits() as u16) << 8) | (io.gpu.winout_flags.bits() as u16)
|
(io.gpu.winobj_flags.bits() << 8) | io.gpu.winout_flags.bits()
|
||||||
}
|
}
|
||||||
REG_BLDCNT => io.gpu.bldcnt.read(),
|
REG_BLDCNT => io.gpu.bldcnt.read(),
|
||||||
REG_BLDALPHA => io.gpu.bldalpha.read(),
|
REG_BLDALPHA => io.gpu.bldalpha.read(),
|
||||||
|
|
||||||
REG_IME => io.intc.interrupt_master_enable as u16,
|
REG_IME => io.intc.interrupt_master_enable as u16,
|
||||||
REG_IE => io.intc.interrupt_enable.0 as u16,
|
REG_IE => io.intc.interrupt_enable.0,
|
||||||
REG_IF => io.intc.interrupt_flags.get().value() as u16,
|
REG_IF => io.intc.interrupt_flags.get().value(),
|
||||||
|
|
||||||
REG_TM0CNT_L..=REG_TM3CNT_H => io.timers.handle_read(io_addr, &io.scheduler),
|
REG_TM0CNT_L..=REG_TM3CNT_H => io.timers.handle_read(io_addr, &io.scheduler),
|
||||||
|
|
||||||
|
@ -170,7 +168,7 @@ impl BusIO for IoDevices {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_16(&mut self, addr: Addr, value: u16) {
|
fn write_16(&mut self, addr: Addr, value: u16) {
|
||||||
let mut io = self;
|
let io = self;
|
||||||
// if addr > 0x0800 {
|
// if addr > 0x0800 {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
@ -310,11 +308,11 @@ impl BusIO for IoDevices {
|
||||||
fn write_8(&mut self, addr: Addr, value: u8) {
|
fn write_8(&mut self, addr: Addr, value: u8) {
|
||||||
match addr + IO_BASE {
|
match addr + IO_BASE {
|
||||||
/* FIFO_A */
|
/* FIFO_A */
|
||||||
0x0400_00A0 | 0x0400_00A1 | 0x0400_00A2 | 0x0400_00A3 => {
|
0x0400_00A0..=0x0400_00A3 => {
|
||||||
self.sound.write_fifo(0, value as i8)
|
self.sound.write_fifo(0, value as i8)
|
||||||
}
|
}
|
||||||
/* FIFO_B */
|
/* FIFO_B */
|
||||||
0x0400_00A4 | 0x0400_00A5 | 0x0400_00A6 | 0x0400_00A7 => {
|
0x0400_00A4..=0x0400_00A7 => {
|
||||||
self.sound.write_fifo(1, value as i8)
|
self.sound.write_fifo(1, value as i8)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -588,5 +586,5 @@ pub fn io_reg_string(addr: u32) -> &'static str {
|
||||||
|
|
||||||
fn sign_extend_i32(value: i32, size: u32) -> i32 {
|
fn sign_extend_i32(value: i32, size: u32) -> i32 {
|
||||||
let shift = 32 - size;
|
let shift = 32 - size;
|
||||||
((value << shift) as i32) >> shift
|
(value << shift) >> shift
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,9 +23,9 @@ pub enum KeyState {
|
||||||
Released = 1,
|
Released = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<bool> for KeyState {
|
impl From<KeyState> for bool {
|
||||||
fn into(self) -> bool {
|
fn from(val: KeyState) -> Self {
|
||||||
match self {
|
match val {
|
||||||
KeyState::Pressed => false,
|
KeyState::Pressed => false,
|
||||||
KeyState::Released => true,
|
KeyState::Released => true,
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,12 @@ pub struct DebugPort {
|
||||||
debug_string: Box<[u8]>,
|
debug_string: Box<[u8]>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for DebugPort {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl DebugPort {
|
impl DebugPort {
|
||||||
pub fn new() -> DebugPort {
|
pub fn new() -> DebugPort {
|
||||||
DebugPort {
|
DebugPort {
|
||||||
|
|
|
@ -67,7 +67,7 @@ impl Ord for Event {
|
||||||
impl PartialOrd for Event {
|
impl PartialOrd for Event {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||||
other.time.partial_cmp(&self.time)
|
Some(self.cmp(other))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -108,6 +108,12 @@ pub struct Scheduler {
|
||||||
|
|
||||||
pub type SharedScheduler = Shared<Scheduler>;
|
pub type SharedScheduler = Shared<Scheduler>;
|
||||||
|
|
||||||
|
impl Default for Scheduler {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Scheduler {
|
impl Scheduler {
|
||||||
pub fn new() -> Scheduler {
|
pub fn new() -> Scheduler {
|
||||||
Scheduler {
|
Scheduler {
|
||||||
|
|
|
@ -58,6 +58,6 @@ impl AudioInterface for NullAudio {}
|
||||||
|
|
||||||
impl NullAudio {
|
impl NullAudio {
|
||||||
pub fn new() -> Box<NullAudio> {
|
pub fn new() -> Box<NullAudio> {
|
||||||
Box::new(NullAudio::default())
|
Box::<NullAudio>::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ use super::cartridge::Cartridge;
|
||||||
use super::dma::DmaNotifer;
|
use super::dma::DmaNotifer;
|
||||||
use super::iodev::{IoDevices, WaitControl};
|
use super::iodev::{IoDevices, WaitControl};
|
||||||
use super::sched::*;
|
use super::sched::*;
|
||||||
use arm7tdmi::{self, Arm7tdmiCore};
|
use arm7tdmi::{Arm7tdmiCore};
|
||||||
use rustboyadvance_utils::{Shared, WeakPointer};
|
use rustboyadvance_utils::{Shared, WeakPointer};
|
||||||
|
|
||||||
pub mod consts {
|
pub mod consts {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use sdl2::controller::Button;
|
use sdl2::controller::Button;
|
||||||
use sdl2::event::Event;
|
use sdl2::event::Event;
|
||||||
use sdl2::keyboard::Scancode;
|
use sdl2::keyboard::Scancode;
|
||||||
use sdl2::{self};
|
|
||||||
|
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
|
|
Reference in a new issue