Command-line options: manual and executable
Consolidated from printed English manual pages 20–22 (PDF pages 12–13), darker/DARKER.BAT, and all 13 entries in the original parser. The batch file runs X Lang=0 Mus=1.
Use decimal Name=value arguments, separated by spaces. Matching is case-insensitive and uses only the first two letters; longer alphabetic suffixes are ignored. Values are unsigned 16-bit decimal integers, with additional bounds in some handlers. This makes Lang, Language and LA equivalent. An unrecognised prefix or rejected value takes the invalid-command-line path.
All accepted prefixes
| Prefix / manual spelling | Meaning and accepted range | Handler | Manual coverage (pp. 20–22) |
|---|---|---|---|
LA / Language, Lang |
0 English, 1 French, 2 German | 029E | Documented. |
MU / Music, Mus |
0 no sound, 1 SoundBlaster FM, 2 General MIDI, 3 Roland, 4 Gravis, 5 SoundBlaster AWE32 (manual names) | 0293 | Documented. |
LI / Light |
Monitor brightness compensation, 0–50; manual default 0 | 02AA | Documented. |
MS / MSpeed |
Mouse sensitivity, 1–25; higher is more sensitive | 02BA | Documented. |
IN / Input |
Mouse/device selection; low and high bytes stored separately; see below | 02DC | Documented. |
LO / LookRnd |
Look-around action mask | 02F0 | Documented. |
RA / Radar |
Enlarged-radar action mask | 02E4 | Documented. |
BR / Brake |
Brake action mask | 02E8 | Documented. |
CL / ClrLock |
Clear-target-lock action mask | 02EC | Documented. |
AF |
Primary-fire action mask; full original spelling not recovered | 02F4 | Not documented under this name; manual calls it PrimFire (unrecognised). |
BF |
Secondary-fire action mask; full original spelling not recovered | 02F8 | Not documented under this name; manual calls it SecFire (different handler). |
EY |
Display mode: 1 ordinary, 2 paired-view; full spelling not recovered | 02C6 | Undocumented. |
SE |
0–15; selects AH=60h+n for a specialised INT 33h mouse/device call at 3B5D. Full name and hardware semantics unresolved | 02D1 | Undocumented function; the manual’s SecFire name collides with this prefix. |
EY stores value minus one at image offset 3CFD. Mode 1 there enables the two displaced scene views and the keypad-minus separation adjustment. This connects it to the stereo/VR rendering investigation; it is not a claim that EY=2 alone configures all required headset hardware. The untouched image has FF (automatic/unset) here; EFA6 resolves that default using detected device flags. These mode names describe traced branches rather than recovered full command names.
SE defaults to 0. The original instruction at 3B5D is MOV AH,60h; INT 33h (B4 60 CD 33), exactly the selector produced by SE=0. Thus this is the built-in default even when no SE argument is supplied; it is not 60 in command-line units. The call is gated by device flag bit 10h at 3B52, so the default does not imply that every setup executes it.
Playtest: explicitly launching with EY=2 produces a blank screen in DOSBox. This is recorded as an observed outcome, not proof of the cause; the required hardware/driver/display conditions remain unresolved.
Playtesting also shows no detectable difference when varying SE; tested values and device configuration were not specified. This does not establish that the gated device call executes in that setup. EYES is a plausible expansion of EY, but the parser preserves only the two-letter prefix, so the intended original spelling remains unknown.
Early handlers address data relative to the PSP, 100h below the unpacked image, while parser dispatch uses the image segment. For example, the store to DS:3DFD corresponds to image offset 3CFD. This distinction is reproduced in the verification harness.
Manual mouse selections
Input value |
Device |
|---|---|
| 1 | PS/2 mouse |
| 2 | MS or Logitech bus mouse |
| 4 | MS MSX bus mouse |
| 8 | Serial mouse COM2 |
| 16 | Serial mouse COM1 |
| 32 | Amstrad mouse |
Add 256 for one CyberPuck or 512 for two. The manual example Input=264 is COM2 plus one CyberPuck. These are documented device selections, not proof that arbitrary combinations of the low-byte values work. The parser itself stores both bytes without enumerating valid hardware combinations.
Action-mask values
| Value | Input |
|---|---|
| 1 | Right mouse button |
| 2 | Middle mouse button |
| 4 | Left mouse button |
| 16 | Joystick A button 1 |
| 32 | Joystick A button 2 |
| 64 | Joystick B button 1 |
| 128 | Joystick B button 2 |
| 256 | Tab |
| 512 | Backspace |
| 1024 | Equals |
| 2048 | Minus |
| 4096 | Insert / keypad 0 |
| 8192 | Caps Lock |
| 16384 | Space |
| 32768 | Alt |
The manual instructs adding values to assign multiple inputs to one action. These are masks of alternative inputs, not arbitrary keyboard scan codes.
Manual discrepancies and remapping limitation
Do not treat the manual's fire-remapping examples as verified working recipes for this executable.
PrimFirehas prefix PR, absent from the table;PrimFire=16384is rejected.SecFirehas prefix SE, which invokes the specialised device-call selector, not secondary-fire remapping. The manual exampleSecFire=8192is rejected; values 0–15 instead affect that unrelated selector.- The actual primary/secondary mask handlers have prefixes AF/BF.
- There is a further apparent implementation defect: the shared handler at
02FBcomplements the requested mask, clears the requested bits from all six action masks, then ORs the complement into the chosen mask. An isolated original-code run ofRadar=256leaves the radar mask FEFF, not 0100, and removes Tab from the look-around mask.AF=16384similarly leaves the primary mask BFFF. These are native handler results, not corrected intent. Later startup and complete in-game consequences have not been tested; do not silently repair this behaviour in a faithful implementation.
This reference covers the complete recovered parser table. Hardware semantics for SE and the full VR setup remain open, and accepted syntax does not establish that a hardware mode will function on the current DOS environment.
Reproduction
PYTHONPATH=/tmp/darker-python python3 tools/verify_command_line.py
The 27-case report executes the original parser and handlers with a synthetic PSP command tail, including boundary checks, manual-name rejection, display selection and mask mutation. Execution stops before subsequent startup; no original game files or saved games are changed. Raw prefix entries remain in tables.json.