├── WirelessKeyboard ├── JPN │ ├── arm7 │ │ ├── source │ │ │ ├── arm7.h │ │ │ ├── hook.h │ │ │ ├── arm7.c │ │ │ ├── hook.c │ │ │ └── entry.S │ │ ├── symbol.sym │ │ ├── linker.ld │ │ └── makefile │ ├── loader │ │ ├── Makefile │ │ └── loader.S │ ├── makefile │ └── arm9 │ │ ├── linker.ld │ │ ├── symbol.sym │ │ ├── source │ │ ├── arm7loader.c │ │ ├── common.c │ │ ├── common.h │ │ ├── arm9.c │ │ ├── backup.c │ │ ├── entry.S │ │ ├── server.c │ │ └── typingMap.h │ │ └── makefile ├── EUR │ ├── loader │ │ ├── Makefile │ │ └── loader.S │ ├── makefile │ ├── arm7 │ │ ├── symbol.sym │ │ └── makefile │ └── arm9 │ │ ├── symbol.sym │ │ └── makefile ├── FRA │ ├── loader │ │ ├── Makefile │ │ └── loader.S │ ├── makefile │ ├── arm7 │ │ ├── symbol.sym │ │ └── makefile │ └── arm9 │ │ ├── symbol.sym │ │ └── makefile ├── GER │ ├── loader │ │ ├── Makefile │ │ └── loader.S │ ├── makefile │ ├── arm7 │ │ ├── symbol.sym │ │ └── makefile │ └── arm9 │ │ ├── symbol.sym │ │ └── makefile ├── ITA │ ├── loader │ │ ├── Makefile │ │ └── loader.S │ ├── makefile │ ├── arm7 │ │ ├── symbol.sym │ │ └── makefile │ └── arm9 │ │ ├── symbol.sym │ │ └── makefile ├── SPA │ ├── loader │ │ ├── Makefile │ │ └── loader.S │ ├── makefile │ ├── arm7 │ │ ├── symbol.sym │ │ └── makefile │ └── arm9 │ │ ├── symbol.sym │ │ └── makefile ├── client │ ├── readme.txt │ └── client_win.py ├── lib │ └── readme.txt ├── makefile └── Tools.py ├── SaveFix └── JPN │ ├── loader │ ├── Makefile │ └── loader.S │ ├── introduction.txt │ └── main │ ├── symbol.sym │ └── Makefile ├── Release ├── full_hacking_eur.3ps ├── full_hacking_fra.3ps ├── full_hacking_ger.3ps ├── full_hacking_ita.3ps ├── full_hacking_jpn.3ps ├── full_hacking_spa.3ps └── readme.txt └── README.md /WirelessKeyboard/JPN/arm7/source/arm7.h: -------------------------------------------------------------------------------- 1 | int main(); 2 | void OSi_IrqVBlank(); 3 | void RtcPxiCallback(); -------------------------------------------------------------------------------- /SaveFix/JPN/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/SaveFix/JPN/loader/Makefile -------------------------------------------------------------------------------- /Release/full_hacking_eur.3ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/Release/full_hacking_eur.3ps -------------------------------------------------------------------------------- /Release/full_hacking_fra.3ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/Release/full_hacking_fra.3ps -------------------------------------------------------------------------------- /Release/full_hacking_ger.3ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/Release/full_hacking_ger.3ps -------------------------------------------------------------------------------- /Release/full_hacking_ita.3ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/Release/full_hacking_ita.3ps -------------------------------------------------------------------------------- /Release/full_hacking_jpn.3ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/Release/full_hacking_jpn.3ps -------------------------------------------------------------------------------- /Release/full_hacking_spa.3ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/Release/full_hacking_spa.3ps -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/WirelessKeyboard/EUR/loader/Makefile -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/WirelessKeyboard/FRA/loader/Makefile -------------------------------------------------------------------------------- /WirelessKeyboard/GER/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/WirelessKeyboard/GER/loader/Makefile -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/WirelessKeyboard/ITA/loader/Makefile -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/WirelessKeyboard/JPN/loader/Makefile -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/loader/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enler/PokemonTypingDSHacking/HEAD/WirelessKeyboard/SPA/loader/Makefile -------------------------------------------------------------------------------- /WirelessKeyboard/client/readme.txt: -------------------------------------------------------------------------------- 1 | client_win.py requires pyHook (https://pypi.python.org/pypi/pyHook) and pyPng (https://pypi.python.org/pypi/pypng) -------------------------------------------------------------------------------- /WirelessKeyboard/lib/readme.txt: -------------------------------------------------------------------------------- 1 | build the modifed dswifi library(https://github.com/enler/dswifi) and copy libdswifi7.a and libdswifi9.a to this folder -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C arm9 3 | make -C arm7 4 | make -C loader 5 | 6 | clean: 7 | make -C arm9 clean 8 | make -C arm7 clean 9 | make -C loader clean 10 | -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C arm9 3 | make -C arm7 4 | make -C loader 5 | 6 | clean: 7 | make -C arm9 clean 8 | make -C arm7 clean 9 | make -C loader clean 10 | -------------------------------------------------------------------------------- /WirelessKeyboard/GER/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C arm9 3 | make -C arm7 4 | make -C loader 5 | 6 | clean: 7 | make -C arm9 clean 8 | make -C arm7 clean 9 | make -C loader clean 10 | -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C arm9 3 | make -C arm7 4 | make -C loader 5 | 6 | clean: 7 | make -C arm9 clean 8 | make -C arm7 clean 9 | make -C loader clean 10 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C arm9 3 | make -C arm7 4 | make -C loader 5 | 6 | clean: 7 | make -C arm9 clean 8 | make -C arm7 clean 9 | make -C loader clean 10 | -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C arm9 3 | make -C arm7 4 | make -C loader 5 | 6 | clean: 7 | make -C arm9 clean 8 | make -C arm7 clean 9 | make -C loader clean 10 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/source/hook.h: -------------------------------------------------------------------------------- 1 | typedef struct _HookDataEntry { 2 | void * functionAddr; 3 | void * hookFunction; 4 | void ** origFunctionRef; 5 | u32 oldInstruction; 6 | u32 jumpInstruction; 7 | } HookDataEntry; 8 | 9 | void HookFunction(HookDataEntry * entry); -------------------------------------------------------------------------------- /WirelessKeyboard/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | make -C JPN 3 | make -C EUR 4 | make -C FRA 5 | make -C GER 6 | make -C ITA 7 | make -C SPA 8 | 9 | clean: 10 | make -C JPN clean 11 | make -C EUR clean 12 | make -C FRA clean 13 | make -C GER clean 14 | make -C ITA clean 15 | make -C SPA clean 16 | -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/arm7/symbol.sym: -------------------------------------------------------------------------------- 1 | _PXI_SendWordByFifo = 0x037FEC51; 2 | _PXI_SetFifoRecvCallback = 0x037FEBD9; 3 | OS_DisableIrqMask = 0x037FBE0C; 4 | OS_EnableIrqMask = 0x037FBDD4; 5 | OS_SetIrqFunction = 0x037FBCA4; 6 | FLASH_DirectRead = 0x027F58A0; 7 | _Ven__SVC_WaitByLoop = 0x037FBF70; 8 | RtcPxiCallback = 0x27E02A4; 9 | OSi_IrqVBlank = 0x37FBC30; 10 | __entry = 0x252C260; -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/arm7/symbol.sym: -------------------------------------------------------------------------------- 1 | _PXI_SendWordByFifo = 0x037FEC51; 2 | _PXI_SetFifoRecvCallback = 0x037FEBD9; 3 | OS_DisableIrqMask = 0x037FBE0C; 4 | OS_EnableIrqMask = 0x037FBDD4; 5 | OS_SetIrqFunction = 0x037FBCA4; 6 | FLASH_DirectRead = 0x027F58A0; 7 | _Ven__SVC_WaitByLoop = 0x037FBF70; 8 | RtcPxiCallback = 0x27E02A4; 9 | OSi_IrqVBlank = 0x37FBC30; 10 | __entry = 0x252C260; -------------------------------------------------------------------------------- /WirelessKeyboard/GER/arm7/symbol.sym: -------------------------------------------------------------------------------- 1 | _PXI_SendWordByFifo = 0x037FEC51; 2 | _PXI_SetFifoRecvCallback = 0x037FEBD9; 3 | OS_DisableIrqMask = 0x037FBE0C; 4 | OS_EnableIrqMask = 0x037FBDD4; 5 | OS_SetIrqFunction = 0x037FBCA4; 6 | FLASH_DirectRead = 0x027F58A0; 7 | _Ven__SVC_WaitByLoop = 0x037FBF70; 8 | RtcPxiCallback = 0x27E02A4; 9 | OSi_IrqVBlank = 0x37FBC30; 10 | __entry = 0x252c320; -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/arm7/symbol.sym: -------------------------------------------------------------------------------- 1 | _PXI_SendWordByFifo = 0x037FEC51; 2 | _PXI_SetFifoRecvCallback = 0x037FEBD9; 3 | OS_DisableIrqMask = 0x037FBE0C; 4 | OS_EnableIrqMask = 0x037FBDD4; 5 | OS_SetIrqFunction = 0x037FBCA4; 6 | FLASH_DirectRead = 0x027F58A0; 7 | _Ven__SVC_WaitByLoop = 0x037FBF70; 8 | RtcPxiCallback = 0x27E02A4; 9 | OSi_IrqVBlank = 0x37FBC30; 10 | __entry = 0x252c280; -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/symbol.sym: -------------------------------------------------------------------------------- 1 | _PXI_SendWordByFifo = 0x037FEC51; 2 | _PXI_SetFifoRecvCallback = 0x037FEBD9; 3 | OS_DisableIrqMask = 0x037FBE0C; 4 | OS_EnableIrqMask = 0x037FBDD4; 5 | OS_SetIrqFunction = 0x037FBCA4; 6 | FLASH_DirectRead = 0x027F58A0; 7 | _Ven__SVC_WaitByLoop = 0x037FBF70; 8 | RtcPxiCallback = 0x27E02A4; 9 | OSi_IrqVBlank = 0x37FBC30; 10 | __entry = 0x2530C20; -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/arm7/symbol.sym: -------------------------------------------------------------------------------- 1 | _PXI_SendWordByFifo = 0x037FEC51; 2 | _PXI_SetFifoRecvCallback = 0x037FEBD9; 3 | OS_DisableIrqMask = 0x037FBE0C; 4 | OS_EnableIrqMask = 0x037FBDD4; 5 | OS_SetIrqFunction = 0x037FBCA4; 6 | FLASH_DirectRead = 0x027F58A0; 7 | _Ven__SVC_WaitByLoop = 0x037FBF70; 8 | RtcPxiCallback = 0x27E02A4; 9 | OSi_IrqVBlank = 0x37FBC30; 10 | __entry = 0x252c280; -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/linker.ld: -------------------------------------------------------------------------------- 1 | OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 2 | OUTPUT_ARCH(arm) 3 | 4 | ENTRY(_start) 5 | 6 | SECTIONS 7 | { 8 | . = __entry; 9 | .text.start : { *(.text.start ) } 10 | .text : { *(.text) } 11 | .rodata : { *(.rodata) } 12 | .data : { *(.data*) } 13 | __bss_start = .; 14 | .bss : { *(.bss*) } 15 | _end = .; 16 | } 17 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/linker.ld: -------------------------------------------------------------------------------- 1 | OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 2 | OUTPUT_ARCH(arm) 3 | 4 | ENTRY(_start) 5 | 6 | SECTIONS 7 | { 8 | . = __entry; 9 | .text.start : { *(.text.start ) } 10 | .text : { *(.text*) } 11 | .rodata : { *(.rodata*) } 12 | .data : { *(.data*) } 13 | __bss_start = .; 14 | .bss : { *(.bss*) } 15 | _end = .; 16 | } 17 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/source/arm7.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "arm7.h" 3 | #include "hook.h" 4 | #include 5 | 6 | void (*orig_VBlank)() = (void*)0; 7 | 8 | void hook_VBlank() { 9 | if (orig_VBlank) orig_VBlank(); 10 | Wifi_Update(); 11 | } 12 | 13 | int main() 14 | { 15 | static HookDataEntry entry = {(void*)0, hook_VBlank, (void**)&orig_VBlank}; 16 | entry.functionAddr = OSi_IrqVBlank; 17 | HookFunction(&entry); 18 | u32* restoreOffset = (u32*)RtcPxiCallback; 19 | *restoreOffset = 0x2A00B510; 20 | *(restoreOffset + 1) = 0x207FD122; 21 | installWifiFIFO(); 22 | } -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/source/hook.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "arm7.h" 3 | #include "hook.h" 4 | 5 | #define MAKE_BRANCH(src, dest) (((((s32)(dest) - 8 - (s32)(src)) >> 2) & 0xFFFFFF) | 0xEA000000); 6 | 7 | void HookFunction(HookDataEntry * entry) { 8 | entry->oldInstruction = *(u32*)entry->functionAddr; 9 | *(u32*)entry->functionAddr = MAKE_BRANCH(entry->functionAddr, entry->hookFunction); 10 | entry->jumpInstruction = MAKE_BRANCH(&entry->jumpInstruction, (u32)entry->functionAddr + 4); 11 | if (entry->origFunctionRef) 12 | *entry->origFunctionRef = (void*)&entry->oldInstruction; 13 | } -------------------------------------------------------------------------------- /SaveFix/JPN/introduction.txt: -------------------------------------------------------------------------------- 1 | 1. build loader.bin and arm9.bin 2 | 2. open the ROM (JPN's Pokemon typing ds) with HEX editor 3 | 0x00000044 : A8 -> B1 4 | 0x0000004C : 10 -> 18 5 | 0x000040D8 : write loader.bin 6 | 0x00004900 : 37 8E 02 EB -> F4 FD FF FA 7 | 0x00004BB2 : 00 F0 75 -> FF F7 98 8 | 0x001412A7 : 00 FF FF FF FF FF FF FF FF FF -> 08 61 72 6D 39 2E 62 69 6E 00 9 | 0x00157010 : FF FF FF FF FF FF FF FF -> 00 C0 A0 07 44 C2 A0 07 (note: it defines the start offset and end offset of arm9.bin) 10 | 0x07A0C000 : write arm9.bin 11 | 3. use ndstool to fix the crc16 checksum of the modified rom (ndstool -f "your rom") -------------------------------------------------------------------------------- /Release/readme.txt: -------------------------------------------------------------------------------- 1 | full_hacking_*.3ps includes AP patch, save fix, wireless keyborad via WI-FI, screenshot, 2 | use 3dstool (https://github.com/dnasdw/3dstool) to patch your rom, 3 | usage : 3dstool --patch -vf "your rom" --patch-file full_hacking_*.3ps. 4 | After you patched your rom, follow these steps 5 | 0.copy the patched rom to your flashcarts 6 | 1.create a save file with all zero-filled or you can download 'initial.sav', then rename it 7 | 2.make sure your nds can connect to WIFi 8 | 3.start game (if the game is handling with white screen, please turn off power and restart) 9 | 4.run script "client_win.py" 10 | 5.enter IP of your NDS 11 | 6.now, enjoy! -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/source/entry.S: -------------------------------------------------------------------------------- 1 | .section .text.start 2 | .global _start; 3 | _start: 4 | push {r0-r12, lr} 5 | ldr r0, =__bss_start 6 | mov r1, #0 7 | ldr r2, =_end 8 | loop: 9 | cmp r0, r2 10 | bge entry 11 | strb r1, [r0], #1 12 | b loop 13 | entry: 14 | bl main 15 | pop {r0-r12, lr} 16 | ldr r12, =RtcPxiCallback 17 | add r12, r12, #1 18 | bx r12 19 | 20 | .global PXI_SendWordByFifo 21 | .type PXI_SendWordByFifo, %function; 22 | PXI_SendWordByFifo: 23 | ldr r12, =_PXI_SendWordByFifo 24 | bx r12 25 | 26 | .global PXI_SetFifoRecvCallback 27 | .type PXI_SetFifoRecvCallback, %function; 28 | PXI_SetFifoRecvCallback: 29 | ldr r12, =_PXI_SetFifoRecvCallback 30 | bx r12 31 | 32 | -------------------------------------------------------------------------------- /SaveFix/JPN/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopHandler 4 | ldr r1, [r0] 5 | mov r2, #0x40 6 | lsl r2, #4 7 | add r1, r2 8 | str r1, [r0] 9 | bx lr 10 | 11 | loadPayload: 12 | push {r4-r7, lr} 13 | sub sp, #0x3C 14 | bl 0x20010A0 15 | mov r0, sp 16 | bl 0x2096880 17 | ldr r1, =0x20F77E4 18 | ldr r2, =11138 19 | bl 0x209693C 20 | ldr r1, [sp, #0x24] 21 | ldr r2, [sp, #0x28] 22 | sub r2, r1 23 | ldr r1, payloadOffset 24 | mov r0, sp 25 | bl 0x2096A68 26 | mov r0, sp 27 | bl 0x20969B8 28 | ldr r0, payloadOffset 29 | add r0, #1 30 | blx r0 31 | add sp, #0x3C 32 | pop {r4-r7, pc} 33 | 34 | .align 2 35 | 36 | heapTopHandler: 37 | .word 0x209BE80 38 | 39 | payloadOffset: 40 | .word 0x2130C20 -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopRef 4 | ldrh r1, [r0, #2] 5 | add r1, #1 6 | strh r1, [r0, #2] 7 | mov r1, #0 8 | strh r1, [r0] 9 | bx lr 10 | 11 | loadPayload: 12 | push {r4-r7, lr} 13 | sub sp, #0x3C 14 | bl 0x20010A0 15 | mov r0, sp 16 | bl 0x2096880 17 | ldr r1, =0x20F77E4 18 | ldr r2, =11138 19 | bl 0x209693C 20 | ldr r1, [sp, #0x24] 21 | ldr r2, [sp, #0x28] 22 | sub r2, r1 23 | ldr r1, payloadOffset 24 | mov r0, sp 25 | bl 0x2096A68 26 | mov r0, sp 27 | bl 0x20969B8 28 | blx 0x209BB60 29 | ldr r0, payloadOffset 30 | blx r0 31 | add sp, #0x3C 32 | pop {r4-r7, pc} 33 | 34 | .align 2 35 | 36 | heapTopRef: 37 | .word 0x209BE80 38 | 39 | payloadOffset: 40 | .word 0x2135000 -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopRef 4 | ldrh r1, [r0, #2] 5 | add r1, #1 6 | strh r1, [r0, #2] 7 | ldr r0, =0x205b24C 8 | ldr r1, =0x2100 9 | strh r1, [r0] 10 | bx lr 11 | 12 | loadPayload: 13 | push {r4-r7, lr} 14 | sub sp, #0x3C 15 | bl 0x20010A0 16 | mov r0, sp 17 | bl 0x2094E90 18 | ldr r1, =0x20F2CA4 19 | ldr r2, =11120 20 | bl 0x2094F4C 21 | ldr r1, [sp, #0x24] 22 | ldr r2, [sp, #0x28] 23 | sub r2, r1 24 | ldr r1, payloadOffset 25 | mov r0, sp 26 | bl 0x2095078 27 | mov r0, sp 28 | bl 0x2094FC8 29 | blx 0x209A170 30 | ldr r0, payloadOffset 31 | blx r0 32 | add sp, #0x3C 33 | pop {r4-r7, pc} 34 | 35 | .align 2 36 | 37 | heapTopRef: 38 | .word 0x209A490 39 | 40 | payloadOffset: 41 | .word 0x2130800 -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopRef 4 | ldrh r1, [r0, #2] 5 | add r1, #1 6 | strh r1, [r0, #2] 7 | ldr r0, =0x0205b258 8 | ldr r1, =0x2100 9 | strh r1, [r0] 10 | bx lr 11 | 12 | loadPayload: 13 | push {r4-r7, lr} 14 | sub sp, #0x3C 15 | bl 0x20010A0 16 | mov r0, sp 17 | bl 0x2094E9C 18 | ldr r1, =0x20F2CC4 19 | ldr r2, =11120 20 | bl 0x2094F58 21 | ldr r1, [sp, #0x24] 22 | ldr r2, [sp, #0x28] 23 | sub r2, r1 24 | ldr r1, payloadOffset 25 | mov r0, sp 26 | bl 0x2095084 27 | mov r0, sp 28 | bl 0x2094FD4 29 | blx 0x209A17C 30 | ldr r0, payloadOffset 31 | blx r0 32 | add sp, #0x3C 33 | pop {r4-r7, pc} 34 | 35 | .align 2 36 | 37 | heapTopRef: 38 | .word 0x209A49C 39 | 40 | payloadOffset: 41 | .word 0x2130400 -------------------------------------------------------------------------------- /WirelessKeyboard/GER/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopRef 4 | ldrh r1, [r0, #2] 5 | add r1, #1 6 | strh r1, [r0, #2] 7 | ldr r0, =0x0205b2e0 8 | ldr r1, =0x2100 9 | strh r1, [r0] 10 | bx lr 11 | 12 | loadPayload: 13 | push {r4-r7, lr} 14 | sub sp, #0x3C 15 | bl 0x20010A0 16 | mov r0, sp 17 | bl 0x2094F24 18 | ldr r1, =0x20F2D64 19 | ldr r2, =11120 20 | bl 0x2094FE0 21 | ldr r1, [sp, #0x24] 22 | ldr r2, [sp, #0x28] 23 | sub r2, r1 24 | ldr r1, payloadOffset 25 | mov r0, sp 26 | bl 0x209510C 27 | mov r0, sp 28 | bl 0x209505C 29 | blx 0x209A204 30 | ldr r0, payloadOffset 31 | blx r0 32 | add sp, #0x3C 33 | pop {r4-r7, pc} 34 | 35 | .align 2 36 | 37 | heapTopRef: 38 | .word 0x209A524 39 | 40 | payloadOffset: 41 | .word 0x2130400 -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopRef 4 | ldrh r1, [r0, #2] 5 | add r1, #1 6 | strh r1, [r0, #2] 7 | ldr r0, =0x0205b268 8 | ldr r1, =0x2100 9 | strh r1, [r0] 10 | bx lr 11 | 12 | loadPayload: 13 | push {r4-r7, lr} 14 | sub sp, #0x3C 15 | bl 0x20010A0 16 | mov r0, sp 17 | bl 0x2094EAC 18 | ldr r1, =0x20F2CC4 19 | ldr r2, =11120 20 | bl 0x2094F68 21 | ldr r1, [sp, #0x24] 22 | ldr r2, [sp, #0x28] 23 | sub r2, r1 24 | ldr r1, payloadOffset 25 | mov r0, sp 26 | bl 0x2095094 27 | mov r0, sp 28 | bl 0x2094FE4 29 | blx 0x209A18C 30 | ldr r0, payloadOffset 31 | blx r0 32 | add sp, #0x3C 33 | pop {r4-r7, pc} 34 | 35 | .align 2 36 | 37 | heapTopRef: 38 | .word 0x209A4AC 39 | 40 | payloadOffset: 41 | .word 0x2130400 -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/loader/loader.S: -------------------------------------------------------------------------------- 1 | .thumb 2 | expandMemory: 3 | ldr r0, heapTopRef 4 | ldrh r1, [r0, #2] 5 | add r1, #1 6 | strh r1, [r0, #2] 7 | ldr r0, =0x0205b274 8 | ldr r1, =0x2100 9 | strh r1, [r0] 10 | bx lr 11 | 12 | loadPayload: 13 | push {r4-r7, lr} 14 | sub sp, #0x3C 15 | bl 0x20010A0 16 | mov r0, sp 17 | bl 0x2094EB8 18 | ldr r1, =0x20F2CC4 19 | ldr r2, =11120 20 | bl 0x2094F74 21 | ldr r1, [sp, #0x24] 22 | ldr r2, [sp, #0x28] 23 | sub r2, r1 24 | ldr r1, payloadOffset 25 | mov r0, sp 26 | bl 0x20950A0 27 | mov r0, sp 28 | bl 0x2094FF0 29 | blx 0x209A198 30 | ldr r0, payloadOffset 31 | blx r0 32 | add sp, #0x3C 33 | pop {r4-r7, pc} 34 | 35 | .align 2 36 | 37 | heapTopRef: 38 | .word 0x209A4B8 39 | 40 | payloadOffset: 41 | .word 0x2130400 -------------------------------------------------------------------------------- /SaveFix/JPN/main/symbol.sym: -------------------------------------------------------------------------------- 1 | _FS_InitFile = 0x2096881; 2 | _FS_OpenFile = 0x2096AB1; 3 | _FS_ReadFile = 0x02096A69; 4 | $FS_GetLength = 0x2008244; 5 | _FS_CloseFile = 0x020969B9; 6 | DC_InvalidateRange = 0x0209BB94; 7 | DC_StoreRange = 0x0209BBB0; 8 | DC_FlushRange = 0x0209BBCC; 9 | DC_FlushAll = 0x0209BB60; 10 | $OS_AllocFromHeap = 0x207A7EC; 11 | $OS_FreeToHeap = 0x207A8F4; 12 | _OS_EnableIrqMask = 0x209ACF9; 13 | _OS_SetIrqFunction = 0x209ABBD; 14 | _PXI_SendWordByFifo = 0x209CE71; 15 | _PXI_SetFifoRecvCallback = 0x209CE01; 16 | _PXI_IsCallbackReady = 0x209CE4D; 17 | _OS_CreateThread = 0x209B301; 18 | _OS_ExitThread = 0x209B3C9; 19 | _OS_WakeupThreadDirect = 0x209B57D; 20 | _OS_Sleep = 0x209B645; 21 | _FndAllocFromExpHeapEx = 0x20912B9; 22 | _FndFreeToExpHeap = 0x20912D9; 23 | _backupGetBuffer = 0x201A4C1; 24 | _orig_HandleTouchData_8 = 0x200472D; 25 | _foo = 0x2106941; 26 | __entry = 0x2130C20; -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/symbol.sym: -------------------------------------------------------------------------------- 1 | _FS_InitFile = 0x2096881; 2 | _FS_OpenFile = 0x2096AB1; 3 | _FS_ReadFile = 0x02096A69; 4 | $FS_GetLength = 0x2008244; 5 | _FS_CloseFile = 0x020969B9; 6 | DC_InvalidateRange = 0x0209BB94; 7 | DC_StoreRange = 0x0209BBB0; 8 | DC_FlushRange = 0x0209BBCC; 9 | DC_FlushAll = 0x0209BB60; 10 | $OS_AllocFromHeap = 0x207A7EC; 11 | $OS_FreeToHeap = 0x207A8F4; 12 | _OS_EnableIrqMask = 0x209ACF9; 13 | _OS_SetIrqFunction = 0x209ABBD; 14 | _PXI_SendWordByFifo = 0x209CE71; 15 | _PXI_SetFifoRecvCallback = 0x209CE01; 16 | _PXI_IsCallbackReady = 0x209CE4D; 17 | _OS_CreateThread = 0x209B301; 18 | _OS_ExitThread = 0x209B3C9; 19 | _OS_WakeupThreadDirect = 0x209B57D; 20 | _OS_Sleep = 0x209B645; 21 | _FndAllocFromExpHeapEx = 0x20912B9; 22 | _FndFreeToExpHeap = 0x20912D9; 23 | _backupGetBuffer = 0x201A4C1; 24 | _orig_HandleTouchData_8 = 0x200472D; 25 | _foo = 0x2106941; 26 | __entry = 0x2135000; -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/arm7loader.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "common.h" 3 | 4 | static inline u32 uncacheAddr(u32 address) 5 | { 6 | return (address & 0x3FFFFF) + 0x2400000; 7 | } 8 | 9 | void loadFile(void * offset, const char * path) 10 | { 11 | FSFile file; 12 | FS_InitFile(&file); 13 | if (FS_OpenFile(&file, path)) 14 | { 15 | s32 len = FS_GetLength(&file); 16 | FS_ReadFile(&file, offset, len); 17 | } 18 | FS_CloseFile(&file); 19 | } 20 | 21 | void initArm7Payload() 22 | { 23 | void* arm7PayloadOffset = (void*)uncacheAddr(heapTop); 24 | loadFile(arm7PayloadOffset, arm7BinPath); 25 | *(u32*)PxiRtcCallback7 = 0x46C04778;// bx pc; nop; 26 | *(u32*)(PxiRtcCallback7 + 4) = MAKE_BRANCH((void*)uncacheAddr(PxiRtcCallback7 + 4), arm7PayloadOffset); 27 | PXI_SendWordByFifo(5, 0xFF << 8, 0); 28 | while(!PXI_IsCallbackReady(1, 1)); 29 | while(!PXI_IsCallbackReady(2, 1)); 30 | } -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/arm9/symbol.sym: -------------------------------------------------------------------------------- 1 | DC_FlushRange = 0x209A1E8; 2 | backupCtxRef = 0x2002B80; 3 | _PXI_SetFifoRecvCallback = 0x209B41D; 4 | _OS_EnableIrqMask = 0x2099315; 5 | DC_FlushAll = 0x209A17C; 6 | _FS_OpenFile = 0x20950CD; 7 | _FS_CloseFile = 0x2094FD5; 8 | _PXI_SendWordByFifo = 0x209B48D; 9 | _FS_OpenFileFast = 0x2094F59; 10 | _OS_CreateThread = 0x209991D; 11 | _FS_ReadFile = 0x2095085; 12 | wirelessKeyboardEnableFlag = 0x200897C; 13 | _foo = 0x21019E1; 14 | _PXI_IsCallbackReady = 0x209B469; 15 | DC_InvalidateRange = 0x209A1B0; 16 | _OS_Sleep = 0x2099C61; 17 | DC_StoreRange = 0x209A1CC; 18 | _OS_ExitThread = 0x20999E5; 19 | _OS_SetIrqFunction = 0x20991D9; 20 | _orig_HandleTouchData_8 = 0x2004781; 21 | _backupGetBuffer = 0x201A5B9; 22 | _FndFreeToExpHeap = 0x208F8F5; 23 | _FndAllocFromExpHeapEx = 0x208F8D5; 24 | _FS_InitFile = 0x2094E9D; 25 | _OS_WakeupThreadDirect = 0x2099B99; 26 | AP_CheckValue = 0x6A0F7208; 27 | AP_CheckPoint = 0x20F850C; 28 | __entry = 0x2130400; 29 | -------------------------------------------------------------------------------- /WirelessKeyboard/GER/arm9/symbol.sym: -------------------------------------------------------------------------------- 1 | DC_FlushRange = 0x209A270; 2 | backupCtxRef = 0x2002B80; 3 | _PXI_SetFifoRecvCallback = 0x209B4A5; 4 | _OS_EnableIrqMask = 0x209939D; 5 | DC_FlushAll = 0x209A204; 6 | _FS_OpenFile = 0x2095155; 7 | _FS_CloseFile = 0x209505D; 8 | _PXI_SendWordByFifo = 0x209B515; 9 | _FS_OpenFileFast = 0x2094FE1; 10 | _OS_CreateThread = 0x20999A5; 11 | _FS_ReadFile = 0x209510D; 12 | wirelessKeyboardEnableFlag = 0x200897C; 13 | _foo = 0x2101A81; 14 | _PXI_IsCallbackReady = 0x209B4F1; 15 | DC_InvalidateRange = 0x209A238; 16 | _OS_Sleep = 0x2099CE9; 17 | DC_StoreRange = 0x209A254; 18 | _OS_ExitThread = 0x2099A6D; 19 | _OS_SetIrqFunction = 0x2099261; 20 | _orig_HandleTouchData_8 = 0x2004781; 21 | _backupGetBuffer = 0x201A5B9; 22 | _FndFreeToExpHeap = 0x208F97D; 23 | _FndAllocFromExpHeapEx = 0x208F95D; 24 | _FS_InitFile = 0x2094F25; 25 | _OS_WakeupThreadDirect = 0x2099C21; 26 | AP_CheckValue = 0x6A0F72A8; 27 | AP_CheckPoint = 0x20F85AC; 28 | __entry = 0x2130400; 29 | -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/arm9/symbol.sym: -------------------------------------------------------------------------------- 1 | DC_FlushRange = 0x209A1F8; 2 | backupCtxRef = 0x2002B80; 3 | _PXI_SetFifoRecvCallback = 0x209B42D; 4 | _OS_EnableIrqMask = 0x2099325; 5 | DC_FlushAll = 0x209A18C; 6 | _FS_OpenFile = 0x20950DD; 7 | _FS_CloseFile = 0x2094FE5; 8 | _PXI_SendWordByFifo = 0x209B49D; 9 | _FS_OpenFileFast = 0x2094F69; 10 | _OS_CreateThread = 0x209992D; 11 | _FS_ReadFile = 0x2095095; 12 | wirelessKeyboardEnableFlag = 0x200897C; 13 | _foo = 0x21019E1; 14 | _PXI_IsCallbackReady = 0x209B479; 15 | DC_InvalidateRange = 0x209A1C0; 16 | _OS_Sleep = 0x2099C71; 17 | DC_StoreRange = 0x209A1DC; 18 | _OS_ExitThread = 0x20999F5; 19 | _OS_SetIrqFunction = 0x20991E9; 20 | _orig_HandleTouchData_8 = 0x2004781; 21 | _backupGetBuffer = 0x201A5B9; 22 | _FndFreeToExpHeap = 0x208F905; 23 | _FndAllocFromExpHeapEx = 0x208F8E5; 24 | _FS_InitFile = 0x2094EAD; 25 | _OS_WakeupThreadDirect = 0x2099BA9; 26 | AP_CheckValue = 0x6A0F7208; 27 | AP_CheckPoint = 0x20F850C; 28 | __entry = 0x2130400; 29 | -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/arm9/symbol.sym: -------------------------------------------------------------------------------- 1 | DC_FlushRange = 0x209A204; 2 | backupCtxRef = 0x2002B80; 3 | _PXI_SetFifoRecvCallback = 0x209B439; 4 | _OS_EnableIrqMask = 0x2099331; 5 | DC_FlushAll = 0x209A198; 6 | _FS_OpenFile = 0x20950E9; 7 | _FS_CloseFile = 0x2094FF1; 8 | _PXI_SendWordByFifo = 0x209B4A9; 9 | _FS_OpenFileFast = 0x2094F75; 10 | _OS_CreateThread = 0x2099939; 11 | _FS_ReadFile = 0x20950A1; 12 | wirelessKeyboardEnableFlag = 0x200897C; 13 | _foo = 0x21019E1; 14 | _PXI_IsCallbackReady = 0x209B485; 15 | DC_InvalidateRange = 0x209A1CC; 16 | _OS_Sleep = 0x2099C7D; 17 | DC_StoreRange = 0x209A1E8; 18 | _OS_ExitThread = 0x2099A01; 19 | _OS_SetIrqFunction = 0x20991F5; 20 | _orig_HandleTouchData_8 = 0x2004781; 21 | _backupGetBuffer = 0x201A5B9; 22 | _FndFreeToExpHeap = 0x208F911; 23 | _FndAllocFromExpHeapEx = 0x208F8F1; 24 | _FS_InitFile = 0x2094EB9; 25 | _OS_WakeupThreadDirect = 0x2099BB5; 26 | AP_CheckValue = 0x6A0F7208; 27 | AP_CheckPoint = 0x20F850C; 28 | __entry = 0x2130400; 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Save fix:
2 | you can save the game on flashcarts and simulation (tested on no$gba and desmume)
3 | some research were from RetroGameFan (link: https://gbatemp.net/threads/retrogamefan-updates-releases.267243/ )
4 | * NOTE: you must create a sav file with all zero-filled before you start the game!
5 | 6 | Wireless keyboard:
7 | you can play the game by using computer keyboard and other smart device such like iPad,
8 | It requires a special dswifi library (https://github.com/enler/dswifi)
9 | 10 | Get Screenshots of top screen:
11 | you can get Screenshots by using PrtSc key!
12 | 13 | About *.3ps files:
14 | you can use *.3ps files and 3dstool (https://github.com/dnasdw/3dstool) to patch roms, it's very useful :)
15 | usage : 3dstool --patch -vf input.bin --patch-file patch.3ps
16 | * Do not forget to use ndstool to fix the crc16 after you patch the rom. (ndstool -f "your rom")
17 | go to "Release" folder for more informations -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/arm9/symbol.sym: -------------------------------------------------------------------------------- 1 | _FS_InitFile = 0x2094E91; 2 | _FS_OpenFile = 0x20950C1; 3 | _FS_ReadFile = 0x02095079; 4 | $FS_GetLength = 0x2008244; 5 | _FS_CloseFile = 0x02094FC9; 6 | DC_InvalidateRange = 0x0209A1A4; 7 | DC_StoreRange = 0x209A1C0; 8 | DC_FlushRange = 0x209A1DC; 9 | DC_FlushAll = 0x0209A170; 10 | $OS_AllocFromHeap = 0x207A7EC; 11 | $OS_FreeToHeap = 0x207A8F4; 12 | _OS_EnableIrqMask = 0x2099309; 13 | _OS_SetIrqFunction = 0x20991CD; 14 | _PXI_SendWordByFifo = 0x209B481; 15 | _PXI_SetFifoRecvCallback = 0x209B411; 16 | _PXI_IsCallbackReady = 0x209B45D; 17 | _OS_CreateThread = 0x2099911; 18 | _OS_ExitThread = 0x20999D9; 19 | _OS_WakeupThreadDirect = 0x2099B8D; 20 | _OS_Sleep = 0x2099C55; 21 | _FndAllocFromExpHeapEx = 0x208F8C9; 22 | _FndFreeToExpHeap = 0x208F8E9; 23 | _backupGetBuffer = 0x201A5B9; 24 | _orig_HandleTouchData_8 = 0x2004781; 25 | _foo = 0x21019C1; 26 | backupCtxRef = 0x2002B80; 27 | wirelessKeyboardEnableFlag = 0x200897C; 28 | AP_CheckValue = 0x6A0F71E8; 29 | AP_CheckPoint = 0x20F84EC; 30 | __entry = 0x2130800; 31 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm7/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE := source 15 | LIBS := -L../../lib -ldswifi7 16 | 17 | # define options for compilation 18 | CFLAGS = -I $(SOURCE) -I $(INCLUDE) -std=c99 -Wall -O2 -mtune=arm7tdmi -fomit-frame-pointer -ffast-math 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T $(CURDIR)/linker.ld -nostartfiles 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm7.o $(SOURCE)/entry.o $(SOURCE)/hook.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: arm7.bin 35 | 36 | clean: 37 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 38 | 39 | 40 | # build s-record with init code and c files linked together 41 | arm7.bin: $(OBJS) 42 | $(LD) $(LDFLAGS) -o arm7.elf $(OBJS) $(LIBS) 43 | $(OBJCOPY) -O binary arm7.elf arm7.bin 44 | 45 | # handle compilation of C files 46 | %.o:%.S 47 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 48 | 49 | %.o:%.c 50 | $(CC) $(CFLAGS) -c $< -o $@ 51 | 52 | 53 | -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/arm7/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE := ../../JPN/arm7/source 15 | LIBS := -L../../lib -ldswifi7 16 | 17 | # define options for compilation 18 | CFLAGS = -I $(SOURCE) -I $(INCLUDE) -std=c99 -Wall -O2 -mtune=arm7tdmi -fomit-frame-pointer -ffast-math 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm7/linker.ld -nostartfiles 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm7.o $(SOURCE)/entry.o $(SOURCE)/hook.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: arm7.bin 35 | 36 | clean: 37 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 38 | 39 | 40 | # build s-record with init code and c files linked together 41 | arm7.bin: $(OBJS) 42 | $(LD) $(LDFLAGS) -o arm7.elf $(OBJS) $(LIBS) 43 | $(OBJCOPY) -O binary arm7.elf arm7.bin 44 | 45 | # handle compilation of C files 46 | %.o:%.S 47 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 48 | 49 | %.o:%.c 50 | $(CC) $(CFLAGS) -c $< -o $@ 51 | 52 | 53 | -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/arm7/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE := ../../JPN/arm7/source 15 | LIBS := -L../../lib -ldswifi7 16 | 17 | # define options for compilation 18 | CFLAGS = -I $(SOURCE) -I $(INCLUDE) -std=c99 -Wall -O2 -mtune=arm7tdmi -fomit-frame-pointer -ffast-math 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm7/linker.ld -nostartfiles 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm7.o $(SOURCE)/entry.o $(SOURCE)/hook.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: arm7.bin 35 | 36 | clean: 37 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 38 | 39 | 40 | # build s-record with init code and c files linked together 41 | arm7.bin: $(OBJS) 42 | $(LD) $(LDFLAGS) -o arm7.elf $(OBJS) $(LIBS) 43 | $(OBJCOPY) -O binary arm7.elf arm7.bin 44 | 45 | # handle compilation of C files 46 | %.o:%.S 47 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 48 | 49 | %.o:%.c 50 | $(CC) $(CFLAGS) -c $< -o $@ 51 | 52 | 53 | -------------------------------------------------------------------------------- /WirelessKeyboard/GER/arm7/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE := ../../JPN/arm7/source 15 | LIBS := -L../../lib -ldswifi7 16 | 17 | # define options for compilation 18 | CFLAGS = -I $(SOURCE) -I $(INCLUDE) -std=c99 -Wall -O2 -mtune=arm7tdmi -fomit-frame-pointer -ffast-math 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm7/linker.ld -nostartfiles 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm7.o $(SOURCE)/entry.o $(SOURCE)/hook.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: arm7.bin 35 | 36 | clean: 37 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 38 | 39 | 40 | # build s-record with init code and c files linked together 41 | arm7.bin: $(OBJS) 42 | $(LD) $(LDFLAGS) -o arm7.elf $(OBJS) $(LIBS) 43 | $(OBJCOPY) -O binary arm7.elf arm7.bin 44 | 45 | # handle compilation of C files 46 | %.o:%.S 47 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 48 | 49 | %.o:%.c 50 | $(CC) $(CFLAGS) -c $< -o $@ 51 | 52 | 53 | -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/arm7/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE := ../../JPN/arm7/source 15 | LIBS := -L../../lib -ldswifi7 16 | 17 | # define options for compilation 18 | CFLAGS = -I $(SOURCE) -I $(INCLUDE) -std=c99 -Wall -O2 -mtune=arm7tdmi -fomit-frame-pointer -ffast-math 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm7/linker.ld -nostartfiles 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm7.o $(SOURCE)/entry.o $(SOURCE)/hook.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: arm7.bin 35 | 36 | clean: 37 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 38 | 39 | 40 | # build s-record with init code and c files linked together 41 | arm7.bin: $(OBJS) 42 | $(LD) $(LDFLAGS) -o arm7.elf $(OBJS) $(LIBS) 43 | $(OBJCOPY) -O binary arm7.elf arm7.bin 44 | 45 | # handle compilation of C files 46 | %.o:%.S 47 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 48 | 49 | %.o:%.c 50 | $(CC) $(CFLAGS) -c $< -o $@ 51 | 52 | 53 | -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/arm7/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE := ../../JPN/arm7/source 15 | LIBS := -L../../lib -ldswifi7 16 | 17 | # define options for compilation 18 | CFLAGS = -I $(SOURCE) -I $(INCLUDE) -std=c99 -Wall -O2 -mtune=arm7tdmi -fomit-frame-pointer -ffast-math 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm7/linker.ld -nostartfiles 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm7.o $(SOURCE)/entry.o $(SOURCE)/hook.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: arm7.bin 35 | 36 | clean: 37 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 38 | 39 | 40 | # build s-record with init code and c files linked together 41 | arm7.bin: $(OBJS) 42 | $(LD) $(LDFLAGS) -o arm7.elf $(OBJS) $(LIBS) 43 | $(OBJCOPY) -O binary arm7.elf arm7.bin 44 | 45 | # handle compilation of C files 46 | %.o:%.S 47 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 48 | 49 | %.o:%.c 50 | $(CC) $(CFLAGS) -c $< -o $@ 51 | 52 | 53 | -------------------------------------------------------------------------------- /SaveFix/JPN/main/Makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | SOURCE = ../../../WirelessKeyboard/JPN/arm9/source 15 | 16 | # define options for compilation 17 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=JPN -D=NO_NETWORKING -D=ARM9 -ffunction-sections -fdata-sections -mthumb -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 18 | 19 | 20 | # define options for linkage. Prevent the inclusion of standard start 21 | # code and libraries. 22 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../../WirelessKeyboard/JPN/arm9/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 23 | 24 | 25 | # define options for the objdump 26 | DUMPFLAGS = -xdsS 27 | 28 | # use variables to refer to init code in case it changes 29 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/common.o $(SOURCE)/backup.o 30 | 31 | # 32 | # define build targets 33 | # 34 | all: 35 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 36 | make arm9.bin 37 | 38 | clean: 39 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 40 | 41 | 42 | # build s-record with init code and c files linked together 43 | arm9.bin: $(OBJS) 44 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) 45 | $(OBJCOPY) -O binary arm9.elf arm9.bin 46 | 47 | # handle compilation of C files 48 | %.o:%.S 49 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 50 | 51 | %.o:%.c 52 | $(CC) $(CFLAGS) -c $< -o $@ 53 | 54 | 55 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | LIBS = ../../lib 15 | SOURCE = source 16 | 17 | # define options for compilation 18 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=JPN -D=ARM9 -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 19 | 20 | 21 | # define options for linkage. Prevent the inclusion of standard start 22 | # code and libraries. 23 | LDFLAGS = -T $(CURDIR)/symbol.sym -T $(CURDIR)/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 24 | 25 | 26 | # define options for the objdump 27 | DUMPFLAGS = -xdsS 28 | 29 | # use variables to refer to init code in case it changes 30 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/arm7loader.o $(SOURCE)/common.o $(SOURCE)/backup.o $(SOURCE)/server.o 31 | 32 | 33 | # 34 | # define build targets 35 | # 36 | all: 37 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 38 | make arm9.bin 39 | 40 | clean: 41 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 42 | 43 | 44 | # build s-record with init code and c files linked together 45 | arm9.bin: $(OBJS) 46 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) -L$(LIBS) -ldswifi9 47 | $(OBJCOPY) -O binary arm9.elf arm9.bin 48 | 49 | # handle compilation of C files 50 | $(SOURCE)/server.o:$(SOURCE)/server.c 51 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 52 | 53 | $(SOURCE)/backup.o:$(SOURCE)/backup.c 54 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 55 | 56 | %.o:%.S 57 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 58 | 59 | %.o:%.c 60 | $(CC) $(CFLAGS) -c $< -o $@ 61 | 62 | 63 | -------------------------------------------------------------------------------- /WirelessKeyboard/EUR/arm9/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | LIBS = ../../lib 15 | SOURCE = ../../JPN/arm9/source 16 | 17 | # define options for compilation 18 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=EUR -D=ARM9 -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 19 | 20 | 21 | # define options for linkage. Prevent the inclusion of standard start 22 | # code and libraries. 23 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm9/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 24 | 25 | 26 | # define options for the objdump 27 | DUMPFLAGS = -xdsS 28 | 29 | # use variables to refer to init code in case it changes 30 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/arm7loader.o $(SOURCE)/common.o $(SOURCE)/backup.o $(SOURCE)/server.o 31 | 32 | 33 | # 34 | # define build targets 35 | # 36 | all: 37 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 38 | make arm9.bin 39 | 40 | clean: 41 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 42 | 43 | 44 | # build s-record with init code and c files linked together 45 | arm9.bin: $(OBJS) 46 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) -L$(LIBS) -ldswifi9 47 | $(OBJCOPY) -O binary arm9.elf arm9.bin 48 | 49 | # handle compilation of C files 50 | $(SOURCE)/server.o:$(SOURCE)/server.c 51 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 52 | 53 | $(SOURCE)/backup.o:$(SOURCE)/backup.c 54 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 55 | 56 | %.o:%.S 57 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 58 | 59 | %.o:%.c 60 | $(CC) $(CFLAGS) -c $< -o $@ 61 | 62 | 63 | -------------------------------------------------------------------------------- /WirelessKeyboard/FRA/arm9/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | LIBS = ../../lib 15 | SOURCE = ../../JPN/arm9/source 16 | 17 | # define options for compilation 18 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=FRA -D=ARM9 -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 19 | 20 | 21 | # define options for linkage. Prevent the inclusion of standard start 22 | # code and libraries. 23 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm9/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 24 | 25 | 26 | # define options for the objdump 27 | DUMPFLAGS = -xdsS 28 | 29 | # use variables to refer to init code in case it changes 30 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/arm7loader.o $(SOURCE)/common.o $(SOURCE)/backup.o $(SOURCE)/server.o 31 | 32 | 33 | # 34 | # define build targets 35 | # 36 | all: 37 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 38 | make arm9.bin 39 | 40 | clean: 41 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 42 | 43 | 44 | # build s-record with init code and c files linked together 45 | arm9.bin: $(OBJS) 46 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) -L$(LIBS) -ldswifi9 47 | $(OBJCOPY) -O binary arm9.elf arm9.bin 48 | 49 | # handle compilation of C files 50 | $(SOURCE)/server.o:$(SOURCE)/server.c 51 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 52 | 53 | $(SOURCE)/backup.o:$(SOURCE)/backup.c 54 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 55 | 56 | %.o:%.S 57 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 58 | 59 | %.o:%.c 60 | $(CC) $(CFLAGS) -c $< -o $@ 61 | 62 | 63 | -------------------------------------------------------------------------------- /WirelessKeyboard/GER/arm9/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | LIBS = ../../lib 15 | SOURCE = ../../JPN/arm9/source 16 | 17 | # define options for compilation 18 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=GER -D=ARM9 -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 19 | 20 | 21 | # define options for linkage. Prevent the inclusion of standard start 22 | # code and libraries. 23 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm9/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 24 | 25 | 26 | # define options for the objdump 27 | DUMPFLAGS = -xdsS 28 | 29 | # use variables to refer to init code in case it changes 30 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/arm7loader.o $(SOURCE)/common.o $(SOURCE)/backup.o $(SOURCE)/server.o 31 | 32 | 33 | # 34 | # define build targets 35 | # 36 | all: 37 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 38 | make arm9.bin 39 | 40 | clean: 41 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 42 | 43 | 44 | # build s-record with init code and c files linked together 45 | arm9.bin: $(OBJS) 46 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) -L$(LIBS) -ldswifi9 47 | $(OBJCOPY) -O binary arm9.elf arm9.bin 48 | 49 | # handle compilation of C files 50 | $(SOURCE)/server.o:$(SOURCE)/server.c 51 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 52 | 53 | $(SOURCE)/backup.o:$(SOURCE)/backup.c 54 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 55 | 56 | %.o:%.S 57 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 58 | 59 | %.o:%.c 60 | $(CC) $(CFLAGS) -c $< -o $@ 61 | 62 | 63 | -------------------------------------------------------------------------------- /WirelessKeyboard/ITA/arm9/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | LIBS = ../../lib 15 | SOURCE = ../../JPN/arm9/source 16 | 17 | # define options for compilation 18 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=ITA -D=ARM9 -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 19 | 20 | 21 | # define options for linkage. Prevent the inclusion of standard start 22 | # code and libraries. 23 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm9/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 24 | 25 | 26 | # define options for the objdump 27 | DUMPFLAGS = -xdsS 28 | 29 | # use variables to refer to init code in case it changes 30 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/arm7loader.o $(SOURCE)/common.o $(SOURCE)/backup.o $(SOURCE)/server.o 31 | 32 | 33 | # 34 | # define build targets 35 | # 36 | all: 37 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 38 | make arm9.bin 39 | 40 | clean: 41 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 42 | 43 | 44 | # build s-record with init code and c files linked together 45 | arm9.bin: $(OBJS) 46 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) -L$(LIBS) -ldswifi9 47 | $(OBJCOPY) -O binary arm9.elf arm9.bin 48 | 49 | # handle compilation of C files 50 | $(SOURCE)/server.o:$(SOURCE)/server.c 51 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 52 | 53 | $(SOURCE)/backup.o:$(SOURCE)/backup.c 54 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 55 | 56 | %.o:%.S 57 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 58 | 59 | %.o:%.c 60 | $(CC) $(CFLAGS) -c $< -o $@ 61 | 62 | 63 | -------------------------------------------------------------------------------- /WirelessKeyboard/SPA/arm9/makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(strip $(DEVKITARM)),) 2 | $(error "请将DEVKITARM添加到环境变量") 3 | endif 4 | 5 | PREFIX = $(DEVKITARM)/bin/arm-none-eabi- 6 | 7 | CC = $(PREFIX)gcc 8 | LD = $(PREFIX)gcc 9 | OBJCOPY = $(PREFIX)objcopy 10 | OBJDUMP = $(PREFIX)objdump 11 | 12 | INCLUDE = $(DEVKITPRO)/libnds/include 13 | 14 | LIBS = ../../lib 15 | SOURCE = ../../JPN/arm9/source 16 | 17 | # define options for compilation 18 | CFLAGS = -std=c99 -Wall -Os -march=armv5te -mtune=arm946e-s -D=SPA -D=ARM9 -mthumb-interwork -fomit-frame-pointer -ffast-math -I $(INCLUDE) 19 | 20 | 21 | # define options for linkage. Prevent the inclusion of standard start 22 | # code and libraries. 23 | LDFLAGS = -T $(CURDIR)/symbol.sym -T ../../JPN/arm9/linker.ld -nostartfiles -Wl,--gc-sections,--use-blx 24 | 25 | 26 | # define options for the objdump 27 | DUMPFLAGS = -xdsS 28 | 29 | # use variables to refer to init code in case it changes 30 | OBJS = $(SOURCE)/arm9.o $(SOURCE)/entry.o $(SOURCE)/arm7loader.o $(SOURCE)/common.o $(SOURCE)/backup.o $(SOURCE)/server.o 31 | 32 | 33 | # 34 | # define build targets 35 | # 36 | all: 37 | touch $(SOURCE)/common.c $(SOURCE)/arm9.c $(SOURCE)/entry.S 38 | make arm9.bin 39 | 40 | clean: 41 | rm -f *.o *.elf *.bin *.dump $(SOURCE)/*.o 42 | 43 | 44 | # build s-record with init code and c files linked together 45 | arm9.bin: $(OBJS) 46 | $(LD) $(LDFLAGS) -o arm9.elf $(OBJS) -L$(LIBS) -ldswifi9 47 | $(OBJCOPY) -O binary arm9.elf arm9.bin 48 | 49 | # handle compilation of C files 50 | $(SOURCE)/server.o:$(SOURCE)/server.c 51 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 52 | 53 | $(SOURCE)/backup.o:$(SOURCE)/backup.c 54 | $(CC) $(CFLAGS) -mthumb -c $< -o $@ 55 | 56 | %.o:%.S 57 | $(CC) -D__ASSEMBLY__ $(CFLAGS) -c $< -o $@ 58 | 59 | %.o:%.c 60 | $(CC) $(CFLAGS) -c $< -o $@ 61 | 62 | 63 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/common.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "common.h" 3 | 4 | u32 PxiRtcCallback7 = 0x023E02A4; 5 | 6 | #if (defined JPN) 7 | 8 | void ** heapHeaderRef = (void**)0x20F4CE4; 9 | u32 heapTop = 0x2130C20; 10 | 11 | const u8** backupCtxRef = (const u8**)0x20C7D3C; 12 | const int readBackupHookOffset = 0x2004CDC; 13 | const int writeBackupHookOffset = 0x201953C; 14 | 15 | const int handleTouchDataOffset = 0x2004724; 16 | const int GetInputOffset = 0x205A1B8; 17 | u8 * wirelessKeyboardEnableFlag = (u8*)0x20CD31F; 18 | 19 | const char * arm7BinPath = "/worldmap/sprite/arm7.bin"; 20 | 21 | #elif (defined EUR) 22 | 23 | void ** heapHeaderRef = (void**)0x20F01B0; 24 | u32 heapTop = 0x212C260; 25 | const int GetInputOffset = 0x205AEB8; 26 | 27 | const char * arm7BinPath = "dataUK/worldmap/sprite/arm7.bin"; 28 | 29 | #elif (defined ITA) 30 | 31 | const int GetInputOffset=0x205AED4; 32 | void ** heapHeaderRef = (void**)0x20F01D0; 33 | u32 heapTop = 0x212C280; 34 | 35 | const char * arm7BinPath = "dataIT/worldmap/sprite/arm7.bin"; 36 | 37 | #elif (defined SPA) 38 | 39 | const int GetInputOffset=0x205AEE0; 40 | void ** heapHeaderRef = (void**)0x20F01D0; 41 | u32 heapTop = 0x212C280; 42 | 43 | const char * arm7BinPath = "dataSP/worldmap/sprite/arm7.bin"; 44 | 45 | #elif (defined FRA) 46 | 47 | const int GetInputOffset=0x205AEC4; 48 | void ** heapHeaderRef = (void**)0x20F01D0; 49 | u32 heapTop = 0x212C260; 50 | 51 | const char * arm7BinPath = "dataFR/worldmap/sprite/arm7.bin"; 52 | 53 | #elif (defined GER) 54 | 55 | const int GetInputOffset=0x205AF4C; 56 | void ** heapHeaderRef = (void**)0x20F0270; 57 | u32 heapTop = 0x212C320; 58 | 59 | const char * arm7BinPath = "dataGE/worldmap/sprite/arm7.bin"; 60 | 61 | #endif 62 | 63 | #if (defined EUR) || (defined ITA) || (defined SPA) || (defined FRA) || (defined GER) 64 | 65 | const int readBackupHookOffset = 0x2004D30; 66 | const int writeBackupHookOffset = 0x2019658; 67 | const int handleTouchDataOffset = 0x2004778; 68 | 69 | #endif 70 | 71 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/common.h: -------------------------------------------------------------------------------- 1 | //file interface 2 | 3 | typedef struct _FSFile { 4 | char data[0x3c]; 5 | } FSFile; 6 | 7 | 8 | void FS_InitFile(FSFile *p_file); 9 | bool FS_OpenFile(FSFile *p_file, const char *path); 10 | 11 | static inline u32 FS_GetLength(const FSFile *p_file) 12 | { 13 | return *(u32*)(p_file->data + 0x28) - *(u32*)(p_file->data + 0x24); 14 | } 15 | 16 | s32 FS_ReadFile(FSFile *p_file, void *dst, s32 len); 17 | bool FS_CloseFile(FSFile *p_file); 18 | 19 | //cache interface 20 | 21 | void DC_InvalidateRange(void *startAddr, u32 nBytes); 22 | void DC_StoreRange(const void *startAddr, u32 nBytes); 23 | void DC_FlushRange(const void *startAddr, u32 nBytes); 24 | 25 | //memory interface 26 | 27 | void* FndAllocFromExpHeapEx(void* heap, u32 size, s32 align); 28 | void FndFreeToExpHeap(void* heap, void* ptr); 29 | void* malloc(u32 size); 30 | void free(void * ptr); 31 | 32 | //pxi interface 33 | typedef void (*PXIFifoCallback) (int tag, u32 data, bool err); 34 | 35 | int PXI_SendWordByFifo(int fifotag, u32 data, bool err); 36 | bool PXI_IsCallbackReady(int fifotag, int proc); 37 | void PXI_SetFifoRecvCallback(int fifotag, PXIFifoCallback callback); 38 | 39 | //thread interface 40 | typedef struct _OSThread { 41 | u8 context[512]; 42 | } OSThread; 43 | 44 | void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio); 45 | void OS_WakeupThreadDirect(OSThread *thread); 46 | void OS_ExitThread(void); 47 | void OS_Sleep(u32 msec); 48 | 49 | void initArm7Payload(); 50 | void startServer(); 51 | 52 | // backup 53 | void jmp_writeBackup(); 54 | void initBackup(); 55 | void* backupGetBuffer(const void* ctx, int a1); 56 | u32 foo(); 57 | 58 | extern void ** heapHeaderRef; 59 | extern u32 heapTop; 60 | 61 | extern u32 PxiRtcCallback7; 62 | extern const char * arm7BinPath; 63 | 64 | extern const u8** backupCtxRef; 65 | extern const int readBackupHookOffset; 66 | extern const int writeBackupHookOffset; 67 | 68 | extern const int handleTouchDataOffset; 69 | extern const int GetInputOffset; 70 | extern u8 * wirelessKeyboardEnableFlag; 71 | 72 | #define MAKE_BRANCH(src, dest) (((((s32)(dest) - 8 - (s32)(src)) >> 2) & 0xFFFFFF) | 0xEA000000); 73 | 74 | extern int TouchState; 75 | extern int TouchXY; 76 | extern u16 inputCharacter; 77 | extern int inputState; -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/arm9.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "common.h" 3 | 4 | void orig_HandleTouchData(void*); 5 | 6 | void* malloc(u32 size) { 7 | return FndAllocFromExpHeapEx(*heapHeaderRef, size, 0x10); 8 | } 9 | 10 | void free(void * ptr) { 11 | return FndFreeToExpHeap(*heapHeaderRef, ptr); 12 | } 13 | 14 | int TouchState = 0; 15 | int TouchXY = 0; 16 | u16 inputCharacter = 0; 17 | int inputState = 0; 18 | 19 | void hook_HandleTouchData(char* touchContext) { 20 | if (TouchState == 1) { 21 | *(int*)(touchContext + 0x30) = TouchXY; 22 | touchContext[0x34] = 1; 23 | touchContext[0x35] = 0; 24 | touchContext[0x36] = 1; 25 | TouchState = 2; 26 | return; 27 | } 28 | else if (TouchState == 2) { 29 | touchContext[0x34] = 0; 30 | touchContext[0x35] = 1; 31 | touchContext[0x36] = 0; 32 | TouchState = 0; 33 | return; 34 | } 35 | orig_HandleTouchData(touchContext); 36 | } 37 | 38 | #if (defined EUR) || (defined FRA) || (defined ITA) || (defined SPA) || (defined GER) 39 | 40 | #include "typingMap.h" 41 | 42 | typedef struct _charKeyIDPair { 43 | u32 character:16; 44 | u32 keyID:16; 45 | } charKeyIDPair; 46 | 47 | u8 findKeyID(u16 character) { 48 | charKeyIDPair * dic = (charKeyIDPair*)&typingMap; 49 | int counter = sizeof(typingMap) / sizeof(charKeyIDPair); 50 | int max, min, mid; 51 | min = 0; 52 | max = counter - 1; 53 | while (min <= max) { 54 | mid = (min + max) / 2; 55 | if (dic[mid].character < character) min = mid + 1; 56 | else if (dic[mid].character > character) max = mid - 1; 57 | else return dic[mid].keyID; 58 | } 59 | return 0xFF; 60 | } 61 | 62 | #endif 63 | 64 | u32 hook_GetInput(void * ctx) { 65 | if (inputState == 1) { 66 | inputState = 0; 67 | #ifdef JPN 68 | return inputCharacter; 69 | #endif 70 | 71 | #if (defined EUR) || (defined FRA) || (defined ITA) || (defined SPA) || (defined GER) 72 | return (findKeyID(inputCharacter) << 16) | inputCharacter; 73 | #endif 74 | } 75 | return 0; 76 | } 77 | 78 | int main() { 79 | initBackup(); 80 | #ifndef NO_NETWORKING 81 | initArm7Payload(); 82 | *(u32*)handleTouchDataOffset = 0x46C04778; 83 | *(u32*)(handleTouchDataOffset + 4) = MAKE_BRANCH(handleTouchDataOffset + 4, hook_HandleTouchData); 84 | *(u32*)GetInputOffset = 0x46C04778; 85 | *(u32*)(GetInputOffset + 4) = MAKE_BRANCH(GetInputOffset + 4, hook_GetInput); 86 | startServer(); 87 | #endif 88 | return 0; 89 | } -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/backup.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "common.h" 3 | 4 | #define MAKE_BRANCH_T_L(src, dest) (((((s32)(dest) - 4 - (s32)(src)) >> 12) & 0x7FF) | 0xF000) 5 | #define MAKE_BRANCH_T_H(src, dest) (((((s32)(dest) - 4 - (s32)(src)) >> 1) & 0x7FF) | 0xF800) 6 | 7 | void writeBackup(); 8 | u32 readBackup(); 9 | 10 | u32 backupSharedMem[96 / 4] = {0, 0x1101, 0, 0, 0, 0, 0x20000, 0x100, 0, 0x100, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFF, 0}; 11 | 12 | int backupLength = 0xFD8; 13 | 14 | int requestFlag = 0; 15 | 16 | void onFifoRecv(int tag, u32 data, bool err) 17 | { 18 | if ((tag == 11) && err) { 19 | if (1 == data) { 20 | requestFlag = 1; 21 | } 22 | } 23 | } 24 | 25 | static inline bool sendBackupFifo(u32 data) { 26 | return PXI_SendWordByFifo(11, data, 1) >= 0; 27 | } 28 | 29 | void initBackup() { 30 | *(u16*)readBackupHookOffset = (u16)MAKE_BRANCH_T_L(readBackupHookOffset, readBackup); 31 | *(u16*)(readBackupHookOffset + 2) = (u16)MAKE_BRANCH_T_H(readBackupHookOffset, readBackup); 32 | *(u16*)writeBackupHookOffset = (u16)MAKE_BRANCH_T_L(writeBackupHookOffset, jmp_writeBackup); 33 | *(u16*)(writeBackupHookOffset + 2) = (u16)MAKE_BRANCH_T_H(writeBackupHookOffset, jmp_writeBackup); 34 | PXI_SetFifoRecvCallback(11, onFifoRecv); 35 | requestFlag = 0; 36 | while(!sendBackupFifo(0)); 37 | DC_FlushRange(&backupSharedMem, sizeof(backupSharedMem)); 38 | while(!sendBackupFifo((u32)&backupSharedMem)); 39 | do OS_Sleep(100); while(!requestFlag); 40 | requestFlag = 0; 41 | while(!sendBackupFifo(2)); 42 | do OS_Sleep(100); while(!requestFlag); 43 | } 44 | 45 | u32 readBackup() { 46 | u32 ret = foo(); 47 | const u8 * backupCtx = *backupCtxRef; 48 | for (int i = 0; i < 4; i++) { 49 | void * buf = backupGetBuffer(backupCtx + i * 120 + 12, 0); 50 | backupSharedMem[3] = i << 12; 51 | backupSharedMem[4] = (int)buf; 52 | backupSharedMem[5] = backupLength; 53 | DC_FlushRange(&backupSharedMem, sizeof(backupSharedMem)); 54 | requestFlag = 0; 55 | while(!sendBackupFifo(6)); 56 | do OS_Sleep(100); while(!requestFlag); 57 | DC_InvalidateRange(buf, backupLength); 58 | } 59 | return ret; 60 | } 61 | 62 | void writeBackup() { 63 | const u8 * backupCtx = *backupCtxRef; 64 | int slot = backupCtx[480]; 65 | const u8 * slotCtx = backupCtx + slot * 120; 66 | void * buf = backupGetBuffer(slotCtx + 12, 0); 67 | DC_FlushRange(buf, backupLength); 68 | backupSharedMem[3] = (int)buf; 69 | backupSharedMem[4] = slot << 12; 70 | backupSharedMem[5] = backupLength; 71 | DC_FlushRange(&backupSharedMem, sizeof(backupSharedMem)); 72 | requestFlag = 0; 73 | while(!sendBackupFifo(7)); 74 | do OS_Sleep(100); while(!requestFlag); 75 | } -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/entry.S: -------------------------------------------------------------------------------- 1 | #define STUB_FUNC_THUMB(name)\ 2 | .section .text.##name;\ 3 | .global name;\ 4 | .type name, %function;\ 5 | .code 32;\ 6 | name:\ 7 | ldr pc, =_##name;\ 8 | 9 | 10 | .section .text.start 11 | .global _start; 12 | .arm 13 | _start: 14 | push {lr} 15 | ldr r0, =__bss_start 16 | mov r1, #0 17 | ldr r2, =_end 18 | sub r2, r2, r0 19 | bl memset 20 | #ifndef NO_NETWORKING 21 | bl changePU 22 | #endif 23 | pop {lr} 24 | #ifndef JPN 25 | adr r0, AP_Patch 26 | ldr r1, =0x2000A00 27 | sub r0, r0, r1 28 | mvn r2, #0xFF000000 29 | and r0,r2, r0, asr #2 30 | orr r0, #0xEA000000 31 | str r0, [r1, #-0x8] 32 | #endif 33 | b main 34 | 35 | #ifndef JPN 36 | AP0: 37 | ldr r0, value0 38 | bx lr 39 | value0: 40 | .word 0xB3CF 41 | 42 | AP1: 43 | ldr r0, value1 44 | bx lr 45 | value1: 46 | .word 0xC127 47 | 48 | AP_Patch: 49 | push {r0-r2, lr} 50 | ldr r0,=AP_CheckValue 51 | ldr r1,=AP_CheckPoint 52 | ldr r2, [r1] 53 | cmp r2, r0 54 | ldreq r0, patchValue 55 | streq r0, [r1] 56 | addeq r0, #0xC 57 | streq r0, [r1, #0xAC] 58 | pop {r0-r2, pc} 59 | 60 | patchValue: 61 | .word AP0 + 0x60000000 62 | 63 | #endif 64 | 65 | .section .text.changePU 66 | .global changePU; 67 | .type changePU, %function; 68 | .arm 69 | changePU: 70 | ldr r0, =0x240002B 71 | mcr p15, 0, r0, c6, c2, 0 72 | mrc p15, 0, r0, c5, c0, 2 73 | bic r0, r0, #0xF00 74 | orr r0, r0, #0x300 75 | mcr p15, 0, r0, c5, c0, 2 76 | mrc p15, 0, r0, c5, c0, 3 77 | bic r0, r0, #0xF00 78 | orr r0, r0, #0x300 79 | mcr p15, 0, r0, c5, c0, 3 80 | bx lr 81 | 82 | STUB_FUNC_THUMB(FS_InitFile) 83 | STUB_FUNC_THUMB(FS_OpenFile) 84 | STUB_FUNC_THUMB(FS_ReadFile) 85 | STUB_FUNC_THUMB(FS_CloseFile) 86 | STUB_FUNC_THUMB(OS_EnableIrqMask) 87 | STUB_FUNC_THUMB(OS_SetIrqFunction) 88 | STUB_FUNC_THUMB(PXI_SendWordByFifo) 89 | STUB_FUNC_THUMB(PXI_SetFifoRecvCallback) 90 | STUB_FUNC_THUMB(PXI_IsCallbackReady) 91 | STUB_FUNC_THUMB(OS_CreateThread) 92 | STUB_FUNC_THUMB(OS_ExitThread) 93 | STUB_FUNC_THUMB(OS_WakeupThreadDirect) 94 | STUB_FUNC_THUMB(OS_Sleep) 95 | STUB_FUNC_THUMB(FndAllocFromExpHeapEx) 96 | STUB_FUNC_THUMB(FndFreeToExpHeap) 97 | STUB_FUNC_THUMB(backupGetBuffer) 98 | STUB_FUNC_THUMB(foo) 99 | 100 | .section .text.orig_HandleTouchData 101 | .global orig_HandleTouchData; 102 | .type orig_HandleTouchData, %function; 103 | .arm 104 | orig_HandleTouchData: 105 | PUSH {R4-R7,LR} 106 | SUB SP, SP, #0xC 107 | MOVS R5, R0 108 | MOVS R6, #0 109 | ldr pc, =_orig_HandleTouchData_8 110 | 111 | .section .text.jmp_writeBackup 112 | .global jmp_writeBackup 113 | .type jmp_writeBackup, %function; 114 | .thumb 115 | jmp_writeBackup: 116 | push {r3} 117 | bl writeBackup 118 | pop {pc} 119 | 120 | -------------------------------------------------------------------------------- /WirelessKeyboard/client/client_win.py: -------------------------------------------------------------------------------- 1 | import pythoncom 2 | import pyHook 3 | import socket 4 | import struct 5 | import time 6 | import png 7 | 8 | seqNo = 0 9 | 10 | def sendCMDPacket(cmd, data): 11 | global seqNo 12 | if len(data) > 0x10: 13 | data = data[0 : 0x10] 14 | msg = 'TPAC' + struct.pack('iii%ds%dx' % (len(data), 16 - len(data)), seqNo, cmd, 0x10, data) 15 | s.sendto(msg, address) 16 | curSeqNo = seqNo 17 | seqNo = seqNo + 1 18 | return curSeqNo 19 | 20 | def recvAckPacket(ackSeqNo): 21 | while True: 22 | try: 23 | msg, addr = s.recvfrom(400) 24 | except: 25 | return (False, '') 26 | if len(msg) != 32: 27 | continue 28 | packetType, seq, cmd, bodySize, data = struct.unpack('4i16s', msg) 29 | if packetType == 0x43415054 and seq == ackSeqNo and cmd == 1: 30 | return (True, data) 31 | 32 | def recvDataPacket(ackSeqNo, packetsz): 33 | while True: 34 | try: 35 | msg, addr = s.recvfrom(16 + packetsz) 36 | except: 37 | return (False, '', -1) 38 | if len(msg) != 400: 39 | continue 40 | packetType, seq, index, bodySize, data = struct.unpack('4i%ds' % packetsz, msg) 41 | if packetType == 0x44415054 and seq == ackSeqNo and bodySize == packetsz: 42 | return (True, data, index) 43 | 44 | def recvBuffer(sz, packetsz, packectr): 45 | global seqNo 46 | s.settimeout(1.5) 47 | ackSeqNo = sendCMDPacket(6, '') 48 | packets = [False] * packectr 49 | while True: 50 | result, data, index = recvDataPacket(ackSeqNo, packetsz) 51 | if result == False: 52 | break 53 | else: 54 | packets[index] = data 55 | s.settimeout(0.1) 56 | for i in range(0, packectr): 57 | if packets[i] == False: 58 | print 'missing packet id', i 59 | for j in range(0, 4): 60 | ackSeqNo = sendCMDPacket(4, struct.pack('i', i)) 61 | result, data, index = recvDataPacket(ackSeqNo, packetsz) 62 | if result == False: 63 | continue 64 | elif index != i: 65 | print 'index is not match' 66 | else: 67 | packets[index] = data 68 | break 69 | ackSeqNo = sendCMDPacket(5, '') 70 | result, body = recvAckPacket(ackSeqNo) 71 | if result == False: 72 | print 'ack packet missing' 73 | outbuf = '' 74 | missingbuf = 'missing\x00' * (packetsz / 8 + 1) 75 | for subPacket in packets: 76 | if subPacket == False: 77 | outbuf = outbuf + missingbuf[0 : packetsz] 78 | else: 79 | outbuf = outbuf + subPacket 80 | return outbuf[0 : sz] 81 | 82 | def savePng(width, height, buffer, fname): 83 | rows = [0] * height 84 | for j in range(0, height): 85 | row = [] 86 | for i in range(0, width): 87 | value = struct.unpack("H", buffer[(j * width + i) * 2 : (j * width + i) * 2 + 2])[0] 88 | r = (value & 0x1F) << 3 89 | g = (value & 0x3E0) >> 2 90 | b = (value & 0x7C00) >> 7 91 | row = row + [r, g, b] 92 | rows[j] = row 93 | f = open(fname, 'wb') 94 | w = png.Writer(width, height) 95 | w.write(f, rows) 96 | f.close() 97 | 98 | def onKeyboardEvent(event): 99 | """ 100 | print "Ascii:", event.Ascii, chr(event.Ascii) 101 | print "Key:", event.Key 102 | print "KeyID:", event.KeyID 103 | special keys: 104 | right shift 0xFF00 105 | left shift 0xFF01 106 | control 0xFF02 107 | right alt 0xFF04 108 | caps lock 0xFF06 109 | function 0xFF07 110 | home 0xFF08 111 | half/full 0xFF09 (JPN only) 112 | yan mark 0xFF0A (JPN only) 113 | left alt 0xFF0B (EUR only) 114 | left 0xE04B 115 | up 0xE048 116 | down 0xE050 117 | right 0xE04D 118 | """ 119 | spKeyDic = {20:0xFF06, 37:0xE04B, 38:0xE048, 39:0xE04D, 40:0xE050, 160:0xFF00, 161:0xFF01, 162:0xFF02, 36:0xFF08, 27:0xFF09, 164:0xFF04, 165:0xFF0B, 163:0xFF07} 120 | print 'key down' 121 | global seqNo 122 | if chr(event.Ascii)[0] != '\x00' and spKeyDic.has_key(event.KeyID) == False: 123 | curSeqNo = sendCMDPacket(2, chr(event.Ascii)) 124 | result, body = recvAckPacket(curSeqNo) 125 | if result == False: 126 | print 'ack packet missing' 127 | elif spKeyDic.has_key(event.KeyID): 128 | keyValue = spKeyDic[event.KeyID] 129 | curSeqNo = sendCMDPacket(2, struct.pack('H', keyValue)) 130 | result, body = recvAckPacket(curSeqNo) 131 | if result == False: 132 | print 'ack packet missing' 133 | elif event.KeyID == 44: 134 | curSeqNo = sendCMDPacket(3, '') 135 | result, body = recvAckPacket(curSeqNo) 136 | if result == False: 137 | print 'ack packet missing' 138 | else: 139 | sz, packectr, packetsz = struct.unpack('3i4x', body) 140 | if sz != 0 and packectr != 0 and packetsz != 0: 141 | buf = recvBuffer(sz, packetsz, packectr) 142 | fname = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())) 143 | savePng(256, 192, buf, fname + ".png") 144 | print "save screenshot" 145 | return True 146 | 147 | 148 | 149 | def main(): 150 | ndsIP = raw_input('enter IP of nds:\n') 151 | global address 152 | global s 153 | 154 | address = (ndsIP, 818) 155 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 156 | s.settimeout(0.1) 157 | 158 | hm = pyHook.HookManager() 159 | 160 | hm.KeyDown = onKeyboardEvent 161 | 162 | hm.HookKeyboard() 163 | 164 | pythoncom.PumpMessages() 165 | 166 | 167 | if __name__ == "__main__": 168 | main() 169 | -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/server.c: -------------------------------------------------------------------------------- 1 | #include "nds/ndstypes.h" 2 | #include "nds/dma.h" 3 | #include "nds/arm9/video.h" 4 | #include "common.h" 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #define DATA_BODY_SIZE 384 13 | #define SCREENSHOT_WIDTH 256 14 | #define SCREENSHOT_HEIGHT 192 15 | 16 | typedef enum _TP_PACKET_TYPE { 17 | TYPE_CMD = 0x43415054, //'TPAC' 18 | TYPE_DATA = 0x44415054 //'TPAD' 19 | } TP_PACKET_TYPE; 20 | 21 | typedef struct _TPPacketHeader{ 22 | TP_PACKET_TYPE type; 23 | int seqNo; 24 | union _common { 25 | int cmd; 26 | int index; 27 | } common; 28 | int bodySize; 29 | } TPPacketHeader; 30 | 31 | typedef struct _TPPacketCMD { 32 | TPPacketHeader header; 33 | union _data { 34 | u32 req[4]; 35 | u32 resp[4]; 36 | } data; 37 | } TPPacketCMD; 38 | 39 | typedef enum _PACKET_TYPE { 40 | REQ_TOUCHPANEL, 41 | REQ_ACK, 42 | REQ_ASCII, 43 | REQ_CAPTURE, 44 | REQ_RETRY, 45 | REQ_CAPTURE_DONE, 46 | REQ_START_SEND 47 | } PACKET_TYPE; 48 | 49 | 50 | 51 | static inline void sendBufferByIndex(int sock, u8* buffer, int sz, struct sockaddr_in * sock_in, int addr_len, TPPacketHeader * header) { 52 | int index = header->common.index; 53 | u8 tmp_buffer[sizeof(TPPacketHeader) + DATA_BODY_SIZE]; 54 | memcpy(&tmp_buffer, header, sizeof(TPPacketHeader)); 55 | u8 * body = tmp_buffer + sizeof(TPPacketHeader); 56 | memcpy(body, buffer + index * DATA_BODY_SIZE, sz - DATA_BODY_SIZE * index < DATA_BODY_SIZE ? sz - DATA_BODY_SIZE * index : DATA_BODY_SIZE); 57 | sendto(sock, tmp_buffer, sizeof(tmp_buffer), 0, (const struct sockaddr*)sock_in, addr_len); 58 | } 59 | 60 | void sendBuffer(int sock, u8* buffer, int sz, struct sockaddr_in * sock_in, int addr_len, int seqNo) { 61 | TPPacketHeader header; 62 | header.type = TYPE_DATA; 63 | header.seqNo = seqNo; 64 | header.bodySize = DATA_BODY_SIZE; 65 | int packetCount = (sz + DATA_BODY_SIZE - 1) / DATA_BODY_SIZE; 66 | for (int i = 0; i < packetCount; i++) { 67 | header.common.index = i; 68 | sendBufferByIndex(sock, buffer, sz, sock_in, addr_len, &header); 69 | OS_Sleep(10); 70 | if (i != 0 && ((i & 0xFF) == 0)) 71 | OS_Sleep(1000); 72 | } 73 | } 74 | 75 | void screenshot(u8* buffer) { 76 | u8* vram_temp=(u8*)FndAllocFromExpHeapEx(*heapHeaderRef, 128*1024, -0x10); 77 | 78 | if (vram_temp) { 79 | 80 | u8 vram_cr_temp=VRAM_D_CR; 81 | VRAM_D_CR=VRAM_D_LCD | 0x80; 82 | 83 | dmaCopy(VRAM_D, vram_temp, 128*1024); 84 | 85 | REG_DISPCAPCNT=DCAP_BANK(3)|DCAP_ENABLE|DCAP_SIZE(3); 86 | while(REG_DISPCAPCNT & DCAP_ENABLE); 87 | 88 | dmaCopy(VRAM_D, buffer, 256*192*2); 89 | dmaCopy(vram_temp, VRAM_D, 128*1024); 90 | 91 | VRAM_D_CR=vram_cr_temp; 92 | 93 | free(vram_temp); 94 | } 95 | } 96 | 97 | void HandlePacket(void * arg) { 98 | int sock, curSeqNo, addr_len, dumpSize, index; 99 | u8 * snapshot,* offset; 100 | TPPacketCMD packet; 101 | struct sockaddr_in serv_addr, sock_in; 102 | 103 | if (!Wifi_InitDefault(1)) OS_ExitThread(); 104 | 105 | sock = socket(AF_INET ,SOCK_DGRAM ,0); 106 | 107 | memset(&serv_addr, 0, sizeof(serv_addr)); 108 | serv_addr.sin_family = AF_INET; 109 | serv_addr.sin_addr.s_addr = INADDR_ANY; 110 | serv_addr.sin_port = htons(818); 111 | 112 | if (sock >= 0 && bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) >= 0) { 113 | curSeqNo = -1; 114 | addr_len = dumpSize = 0; 115 | snapshot = offset = (u8*)0; 116 | 117 | memset(&packet, 0, sizeof(TPPacketCMD)); 118 | memset(&sock_in, 0, sizeof(struct sockaddr_in)); 119 | 120 | while(1) { 121 | if (recvfrom(sock, &packet, sizeof(TPPacketCMD), 0, (struct sockaddr*)&sock_in, &addr_len) >= 0) { 122 | if (packet.header.type != TYPE_CMD || packet.header.bodySize != sizeof(packet.data)) continue;//invalid packet 123 | if (packet.header.seqNo != curSeqNo) { 124 | curSeqNo = packet.header.seqNo; 125 | switch(packet.header.common.cmd) { 126 | case REQ_TOUCHPANEL: 127 | if (TouchState == 0) { 128 | *wirelessKeyboardEnableFlag = 0; 129 | TouchXY = (int)packet.data.req[0]; 130 | TouchState = 1; 131 | } 132 | packet.header.common.cmd = REQ_ACK; 133 | sendto(sock, &packet, sizeof(TPPacketCMD), 0, (const struct sockaddr*)&sock_in, addr_len); 134 | break; 135 | case REQ_ASCII: 136 | if (inputState == 0) { 137 | *wirelessKeyboardEnableFlag = 1; 138 | inputCharacter = (u16)packet.data.req[0]; 139 | inputState = 1; 140 | } 141 | packet.header.common.cmd = REQ_ACK; 142 | sendto(sock, &packet, sizeof(TPPacketCMD), 0, (const struct sockaddr*)&sock_in, addr_len); 143 | break; 144 | case REQ_CAPTURE: 145 | if (snapshot) free(snapshot); 146 | dumpSize = SCREENSHOT_WIDTH * SCREENSHOT_HEIGHT * 2; 147 | snapshot = (u8*)FndAllocFromExpHeapEx(*heapHeaderRef, dumpSize, -0x10); 148 | if (snapshot) { 149 | screenshot(snapshot); 150 | packet.header.common.cmd = REQ_ACK; 151 | packet.data.resp[0] = dumpSize; 152 | packet.data.resp[1] = dumpSize / DATA_BODY_SIZE; 153 | packet.data.resp[2] = DATA_BODY_SIZE; 154 | sendto(sock, &packet, sizeof(TPPacketCMD), 0, (const struct sockaddr*)&sock_in, addr_len); 155 | } 156 | else { 157 | packet.header.common.cmd = REQ_ACK; 158 | memset(&packet.data, 0, sizeof(packet.data)); 159 | sendto(sock, &packet, sizeof(TPPacketCMD), 0, (const struct sockaddr*)&sock_in, addr_len); 160 | } 161 | break; 162 | case REQ_START_SEND: 163 | if (snapshot && dumpSize) { 164 | sendBuffer(sock, snapshot, dumpSize, &sock_in, addr_len, curSeqNo); 165 | } 166 | break; 167 | case REQ_RETRY: 168 | if (snapshot && dumpSize) { 169 | index = (int)packet.data.req[0]; 170 | packet.header.type = TYPE_DATA; 171 | packet.header.common.index = index; 172 | packet.header.bodySize = DATA_BODY_SIZE; 173 | sendBufferByIndex(sock, snapshot, dumpSize, &sock_in, addr_len, &packet.header); 174 | } 175 | break; 176 | case REQ_CAPTURE_DONE: 177 | if (snapshot) { 178 | free(snapshot); 179 | snapshot = (u8*)0; 180 | } 181 | if (dumpSize) dumpSize = 0; 182 | packet.header.common.cmd = REQ_ACK; 183 | sendto(sock, &packet, sizeof(TPPacketCMD), 0, (const struct sockaddr*)&sock_in, addr_len); 184 | break; 185 | } 186 | } 187 | else { 188 | packet.header.common.cmd = REQ_ACK;//only send ack packet 189 | sendto(sock, &packet, sizeof(TPPacketCMD), 0, (const struct sockaddr*)&sock_in, addr_len); 190 | } 191 | } 192 | } 193 | } 194 | OS_ExitThread(); 195 | } 196 | 197 | void startServer() { 198 | static OSThread backboardThread; 199 | static u8 stack[0x1000]; 200 | OS_CreateThread(&backboardThread, HandlePacket, (void*)0, stack + 0x1000, 0x1000, 8); 201 | OS_WakeupThreadDirect(&backboardThread); 202 | } -------------------------------------------------------------------------------- /WirelessKeyboard/Tools.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import struct 3 | 4 | def searchFunc(mem, sig, isThumb): 5 | addr = mem.find(sig) 6 | if addr == -1: 7 | return -1; 8 | else: 9 | addr = addr + 0x2000000 10 | if isThumb: 11 | return addr + 1; 12 | else: 13 | return addr 14 | 15 | def searchFunctions(mem): 16 | sigDicT = {'FS_InitFile':'\x23\x21\x00\x22\x09\x02\x11\x43\x82\x60\x42\x60\x02\x60\xC2\x61', 17 | 'FS_OpenFileFast':'\x0F\xB4\x08\xB5\x82\xB0\x05\x99\x00\x23\x06\x9A\x00\x29\x09\xD0', 18 | 'FS_ReadFile':'\x70\xB5\x82\xB0\x0E\x1C\x00\xA9\x05\x1C\x14\x1C\x00\xF0\xD2\xFF', 19 | 'OS_EnableIrqMask':'\x18\xB4\x07\x4C\x00\x21\x23\x88\x22\x1C\x08\x32\x21\x80\x11\x68', 20 | 'OS_SetIrqFunction':'\xF0\xB4\x0D\x1C\x00\x23\x06\x1C\x12\x49\x13\x4A\x18\x1C\x01\x24', 21 | 'PXI_SendWordByFifo':'\x78\xB5\x81\xB0\x00\x9C\x1F\x23\x9C\x43\x1F\x23\x18\x40\x23\x1C', 22 | 'PXI_SetFifoRecvCallback':'\x38\xB5\x05\x1C\x0C\x1C\xFF\xF7\x12\xEE\x02\x1C\xA9\x00\x0D\x48', 23 | 'PXI_IsCallbackReady':'\x18\xB4\x01\x22\x82\x40\x06\x4C\x88\x00\x21\x18\xE2\x20\x80\x00', 24 | 'OS_CreateThread':'\xF0\xB5\x83\xB0\x05\x1C\x00\x91\x01\x92\x1E\x1C\x01\xF0\x8E\xEB', 25 | 'OS_ExitThread':'\x08\xB5\x01\xF0\x30\xEB\x03\x48\x00\x21\x00\x6A\x00\xF0\x04\xF8', 26 | 'OS_WakeupThreadDirect':'\x38\xB5\x05\x1C\x01\xF0\x54\xEA\x04\x1C\x01\x20\x68\x66\xFF\xF7', 27 | 'OS_Sleep':'\x78\xB5\x8D\xB0\x02\xAE\x05\x1C\x30\x1C\x00\xF0\x8D\xFF\x15\x48', 28 | 'FndAllocFromExpHeapEx':'\x08\xB5\x00\x29\x00\xD1\x01\x21\x03\x23\xC9\x1C\x99\x43\x00\x2A', 29 | 'FndFreeToExpHeap':'\x70\xB5\x82\xB0\x0D\x1C\x04\x1C\x10\x3D\x00\xAE\x24\x34\x30\x1C'} 30 | symbolDic = {} 31 | for key, v in sigDicT.items(): 32 | addr = searchFunc(mem, v, True) 33 | symbolDic['_' + key] = addr 34 | sigDicArm = {'DC_InvalidateRange':'\x00\x10\x81\xE0\x1F\x00\xC0\xE3\x36\x0F\x07\xEE\x20\x00\x80\xE2', 35 | 'DC_StoreRange':'\x00\x10\x81\xE0\x1F\x00\xC0\xE3\x3A\x0F\x07\xEE\x20\x00\x80\xE2', 36 | 'DC_FlushRange':'\x00\xC0\xA0\xE3\x00\x10\x81\xE0\x1F\x00\xC0\xE3\x9A\xCF\x07\xEE', 37 | 'DC_FlushAll':'\x00\xC0\xA0\xE3\x00\x10\xA0\xE3\x00\x00\xA0\xE3\x00\x20\x81\xE1' 38 | } 39 | for key, v in sigDicArm.items(): 40 | addr = searchFunc(mem, v, False) 41 | symbolDic[key] = addr 42 | sigDicT2 = {'_FS_OpenFile':('\xF8\xB5\xCA\xB0\x05\x1C\x16\x1C\x00\x24\x08\x1C\x00\xA9\x04\xAA', '\x01\x4B\x01\x22\x18\x47\xC0\x46'), 43 | '_FS_CloseFile': ('\xF0\xB5\x83\xB0\x05\x1C\xE8\x68\x00\x91\x01\x21\x17\x1C\x00\x26','\x01\x4B\x08\x21\x01\x22\x18\x47')} 44 | for key, v in sigDicT2.items(): 45 | addr = searchFunc(mem, v[0], True) 46 | sig2 = v[1] + struct.pack('i', addr) 47 | addr = searchFunc(mem, sig2, True) 48 | symbolDic[key] = addr 49 | # for EUR FRA GER ITA SPA these addresses are fixed 50 | symbolDic['_backupGetBuffer'] = 0x201A5B9 51 | symbolDic['_orig_HandleTouchData_8'] = 0x2004781 52 | symbolDic['backupCtxRef'] = 0x2002B80 53 | symbolDic['wirelessKeyboardEnableFlag'] = 0x200897C 54 | instructionH = struct.unpack('H', mem[0x4D30: 0x4D32])[0] 55 | instructionL = struct.unpack('H', mem[0x4D32: 0x4D34])[0] 56 | immH = instructionH & 0x3FF 57 | immL = instructionL & 0x7FF 58 | imm = (immH << 12) | (immL << 1) 59 | symbolDic['_foo'] = 0x2004D34 + imm + 1 60 | return symbolDic 61 | 62 | def searchValue(mem, value): 63 | results = [] 64 | offset = 0 65 | while True: 66 | result = mem.find(value, offset) 67 | if result == -1: 68 | break 69 | results = results + [result + 0x2000000] 70 | offset = result + len(value) 71 | return results 72 | 73 | def searchHeap(mem): 74 | HPXEOffsets = searchValue(mem, 'HPXE') 75 | heapTopOffsetRefs = searchValue(mem, struct.pack('i', HPXEOffsets[1])) 76 | heapHeaderRefs = searchValue(mem, struct.pack('i', HPXEOffsets[2])) 77 | return [HPXEOffsets[1], heapTopOffsetRefs[0], heapHeaderRefs[2]] 78 | 79 | def searchSymbols(mem, heapdata): 80 | results = [] 81 | symDic = {'const int GetInputOffset':'\x02\x6C\x41\x6C\x8A\x42\x01\xD1\x00\x20\x70\x47\x91\x00\x43\x58'} 82 | for key, v in symDic.items(): 83 | result = searchFunc(mem, v, False) 84 | results = results + [key + '=' + '0x%X' % result + ';'] 85 | results = results + ['void ** heapHeaderRef = (void**)' + '0x%X' % heapdata[2] + ';'] 86 | results = results + ['u32 heapTop = ' + '0x%X' % heapdata[0] + ';'] 87 | return results 88 | 89 | def listAddressOfLoadPossible(mem): 90 | securityArea = mem[0 : 2048] 91 | subAreas = securityArea.split('\xDF\x70\x47') 92 | offset = 0 93 | max = 0 94 | maxOffset = 0 95 | for area in subAreas: 96 | if max < len(area) - 1: 97 | maxOffset = offset 98 | max = len(area) - 1 99 | offset = offset + len(area) + 3 100 | maxOffset = maxOffset + 0x2000000 101 | print 'address = 0x%X , length = 0x%X' % (maxOffset, max) 102 | ins = 0xFA000000 | ((maxOffset - 0x2000900 - 8) >> 2) & 0xFFFFFF 103 | print '0x2000900 0x%X' % ins 104 | imm = (maxOffset + 0x10 - 0x2000BB2 - 4) >> 1; 105 | insH = ((imm >> 11) & 0x7FF) | 0xF000 106 | insL = (imm & 0x7FF) | 0xF800 107 | print '0x2000BB2 %X, %X' % (insH, insL) 108 | 109 | def tryGetTypingMap(mem): 110 | ref = struct.unpack('i', mem[0x1094 : 0x1094 + 4])[0] & 0xFFFFFF 111 | ref = struct.unpack('i', mem[ref : ref + 4])[0] & 0xFFFFFF 112 | ref = struct.unpack('i', mem[ref + 4 : ref + 8])[0] & 0xFFFFFF 113 | if ref == 0: 114 | return '' 115 | dic = {} 116 | print '0x%X' % ref 117 | for i in range(0, 0x40): 118 | typingDataOffset = struct.unpack('i', mem[ref + 8 + i * 4 : ref + 0xc + i * 4])[0] & 0xFFFFFF 119 | for j in range(0, 4): 120 | char = struct.unpack('H', mem[typingDataOffset + 0x10 + j * 2 : typingDataOffset + 0x12 + j * 2])[0] 121 | if char == 0: 122 | continue 123 | elif dic.has_key(char) == False: 124 | dic[char] = struct.unpack('H', mem[typingDataOffset + 0x18 : typingDataOffset + 0x1A])[0] 125 | items = dic.items() 126 | items.sort() 127 | typingMap = '' 128 | for k, v in items: 129 | typingMap = typingMap + struct.pack('HH',k, v) 130 | return typingMap 131 | 132 | def main(): 133 | if len(sys.argv) == 2: 134 | f = open(sys.argv[1], 'rb') 135 | mem = f.read() 136 | f.close() 137 | functions = searchFunctions(mem) 138 | heapdata = searchHeap(mem) 139 | symbols = searchSymbols(mem, heapdata) 140 | print 'arm7payload entrypoint = 0x%x' % (heapdata[0] + 0x400000) 141 | print 'arm9payload entrypoint = 0x%x' % ((heapdata[0] + 0x4000 + 0x3FF) & ~0x3FF) 142 | print 'oldHeapRef = 0x%X' % heapdata[1] 143 | archiveObjs = searchValue(mem, 'rom\x00') 144 | print 'archiveObj = 0x%X' % archiveObjs[4] 145 | listAddressOfLoadPossible(mem) 146 | f = open('symbol.sym', 'w') 147 | for k, v in functions.items(): 148 | f.write(k + ' = ' + '0x%X' % v + ';\n') 149 | f.write('__entry = ' + '0x%X' % ((heapdata[0] + 0x4000 + 0x3FF) & ~0x3FF) + ';\n') 150 | f.close() 151 | f = open('common.c', 'w') 152 | for sym in symbols: 153 | f.write(sym + '\n') 154 | f.close() 155 | typingMap = tryGetTypingMap(mem) 156 | if len(typingMap) != 0: 157 | f = open('typingMap.bin', 'wb') 158 | f.write(typingMap) 159 | f.close() 160 | 161 | if __name__ == "__main__": 162 | main() -------------------------------------------------------------------------------- /WirelessKeyboard/JPN/arm9/source/typingMap.h: -------------------------------------------------------------------------------- 1 | #if (defined EUR) 2 | 3 | static unsigned char typingMap[] __attribute__((aligned(16))) = { 4 | 0x08, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2c, 0x00, 5 | 0x21, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x34, 0x00, 0x23, 0x00, 0x32, 0x00, 0x24, 0x00, 0x21, 0x00, 6 | 0x25, 0x00, 0x22, 0x00, 0x26, 0x00, 0x24, 0x00, 0x27, 0x00, 0x34, 0x00, 0x28, 0x00, 0x26, 0x00, 7 | 0x29, 0x00, 0x27, 0x00, 0x2a, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x36, 0x00, 8 | 0x2d, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x37, 0x00, 0x2f, 0x00, 0x38, 0x00, 0x30, 0x00, 0x27, 0x00, 9 | 0x31, 0x00, 0x1e, 0x00, 0x32, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x21, 0x00, 10 | 0x35, 0x00, 0x22, 0x00, 0x36, 0x00, 0x23, 0x00, 0x37, 0x00, 0x24, 0x00, 0x38, 0x00, 0x25, 0x00, 11 | 0x39, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x3c, 0x00, 0x36, 0x00, 12 | 0x3d, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x38, 0x00, 0x40, 0x00, 0x1f, 0x00, 13 | 0x41, 0x00, 0x04, 0x00, 0x42, 0x00, 0x05, 0x00, 0x43, 0x00, 0x06, 0x00, 0x44, 0x00, 0x07, 0x00, 14 | 0x45, 0x00, 0x08, 0x00, 0x46, 0x00, 0x09, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x0b, 0x00, 15 | 0x49, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x0d, 0x00, 0x4b, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x0f, 0x00, 16 | 0x4d, 0x00, 0x10, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x13, 0x00, 17 | 0x51, 0x00, 0x14, 0x00, 0x52, 0x00, 0x15, 0x00, 0x53, 0x00, 0x16, 0x00, 0x54, 0x00, 0x17, 0x00, 18 | 0x55, 0x00, 0x18, 0x00, 0x56, 0x00, 0x19, 0x00, 0x57, 0x00, 0x1a, 0x00, 0x58, 0x00, 0x1b, 0x00, 19 | 0x59, 0x00, 0x1c, 0x00, 0x5a, 0x00, 0x1d, 0x00, 0x5b, 0x00, 0x2f, 0x00, 0x5c, 0x00, 0x64, 0x00, 20 | 0x5d, 0x00, 0x30, 0x00, 0x5e, 0x00, 0x23, 0x00, 0x5f, 0x00, 0x2d, 0x00, 0x60, 0x00, 0x35, 0x00, 21 | 0x61, 0x00, 0x04, 0x00, 0x62, 0x00, 0x05, 0x00, 0x63, 0x00, 0x06, 0x00, 0x64, 0x00, 0x07, 0x00, 22 | 0x65, 0x00, 0x08, 0x00, 0x66, 0x00, 0x09, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x68, 0x00, 0x0b, 0x00, 23 | 0x69, 0x00, 0x0c, 0x00, 0x6a, 0x00, 0x0d, 0x00, 0x6b, 0x00, 0x0e, 0x00, 0x6c, 0x00, 0x0f, 0x00, 24 | 0x6d, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 0x6f, 0x00, 0x12, 0x00, 0x70, 0x00, 0x13, 0x00, 25 | 0x71, 0x00, 0x14, 0x00, 0x72, 0x00, 0x15, 0x00, 0x73, 0x00, 0x16, 0x00, 0x74, 0x00, 0x17, 0x00, 26 | 0x75, 0x00, 0x18, 0x00, 0x76, 0x00, 0x19, 0x00, 0x77, 0x00, 0x1a, 0x00, 0x78, 0x00, 0x1b, 0x00, 27 | 0x79, 0x00, 0x1c, 0x00, 0x7a, 0x00, 0x1d, 0x00, 0x7b, 0x00, 0x2f, 0x00, 0x7c, 0x00, 0x64, 0x00, 28 | 0x7d, 0x00, 0x30, 0x00, 0x7e, 0x00, 0x32, 0x00, 0xa3, 0x00, 0x20, 0x00, 0xac, 0x20, 0x08, 0x00, 29 | 0x48, 0xe0, 0x52, 0x00, 0x4b, 0xe0, 0x50, 0x00, 0x4d, 0xe0, 0x4f, 0x00, 0x50, 0xe0, 0x51, 0x00, 30 | 0x00, 0xff, 0x72, 0x00, 0x01, 0xff, 0x71, 0x00, 0x02, 0xff, 0x70, 0x00, 0x04, 0xff, 0x73, 0x00, 31 | 0x06, 0xff, 0x39, 0x00, 0x07, 0xff, 0x75, 0x00, 0x08, 0xff, 0x74, 0x00, 0x0b, 0xff, 0x76, 0x00, 32 | }; 33 | 34 | #elif (defined FRA) 35 | 36 | static unsigned char typingMap[] __attribute__((aligned(16))) = { 37 | 0x08, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2c, 0x00, 38 | 0x21, 0x00, 0x38, 0x00, 0x22, 0x00, 0x20, 0x00, 0x23, 0x00, 0x20, 0x00, 0x24, 0x00, 0x30, 0x00, 39 | 0x25, 0x00, 0x34, 0x00, 0x26, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x21, 0x00, 0x28, 0x00, 0x22, 0x00, 40 | 0x29, 0x00, 0x2d, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x10, 0x00, 41 | 0x2d, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x30, 0x00, 0x27, 0x00, 42 | 0x31, 0x00, 0x1e, 0x00, 0x32, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x21, 0x00, 43 | 0x35, 0x00, 0x22, 0x00, 0x36, 0x00, 0x23, 0x00, 0x37, 0x00, 0x24, 0x00, 0x38, 0x00, 0x25, 0x00, 44 | 0x39, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x64, 0x00, 45 | 0x3d, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x64, 0x00, 0x3f, 0x00, 0x10, 0x00, 0x40, 0x00, 0x27, 0x00, 46 | 0x41, 0x00, 0x14, 0x00, 0x42, 0x00, 0x05, 0x00, 0x43, 0x00, 0x06, 0x00, 0x44, 0x00, 0x07, 0x00, 47 | 0x45, 0x00, 0x08, 0x00, 0x46, 0x00, 0x09, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x0b, 0x00, 48 | 0x49, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x0d, 0x00, 0x4b, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x0f, 0x00, 49 | 0x4d, 0x00, 0x33, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x13, 0x00, 50 | 0x51, 0x00, 0x04, 0x00, 0x52, 0x00, 0x15, 0x00, 0x53, 0x00, 0x16, 0x00, 0x54, 0x00, 0x17, 0x00, 51 | 0x55, 0x00, 0x18, 0x00, 0x56, 0x00, 0x19, 0x00, 0x57, 0x00, 0x1d, 0x00, 0x58, 0x00, 0x1b, 0x00, 52 | 0x59, 0x00, 0x1c, 0x00, 0x5a, 0x00, 0x1a, 0x00, 0x5b, 0x00, 0x22, 0x00, 0x5c, 0x00, 0x25, 0x00, 53 | 0x5d, 0x00, 0x2d, 0x00, 0x5e, 0x00, 0x26, 0x00, 0x5f, 0x00, 0x25, 0x00, 0x60, 0x00, 0x24, 0x00, 54 | 0x61, 0x00, 0x14, 0x00, 0x62, 0x00, 0x05, 0x00, 0x63, 0x00, 0x06, 0x00, 0x64, 0x00, 0x07, 0x00, 55 | 0x65, 0x00, 0x08, 0x00, 0x66, 0x00, 0x09, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x68, 0x00, 0x0b, 0x00, 56 | 0x69, 0x00, 0x0c, 0x00, 0x6a, 0x00, 0x0d, 0x00, 0x6b, 0x00, 0x0e, 0x00, 0x6c, 0x00, 0x0f, 0x00, 57 | 0x6d, 0x00, 0x33, 0x00, 0x6e, 0x00, 0x11, 0x00, 0x6f, 0x00, 0x12, 0x00, 0x70, 0x00, 0x13, 0x00, 58 | 0x71, 0x00, 0x04, 0x00, 0x72, 0x00, 0x15, 0x00, 0x73, 0x00, 0x16, 0x00, 0x74, 0x00, 0x17, 0x00, 59 | 0x75, 0x00, 0x18, 0x00, 0x76, 0x00, 0x19, 0x00, 0x77, 0x00, 0x1d, 0x00, 0x78, 0x00, 0x1b, 0x00, 60 | 0x79, 0x00, 0x1c, 0x00, 0x7a, 0x00, 0x1a, 0x00, 0x7b, 0x00, 0x21, 0x00, 0x7c, 0x00, 0x23, 0x00, 61 | 0x7d, 0x00, 0x2e, 0x00, 0x7e, 0x00, 0x1f, 0x00, 0xa3, 0x00, 0x30, 0x00, 0xa4, 0x00, 0x30, 0x00, 62 | 0xa7, 0x00, 0x38, 0x00, 0xa8, 0x00, 0x2f, 0x00, 0xb0, 0x00, 0x2d, 0x00, 0xb2, 0x00, 0x35, 0x00, 63 | 0xb5, 0x00, 0x32, 0x00, 0xc7, 0x00, 0x26, 0x00, 0xe0, 0x00, 0x27, 0x00, 0xe8, 0x00, 0x24, 0x00, 64 | 0xe9, 0x00, 0x1f, 0x00, 0xf9, 0x00, 0x34, 0x00, 0xac, 0x20, 0x08, 0x00, 0x48, 0xe0, 0x52, 0x00, 65 | 0x4b, 0xe0, 0x50, 0x00, 0x4d, 0xe0, 0x4f, 0x00, 0x50, 0xe0, 0x51, 0x00, 0x00, 0xff, 0x72, 0x00, 66 | 0x01, 0xff, 0x71, 0x00, 0x02, 0xff, 0x70, 0x00, 0x04, 0xff, 0x73, 0x00, 0x06, 0xff, 0x39, 0x00, 67 | 0x07, 0xff, 0x75, 0x00, 0x08, 0xff, 0x74, 0x00, 0x0b, 0xff, 0x76, 0x00, 68 | }; 69 | 70 | #elif (defined GER) 71 | 72 | static unsigned char typingMap[] __attribute__((aligned(16))) = { 73 | 0x08, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2c, 0x00, 74 | 0x21, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x32, 0x00, 0x24, 0x00, 0x21, 0x00, 75 | 0x25, 0x00, 0x22, 0x00, 0x26, 0x00, 0x23, 0x00, 0x27, 0x00, 0x32, 0x00, 0x28, 0x00, 0x25, 0x00, 76 | 0x29, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x36, 0x00, 77 | 0x2d, 0x00, 0x38, 0x00, 0x2e, 0x00, 0x37, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x30, 0x00, 0x27, 0x00, 78 | 0x31, 0x00, 0x1e, 0x00, 0x32, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x21, 0x00, 79 | 0x35, 0x00, 0x22, 0x00, 0x36, 0x00, 0x23, 0x00, 0x37, 0x00, 0x24, 0x00, 0x38, 0x00, 0x25, 0x00, 80 | 0x39, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x64, 0x00, 81 | 0x3d, 0x00, 0x27, 0x00, 0x3e, 0x00, 0x64, 0x00, 0x3f, 0x00, 0x2d, 0x00, 0x40, 0x00, 0x14, 0x00, 82 | 0x41, 0x00, 0x04, 0x00, 0x42, 0x00, 0x05, 0x00, 0x43, 0x00, 0x06, 0x00, 0x44, 0x00, 0x07, 0x00, 83 | 0x45, 0x00, 0x08, 0x00, 0x46, 0x00, 0x09, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x0b, 0x00, 84 | 0x49, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x0d, 0x00, 0x4b, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x0f, 0x00, 85 | 0x4d, 0x00, 0x10, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x13, 0x00, 86 | 0x51, 0x00, 0x14, 0x00, 0x52, 0x00, 0x15, 0x00, 0x53, 0x00, 0x16, 0x00, 0x54, 0x00, 0x17, 0x00, 87 | 0x55, 0x00, 0x18, 0x00, 0x56, 0x00, 0x19, 0x00, 0x57, 0x00, 0x1a, 0x00, 0x58, 0x00, 0x1b, 0x00, 88 | 0x59, 0x00, 0x1d, 0x00, 0x5a, 0x00, 0x1c, 0x00, 0x5b, 0x00, 0x25, 0x00, 0x5c, 0x00, 0x2d, 0x00, 89 | 0x5d, 0x00, 0x26, 0x00, 0x5e, 0x00, 0x35, 0x00, 0x5f, 0x00, 0x38, 0x00, 0x60, 0x00, 0x2e, 0x00, 90 | 0x61, 0x00, 0x04, 0x00, 0x62, 0x00, 0x05, 0x00, 0x63, 0x00, 0x06, 0x00, 0x64, 0x00, 0x07, 0x00, 91 | 0x65, 0x00, 0x08, 0x00, 0x66, 0x00, 0x09, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x68, 0x00, 0x0b, 0x00, 92 | 0x69, 0x00, 0x0c, 0x00, 0x6a, 0x00, 0x0d, 0x00, 0x6b, 0x00, 0x0e, 0x00, 0x6c, 0x00, 0x0f, 0x00, 93 | 0x6d, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 0x6f, 0x00, 0x12, 0x00, 0x70, 0x00, 0x13, 0x00, 94 | 0x71, 0x00, 0x14, 0x00, 0x72, 0x00, 0x15, 0x00, 0x73, 0x00, 0x16, 0x00, 0x74, 0x00, 0x17, 0x00, 95 | 0x75, 0x00, 0x18, 0x00, 0x76, 0x00, 0x19, 0x00, 0x77, 0x00, 0x1a, 0x00, 0x78, 0x00, 0x1b, 0x00, 96 | 0x79, 0x00, 0x1d, 0x00, 0x7a, 0x00, 0x1c, 0x00, 0x7b, 0x00, 0x24, 0x00, 0x7c, 0x00, 0x64, 0x00, 97 | 0x7d, 0x00, 0x27, 0x00, 0x7e, 0x00, 0x30, 0x00, 0xa7, 0x00, 0x20, 0x00, 0xb0, 0x00, 0x35, 0x00, 98 | 0xb2, 0x00, 0x1f, 0x00, 0xb3, 0x00, 0x20, 0x00, 0xb4, 0x00, 0x2e, 0x00, 0xb5, 0x00, 0x10, 0x00, 99 | 0xc4, 0x00, 0x34, 0x00, 0xd6, 0x00, 0x33, 0x00, 0xdc, 0x00, 0x2f, 0x00, 0xdf, 0x00, 0x2d, 0x00, 100 | 0xe4, 0x00, 0x34, 0x00, 0xf6, 0x00, 0x33, 0x00, 0xfc, 0x00, 0x2f, 0x00, 0xac, 0x20, 0x08, 0x00, 101 | 0x48, 0xe0, 0x52, 0x00, 0x4b, 0xe0, 0x50, 0x00, 0x4d, 0xe0, 0x4f, 0x00, 0x50, 0xe0, 0x51, 0x00, 102 | 0x00, 0xff, 0x72, 0x00, 0x01, 0xff, 0x71, 0x00, 0x02, 0xff, 0x70, 0x00, 0x04, 0xff, 0x73, 0x00, 103 | 0x06, 0xff, 0x39, 0x00, 0x07, 0xff, 0x75, 0x00, 0x08, 0xff, 0x74, 0x00, 0x0b, 0xff, 0x76, 0x00, 104 | }; 105 | 106 | #elif (defined ITA) 107 | 108 | static unsigned char typingMap[] __attribute__((aligned(16))) = { 109 | 0x08, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2c, 0x00, 110 | 0x21, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x34, 0x00, 0x24, 0x00, 0x21, 0x00, 111 | 0x25, 0x00, 0x22, 0x00, 0x26, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x28, 0x00, 0x25, 0x00, 112 | 0x29, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x36, 0x00, 113 | 0x2d, 0x00, 0x38, 0x00, 0x2e, 0x00, 0x37, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x30, 0x00, 0x27, 0x00, 114 | 0x31, 0x00, 0x1e, 0x00, 0x32, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x21, 0x00, 115 | 0x35, 0x00, 0x22, 0x00, 0x36, 0x00, 0x23, 0x00, 0x37, 0x00, 0x24, 0x00, 0x38, 0x00, 0x25, 0x00, 116 | 0x39, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x64, 0x00, 117 | 0x3d, 0x00, 0x27, 0x00, 0x3e, 0x00, 0x64, 0x00, 0x3f, 0x00, 0x2d, 0x00, 0x40, 0x00, 0x33, 0x00, 118 | 0x41, 0x00, 0x04, 0x00, 0x42, 0x00, 0x05, 0x00, 0x43, 0x00, 0x06, 0x00, 0x44, 0x00, 0x07, 0x00, 119 | 0x45, 0x00, 0x08, 0x00, 0x46, 0x00, 0x09, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x0b, 0x00, 120 | 0x49, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x0d, 0x00, 0x4b, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x0f, 0x00, 121 | 0x4d, 0x00, 0x10, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x13, 0x00, 122 | 0x51, 0x00, 0x14, 0x00, 0x52, 0x00, 0x15, 0x00, 0x53, 0x00, 0x16, 0x00, 0x54, 0x00, 0x17, 0x00, 123 | 0x55, 0x00, 0x18, 0x00, 0x56, 0x00, 0x19, 0x00, 0x57, 0x00, 0x1a, 0x00, 0x58, 0x00, 0x1b, 0x00, 124 | 0x59, 0x00, 0x1c, 0x00, 0x5a, 0x00, 0x1d, 0x00, 0x5b, 0x00, 0x2f, 0x00, 0x5c, 0x00, 0x35, 0x00, 125 | 0x5d, 0x00, 0x30, 0x00, 0x5e, 0x00, 0x2e, 0x00, 0x5f, 0x00, 0x38, 0x00, 0x61, 0x00, 0x04, 0x00, 126 | 0x62, 0x00, 0x05, 0x00, 0x63, 0x00, 0x06, 0x00, 0x64, 0x00, 0x07, 0x00, 0x65, 0x00, 0x08, 0x00, 127 | 0x66, 0x00, 0x09, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x68, 0x00, 0x0b, 0x00, 0x69, 0x00, 0x0c, 0x00, 128 | 0x6a, 0x00, 0x0d, 0x00, 0x6b, 0x00, 0x0e, 0x00, 0x6c, 0x00, 0x0f, 0x00, 0x6d, 0x00, 0x10, 0x00, 129 | 0x6e, 0x00, 0x11, 0x00, 0x6f, 0x00, 0x12, 0x00, 0x70, 0x00, 0x13, 0x00, 0x71, 0x00, 0x14, 0x00, 130 | 0x72, 0x00, 0x15, 0x00, 0x73, 0x00, 0x16, 0x00, 0x74, 0x00, 0x17, 0x00, 0x75, 0x00, 0x18, 0x00, 131 | 0x76, 0x00, 0x19, 0x00, 0x77, 0x00, 0x1a, 0x00, 0x78, 0x00, 0x1b, 0x00, 0x79, 0x00, 0x1c, 0x00, 132 | 0x7a, 0x00, 0x1d, 0x00, 0x7b, 0x00, 0x2f, 0x00, 0x7c, 0x00, 0x35, 0x00, 0x7d, 0x00, 0x30, 0x00, 133 | 0xa3, 0x00, 0x20, 0x00, 0xa7, 0x00, 0x32, 0x00, 0xb0, 0x00, 0x34, 0x00, 0xc7, 0x00, 0x33, 0x00, 134 | 0xe0, 0x00, 0x34, 0x00, 0xe8, 0x00, 0x2f, 0x00, 0xe9, 0x00, 0x2f, 0x00, 0xec, 0x00, 0x2e, 0x00, 135 | 0xf2, 0x00, 0x33, 0x00, 0xf9, 0x00, 0x32, 0x00, 0xac, 0x20, 0x08, 0x00, 0x48, 0xe0, 0x52, 0x00, 136 | 0x4b, 0xe0, 0x50, 0x00, 0x4d, 0xe0, 0x4f, 0x00, 0x50, 0xe0, 0x51, 0x00, 0x00, 0xff, 0x72, 0x00, 137 | 0x01, 0xff, 0x71, 0x00, 0x02, 0xff, 0x70, 0x00, 0x04, 0xff, 0x73, 0x00, 0x06, 0xff, 0x39, 0x00, 138 | 0x07, 0xff, 0x75, 0x00, 0x08, 0xff, 0x74, 0x00, 0x0b, 0xff, 0x76, 0x00, 139 | }; 140 | 141 | #elif (defined SPA) 142 | 143 | static unsigned char typingMap[] __attribute__((aligned(16))) = { 144 | 0x08, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2c, 0x00, 145 | 0x21, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x20, 0x00, 0x24, 0x00, 0x21, 0x00, 146 | 0x25, 0x00, 0x22, 0x00, 0x26, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x28, 0x00, 0x25, 0x00, 147 | 0x29, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x36, 0x00, 148 | 0x2d, 0x00, 0x38, 0x00, 0x2e, 0x00, 0x37, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x30, 0x00, 0x27, 0x00, 149 | 0x31, 0x00, 0x1e, 0x00, 0x32, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x21, 0x00, 150 | 0x35, 0x00, 0x22, 0x00, 0x36, 0x00, 0x23, 0x00, 0x37, 0x00, 0x24, 0x00, 0x38, 0x00, 0x25, 0x00, 151 | 0x39, 0x00, 0x26, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x64, 0x00, 152 | 0x3d, 0x00, 0x27, 0x00, 0x3e, 0x00, 0x64, 0x00, 0x3f, 0x00, 0x2d, 0x00, 0x40, 0x00, 0x1f, 0x00, 153 | 0x41, 0x00, 0x04, 0x00, 0x42, 0x00, 0x05, 0x00, 0x43, 0x00, 0x06, 0x00, 0x44, 0x00, 0x07, 0x00, 154 | 0x45, 0x00, 0x08, 0x00, 0x46, 0x00, 0x09, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x0b, 0x00, 155 | 0x49, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x0d, 0x00, 0x4b, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x0f, 0x00, 156 | 0x4d, 0x00, 0x10, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x13, 0x00, 157 | 0x51, 0x00, 0x14, 0x00, 0x52, 0x00, 0x15, 0x00, 0x53, 0x00, 0x16, 0x00, 0x54, 0x00, 0x17, 0x00, 158 | 0x55, 0x00, 0x18, 0x00, 0x56, 0x00, 0x19, 0x00, 0x57, 0x00, 0x1a, 0x00, 0x58, 0x00, 0x1b, 0x00, 159 | 0x59, 0x00, 0x1c, 0x00, 0x5a, 0x00, 0x1d, 0x00, 0x5b, 0x00, 0x2f, 0x00, 0x5c, 0x00, 0x35, 0x00, 160 | 0x5d, 0x00, 0x30, 0x00, 0x5e, 0x00, 0x2f, 0x00, 0x5f, 0x00, 0x38, 0x00, 0x60, 0x00, 0x2f, 0x00, 161 | 0x61, 0x00, 0x04, 0x00, 0x62, 0x00, 0x05, 0x00, 0x63, 0x00, 0x06, 0x00, 0x64, 0x00, 0x07, 0x00, 162 | 0x65, 0x00, 0x08, 0x00, 0x66, 0x00, 0x09, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x68, 0x00, 0x0b, 0x00, 163 | 0x69, 0x00, 0x0c, 0x00, 0x6a, 0x00, 0x0d, 0x00, 0x6b, 0x00, 0x0e, 0x00, 0x6c, 0x00, 0x0f, 0x00, 164 | 0x6d, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 0x6f, 0x00, 0x12, 0x00, 0x70, 0x00, 0x13, 0x00, 165 | 0x71, 0x00, 0x14, 0x00, 0x72, 0x00, 0x15, 0x00, 0x73, 0x00, 0x16, 0x00, 0x74, 0x00, 0x17, 0x00, 166 | 0x75, 0x00, 0x18, 0x00, 0x76, 0x00, 0x19, 0x00, 0x77, 0x00, 0x1a, 0x00, 0x78, 0x00, 0x1b, 0x00, 167 | 0x79, 0x00, 0x1c, 0x00, 0x7a, 0x00, 0x1d, 0x00, 0x7b, 0x00, 0x34, 0x00, 0x7c, 0x00, 0x1e, 0x00, 168 | 0x7d, 0x00, 0x32, 0x00, 0x7e, 0x00, 0x21, 0x00, 0xa1, 0x00, 0x2e, 0x00, 0xa8, 0x00, 0x34, 0x00, 169 | 0xaa, 0x00, 0x35, 0x00, 0xac, 0x00, 0x23, 0x00, 0xb0, 0x00, 0x35, 0x00, 0xb4, 0x00, 0x34, 0x00, 170 | 0xb7, 0x00, 0x20, 0x00, 0xbf, 0x00, 0x2e, 0x00, 0xc7, 0x00, 0x32, 0x00, 0xd1, 0x00, 0x33, 0x00, 171 | 0xe7, 0x00, 0x32, 0x00, 0xf1, 0x00, 0x33, 0x00, 0xac, 0x20, 0x08, 0x00, 0x48, 0xe0, 0x52, 0x00, 172 | 0x4b, 0xe0, 0x50, 0x00, 0x4d, 0xe0, 0x4f, 0x00, 0x50, 0xe0, 0x51, 0x00, 0x00, 0xff, 0x72, 0x00, 173 | 0x01, 0xff, 0x71, 0x00, 0x02, 0xff, 0x70, 0x00, 0x04, 0xff, 0x73, 0x00, 0x06, 0xff, 0x39, 0x00, 174 | 0x07, 0xff, 0x75, 0x00, 0x08, 0xff, 0x74, 0x00, 0x0b, 0xff, 0x76, 0x00, 175 | }; 176 | 177 | #else 178 | static unsigned char typingMap[] __attribute__((aligned(16))) = { 179 | 0x00, 0x00, 0x00, 0x00, 180 | }; 181 | 182 | #endif --------------------------------------------------------------------------------