Refactor core functionality into a separate module
Former-commit-id: 5d55b9eb0b63ed7c61465b4e814782165caa5002
This commit is contained in:
parent
0f73abaf98
commit
53115a9a58
|
@ -5,11 +5,11 @@ use clap::{App, ArgMatches};
|
|||
|
||||
extern crate rustboyadvance_ng;
|
||||
|
||||
use rustboyadvance_ng::arm7tdmi::Core;
|
||||
use rustboyadvance_ng::cartridge::Cartridge;
|
||||
use rustboyadvance_ng::debugger::Debugger;
|
||||
use rustboyadvance_ng::core::arm7tdmi::Core;
|
||||
use rustboyadvance_ng::core::cartridge::Cartridge;
|
||||
use rustboyadvance_ng::core::{GBAResult, GameBoyAdvance};
|
||||
use rustboyadvance_ng::util::read_bin_file;
|
||||
use rustboyadvance_ng::{GBAResult, GameBoyAdvance};
|
||||
use rustboyadvance_ng::debugger::Debugger;
|
||||
|
||||
fn run_debug(matches: &ArgMatches) -> GBAResult<()> {
|
||||
let skip_bios = match matches.occurrences_of("skip_bios") {
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::fmt;
|
|||
use crate::bit::BitIndex;
|
||||
|
||||
use super::{AluOpCode, ArmCond, ArmFormat, ArmHalfwordTransferType, ArmInstruction};
|
||||
use crate::arm7tdmi::{
|
||||
use crate::core::arm7tdmi::{
|
||||
psr::RegPSR, reg_string, Addr, BarrelShiftOpCode, BarrelShifterValue, ShiftedRegister, REG_PC,
|
||||
};
|
||||
|
|
@ -1,11 +1,13 @@
|
|||
use crate::bit::BitIndex;
|
||||
|
||||
use crate::arm7tdmi::alu::*;
|
||||
use crate::arm7tdmi::bus::Bus;
|
||||
use crate::arm7tdmi::cpu::{Core, CpuExecResult};
|
||||
use crate::arm7tdmi::exception::Exception;
|
||||
use crate::arm7tdmi::psr::RegPSR;
|
||||
use crate::arm7tdmi::{Addr, CpuError, CpuMode, CpuResult, CpuState, DecodedInstruction, REG_PC};
|
||||
use crate::core::arm7tdmi::alu::*;
|
||||
use crate::core::arm7tdmi::bus::Bus;
|
||||
use crate::core::arm7tdmi::cpu::{Core, CpuExecResult};
|
||||
use crate::core::arm7tdmi::exception::Exception;
|
||||
use crate::core::arm7tdmi::psr::RegPSR;
|
||||
use crate::core::arm7tdmi::{
|
||||
Addr, CpuError, CpuMode, CpuResult, CpuState, DecodedInstruction, REG_PC,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
|
|
@ -2,7 +2,7 @@ pub mod display;
|
|||
pub mod exec;
|
||||
|
||||
use super::alu::*;
|
||||
use crate::arm7tdmi::{Addr, InstructionDecoder, InstructionDecoderError};
|
||||
use crate::core::arm7tdmi::{Addr, InstructionDecoder, InstructionDecoderError};
|
||||
|
||||
use crate::bit::BitIndex;
|
||||
use crate::byteorder::{LittleEndian, ReadBytesExt};
|
||||
|
@ -351,7 +351,7 @@ impl ArmInstruction {
|
|||
/// All instructions constants were generated using an ARM assembler.
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::arm7tdmi::*;
|
||||
use crate::core::arm7tdmi::*;
|
||||
use crate::sysbus::BoxedMemory;
|
||||
|
||||
#[test]
|
|
@ -3,7 +3,7 @@ use std::fmt;
|
|||
use crate::bit::BitIndex;
|
||||
|
||||
use super::*;
|
||||
use crate::arm7tdmi::*;
|
||||
use crate::core::arm7tdmi::*;
|
||||
|
||||
impl ThumbInstruction {
|
||||
fn fmt_thumb_move_shifted_reg(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
@ -1,6 +1,6 @@
|
|||
use crate::arm7tdmi::bus::Bus;
|
||||
use crate::arm7tdmi::cpu::{Core, CpuExecResult};
|
||||
use crate::arm7tdmi::*;
|
||||
use crate::core::arm7tdmi::bus::Bus;
|
||||
use crate::core::arm7tdmi::cpu::{Core, CpuExecResult};
|
||||
use crate::core::arm7tdmi::*;
|
||||
|
||||
use super::*;
|
||||
fn push(cpu: &mut Core, bus: &mut Bus, r: usize) {
|
|
@ -348,7 +348,7 @@ impl ThumbInstruction {
|
|||
/// All instructions constants were generated using an ARM assembler.
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::arm7tdmi::{Core, Bus};
|
||||
use crate::core::arm7tdmi::{Bus, Core};
|
||||
use crate::sysbus::BoxedMemory;
|
||||
|
||||
#[test]
|
|
@ -2,13 +2,12 @@ use std::str::from_utf8;
|
|||
|
||||
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
||||
|
||||
use crate::arm7tdmi::{
|
||||
use super::arm7tdmi::{
|
||||
bus::{Bus, MemoryAccess, MemoryAccessWidth},
|
||||
Addr,
|
||||
};
|
||||
use crate::sysbus::WaitState;
|
||||
use super::sysbus::WaitState;
|
||||
use crate::util::read_bin_file;
|
||||
use crate::GBAError;
|
||||
|
||||
/// From GBATEK
|
||||
///
|
||||
|
@ -79,7 +78,7 @@ pub struct Cartridge {
|
|||
impl Cartridge {
|
||||
const MIN_SIZE: usize = 4 * 1024 * 1024;
|
||||
|
||||
pub fn load(path: &str) -> Result<Cartridge, GBAError> {
|
||||
pub fn load(path: &str) -> Result<Cartridge, ::std::io::Error> {
|
||||
let mut rom_bin = read_bin_file(path)?;
|
||||
if rom_bin.len() < Cartridge::MIN_SIZE {
|
||||
rom_bin.resize_with(Cartridge::MIN_SIZE, Default::default);
|
|
@ -7,8 +7,8 @@ use super::gpu::*;
|
|||
use super::interrupt::*;
|
||||
use super::ioregs::consts::*;
|
||||
use super::sysbus::SysBus;
|
||||
|
||||
use super::{EmuIoDev, GBAError, GBAResult};
|
||||
use super::EmuIoDev;
|
||||
use super::{GBAError, GBAResult};
|
||||
|
||||
pub struct GameBoyAdvance {
|
||||
pub cpu: Core,
|
|
@ -145,7 +145,7 @@ use GpuState::*;
|
|||
|
||||
pub struct Gpu {
|
||||
cycles: usize,
|
||||
pub pixeldata: [Rgb15; 256 * 256],
|
||||
pub pixeldata: [Rgb15; 512 * 512],
|
||||
pub state: GpuState,
|
||||
pub current_scanline: usize, // VCOUNT
|
||||
}
|
||||
|
@ -168,7 +168,7 @@ impl Gpu {
|
|||
state: HDraw,
|
||||
current_scanline: 0,
|
||||
cycles: 0,
|
||||
pixeldata: [Rgb15::from(0); 256 * 256],
|
||||
pixeldata: [Rgb15::from(0); 512 * 512],
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -300,7 +300,7 @@ impl Gpu {
|
|||
self.get_palette_color(sysbus, index as u32, 0)
|
||||
}
|
||||
};
|
||||
self.pixeldata[((px + tile_x) as usize) + py * 256] = color;
|
||||
self.pixeldata[((px + tile_x) as usize) + py * 512] = color;
|
||||
}
|
||||
px += 8;
|
||||
if px == bgcnt.screen_width as u32 {
|
||||
|
@ -313,7 +313,7 @@ impl Gpu {
|
|||
let page: u32 = match dispcnt.display_frame {
|
||||
0 => 0x0600_0000,
|
||||
1 => 0x0600_a000,
|
||||
_ => unreachable!()
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let y = self.current_scanline;
|
||||
|
@ -322,7 +322,7 @@ impl Gpu {
|
|||
let bitmap_index = x + y * Self::DISPLAY_WIDTH;
|
||||
let bitmap_addr = page + (bitmap_index as u32);
|
||||
let index = sysbus.read_8(bitmap_addr as Addr) as u32;
|
||||
self.pixeldata[x + y * 256] = self.get_palette_color(sysbus, index, 0);
|
||||
self.pixeldata[x + y * 512] = self.get_palette_color(sysbus, index, 0);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ use std::io;
|
|||
|
||||
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
||||
|
||||
use crate::arm7tdmi::{Addr, Bus, MemoryAccess};
|
||||
use crate::core::arm7tdmi::{Addr, Bus, MemoryAccess};
|
||||
|
||||
pub mod consts {
|
||||
use super::*;
|
45
src/core/mod.rs
Normal file
45
src/core/mod.rs
Normal file
|
@ -0,0 +1,45 @@
|
|||
pub mod arm7tdmi;
|
||||
pub mod cartridge;
|
||||
pub mod gpu;
|
||||
pub mod sysbus;
|
||||
pub use sysbus::SysBus;
|
||||
pub mod interrupt;
|
||||
pub mod ioregs;
|
||||
pub use interrupt::Interrupt;
|
||||
pub mod gba;
|
||||
pub use gba::GameBoyAdvance;
|
||||
pub mod dma;
|
||||
pub mod palette;
|
||||
|
||||
use crate::debugger;
|
||||
|
||||
pub trait EmuIoDev {
|
||||
fn step(&mut self, cycles: usize, sysbus: &mut SysBus) -> (usize, Option<Interrupt>);
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum GBAError {
|
||||
IO(::std::io::Error),
|
||||
CpuError(arm7tdmi::CpuError),
|
||||
DebuggerError(debugger::DebuggerError),
|
||||
}
|
||||
|
||||
pub type GBAResult<T> = Result<T, GBAError>;
|
||||
|
||||
impl From<::std::io::Error> for GBAError {
|
||||
fn from(err: ::std::io::Error) -> GBAError {
|
||||
GBAError::IO(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<arm7tdmi::CpuError> for GBAError {
|
||||
fn from(err: arm7tdmi::CpuError) -> GBAError {
|
||||
GBAError::CpuError(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<debugger::DebuggerError> for GBAError {
|
||||
fn from(err: debugger::DebuggerError) -> GBAError {
|
||||
GBAError::DebuggerError(err)
|
||||
}
|
||||
}
|
|
@ -1,9 +1,11 @@
|
|||
use crate::arm7tdmi::bus::Bus;
|
||||
use crate::arm7tdmi::{Addr, CpuState};
|
||||
use crate::core::arm7tdmi::arm::ArmInstruction;
|
||||
use crate::core::arm7tdmi::bus::Bus;
|
||||
use crate::core::arm7tdmi::thumb::ThumbInstruction;
|
||||
use crate::core::arm7tdmi::{Addr, CpuState};
|
||||
use crate::core::gpu::*;
|
||||
use crate::core::ioregs::consts::*;
|
||||
use crate::core::GBAError;
|
||||
use crate::disass::Disassembler;
|
||||
use crate::ioregs::consts::*;
|
||||
use crate::gpu::*;
|
||||
use crate::GBAError;
|
||||
|
||||
use super::palette_view::create_palette_view;
|
||||
use super::render_view::create_render_view;
|
||||
|
@ -137,9 +139,6 @@ impl Command {
|
|||
hexdump::hexdump(&bytes[0..nbytes]);
|
||||
}
|
||||
Disass(mode, addr, n) => {
|
||||
use crate::arm7tdmi::arm::ArmInstruction;
|
||||
use crate::arm7tdmi::thumb::ThumbInstruction;
|
||||
|
||||
let bytes = debugger.gba.sysbus.get_bytes(addr);
|
||||
match mode {
|
||||
DisassMode::ModeArm => {
|
||||
|
|
|
@ -3,8 +3,8 @@ use rustyline::Editor;
|
|||
|
||||
use colored::*;
|
||||
|
||||
use super::arm7tdmi::{Addr, Bus, CpuError};
|
||||
use super::GameBoyAdvance;
|
||||
use super::core::arm7tdmi::{Addr, Bus, CpuError};
|
||||
use super::core::GameBoyAdvance;
|
||||
|
||||
mod parser;
|
||||
use parser::{parse_expr, DerefType, Expr, Value};
|
||||
|
|
|
@ -3,7 +3,7 @@ use sdl2::pixels::Color;
|
|||
use sdl2::rect::{Point, Rect};
|
||||
use sdl2::render::Canvas;
|
||||
|
||||
use super::super::palette::{Palette, Rgb15};
|
||||
use crate::core::palette::{Palette, Rgb15};
|
||||
|
||||
const PALETTE_RECT_WIDTH: u32 = 20;
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ use sdl2::event::Event;
|
|||
use sdl2::pixels::Color;
|
||||
use sdl2::rect::Point;
|
||||
|
||||
use crate::gba::GameBoyAdvance;
|
||||
use crate::gpu::Gpu;
|
||||
use crate::core::gba::GameBoyAdvance;
|
||||
use crate::core::gpu::Gpu;
|
||||
|
||||
const SCREEN_WIDTH: u32 = Gpu::DISPLAY_WIDTH as u32;
|
||||
const SCREEN_HEIGHT: u32 = Gpu::DISPLAY_HEIGHT as u32;
|
||||
|
@ -39,7 +39,7 @@ pub fn create_render_view(gba: &GameBoyAdvance) {
|
|||
|
||||
for y in 0..Gpu::DISPLAY_HEIGHT {
|
||||
for x in 0..Gpu::DISPLAY_WIDTH {
|
||||
let index = (x as usize) + (y as usize) * (256 as usize);
|
||||
let index = (x as usize) + (y as usize) * (512 as usize);
|
||||
let color = gba.gpu.pixeldata[index];
|
||||
let rgb24: Color = color.into();
|
||||
canvas.set_draw_color(rgb24);
|
||||
|
|
|
@ -5,12 +5,12 @@ use sdl2::pixels::Color;
|
|||
use sdl2::rect::{Point, Rect};
|
||||
use sdl2::render::Canvas;
|
||||
|
||||
use crate::arm7tdmi::bus::Bus;
|
||||
use crate::gba::GameBoyAdvance;
|
||||
use crate::ioregs::consts::*;
|
||||
use crate::gpu::*;
|
||||
use crate::palette::*;
|
||||
use crate::sysbus::SysBus;
|
||||
use crate::core::arm7tdmi::bus::Bus;
|
||||
use crate::core::gba::GameBoyAdvance;
|
||||
use crate::core::gpu::*;
|
||||
use crate::core::ioregs::consts::*;
|
||||
use crate::core::palette::*;
|
||||
use crate::core::sysbus::SysBus;
|
||||
|
||||
impl Into<Color> for Rgb15 {
|
||||
fn into(self) -> Color {
|
||||
|
@ -100,7 +100,6 @@ pub fn create_tile_view(bg: u32, gba: &GameBoyAdvance) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
canvas.set_draw_color(Color::RGB(00, 00, 00));
|
||||
canvas.clear();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use std::marker::PhantomData;
|
||||
|
||||
use super::arm7tdmi::{Addr, InstructionDecoder, InstructionDecoderError};
|
||||
use super::core::arm7tdmi::{Addr, InstructionDecoder, InstructionDecoderError};
|
||||
use std::io::ErrorKind;
|
||||
|
||||
pub struct Disassembler<'a, D>
|
||||
|
|
44
src/lib.rs
44
src/lib.rs
|
@ -14,49 +14,7 @@ extern crate nom;
|
|||
extern crate ansi_term;
|
||||
extern crate colored; // not needed in Rust 2018
|
||||
|
||||
pub mod arm7tdmi;
|
||||
pub mod cartridge;
|
||||
pub mod core;
|
||||
pub mod debugger;
|
||||
pub mod disass;
|
||||
pub mod gpu;
|
||||
pub mod sysbus;
|
||||
pub use sysbus::SysBus;
|
||||
pub mod interrupt;
|
||||
pub mod ioregs;
|
||||
pub use interrupt::Interrupt;
|
||||
pub mod gba;
|
||||
pub use gba::GameBoyAdvance;
|
||||
pub mod dma;
|
||||
pub mod palette;
|
||||
pub mod util;
|
||||
|
||||
pub trait EmuIoDev {
|
||||
fn step(&mut self, cycles: usize, sysbus: &mut SysBus) -> (usize, Option<Interrupt>);
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum GBAError {
|
||||
IO(::std::io::Error),
|
||||
CpuError(arm7tdmi::CpuError),
|
||||
DebuggerError(debugger::DebuggerError),
|
||||
}
|
||||
|
||||
pub type GBAResult<T> = Result<T, GBAError>;
|
||||
|
||||
impl From<::std::io::Error> for GBAError {
|
||||
fn from(err: ::std::io::Error) -> GBAError {
|
||||
GBAError::IO(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<arm7tdmi::CpuError> for GBAError {
|
||||
fn from(err: arm7tdmi::CpuError) -> GBAError {
|
||||
GBAError::CpuError(err)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<debugger::DebuggerError> for GBAError {
|
||||
fn from(err: debugger::DebuggerError) -> GBAError {
|
||||
GBAError::DebuggerError(err)
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue