Takes the official C900NXS.UPD (1.31, checked by SHA-256), lets you choose mods in a list (arrows, space, enter; numbers where the terminal cannot pass keys), patches the application with the emulator checkout's mods/patch_cdj900nxs.py, packs it and writes a new C900NXS.UPD labelled 1.32. Only the application is replaced: the boot loader and recovery records, MAIN's S0/S7 records, DRIV and PANL are copied byte for byte and checked again on the finished file, which is also unpacked the boot loader's way and compared with the patched application. --stock differs from the official file in the version label and its CRC only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
3.3 KiB
Markdown
73 lines
3.3 KiB
Markdown
# CDJ-900NXS firmware patcher
|
|
|
|
Builds a new `C900NXS.UPD` from the official CDJ-900NXS firmware 1.31 with
|
|
the mods you choose, for the player's own USB update.
|
|
|
|
```sh
|
|
python cdj900nxs_patcher.py C900NXS.UPD # choose in a list
|
|
python cdj900nxs_patcher.py C900NXS.UPD --mods beatjump,cuecolours,hotcuekeys
|
|
python cdj900nxs_patcher.py C900NXS.UPD --stock # the original, to go back
|
|
python cdj900nxs_patcher.py --list
|
|
```
|
|
|
|
In the list: **arrow keys** move, **space** ticks or unticks, **a** ticks all
|
|
or none, **enter** builds, **q** quits. Terminals that cannot pass single
|
|
keys (Git Bash's mintty, a pipe) get a numbered list instead. The result goes
|
|
to `out/<date>-<mods>/C900NXS.UPD` with a `report.txt` of every check.
|
|
|
|
## What it guarantees
|
|
|
|
- **Only the original file is accepted**: SHA-256
|
|
`e96bca7d1ac983985992a8e5fa7813e1ebf04bef514e0c6cfd0a8375f667f7f9`, and the
|
|
1.31 application inside it is checked too.
|
|
- **Only the main application is replaced.** The boot loader and recovery
|
|
loader (MAIN's records below flash 0x40000), MAIN's S0 header and S7 entry
|
|
records, and the DRIV and PANL sections are copied from the original byte
|
|
for byte. Before anything is written the finished file is read back and
|
|
checked: every section CRC and S-record checksum; DRIV and PANL equal to the
|
|
original; MAIN's header equal but for its version label, application-only
|
|
mode kept; every boot loader and recovery record and byte equal; no record
|
|
past 0x7E0000; the packed application's checksum; and the application,
|
|
unpacked the way the boot loader does it, equal to the patched one.
|
|
- **Labelled 1.32**, so that the player's updater does not skip the update as
|
|
the version it already has. The application still reports 1.31 (as
|
|
arnoldasr's builds do). `--stock` gives the original firmware with only that
|
|
label changed: three bytes differ from the official file (the digit and the
|
|
section CRC), exactly as arnoldasr's back-to-stock file, which installed on
|
|
his test player.
|
|
|
|
Checked in the emulator: both the `--stock` file and one with every mod were
|
|
written into an emulated flash and booted through Pioneer's own boot loader,
|
|
which unpacked and started them.
|
|
|
|
## Mods
|
|
|
|
From the emulator checkout `../CDJ900NXSVirtual` (`--repo` for another place):
|
|
`mods/patch_cdj900nxs.py` and the mods next to it.
|
|
|
|
| mod | what it does |
|
|
|---|---|
|
|
| `code` | arnoldasr: BPM with two decimals, two-line phase meter, RGB waveform |
|
|
| `utility` | arnoldasr: UTILITY > PHASE METER switch (needs `code`) |
|
|
| `overview` | arnoldasr: overview waveform colour gradient |
|
|
| `beatjump` | TRACK SEARCH jumps 1/2/4/8 beats, UTILITY > BEAT JUMP |
|
|
| `cuecolours` | memory cues in their rekordbox colours, hot cues shown |
|
|
| `hotcuekeys` | UTILITY > HOT CUE KEYS; QUANTIZE short = hot key mode |
|
|
|
|
arnoldasr's mods need his repository checked out in
|
|
`../CDJ900NXSVirtual/mods/cdj900nxs/upstream` (it has no licence, so it is
|
|
not copied here); without it they are greyed out.
|
|
|
|
## Risk
|
|
|
|
Nothing here talks to a player; you copy the file to a FAT32 USB stick and run
|
|
the update yourself. Our mods have only run in the emulator. Recovery from an
|
|
application that crashes at start-up has not been tested by anyone. Keep the
|
|
`--stock` file at hand.
|
|
|
|
## Tests
|
|
|
|
```sh
|
|
CDJ900NXS_UPD=/path/to/C900NXS.UPD python -m pytest test_patcher.py
|
|
```
|