Created
February 3, 2023 15:46
-
-
Save profi200/9d7106075823ea0540ed28f7a6b28a4a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.cpu arm7tdmi | |
.fpu softvfp | |
.macro BEGIN_ASM_FUNC name, type=arm, linkage=global, section=text | |
.section .\section\().\name, "ax", %progbits | |
.if \type == thumb | |
.align 1 | |
.thumb | |
.else | |
.align 2 | |
.arm | |
.endif | |
.\linkage \name | |
.type \name, %function | |
.func \name | |
.cfi_sections .debug_frame | |
.cfi_startproc | |
\name: | |
.endm | |
.macro END_ASM_FUNC | |
.cfi_endproc | |
.endfunc | |
.endm | |
@ void lgyLinkSend16(const u16 *src, u32 size) | |
@ Outdated variant. | |
BEGIN_ASM_FUNC lgyLinkSend16, thumb | |
add r1, r0, r1 @ r1 = r0 + r1; | |
ldr r2, =0x04000132 @ r2 = ®_KEYCNT; // Base address. | |
push {r4, r5} @ Save r4 and r5. | |
lsr r3, r2, #18 @ r3 = r2>>18; // r3 = 0x100; | |
lgyLinkSend16_lp: | |
ldrh r4, [r0] @ r4 = *r0; | |
add r0, r0, #2 @ r0 += 2; | |
lsr r5, r4, #8 @ r5 = r4>>8; | |
orr r4, r4, r3 @ r4 |= r3; | |
bic r5, r5, r3 @ r5 &= ~(r3); | |
strh r4, [r2] @ *r2 = r4; | |
strh r5, [r2] @ *r2 = r5; | |
cmp r1, r0 @ Compare r0 and r1, sets flags. | |
bhi lgyLinkSend16_lp @ while(r0 < r1); | |
pop {r4, r5} @ Restore r4 and r5. | |
bx lr @ return; | |
END_ASM_FUNC | |
@ void lgyLinkSend32(const u32 *src, u32 size) | |
BEGIN_ASM_FUNC lgyLinkSend32, thumb | |
add r1, r0, r1 @ r1 = r0 + r1; | |
ldr r2, =0x04000132 @ r2 = ®_KEYCNT; | |
push {r4, r5} @ Save r4 and r5. | |
ldr r3, =0x01000100 @ r3 = 0x01000100; | |
lgyLinkSend32_lp: | |
ldmia r0!, {r4} @ r4 = *r0++; | |
lsr r5, r4, #8 @ r5 = r4>>8; | |
orr r4, r4, r3 @ r4 |= r3; | |
bic r5, r5, r3 @ r5 &= ~(r3); | |
strh r4, [r2] @ *r2 = r4; | |
strh r5, [r2] @ *r2 = r5; | |
lsr r4, r4, #16 @ r4 >>= 16; | |
lsr r5, r5, #16 @ r5 >>= 16; | |
cmp r1, r0 @ Compare r0 and r1, sets flags. | |
strh r4, [r2] @ *r2 = r4; | |
strh r5, [r2] @ *r2 = r5; | |
bhi lgyLinkSend32_lp @ while(r0 < r1); | |
pop {r4, r5} @ Restore r4 and r5. | |
bx lr @ return; | |
END_ASM_FUNC | |
@ void lgyLinkRecv32(u32 *dst, u32 size) | |
@ TODO | |
BEGIN_ASM_FUNC lgyLinkRecv32, thumb | |
add r1, r0, r1 @ r1 = r0 + r1; | |
ldr r2, =0x04000130 @ r2 = ®_KEYINPUT; // Base address. | |
push {r4-r6} @ Save r4, r5 and r6. | |
mov r3, #0xFF | |
lgyLinkRecv32_lp: | |
ldrh r4, [r2] | |
strh r3, [r2, #2] @ r2[2] = r3; // REG_KEYCNT = r3; | |
ldrh r5, [r2] | |
strh r2, [r2, #2] @ r2[2] = r2; // REG_KEYCNT = r2; | |
lsl r5, r5, #8 | |
orr r4, r4, r5 | |
ldrh r5, [r2] | |
strh r3, [r2, #2] @ r2[2] = r3; // REG_KEYCNT = r3; | |
ldrh r6, [r2] | |
strh r2, [r2, #2] @ r2[2] = r2; // REG_KEYCNT = r2; | |
lsl r5, r5, #16 | |
lsl r6, r6, #24 | |
orr r4, r4, r5 | |
orr r4, r4, r6 | |
str r4, [r0] | |
add r0, r0, #4 | |
cmp r1, r0 | |
bhi lgyLinkRecv32_lp | |
pop {r4-r6} @ Restore r4, r5 and r6. | |
bx lr @ return; | |
END_ASM_FUNC |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment