早期的nds和后来的ndsl具有读取GBA卡带的功能,通过nds烧录卡启动一些nds自制软件可以完成对一些gba卡带的烧录功能,从而实现游戏更换。
gba卡带游戏内容映射起点在0x8000000,记录文件映射起点在0xa000000,游戏卡带基本采用了norflash,读取起点位置并解锁指令之后,可以实现对卡带的擦除,编程等功能。
devkitPro种的libnds自带了nds对gba卡带读取和写入的代码:
#define GBAROM ((u16*)0x08000000) 和 #define GBA_BUS ((vu16 *)(0x08000000))
对应的读取和写入函数代码:
u16 read(u32 address){ return GBAROM[address];}
void write(u32 address, u16 byte){ GBA_BUS[address] = byte;asm("nop");}
使用libnds种函数写入和读取的好处是,可以直接对应地址,不需要偏移,也可以采用下面这种代码函数:
vu16 read(u32 addr){return *(vu16*)(addr|0x8000000);}
volatile void write(u32 addr, u16 data){ *(vu16 *)(addr|0x8000000) = data; asm("nop");}
但采用这种之后,卡带的地址和cpu地址的对位情况需要地址向左偏移1位,<<1。
如果但从代码上看,上面两种代码应是相同才对,但实际编译使用过程种,就能够发现编译之后他们之间的确实存在了明显的差异。
由于这两种代码是刷写GBA卡带的基础函数&#x