emulator: "advanced_drastic" type: standalone core_classification: enhanced_fork source: "https://github.com/trngaje/advanced_drastic" upstream: closed-source author: "trngaje (hooks), Exophase (DraStic)" profiled_date: "2026-10-22" source_commit: "eaf41ab9bc8adcc15c010bf9517bc94c38e7bffd" pin_frozen: "KNULLI, the only platform that ships it, builds this revision (KNULLI package/emulators/advanced_drastic/advanced_drastic.mk:7 at tag 20260511). Later commits are not part of that build." pin_build: - platform: knulli repo: "https://github.com/knulli-cfw/knulli-linux" revision: "20260511" path: "package/emulators/advanced_drastic/advanced_drastic.mk" variable: ADVANCED_DRASTIC_VERSION value: "eaf41ab9bc8adcc15c010bf9517bc94c38e7bffd" core_version: "r2.5.2.0" version_basis: kind: file path: "drastic" pattern: "Version (r[0-9][0-9.]+[0-9])" display_name: "Nintendo - DS (advanced_drastic)" cores: - "advanced_drastic" - "drastic - standalone" - "DraStic-original" systems: - nintendo-ds mode: standalone notes: | trngaje's package around the closed-source 64-bit Linux DraStic. The repository carries the DraStic binary itself, md5 59a7711eff41c640b8861b4d869c747d (sha256 6e11511907f21888), stripped, which draws "Version r2.5.2.0" in its menu, together with its system, config, resources and microphone directories, game_database.xml and usrcheat.dat. launch.sh puts libs/ under its own directory on LD_LIBRARY_PATH, changes to that directory and runs ./drastic on the content, so that directory is the root every path below is joined to. ref: launch.sh:1-9, drastic r2.5.2.0 FUN_93140 0x931b4-0x931cc (draws the version string) KNULLI builds this revision, installs the whole tree under /usr/share/advanced_drastic, copies it to /userdata/system/configs/advanced_drastic on first launch or after a board change, then starts launch.sh from there. The copy includes the Nintendo BIOS and firmware images the repository ships, so the platform installs them with the emulator. ref: KNULLI package/emulators/advanced_drastic/advanced_drastic.mk:7-14, KNULLI package/system/knulli-configgen/configgen/configgen/generators/advanced_drastic/advanced_drasticGenerator.py:30-50,156-158 The binary names the same system files as DraStic r2.5.2.2: each BIOS slot takes the Nintendo image, then the free DraStic one ("Can't find Nintendo ARM9 BIOS. Trying free DraStic ARM9 BIOS."), the firmware is nds_firmware.bin alone, a file of the wrong length is refused with "System file %s is the wrong size", and an empty slot ends in "FATAL: Could not load system files." It carries neither the firmware editor's nds_firmware_modified.bin nor game_database_user.xml. The root also serves game_database.xml, usrcheat.dat, microphone/.wav then microphone/microphone.wav, scripts/.lua then scripts/default.lua, cheats/.cht, slot2/.gba, drastic_dldi.img for homebrew and the drastic_logo_.raw splash. The functions are unnamed and are matched to their r2.5.2.2 names by the strings and calls they share: FUN_fbd0 is load_system_file, FUN_1e7e0 initialize_memory, FUN_10920 initialize_system, FUN_84640 initialize_gamecard, FUN_86cf0 initialize_game_database, FUN_94650 load_cheat_directory, FUN_81720 reset_spu, FUN_839d0 load_nds, FUN_951e0 load_custom_cheats, FUN_82c50 gamecard_load_gba, FUN_82480 gamecard_initialize_homebrew and FUN_93360 load_logo. ref: drastic r2.5.2.0 FUN_fbd0 0xfc18-0xfd04, drastic r2.5.2.0 FUN_1e7e0 0x1ed78-0x1ef6c, drastic r2.5.2.0 FUN_10920 0x10ab8-0x10b84, drastic r2.5.2.0 FUN_84640 0x84678-0x846d0, drastic r2.5.2.0 FUN_81720 0x819c8-0x81a78, drastic r2.5.2.0 FUN_839d0 0x83c30-0x83cd0, drastic r2.5.2.0 FUN_951e0 0x952a4-0x952c4, drastic r2.5.2.0 FUN_82c50 0x82c98-0x82cdc, drastic r2.5.2.0 FUN_82480 0x824f4-0x825ac, drastic r2.5.2.0 FUN_93360 0x933b8-0x93400 files: - name: nds_bios_arm9.bin path: system/nds_bios_arm9.bin system: nintendo-ds required: false bundled: true size: 4096 sha1: "bfaac75f101c135e32e2aaf541de6b1be4c8c62d" md5: "a392174eb3e572fed6447e956bde4b25" validation: [size] description: "Nintendo DS ARM9 BIOS" note: "First candidate for the ARM9 slot, before the free replacement. The hashes are those of the copy the repository ships." source_ref: "drastic r2.5.2.0 FUN_1e7e0 0x1ed78-0x1ed94 (FUN_fbd0 of nds_bios_arm9.bin for 0x1000 bytes, failure branches to 0x1eea4), FUN_fbd0 0xfc18-0xfca4 (sprintf %s%csystem%c%s, fopen rb, fseek and ftell length compared to the requested size, fread), 0xfcec-0xfd04 (wrong size message, returns -1), FUN_10920 0x10ab8-0x10b84 (a negative return from FUN_1e7e0 draws the missing BIOS screen through FUN_93ae0, prints FATAL: Could not load system files. and quits)" - name: drastic_bios_arm9.bin sha1: 4dc29a1560e1cbd7afef1998f7a6c25c5db1cc3a md5: 5f34f9f6108f8d57fc26789b7a7ecf82 path: system/drastic_bios_arm9.bin system: nintendo-ds required: false bundled: true size: 4096 validation: [size] description: "DraStic free ARM9 BIOS replacement" source_ref: "drastic r2.5.2.0 FUN_1e7e0 0x1eea4-0x1eec8 (logs Can't find Nintendo ARM9 BIOS, then FUN_fbd0 of drastic_bios_arm9.bin for 0x1000 bytes), 0x1eecc-0x1eeec (sets the free ARM9 bit), 0x1f160 (failure returns -1)" - name: nds_bios_arm7.bin path: system/nds_bios_arm7.bin system: nintendo-ds required: false bundled: true size: 16384 sha1: "24f67bdea115a2c847c8813a262502ee1607b7df" md5: "df692a80a5b1bc90728bc3dfc76cd948" validation: [size] description: "Nintendo DS ARM7 BIOS" note: "First candidate for the ARM7 slot. The hashes are those of the copy the repository ships." source_ref: "drastic r2.5.2.0 FUN_1e7e0 0x1ed9c-0x1edb8 (FUN_fbd0 of nds_bios_arm7.bin for 0x4000 bytes, failure branches to 0x1eefc), 0x1eed8-0x1eef8 (same load on the path that took the free ARM9 image)" - name: drastic_bios_arm7.bin sha1: 31ae916c85d012582c7cdf47de6943ac6778253b md5: c259d5dd2d1a8e1f58eaa26c08efae45 path: system/drastic_bios_arm7.bin system: nintendo-ds required: false bundled: true size: 16384 validation: [size] description: "DraStic free ARM7 BIOS replacement" source_ref: "drastic r2.5.2.0 FUN_1e7e0 0x1eefc-0x1ef20 (logs the fallback message, then FUN_fbd0 of drastic_bios_arm7.bin for 0x4000 bytes), 0x1f160 (failure returns -1)" - name: nds_firmware.bin path: system/nds_firmware.bin system: nintendo-ds required: false hle_fallback: true bundled: true size: 262144 sha1: "87dae2500e889737af51f4a5b5845770a62482f5" md5: "3c704824663ce26b6a1ed4d85238ae5b" validation: [size] description: "Nintendo DS firmware" note: "The hashes are those of the copy the repository ships." source_ref: "drastic r2.5.2.0 FUN_1e7e0 0x1edc0-0x1eddc, 0x1ef30-0x1ef50 (FUN_fbd0 of nds_firmware.bin for 0x40000 bytes), 0x1ef54-0x1ef6c (on failure the region is zeroed and FUN_1e250 writes the firmware header, then the boot carries on)" - name: game_database.xml path: game_database.xml system: nintendo-ds required: false bundled: true category: game_data size: 1610336 sha1: 7b84fef16d1d461a49c197709d174eb1ccd8f88d description: "save type database, one entry per title" source_ref: "drastic r2.5.2.0 FUN_84640 0x84678-0x846a0 (sprintf %s%cgame_database.xml, then FUN_86cf0), FUN_86cf0 0x86d18-0x86d30 (fopen rb), 0x87684-0x8769c (a failed open logs Error: could not load game database file and returns)" - name: usrcheat.dat path: usrcheat.dat system: nintendo-ds required: false bundled: true category: game_data size: 13739796 sha1: 6dd1a5399403f39620061556d61f5c6f6c704219 description: "Action Replay cheat library" source_ref: "drastic r2.5.2.0 FUN_84640 0x846a8-0x846d0 (sprintf %s%cusrcheat.dat, then FUN_94650), FUN_94650 0x94680-0x9468c (fopen rb), 0x946cc-0x94704 (header read, Invalid cheat database header and close on a mismatch)" - name: microphone.wav path: microphone/microphone.wav system: nintendo-ds required: false bundled: true category: game_data size: 1323090 sha1: ea9281c65ea39c9d1061a05b8b15d9a44f92918e description: "default fake microphone input" note: "Played when the game asks for the microphone and no microphone/.wav exists." source_ref: "drastic r2.5.2.0 FUN_81720 0x81a40-0x81a78 (sprintf %s%cmicrophone%cmicrophone.wav, FUN_7f220 loads it, Loaded default fake microphone audio file), FUN_7f220 0x7f250-0x7f28c (fopen rb, length by fseek and ftell)" - name: ".wav" path: "microphone/.wav" system: nintendo-ds required: false category: game_data description: "per-title fake microphone input" note: "Tried before microphone.wav and named after the running title." source_ref: "drastic r2.5.2.0 FUN_81720 0x819c8-0x81a0c (sprintf %s%cmicrophone%c%s.wav, FUN_7f220 loads it, Loaded game specific fake microphone audio file)" - name: ".lua" path: "scripts/.lua" required: false category: game_data description: "per-title Lua script" note: "Tried before default.lua and named after the running title." source_ref: "drastic r2.5.2.0 FUN_839d0 0x83c30-0x83c8c (sprintf %s%c%s%c%s.%s with scripts and lua, Attempting to load lua script, FUN_99850), FUN_99850 0x99884 (luaL_loadfilex of the path), 0x998a4 (lua_pcallk)" - name: default.lua path: scripts/default.lua required: false category: game_data unsourceable: "script the user writes against the built-in Lua 5.3 interpreter" description: "fallback Lua script" note: "Loaded when no per-title script answers." source_ref: "drastic r2.5.2.0 FUN_839d0 0x83ca4-0x83cd8 (sprintf %s%c%s%cdefault.%s, then FUN_99850, which hands it to luaL_loadfilex at 0x99884)" - name: ".cht" path: "cheats/.cht" system: nintendo-ds required: false category: game_data description: "custom cheat file" note: "Read on top of the entries usrcheat.dat holds and written back when a cheat is toggled. Absent, the message No custom cheat file is logged." source_ref: "drastic r2.5.2.0 FUN_951e0 0x952a4-0x952e0 (sprintf %s%ccheats%c%s.cht, fopen rb, No custom cheat file at %s), FUN_957e0 0x95824-0x95850 (same path opened wb)" - name: ".gba" path: "slot2/.gba" system: nintendo-ds required: false category: game_data unsourceable: "Game Boy Advance cartridge the title reads for bonus content" description: "slot 2 cartridge image" note: "Loaded into the slot 2 cart window, with its save read from slot2/.sav beside it." source_ref: "drastic r2.5.2.0 FUN_82c50 0x82c98-0x82cdc (snprintf %s%cslot2%c%s.gba, fopen rb), 0x82d08-0x82d6c (length by fseek and ftell, read whole), 0x82dd0-0x82dec (slot2/.sav opened rb)" - name: drastic_dldi.img path: drastic_dldi.img system: nintendo-ds required: false category: game_data unsourceable: "FAT image the user builds for the emulated flashcart" description: "R4 flashcart disk image" note: "Opened read-write when a homebrew title is recognised and mounted as the fat:/ device. Absent, the error is logged and the title runs without a card." source_ref: "drastic r2.5.2.0 FUN_82480 0x824a4-0x824cc (Homebrew recognized), 0x824f4-0x82518 (sprintf %s%cdrastic_dldi.img, open O_RDWR), 0x825a4-0x825b0 (perror Couldn't load drastic_dldi.img, then carries on)" - name: drastic_logo_0.raw path: drastic_logo_0.raw required: false category: game_data size: 120000 validation: [size] description: "boot splash, first of two" note: "Read from the root in one 120000 byte request, so a shorter file is rejected. The index is the low bit of the time and a missing file skips the splash. The repository ships neither." source_ref: "drastic r2.5.2.0 FUN_93360 0x93398-0x933d8 (index time() & 1, sprintf %s%cdrastic_logo_%d.raw, fopen rb), 0x933e0-0x93410 (fread of 0x1d4c0 bytes as one item, buffer freed when the read falls short)" - name: drastic_logo_1.raw path: drastic_logo_1.raw required: false category: game_data size: 120000 validation: [size] description: "boot splash, second of two" note: "Same read as index 0." source_ref: "drastic r2.5.2.0 FUN_93360 0x93398-0x933d8, 0x933e0-0x93410"