KN5000 effects-DSP — program flowcharts
KN5000 effects-DSP — program flowcharts
One structural flowchart per NEC uPD6383GF microprogram: the shared kernel that every effect runs, plus each of the 38 distinct effect bodies. These show the signal flow / algorithm structure — not a per-instruction dump (that is the ../disasm/ .dsm listing, one per program). They are the diagram companion to the disassembly tree; read ../README.md and ../instruction-set.md first.
How to read these charts
The charts are Mermaid (they render on GitHub and in the technics-docs Jekyll site) and are regenerated from the ROM words plus the notes — never hand-drawn. A node is emitted only when the landmark it names is actually detected in the program’s words, using the same rules as the disassembler (../tools/dsp_disasm.py). Every instruction is accounted for: the ones a recognised landmark matches become labelled stages, and the rest are collected into a single honest opaque “undecoded core (N of M instructions)” node. No signal flow is invented.
Confidence is carried in the node style:
| style | meaning |
|---|---|
| solid green | PROVEN — proved by construction or decoded to the bit (the kernel control flow, the EQ biquad, the reverb tank) |
| solid blue | MEASURED — a structural landmark measured across the corpus (LFO phase word, biquad section, damping filter, all-pass marker) |
| solid amber | INFERRED — a strong reading not yet decoded to the bit (external-DRAM read/write, waveshaper LUT, stage counts) |
| dashed grey | OPEN — the opaque undecoded-core block and other open steps |
| purple | a UI control parameter hanging off the stage it drives |
Ordering follows the family signal chain documented in ../algorithms/families.md; stage presence is gated by detection, and parameter labels are the live UI names (notes/kn5000-dsp-paramlist.md). Because both the named-coefficient layer (500/822 today) and the ISA are still growing, re-running the generator refreshes every chart — opaque blocks shrink and stages gain names as the RE advances.
The charts
- kernel — the shared per-frame control flow (PROVEN)
| chart | effect | family | conf. | words | opaque | landmarks |
|---|---|---|---|---|---|---|
| prog00 | NO OPERATION | dynamics | medium | 49 | 0 | 1 biquad DF-I section(s), 2 C-format immediate load(s), 3 DRAM read/write word(s) |
| prog01 | CHORUS | modulation | high | 70 | 0 | 1 LFO phase word(s), 4 C-format immediate load(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog02 | MODULATED CHORUS | modulation | high | 85 | 0 | 2 LFO phase word(s), 4 C-format immediate load(s), 1 DRAM read/write word(s), 3 waveshaper LUT selector(s) |
| prog03 | ENHANCER | filter | medium | 99 | 0 | 2 C-format immediate load(s), 1 DRAM read/write word(s), 4 all-pass marker(s) |
| prog04 | FLANGER | modulation | medium | 65 | 0 | 2 LFO phase word(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog05 | PHASER | modulation | medium | 106 | 0 | 2 LFO phase word(s), 2 waveshaper LUT selector(s), 2 all-pass marker(s) |
| prog06 | ENSEMBLE | modulation | medium | 96 | 0 | 1 LFO phase word(s), 3 DRAM read/write word(s), 4 waveshaper LUT selector(s) |
| prog08 | GATED REVERB | reverb | medium | 102 | 0 | 2 C-format immediate load(s), 10 DRAM read/write word(s), 6 all-pass marker(s) |
| prog09 | SINGLE DELAY | delay | high | 48 | 0 | 3 DRAM read/write word(s) |
| prog10 | MULTI TAP DELAY | delay | high | 68 | 0 | 2 DRAM read/write word(s) |
| prog15 | ROCK ROTARY | rotary | high | 86 | 0 | 1 biquad DF-I section(s), 5 C-format immediate load(s), 1 DRAM read/write word(s), 1 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog16 | ROOM REVERB 1 | reverb | SOLVED | 133 | 0 | 4 C-format immediate load(s), 13 DRAM read/write word(s), 9 all-pass marker(s) |
| prog32 | DISTORTION | distortion | high | 42 | 0 | 2 waveshaper LUT selector(s) |
| prog33 | OVERDRIVE | distortion | high | 63 | 0 | 2 biquad DF-I section(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog34 | FUZZ | distortion | high | 42 | 0 | 2 waveshaper LUT selector(s) |
| prog35 | EXCITER | exciter | high | 69 | 0 | 2 biquad DF-I section(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog36 | COMPRESSOR | dynamics | medium | 40 | 0 | 4 C-format immediate load(s) |
| prog39 | PARAMETRIC EQ | eq | SOLVED | 105 | 0 | 10 biquad DF-I section(s), 10 class-8 post-sum step(s) |
| prog48 | AUTO PAN | am | high | 50 | 0 | 2 LFO phase word(s), 2 waveshaper LUT selector(s) |
| prog50 | VIBRATO | modulation | high | 53 | 0 | 2 LFO phase word(s), 2 C-format immediate load(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog52 | AUTO WAH | filter | medium | 72 | 0 | 1 C-format immediate load(s), 2 class-8 post-sum step(s) |
| prog54 | RING MODULATOR | am | high | 46 | 0 | 2 LFO phase word(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog56 | MIX UP | modulation | medium | 64 | 0 | 3 LFO phase word(s), 2 C-format immediate load(s), 1 DRAM read/write word(s), 3 waveshaper LUT selector(s) |
| prog64 | S.DELAY+CHORUS | combi | high | 95 | 0 | 1 LFO phase word(s), 4 C-format immediate load(s), 3 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog65 | S.DELAY+S.DELAY | delay | high | 68 | 0 | 5 DRAM read/write word(s) |
| prog66 | S.DELAY+FLANGER | combi | medium | 100 | 0 | 2 LFO phase word(s), 3 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog67 | S.DELAY+VIBRATO | combi | high | 86 | 0 | 2 LFO phase word(s), 2 C-format immediate load(s), 3 DRAM read/write word(s), 2 waveshaper LUT selector(s) |
| prog68 | S.DELAY+PHASER | combi | medium | 110 | 0 | 2 LFO phase word(s), 3 DRAM read/write word(s), 2 waveshaper LUT selector(s), 2 all-pass marker(s) |
| prog70 | AUTO WAH+S.DELAY | combi | medium | 105 | 0 | 1 C-format immediate load(s), 3 DRAM read/write word(s), 2 class-8 post-sum step(s) |
| prog71 | PEQ+CHORUS | combi | high | 93 | 0 | 2 biquad DF-I section(s), 1 LFO phase word(s), 4 C-format immediate load(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog72 | PEQ+S.DELAY | combi | high | 54 | 0 | 2 biquad DF-I section(s), 3 DRAM read/write word(s), 2 class-8 post-sum step(s) |
| prog73 | PEQ+FLANGER | combi | high | 91 | 0 | 2 biquad DF-I section(s), 2 LFO phase word(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog74 | PEQ+VIBRATO | combi | high | 77 | 0 | 2 biquad DF-I section(s), 2 LFO phase word(s), 2 C-format immediate load(s), 1 DRAM read/write word(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog75 | PEQ+COMPRESSOR | combi | high | 59 | 0 | 2 biquad DF-I section(s), 4 C-format immediate load(s), 1 DRAM read/write word(s), 2 class-8 post-sum step(s) |
| prog96 | PEQ+COMPR+DIST | combi | high | 90 | 0 | 2 biquad DF-I section(s), 4 C-format immediate load(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog97 | PEQ+COMPR+OVERDR | combi | high | 97 | 0 | 2 biquad DF-I section(s), 4 C-format immediate load(s), 2 waveshaper LUT selector(s), 4 class-8 post-sum step(s) |
| prog98 | PEQ+DIST+DELAY | combi | high | 92 | 0 | 2 biquad DF-I section(s), 3 DRAM read/write word(s), 2 waveshaper LUT selector(s), 2 class-8 post-sum step(s) |
| prog99 | PEQ+OVERDR+DELAY | combi | high | 104 | 0 | 4 biquad DF-I section(s), 3 DRAM read/write word(s), 2 waveshaper LUT selector(s), 4 class-8 post-sum step(s) |
Regenerating
make dsp-flowcharts # or: python3 dsp/tools/gen_dsp_flowcharts.py
git diff --exit-code dsp/flowcharts # doubles as a drift check
The generator reuses gen_dsp_disasm.py’s extraction, grouping and named-coefficient overlay, so the two trees never diverge. It does not touch the .dsm listings and does not affect dsp/verify.py’s byte-match.
On this site
These flowcharts are the diagram companion to the Effects DSP (NEC uPD6383GF) reference page. The narrative — how each result was found — is in the MAME development blog, KN5000 effects-DSP series (Parts 78-84).
Synced from the kn5000-roms-disasm disassembly tree by tools/sync_flowcharts.py; re-run make flowcharts to refresh after the charts are regenerated upstream.