mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-24 00:31:34 +11:00
Compile agbabi into agb
This commit is contained in:
parent
149d2ec76b
commit
601360ca67
|
@ -1,7 +1,13 @@
|
||||||
use std::path;
|
use std::path;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let asm = &["crt0.s", "interrupt_handler.s", "src/sound/mixer/mixer.s"];
|
let asm = &[
|
||||||
|
"crt0.s",
|
||||||
|
"interrupt_handler.s",
|
||||||
|
"src/sound/mixer/mixer.s",
|
||||||
|
"src/agbabi/memset.s",
|
||||||
|
"src/agbabi/memcpy.s",
|
||||||
|
];
|
||||||
|
|
||||||
println!("cargo:rerun-if-changed=gba.ld");
|
println!("cargo:rerun-if-changed=gba.ld");
|
||||||
println!("cargo:rerun-if-changed=gba_mb.ld");
|
println!("cargo:rerun-if-changed=gba_mb.ld");
|
||||||
|
|
115
agb/src/agbabi/memcpy.s
Normal file
115
agb/src/agbabi/memcpy.s
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
ABI:
|
||||||
|
__aeabi_memcpy, __aeabi_memcpy4, __aeabi_memcpy8
|
||||||
|
Standard:
|
||||||
|
memcpy
|
||||||
|
Support:
|
||||||
|
__agbabi_memcpy2
|
||||||
|
|
||||||
|
Copyright (C) 2021-2022 agbabi contributors
|
||||||
|
For conditions of distribution and use, see copyright notice in LICENSE.md
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
.arm
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
.section .iwram.__aeabi_memcpy, "ax", %progbits
|
||||||
|
.global __agbabi_memcpy
|
||||||
|
__agbabi_memcpy:
|
||||||
|
.global __aeabi_memcpy
|
||||||
|
__aeabi_memcpy:
|
||||||
|
// Check pointer alignment
|
||||||
|
eor r3, r1, r0
|
||||||
|
// JoaoBapt carry & sign bit test
|
||||||
|
movs r3, r3, lsl #31
|
||||||
|
bmi .Lcopy1
|
||||||
|
bcs .Lcopy2
|
||||||
|
|
||||||
|
.Lcopy4:
|
||||||
|
// Copy half and byte head
|
||||||
|
rsb r3, r0, #4
|
||||||
|
movs r3, r3, lsl #31
|
||||||
|
ldrmib r3, [r1], #1
|
||||||
|
strmib r3, [r0], #1
|
||||||
|
submi r2, r2, #1
|
||||||
|
ldrcsh r3, [r1], #2
|
||||||
|
strcsh r3, [r0], #2
|
||||||
|
subcs r2, r2, #2
|
||||||
|
// Fallthrough
|
||||||
|
|
||||||
|
.global __aeabi_memcpy8
|
||||||
|
__aeabi_memcpy8:
|
||||||
|
.global __aeabi_memcpy4
|
||||||
|
__aeabi_memcpy4:
|
||||||
|
// Copy 8 words
|
||||||
|
movs r12, r2, lsr #5
|
||||||
|
beq .Lskip32
|
||||||
|
lsl r3, r12, #5
|
||||||
|
sub r2, r2, r3
|
||||||
|
push {r4-r10}
|
||||||
|
.LcopyWords8:
|
||||||
|
ldmia r1!, {r3-r10}
|
||||||
|
stmia r0!, {r3-r10}
|
||||||
|
subs r12, r12, #1
|
||||||
|
bne .LcopyWords8
|
||||||
|
pop {r4-r10}
|
||||||
|
.Lskip32:
|
||||||
|
|
||||||
|
// Copy words
|
||||||
|
movs r12, r2, lsr #2
|
||||||
|
.LcopyWords:
|
||||||
|
subs r12, r12, #1
|
||||||
|
ldrhs r3, [r1], #4
|
||||||
|
strhs r3, [r0], #4
|
||||||
|
bhs .LcopyWords
|
||||||
|
|
||||||
|
// Copy half and byte tail
|
||||||
|
movs r3, r2, lsl #31
|
||||||
|
ldrcsh r3, [r1], #2
|
||||||
|
strcsh r3, [r0], #2
|
||||||
|
ldrmib r3, [r1]
|
||||||
|
strmib r3, [r0]
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.Lcopy2:
|
||||||
|
// Copy byte head
|
||||||
|
tst r0, #1
|
||||||
|
ldrneb r3, [r1], #1
|
||||||
|
strneb r3, [r0], #1
|
||||||
|
subne r2, r2, #1
|
||||||
|
// Fallthrough
|
||||||
|
|
||||||
|
.global __agbabi_memcpy2
|
||||||
|
__agbabi_memcpy2:
|
||||||
|
// Copy halves
|
||||||
|
movs r12, r2, lsr #1
|
||||||
|
.LcopyHalves:
|
||||||
|
subs r12, r12, #1
|
||||||
|
ldrhsh r3, [r1], #2
|
||||||
|
strhsh r3, [r0], #2
|
||||||
|
bhs .LcopyHalves
|
||||||
|
|
||||||
|
// Copy byte tail
|
||||||
|
tst r2, #1
|
||||||
|
ldrneb r3, [r1]
|
||||||
|
strneb r3, [r0]
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.Lcopy1:
|
||||||
|
subs r2, r2, #1
|
||||||
|
ldrhsb r3, [r1], #1
|
||||||
|
strhsb r3, [r0], #1
|
||||||
|
bhs .Lcopy1
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.section .iwram.memcpy, "ax", %progbits
|
||||||
|
.global memcpy
|
||||||
|
memcpy:
|
||||||
|
push {r0, lr}
|
||||||
|
bl __aeabi_memcpy
|
||||||
|
pop {r0, lr}
|
||||||
|
bx lr
|
107
agb/src/agbabi/memset.s
Normal file
107
agb/src/agbabi/memset.s
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
ABI:
|
||||||
|
__aeabi_memset, __aeabi_memset4, __aeabi_memset8,
|
||||||
|
__aeabi_memclr, __aeabi_memclr4, __aeabi_memclr8
|
||||||
|
Standard:
|
||||||
|
memset
|
||||||
|
Support:
|
||||||
|
__agbabi_wordset4
|
||||||
|
|
||||||
|
Copyright (C) 2021-2022 agbabi contributors
|
||||||
|
For conditions of distribution and use, see copyright notice in LICENSE.md
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
.arm
|
||||||
|
.balign 4
|
||||||
|
|
||||||
|
.section .iwram.__aeabi_memset, "ax", %progbits
|
||||||
|
.global __agbabi_memset
|
||||||
|
__agbabi_memset:
|
||||||
|
.global __aeabi_memclr
|
||||||
|
__aeabi_memclr:
|
||||||
|
mov r2, #0
|
||||||
|
b .LskipShifts
|
||||||
|
|
||||||
|
.global __aeabi_memset
|
||||||
|
__aeabi_memset:
|
||||||
|
mov r2, r2, lsl #24
|
||||||
|
orr r2, r2, r2, lsr #8
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
// Fallthrough
|
||||||
|
|
||||||
|
.LskipShifts:
|
||||||
|
// JoaoBapt carry & sign bit test
|
||||||
|
rsb r3, r0, #4
|
||||||
|
movs r3, r3, lsl #31
|
||||||
|
// Set half and byte head
|
||||||
|
strmib r2, [r0], #1
|
||||||
|
submi r1, r1, #1
|
||||||
|
strcsh r2, [r0], #2
|
||||||
|
subcs r1, r1, #2
|
||||||
|
b __agbabi_wordset4
|
||||||
|
|
||||||
|
.global __aeabi_memclr8
|
||||||
|
__aeabi_memclr8:
|
||||||
|
.global __aeabi_memclr4
|
||||||
|
__aeabi_memclr4:
|
||||||
|
mov r2, #0
|
||||||
|
b __agbabi_wordset4
|
||||||
|
|
||||||
|
.global __aeabi_memset8
|
||||||
|
__aeabi_memset8:
|
||||||
|
.global __aeabi_memset4
|
||||||
|
__aeabi_memset4:
|
||||||
|
mov r2, r2, lsl #24
|
||||||
|
orr r2, r2, r2, lsr #8
|
||||||
|
orr r2, r2, r2, lsr #16
|
||||||
|
// Fallthrough
|
||||||
|
|
||||||
|
.global __agbabi_wordset4
|
||||||
|
__agbabi_wordset4:
|
||||||
|
// Set 8 words
|
||||||
|
movs r12, r1, lsr #5
|
||||||
|
beq .Lskip32
|
||||||
|
lsl r3, r12, #5
|
||||||
|
sub r1, r1, r3
|
||||||
|
push {r4-r9}
|
||||||
|
mov r3, r2
|
||||||
|
mov r4, r2
|
||||||
|
mov r5, r2
|
||||||
|
mov r6, r2
|
||||||
|
mov r7, r2
|
||||||
|
mov r8, r2
|
||||||
|
mov r9, r2
|
||||||
|
.LsetWords8:
|
||||||
|
stmia r0!, {r2-r9}
|
||||||
|
subs r12, r12, #1
|
||||||
|
bne .LsetWords8
|
||||||
|
pop {r4-r9}
|
||||||
|
.Lskip32:
|
||||||
|
|
||||||
|
// Set words
|
||||||
|
movs r12, r1, lsr #2
|
||||||
|
.LsetWords:
|
||||||
|
subs r12, r12, #1
|
||||||
|
strhs r2, [r0], #4
|
||||||
|
bhs .LsetWords
|
||||||
|
|
||||||
|
// Set half and byte tail
|
||||||
|
movs r3, r1, lsl #31
|
||||||
|
strcsh r2, [r0], #2
|
||||||
|
strmib r2, [r0]
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.section .iwram.memset, "ax", %progbits
|
||||||
|
.global memset
|
||||||
|
memset:
|
||||||
|
mov r3, r1
|
||||||
|
mov r1, r2
|
||||||
|
mov r2, r3
|
||||||
|
push {r0, lr}
|
||||||
|
bl __aeabi_memset
|
||||||
|
pop {r0, lr}
|
||||||
|
bx lr
|
Loading…
Reference in a new issue