diff --git a/agb/src/display/tiled/map.rs b/agb/src/display/tiled/map.rs index ce32312..c38bc29 100644 --- a/agb/src/display/tiled/map.rs +++ b/agb/src/display/tiled/map.rs @@ -3,6 +3,7 @@ use core::ops::{Deref, DerefMut}; use crate::bitarray::Bitarray; use crate::display::{self, Priority, DISPLAY_CONTROL}; +use crate::dma::dma_copy; use crate::fixnum::Vector2D; use crate::memory_mapped::MemoryMapped; @@ -190,28 +191,3 @@ fn div_ceil(x: i32, y: i32) -> i32 { x / y } } - -const fn dma_source_addr(dma: usize) -> usize { - 0x0400_00b0 + 0x0c * dma -} - -const fn dma_dest_addr(dma: usize) -> usize { - 0x0400_00b4 + 0x0c * dma -} - -const fn dma_control_addr(dma: usize) -> usize { - 0x0400_00b8 + 0x0c * dma -} - -const DMA3_SOURCE_ADDR: MemoryMapped = unsafe { MemoryMapped::new(dma_source_addr(3)) }; -const DMA3_DEST_ADDR: MemoryMapped = unsafe { MemoryMapped::new(dma_dest_addr(3)) }; -const DMA3_CONTROL: MemoryMapped = unsafe { MemoryMapped::new(dma_control_addr(3)) }; - -unsafe fn dma_copy(src: *const u16, dest: *mut u16, count: usize) { - assert!(count < u16::MAX as usize); - - DMA3_SOURCE_ADDR.set(src as u32); - DMA3_DEST_ADDR.set(dest as u32); - - DMA3_CONTROL.set(count as u32 | (1 << 31)); -} diff --git a/agb/src/display/tiled/vram_manager.rs b/agb/src/display/tiled/vram_manager.rs index 6253da7..0442751 100644 --- a/agb/src/display/tiled/vram_manager.rs +++ b/agb/src/display/tiled/vram_manager.rs @@ -3,6 +3,7 @@ use alloc::vec::Vec; use crate::{ display::palette16, + dma::dma_copy, memory_mapped::{MemoryMapped, MemoryMapped1DArray}, }; @@ -291,28 +292,3 @@ impl<'a> VRamManager<'a> { } } } - -const fn dma_source_addr(dma: usize) -> usize { - 0x0400_00b0 + 0x0c * dma -} - -const fn dma_dest_addr(dma: usize) -> usize { - 0x0400_00b4 + 0x0c * dma -} - -const fn dma_control_addr(dma: usize) -> usize { - 0x0400_00b8 + 0x0c * dma -} - -const DMA3_SOURCE_ADDR: MemoryMapped = unsafe { MemoryMapped::new(dma_source_addr(3)) }; -const DMA3_DEST_ADDR: MemoryMapped = unsafe { MemoryMapped::new(dma_dest_addr(3)) }; -const DMA3_CONTROL: MemoryMapped = unsafe { MemoryMapped::new(dma_control_addr(3)) }; - -unsafe fn dma_copy(src: *const u16, dest: *mut u16, count: usize) { - assert!(count < u16::MAX as usize); - - DMA3_SOURCE_ADDR.set(src as u32); - DMA3_DEST_ADDR.set(dest as u32); - - DMA3_CONTROL.set(count as u32 | (1 << 31)); -} diff --git a/agb/src/dma.rs b/agb/src/dma.rs new file mode 100644 index 0000000..a7c9c6d --- /dev/null +++ b/agb/src/dma.rs @@ -0,0 +1,26 @@ +use crate::memory_mapped::MemoryMapped; + +const fn dma_source_addr(dma: usize) -> usize { + 0x0400_00b0 + 0x0c * dma +} + +const fn dma_dest_addr(dma: usize) -> usize { + 0x0400_00b4 + 0x0c * dma +} + +const fn dma_control_addr(dma: usize) -> usize { + 0x0400_00b8 + 0x0c * dma +} + +const DMA3_SOURCE_ADDR: MemoryMapped = unsafe { MemoryMapped::new(dma_source_addr(3)) }; +const DMA3_DEST_ADDR: MemoryMapped = unsafe { MemoryMapped::new(dma_dest_addr(3)) }; +const DMA3_CONTROL: MemoryMapped = unsafe { MemoryMapped::new(dma_control_addr(3)) }; + +pub(crate) unsafe fn dma_copy(src: *const u16, dest: *mut u16, count: usize) { + assert!(count < u16::MAX as usize); + + DMA3_SOURCE_ADDR.set(src as u32); + DMA3_DEST_ADDR.set(dest as u32); + + DMA3_CONTROL.set(count as u32 | (1 << 31)); +} diff --git a/agb/src/lib.rs b/agb/src/lib.rs index db1e0c5..86a5443 100644 --- a/agb/src/lib.rs +++ b/agb/src/lib.rs @@ -142,6 +142,7 @@ mod arena; mod bitarray; /// Implements everything relating to things that are displayed on screen. pub mod display; +mod dma; /// Button inputs to the system. pub mod input; #[doc(hidden)] // hide for now as the implementation in here is unsound