Skip to content

Instantly share code, notes, and snippets.

Working from home

32th System 32th-System

Working from home
View GitHub Profile
View th03_resident.h
typedef struct {
char id[11]; // "YUMEConfig"
char difficulty;
char playchar_paletted[2]; // ID of the player character in the same format as in playchar_palleted in player.h
char pl_is_cpu[2];
long random_seed;
char unused;
char music_mode;
char input_mode
bool game_over;

Required game information:


  • The input state is a 142 byte structure. An array of 3 starts at Rxaceb8.
  • input_state[0] (0x4ACE18) is ingame player 1
  • input_state[1] (0x4ACEA6) is ingame player 2
  • input_state[2] (0x4ACF34) is meta input (input picked up by menus and such)
  • The actual input poller is at 0x42B850.
  • The wrapper function that calls the input poller to retrieve all the inputs is at 0x42E9C0

These hex values correspond to following inputs: (the inputs are combined by using logical OR, they're bit flags. Also those are hexadecimal numbers)

32th-System / th17.h
Last active Oct 3, 2019
Touhou 17 data types
View th17.h
// The member names are based off the parameters from
// The bullet types and colors are taken from here
typedef enum {
ali_n:/dev/block/by-name # ls -l
total 0
lrwxrwxrwx 1 root root 21 1970-02-13 02:59 DDR -> /dev/block/mmcblk0p23
lrwxrwxrwx 1 root root 20 1970-02-13 02:59 aboot -> /dev/block/mmcblk0p5
lrwxrwxrwx 1 root root 21 1970-02-13 02:59 abootbak -> /dev/block/mmcblk0p14
lrwxrwxrwx 1 root root 21 1970-02-13 02:59 apdp -> /dev/block/mmcblk0p42
lrwxrwxrwx 1 root root 21 1970-02-13 02:59 boot -> /dev/block/mmcblk0p36
lrwxrwxrwx 1 root root 21 1970-02-13 02:59 cache -> /dev/block/mmcblk0p51
lrwxrwxrwx 1 root root 21 1970-02-13 02:59 carrier -> /dev/block/mmcblk0p33

A custom ECL opcode that can display a popup window. Syntax: ins_720(int a, string)

if the string contains %d, it will get replaced by the int a

        "ins_720_code": {
            "code": "6A 00 89 F9 E8 ED 0B F9 FF 50 83 C6 18 56 31 C0 8A 0E 46 40 84 C9 75 F8 83 C0 0A 50 E8 2C 0B FF FF 83 C4 04 50 6A 00 6A 00 68 50 AE 4A 00 FF 15 30 71 49 00 68 70 AE 4A 00 50 FF 15 D8 70 49 00 FF D0 6A 00 68 80 AE 4A 00 FF 74 24 08 6A 00 FF 15 08 72 49 00 83 C4 0C E9 6F DB F8 FF",
View th12.js
"binhacks": {
"playermovement_prep": {
"expected": "01B7 88090000 8B8F 88090000 0187 8C090000",
"code": "E9 0E130600 CC 8B8F 88090000 E9 1C130600 CC",
"addr": "Rx367e2",
"title": "Player movement preperation for movement freeze"
"customins_jmpbytes": {
"expected": "8e8e",

The EoSD setup guide

The Japanese locale

EoSD has Kanji in the filenames for it's DAT files. A locale specific function is used to find these files and load their contents. When running EoSD with a non-Japanese locale, what EosD will look for is Mojibake, not the actual names of the DATs. Installing EoSD from a CD will not work because of that with a non-Japanese locale.

The solution is to use Locale Emulator. Install it by running LEInstall.exe. It doesn't matter if you install for ne user or for all users. After installing, every time you right click an exe, there will be additional menu entries for running the executable in Japanese. Every EoSD executable needs to be ran in Japanese.

Infinite FPS in Windows 10

Windows 10 isn't nessesairly known for it's amazing compatibillity and while EoSD in fullscreen mode will run, you will get infinite FPS. In order to fix this issue, download the [DirextX8 to DirectX9 converter](


Building Taisei for Windows

Requirements (We will cross compile on Ubuntu for Windows because build tools for Windows suck):

-VirtualBox -Ubuntu installation ISO -Your CPU needs to support virtualization and it needs to be enabled in the BIOS. Otherwise, if you are using Windows 10, you can use the Windows Subsystem for Linux.

VirtualBox preperation (You will need the ISO for a different Ubuntu flavour or the network installer for 32-bit)**: