I'm rusty but hope this helps.
No$GBA would really help debug, especially if you know a little assembly, it has a great interface. Devkitpro
has a C compiler and Assembler. GBAdev.org also has a forum for more development conversation.
On the GBA in C, reading and writing a byte from SRAM is as easy as
byte_to_read = *(u8 *)0x0E000000;
*(u8 *)0x0E000000 = byte_to_write;
In ASM it's probably like
ldrb r0,#0xE000000 ;read
strb r0,#0xE000000 ;write
It's an 8 bit bus so you read a byte at a time. For flash or eeprom you have to send the binary commands as writes and then write the data. SRAM is just a memory read or write. That's what GBATA does, find the pattern of code that does flash or eeprom, then patches it to use simple SRAM read/writes. Not all flash cartridges have flash/eeprom support, only SRAM, and flash/eeprom is used as a hardware copy protection.
Here's a little ASM. You can only MOV a value that's based on 8 bits and shifted. So you can MOV #0x4000000, but not #0x40000D4. The code below sets r0 to #0x4000000, then computes the addresses later. The processor takes [r0,#0xD4] and makes 0x40000D4. If you want to put a 32 bit value directly into a register, you need LDR r0,#0x4000D4, that will work.
ldr r1,#0x8040000 ;some location in ROM
ldr r2,#0x2000000 ;some location in EWRAM
ldr r3,#0x1000 ;length
mov r0,#0x04000000 ;i/o base, later used to set DMA settings
str r1,[r0,#0xD4] ;store (32 bit) source address at 0x040000D4
str r2,[r0,#0xD8] ;store (32 bit) destination address at 0x040000D8
strh r3,[r0,#0xDC] ;store (16 bit) DMA length at 0x040000DC
mov r3,#0x8400 ;value to start a 32 bit dma transfer
strh r3,[r0,#0xDE] ;store (16 bit) DMA setting at 0x040000DE, which now begins the DMA transfer from ROM to EWRAM
bx lr ;return to link register
Here's a pdf that can help with ARM asmhttps://people.freebsd.org/~cognet/t/PDF/ADS_ASSEMBLERGUIDE_B.PDF
just found this one maybe it's simplerhttps://www.csie.ntu.edu.tw/~cyy/courses/assembly/07fall/lectures/handouts/lec08_ARMasm_4up.pdf