Last updated: 2026-05-18
This is the practical plan for getting from safe ABI probes to real 1:1 Airwindows ports.
Current status update: ctx[3] is no longer just a lead. Hardware probes, the
working StereoChorus release, and T9InitOnly show it is a usable
per-instance descriptor arena for large state. The no-divide full ToTape9
kernel now loads and runs on the test MS-70CDR. VerbTiny and Galactic are
now reverb candidates built on the same strategy. The next blockers are
parameter/default lifecycle behavior, hardware reload behavior, and
source-equivalence measurement.
The PDFs in docs/ explain the C6000 architecture and toolchain, but not
Zoom’s private effect-host ABI. They do tell us what not to assume:
B14 is the data page pointer (DP) for the currently active object.
If Zoom does not set it for our object, near globals/statics are unsafe..bss addressing.
Therefore custom plugin objects must reject R_C6000_SBR_* and
R_C6000_SBR_GOT_* until we deliberately implement DSBT/GOT support.--mem_model:data=far is required for custom C so scalar globals do not
silently become DP-relative..fardata; uninitialized far variables go
in .far..bss, .far, .cinit, constructors, stack,
and heap. A ZDL audio callback is not normal C startup. If the Zoom loader
does not do that work, we cannot rely on it..sysmem plus RTS support. Treat malloc/calloc as
unavailable for plugins until proven otherwise..cinit, SHT_TI_INITINFO, DSBT, GOT, TLS, exceptions, and C++
constructors are all real TI mechanisms, but supporting them means writing
loader/runtime behavior. They are not free just because the compiler can emit
them.So the manuals validate our conservative build rules. They do not answer where stock Zoom effects keep large delay/reverb state.
Disassembling stock stateful effects shows that they use more of the ctx
structure than our custom effects currently map.
Observed audio-entry reads:
| Stock effect | Early ctx fields used in audio |
|---|---|
MS-70CDR_STCHO.ZDL / CHORUS.ZDL |
ctx[1], ctx[2], ctx[3], ctx[5], ctx[11], ctx[12], ctx[13], ctx[14] |
MS-70CDR_DELAY.ZDL |
ctx[1], ctx[2], ctx[3], ctx[5], ctx[11], ctx[12] |
MS-70CDR_HALL.ZDL |
ctx[1], ctx[2], ctx[3], ctx[5], ctx[11], ctx[12] |
MS-70CDR_TAPEECHO.ZDL |
same family of fields, plus dense reads/writes through a structure loaded from ctx[1]/ctx[2] |
That was the strongest lead, and the ctx[3] part is now confirmed enough for
custom ZDLs: ctx[3][0..2] describe a host-managed large buffer. ctx[2]
small state and ctx[13]/ctx[14] still deserve mapping, but they no longer
block every large-state Airwindows attempt.
ctxBuild tiny hardware probes that read one candidate field at a time and encode the result audibly or visibly. Do not dereference unknown pointers first.
Probe order:
ctx[0..15].0.The two-instance test matters: Airwindows plugin state must be per effect instance, not one static global shared by every slot.
Use stock Delay, STCHO, Hall, ModRev, and TapeEcho as the corpus.
For each:
build.zdl.Zdl..audio and _init.ctx[2], ctx[3], ctx[13], ctx[14],
and parameter-table structures.Goal: a documented struct map, not just “some pointer probably works”.
ctx[3] state path load-safeStereoChorus proves the large-buffer route can work. For each new stateful
plugin:
ctx[3][0..2] before use..fardata at 0 or tiny.For each target plugin:
manifest.json.This separates “does the Airwindows port match source?” from “does the pedal loader run it?”
For StereoChorus, the target state is:
int[65536] delay lines;sweepL, sweepR, gcount;lastRefL[7], lastRefR[7], cycle;At 44.1 kHz on the pedal, cycleEnd should be 1, so the high-sample-rate
undersampling reference path can be mechanically retained but should stay
inactive unless the host rate is ever proven different.
0..0.14 scaling, then document whether first-touch
Bias/Output and zero-output startup are fixed. Keep init materialization in
isolated probes; the first ToTape9 object-defined init shim crashed on boot.params[7..13] updates are proven
separately from the ToTape9 kernel.VerbTiny.ZDL and Galactic.ZDL for load, unbypass, page 2
controls, reload, and duplicate-instance state isolation.ctx[2], ctx[13], and ctx[14] from stock delay,
modulation, and tape effects.docs/STATE-ABI-PROGRESS.md before moving
the claim into release docs.Do not call a build a 1:1 Airwindows port if:
.fardata for large state;