Skip to content

DraStic - RetroBIOS

Type standalone
Classification Other
Source https://archive.org/details/dra-stic-ds-emulator-r-2.6.0.4a
Upstream closed-source
Version r2.6.0.4a
Profiled 2026-08-11
Cores drastic
Systems nintendo-ds
Author Exophase (Gilead Kutnick)
Technical notes

Nintendo DS emulator by Exophase, closed source and distributed as a binary. Two releases are read here and they name the same files: the Android build r2.6.0.4a build 109, package com.dsemu.drastic, apk md5 7df979ef9420c5053b27c838e6a7e20c, whose loader is lib/arm64-v8a/libdrastic_arm64.so and whose installer is the smali of DraSticActivity; and the Linux AArch64 build r2.5.2.2, md5 17550db727f3b59d36b57746ad1944be, which ships unstripped with 2731 named functions and is cited by function name. r2.5.2.2 predates the firmware editor and the user database, and that is the whole of the divergence. Every reference below is an address in one of the two binaries or a line in the apktool decode of the Android one. ref: libdrastic_arm64.so, drastic r2.5.2.2 (DWARF comp_dir /home/odroid/nds_emu/src/linux_odroid64), DraSticActivity.smali

One root holds everything. On Android it is a directory named DraStic at the root of shared storage; on Linux it is the working directory. Startup creates backup, savestates, config, unzip_cache, system, input_record, cheats, slot2, microphone and scripts below it, and the Android build adds backgrounds, icon_cache, users, shaders and virtual_controller. Paths below are relative to that root. ref: drastic r2.5.2.2 initialize_system_directories 0xf780, drastic r2.5.2.2 0x11ac08-0x11ac80, drastic r2.5.2.2 initialize_system 0xf9e8, DraSticPathCache.smali:44-56, DraSticActivity.smali:4373-4429, DraSticActivity.smali:4187, DraSticActivity.smali:4482

load_system_file builds /system/, opens it read only, measures it by seeking to the end, refuses any length other than the one its caller asks for with "System file %s is the wrong size (should be %d bytes, is %d)", then reads it whole. Size is the only test; no hash is computed on any file. ref: drastic r2.5.2.2 load_system_file 0xea80-0xebe4, libdrastic_arm64.so 0x1b4d4-0x1b510

Each BIOS slot has two candidates. The ARM9 slot takes nds_bios_arm9.bin, and on failure logs "Can't find Nintendo ARM9 BIOS. Trying free DraStic ARM9 BIOS." and takes drastic_bios_arm9.bin; the ARM7 slot does the same with nds_bios_arm7.bin then drastic_bios_arm7.bin. A slot left empty returns -1 from initialize_memory, and initialize_system answers that with the on-screen warning naming the two Nintendo files and their sizes, the line "FATAL: Could not load system files." and quit. Neither name in a slot is required on its own, both slots are. Taking the replacement sets a bit per slot, which is what savestates record so that a state made under one pair does not load under the other. ref: drastic r2.5.2.2 initialize_memory 0x1c398-0x1c3d4, drastic r2.5.2.2 initialize_memory 0x1c4b0-0x1c52c, drastic r2.5.2.2 initialize_system 0xf940-0xf944, drastic r2.5.2.2 initialize_system 0xf9f8-0xfa10, drastic r2.5.2.2 menu_bios_warning 0x801e0-0x80238, libdrastic_arm64.so 0x2b6d0-0x2b764

Firmware is answered in code when no file loads: the 256 KB region is zeroed and patch_firmware_header_data writes the header, the console identity and the user settings block into it. r2.5.2.2 reads nds_firmware.bin alone; r2.6.0.4a reads nds_firmware_modified.bin first, which is what its firmware editor writes back, and falls through to nds_firmware.bin. ref: drastic r2.5.2.2 initialize_memory 0x1c3e0-0x1c3f8, drastic r2.5.2.2 initialize_memory 0x1c560-0x1c578, drastic r2.5.2.2 patch_firmware_header_data 0x1b920, libdrastic_arm64.so 0x2b768-0x2b7c4, libdrastic_arm64.so 0x774e0-0x7751c

The Nintendo ARM7 image still decides one thing. gamecard_load_program passes the 0x1048 bytes at ARM7 BIOS offset 0x30 to gamecard_decrypt_secure_region as the Blowfish key table, and a secure area that does not decrypt to the id encryObj is reported and left alone. The free ARM7 replacement holds zeroes there, so encrypted cards need the dumped image. ref: drastic r2.5.2.2 gamecard_load_program 0x6fb98-0x6fbac, drastic r2.5.2.2 gamecard_decrypt_secure_region 0x6e2c0-0x6e38c, drastic r2.5.2.2 initialize_memory 0x1c3bc-0x1c3c8

Two databases sit at the root. game_database.xml carries the save type per title and a failed open only logs "Error: could not load game database file %s."; r2.6.0.4a reads game_database_user.xml after it as a user overlay. usrcheat.dat is the Action Replay library, read by load_cheat_directory. ref: drastic r2.5.2.2 initialize_gamecard 0x709bc-0x70a30, drastic r2.5.2.2 initialize_game_database 0x73180, drastic r2.5.2.2 initialize_game_database 0x73d24-0x73d38, libdrastic_arm64.so 0x76ab8-0x76b58

The Android package carries its own copies of the files it needs and lays them down on first run: the two free BIOS images into system, the default layout into config, game_database.xml, usrcheat.dat and the BSD-licensed source archive of the free BIOS at the root, and the shaders and virtual_controller trees whole. Nothing already present is overwritten. ref: DraSticActivity.smali:4052-4090, DraSticActivity.smali:5189-5200, DraSticActivity.smali:5459, DraSticActivity.smali:5619-5624, DraSticActivity.smali:5645, DraSticActivity.smali:5834, DraSticActivity.smali:5974

A .dfx names the passes of a post-processing chain and pulls its GLSL stages, its included headers and its lookup textures from paths relative to itself. Nine chains ship: None, Linear, Quilez, Scale2X, Scanline, HQ2X, FXAA, FXAA HQ and SMAA, the last two reading .raw lookup textures. ref: assets/shaders/shader_format.txt:12-58, assets/shaders/SMAA.dfx:1-6

Per-title inputs are read beside the ROM name. reset_spu answers the microphone with microphone/.wav then microphone/microphone.wav, load_nds runs scripts/.lua then scripts/default.lua through the built-in Lua 5.3, load_custom_cheats reads cheats/.cht on top of the library, and gamecard_load_gba fills the slot 2 cart from slot2/.gba with its save beside it. Homebrew turns on R4 flashcart emulation and opens drastic_dldi.img read-write for the fat:/ device, logging "Couldn't load drastic_dldi.img: " and carrying on without one. ref: drastic r2.5.2.2 reset_spu 0x6dba8-0x6dc5c, drastic r2.5.2.2 load_nds 0x6ff78-0x6ffd0, drastic r2.5.2.2 load_nds 0x70054-0x70094, drastic r2.5.2.2 load_custom_cheats 0x817b4, drastic r2.5.2.2 gamecard_load_gba 0x6ec98, drastic r2.5.2.2 gamecard_load_gba 0x6eda0, drastic r2.5.2.2 gamecard_initialize_homebrew 0x6e4e0-0x6e518, drastic r2.5.2.2 gamecard_initialize_homebrew 0x6e5a4

The Linux build alone draws a splash, reading drastic_logo_0.raw or drastic_logo_1.raw at 120000 bytes each, one of the two picked at random. ref: drastic r2.5.2.2 load_logo 0x7fad0-0x7fb78

24 files | 0 required, 24 optional | 8 in repo, 16 missing | 2 with HLE fallback Categories: 6 BIOS, 18 game data

nds_bios_arm9.bin optional missing
Nintendo DS ARM9 BIOS

  • Path: system/nds_bios_arm9.bin
  • System: nintendo-ds
  • Size: 4.0 KB
  • Aliases: NDS_Bios9.bin, bios9.bin, biosnds9.rom
  • Validation: size
  • Source: drastic r2.5.2.2 initialize_memory 0x1c398-0x1c3b0, drastic r2.5.2.2 load_system_file 0xea80-0xebe4, libdrastic_arm64.so 0x2b6d0-0x2b6ec
  • First candidate for the ARM9 slot. Booting continues on the free replacement when it is absent, and the slot ending empty is fatal.

drastic_bios_arm9.bin optional in repo bundled
DraStic free ARM9 BIOS replacement

  • Path: system/drastic_bios_arm9.bin
  • System: nintendo-ds
  • Size: 4.0 KB
  • Validation: size
  • Source: drastic r2.5.2.2 initialize_memory 0x1c4b0-0x1c4d4, libdrastic_arm64.so 0x2b6f0-0x2b708, DraSticActivity.smali:4084-4090, drastic_bios_readme.txt:1-31
  • Second candidate for the ARM9 slot, written by Exophase from public documentation and released under a BSD licence. Installed from the package assets on first run.

nds_bios_arm7.bin optional missing
Nintendo DS ARM7 BIOS

  • Path: system/nds_bios_arm7.bin
  • System: nintendo-ds
  • Size: 16.0 KB
  • Aliases: NDS_Bios7.bin, bios7.bin, biosnds7.rom
  • Validation: size
  • Source: drastic r2.5.2.2 initialize_memory 0x1c3bc-0x1c3d4, drastic r2.5.2.2 gamecard_load_program 0x6fb98-0x6fbac, libdrastic_arm64.so 0x2b724-0x2b73c
  • First candidate for the ARM7 slot, and the only image carrying the Blowfish key table at offset 0x30 that the card secure area is decrypted with.

drastic_bios_arm7.bin optional in repo bundled
DraStic free ARM7 BIOS replacement

  • Path: system/drastic_bios_arm7.bin
  • System: nintendo-ds
  • Size: 16.0 KB
  • Validation: size
  • Source: drastic r2.5.2.2 initialize_memory 0x1c508-0x1c52c, libdrastic_arm64.so 0x2b740-0x2b758, DraSticActivity.smali:4078-4083
  • Second candidate for the ARM7 slot. Offset 0x30 is zero filled, so cards whose secure area is encrypted do not decrypt under it.

nds_firmware.bin optional missing HLE fallback
Nintendo DS firmware

  • Path: system/nds_firmware.bin
  • System: nintendo-ds
  • Size: 256.0 KB
  • Aliases: NDS_Lite_Firmware.bin, dsfirmware.bin, firmware.bin
  • Validation: size
  • Source: drastic r2.5.2.2 initialize_memory 0x1c3e0-0x1c3f8, drastic r2.5.2.2 initialize_memory 0x1c560-0x1c578, drastic r2.5.2.2 patch_firmware_header_data 0x1b920, libdrastic_arm64.so 0x2b794-0x2b7c4
  • Absent, the region is zeroed and patch_firmware_header_data writes a header, a console identity and a user settings block into it, so the emulator boots either way. r2.6.0.4a reads nds_firmware_modified.bin before this.

nds_firmware_modified.bin optional missing HLE fallback
firmware image edited in the emulator

  • Path: system/nds_firmware_modified.bin
  • System: nintendo-ds
  • Size: 256.0 KB
  • Validation: size
  • Source: libdrastic_arm64.so 0x2b768-0x2b790, libdrastic_arm64.so 0x774e0-0x7751c
  • Read before nds_firmware.bin in r2.6.0.4a and absent from r2.5.2.2.

game_database.xml optional in repo game_data bundled
save type database, one entry per title

  • System: nintendo-ds
  • Source: drastic r2.5.2.2 initialize_gamecard 0x709bc-0x70a00, drastic r2.5.2.2 initialize_game_database 0x73180, drastic r2.5.2.2 initialize_game_database 0x73d24-0x73d38, DraSticActivity.smali:5459
  • Parsed from the root of the data directory. A failed open logs an error and the session continues without it. Installed from the package assets on first run.

game_database_user.xml optional missing game_data
user save type database

  • System: nintendo-ds
  • Source: libdrastic_arm64.so 0x76af8-0x76b28
  • Read after game_database.xml in r2.6.0.4a and absent from r2.5.2.2.

usrcheat.dat optional in repo game_data bundled
Action Replay cheat library

  • System: nintendo-ds
  • Source: drastic r2.5.2.2 initialize_gamecard 0x70a0c-0x70a30, libdrastic_arm64.so 0x76b34-0x76b58, DraSticActivity.smali:5974
  • Read from the root of the data directory and written back when a cheat is toggled, so the file carries the enabled state. Installed from the package assets on first run.

drastic_bios.zip optional in repo game_data bundled
source archive of the free BIOS replacement

  • Source: DraSticActivity.smali:5189-5200, drastic_bios_readme.txt:1-31
  • Copied to the root of the data directory on first run and never read back. Holds bios_common.S, a Makefile, the BSD licence notice and the two built images.

LC_default.dat optional in repo game_data bundled
default screen layout

  • Path: config/LC_default.dat
  • Source: DraSticActivity.smali:4052-4066, DraSticActivity.smali:4830-4925
  • Android only. Copied out of the package assets into config on first run, and offered from there by the layout list, which filters that directory on the .dat extension.

<name>.dfx optional missing game_data bundled
post-processing chain definition

  • Path: shaders/<name>.dfx
  • Source: DraSticActivity.smali:5619-5624, assets/shaders/_shader_format_.txt:11-21
  • Android only. Names the passes, the texture inputs and the headers of one chain, all resolved relative to its own path. The package ships None, Linear, Quilez, Scale2X, Scanline, HQ2X, FXAA, FXAA HQ and SMAA.

<name>.dsd optional missing game_data bundled
GLSL stage source named by a chain

  • Path: shaders/<name>.dsd
  • Source: assets/shaders/_shader_format_.txt:8-9, assets/shaders/_shader_format_.txt:36-40, assets/shaders/_shader_format_.txt:59-72, assets/shaders/_shader_format_.txt:75-98
  • Android only. Named by the shader entry of a pass, and carrying the vertex and fragment code for it, together with the .h and .hlsl files the include tags pull in. A stage that fails to compile leaves a dsd.log beside it.

<name>.raw optional missing game_data bundled
lookup texture named by a chain

  • Path: shaders/<name>.raw
  • Source: assets/shaders/_shader_format_.txt:42-56, assets/shaders/SMAA.dfx:1-6
  • Android only. Loaded when a texture tag names a file instead of the framebuffer or an FBO, with the dimensions and the format taken from the tag. SMAA is the one shipped chain that names any, taking smaa/AreaTexRGB.raw and smaa/SearchTexRGB.raw; the package also carries the non-RGB pair of the same two tables, which no shipped chain names.

<name>.zip optional missing game_data bundled
on-screen controller skin

  • Path: virtual_controller/<name>.zip
  • Source: DraSticActivity.smali:5645, DraSticActivity.smali:5834
  • Android only. Installed from the package assets, which carry Simple, Simple-II and Neon.

microphone.wav optional missing game_data
default microphone input

  • Path: microphone/microphone.wav
  • System: nintendo-ds
  • Source: drastic r2.5.2.2 reset_spu 0x6dc30-0x6dc5c
  • Read when no per-title file answers, and logged as the default fake microphone audio file.

<game>.wav optional missing game_data
per-title microphone input

  • Path: microphone/<game>.wav
  • System: nintendo-ds
  • Source: drastic r2.5.2.2 reset_spu 0x6dba8-0x6dbe8
  • Tried before microphone.wav and named after the running title.

default.lua optional missing game_data
fallback Lua script

  • Path: scripts/default.lua
  • Source: drastic r2.5.2.2 load_nds 0x70054-0x70094
  • Loaded at game start when no per-title script answers, then handed the load-game callback.

<game>.lua optional missing game_data
per-title Lua script

  • Path: scripts/<game>.lua
  • Source: drastic r2.5.2.2 load_nds 0x6ff78-0x6ffd0
  • Tried before default.lua and named after the running title.

<game>.cht optional missing game_data
custom cheat file

  • Path: cheats/<game>.cht
  • System: nintendo-ds
  • Source: drastic r2.5.2.2 load_custom_cheats 0x817b4, drastic r2.5.2.2 save_custom_cheats 0x81d24, drastic_readme.txt:789-812
  • Plain text, one bracketed cheat name per block followed by its codes, a trailing plus marking the cheat active. Read on top of the entries usrcheat.dat holds and written back when a cheat is toggled.

<game>.gba optional missing game_data
slot 2 cartridge image

  • Path: slot2/<game>.gba
  • System: nintendo-ds
  • Source: drastic r2.5.2.2 gamecard_load_gba 0x6ec98, drastic r2.5.2.2 gamecard_load_gba 0x6eda0
  • Loaded into the slot 2 cart window, with its save read from slot2/.sav beside it.

drastic_dldi.img optional missing game_data
R4 flashcart disk image

  • System: nintendo-ds
  • Source: drastic r2.5.2.2 gamecard_initialize_homebrew 0x6e4e0-0x6e518, drastic r2.5.2.2 gamecard_initialize_homebrew 0x6e5a4
  • Opened read-write when a homebrew title is recognised and mounted as the fat:/ device. Absent, the message is logged and the title runs without a card.

drastic_logo_0.raw optional in repo game_data
boot splash, first of two

  • Size: 117.2 KB
  • Validation: size
  • Source: drastic r2.5.2.2 load_logo 0x7fad0-0x7fb78
  • Read from the root of the data directory in one 120000 byte request, so a shorter file is rejected. One of the two indices is picked at random and a missing file skips the splash.

drastic_logo_1.raw optional in repo game_data
boot splash, second of two

  • Size: 117.2 KB
  • Validation: size
  • Source: drastic r2.5.2.2 load_logo 0x7fad0-0x7fb78
  • Same read as index 0.

Generated on 2026-08-23T16:12:06Z