WHERE element+0x28 COMES FROM -- a timing measurement. Setup: watch registered by reading the live resource, then band_array = *(res+44) (bit offsets: *8) element = *(band_array + 0xd8) and installing a write watchpoint on element+0x28. Measured: after create (before arm1) band=00291D70 p44=003DC4B0 element = 0 after arm1 (same) element = 0 after PUT_TILE (same) element = 0 WPELEM write hits on element+0x28: 0 But inside EXPORT (breakpoint 0x1B234, i.e. 0x1B238's predecessor) the SAME read gives a non-zero element: EX_BAND a5=003DC4B0 elem@d8=003FDA10 EX_ELEM a5=003FDA10 f28=00000000 So the element record does not exist until the export path runs: EXPORT itself creates/binds it. Consequences for the model: * PUT_TILE does not fill element+0x28 -- the element is not there yet while PUT_TILE runs. The earlier reading ("PUT_TILE fills/clears element+0x28") is therefore wrong for this configuration. * Nothing writes element+0x28 at all (0 watch hits), which is consistent with export painting nothing: the element it builds has no source image. * So the source for export has to be established on the band array BEFORE export, and export only mirrors what is already there. NEXT LEVER: dump the band array (p44) immediately before EXPORT and compare its fields with what export expects; the source pointer must be one of the fields export copies into renderparams (0x1B222..0x1B292 writes 0x5a8, 0x5c8, 0x5d0, 0x5f0, 0x610, 0x630, 0x638, 0x658, 0x6b8, 0x6d8, 0x6f8, 0x718, 0x738, 0x758, 0x778, 0x788, 0x790).