Custom assembly as thumb

This commit is contained in:
Gwilym Inzani 2023-09-06 00:21:27 +01:00
parent e504b93fe3
commit 77445b304f
4 changed files with 26 additions and 42 deletions

View file

@ -131,7 +131,7 @@ pub(crate) fn generate_code(
pub bytes: Bytes, pub bytes: Bytes,
} }
const ALIGNED: &AlignedAs<u16, [u8]> = &AlignedAs { const ALIGNED: &AlignedAs<u32, [u8]> = &AlignedAs {
_align: [], _align: [],
bytes: *#data, bytes: *#data,
}; };

View file

@ -1,27 +0,0 @@
agb_arm_func copy_tile_8bpp
@ Arguments
@ r0 - pointer to the image data beginning
@ r1 - pointer to the target in vram
push {{r4-r8}}
.rept 2
ldmia r0!, {{r2-r8, r12}}
stmia r1!, {{r2-r8, r12}}
.endr
pop {{r4-r8}}
bx lr
agb_arm_end copy_tile_8bpp
agb_arm_func copy_tile_4bpp
@ Arguments
@ r0 - pointer to the image data beginning
@ r1 - pointer to the target in vram
push {{r4-r8}}
ldmia r0!, {{r2-r8, r12}}
stmia r1!, {{r2-r8, r12}}
pop {{r4-r8}}
bx lr
agb_arm_end copy_tile_4bpp

View file

@ -29,9 +29,10 @@ const fn layout_of(format: TileFormat) -> Layout {
} }
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum TileFormat { pub enum TileFormat {
FourBpp, FourBpp = 0,
EightBpp, EightBpp = 1,
} }
impl TileFormat { impl TileFormat {
@ -376,17 +377,33 @@ impl VRamManager {
tile_id: u16, tile_id: u16,
tile_reference: TileReference, tile_reference: TileReference,
) { ) {
let tile_size = tile_set.format.tile_size(); let tile_format = tile_set.format;
let tile_size = tile_format.tile_size();
let tile_offset = (tile_id as usize) * tile_size; let tile_offset = (tile_id as usize) * tile_size;
let tile_slice = &tile_set.tiles[tile_offset..(tile_offset + tile_size)]; let tile_data_start = unsafe { tile_set.tiles.as_ptr().add(tile_offset) };
let target_location = tile_reference.0.as_ptr() as *mut _; let target_location = tile_reference.0.as_ptr() as *mut _;
unsafe { unsafe {
match tile_set.format { core::arch::asm!(
TileFormat::FourBpp => copy_tile_4bpp(tile_slice.as_ptr().cast(), target_location), "cmp r2, #0",
TileFormat::EightBpp => copy_tile_8bpp(tile_slice.as_ptr().cast(), target_location), "beq 1f",
} "ldmia r0!, {{r2-r5}}",
"stmia r1!, {{r2-r5}}",
"ldmia r0!, {{r2-r5}}",
"stmia r1!, {{r2-r5}}",
"1:",
"ldmia r0!, {{r2-r5}}",
"stmia r1!, {{r2-r5}}",
"ldmia r0!, {{r2-r5}}",
"stmia r1!, {{r2-r5}}",
inout("r0") tile_data_start => _,
inout("r1") target_location => _,
inout("r2") tile_format as u32 => _,
out("r3") _,
out("r4") _,
out("r5") _,
);
} }
} }
@ -410,8 +427,3 @@ impl VRamManager {
} }
} }
} }
extern "C" {
fn copy_tile_4bpp(src: *const u32, dest: *mut u32);
fn copy_tile_8bpp(src: *const u32, dest: *mut u32);
}

View file

@ -6,4 +6,3 @@ global_asm!(include_str!("crt0.s"));
global_asm!(include_str!("interrupt_handler.s")); global_asm!(include_str!("interrupt_handler.s"));
global_asm!(include_str!("sound/mixer/mixer.s")); global_asm!(include_str!("sound/mixer/mixer.s"));
global_asm!(include_str!("save/asm_routines.s")); global_asm!(include_str!("save/asm_routines.s"));
global_asm!(include_str!("display/tiled/tile_copy.s"));