Dispatch Tables Inventory

This page catalogs all indirect call/jump dispatch tables found in the KN5000 ROM disassembly. These are sites where firmware computes a target address at runtime using an index into a table of function pointers or offsets.

Last updated: March 9, 2026

Progress: 1583 / 1583 dispatch sites documented (100%)

Every dispatch site (jp_dri, call(xreg), jp(xreg)) across the six KN5000 ROM components is within a semantically-labeled function.

Coverage by ROM

| ROM | Total Sites | Coverage | |—–|————-|———-| | Main CPU | 499 | 100% | | Sub CPU | 24 | 100% | | HDAE5000 | 1057 | 100% | | Table Data | 3 | 100% | | Total | 1583 | 100% | | maincpu/sequencer_engine.s | 14/16 | 0/0 | 16 | 14 | 88% | | maincpu/file_io_engine.s | 0/0 | 10/14 | 14 | 10 | 71% | | maincpu/midi_voice_routing.s | 3/3 | 4/7 | 10 | 7 | 70% | | maincpu/dsp_config_sysex.s | 3/3 | 4/7 | 10 | 7 | 70% |

Dispatch Site Breakdown

Instruction Type Count Description
jp_dri 316 Offset-table indexed jumps (switch/case style)
call (xreg) 1,240 Indirect calls through pointer tables or vtables
jp (xreg) 27 Indirect jumps through pointer tables
Total 1,583  

Note: The HDAE5000 extension ROM accounts for 67% of all sites (1,057). Its call (xhl) sites mostly use a vtable dispatch pattern with 28 unique method offsets (+0x0080, +0x00E4, +0x0100, +0x0124, +0x0538, etc.).


Dispatch Patterns

The firmware uses three main patterns for runtime code dispatch:

Pattern 1: Pointer Table via call (xreg) / jp (xreg)

ldda8 a, <state_var>      ; load index from DRAM
extz wa                    ; zero-extend to 16-bit
sla wa, 2                  ; multiply by 4 (pointer size)
lda_24 xbc, <table_base>  ; load table base address
ld_sril3 XHL, ...         ; indexed load: xhl = table[index]
call (xhl)                 ; dispatch to handler

Table contains .long entries pointing to handler functions. Entry size is 4 bytes (24-bit addresses stored in 32-bit slots).

Pattern 2: Offset Table via jp_dri

cp wa, <max_index>         ; bounds check
jr gt, .default
add wa, wa                 ; multiply by 2 (offset size)
lda_24 xix, <offset_table> ; load offset table address
ld_sriw3 WA, ...          ; indexed load: wa = offsets[index]
lda_24 xix, <dispatch_base> ; load dispatch base address
jp_dri 8, ...              ; jump to base + offset

Table contains 16-bit relative offsets. More compact than pointer tables. Used extensively (316 sites).

Pattern 3: Vtable Dispatch (HDAE5000)

ld_sril XHL, (xwa + 0x00e4)  ; load method from object vtable
call (xhl)                     ; dispatch to method

HDAE5000 uses an object-oriented vtable pattern where XWA points to an object, and the method pointer is loaded from a fixed offset within the object structure. ~1003 call sites use this pattern with various method offsets.

Pattern 4: Two-Level Dispatch

; Level 1: byte lookup
ld a, (xix + <byte_table>)  ; byte_table[index] -> secondary index
extz wa
sll wa, ...
; Level 2: offset table
lda_24 xix, <offset_table>
jp_dri ...

6 sites use this cascaded pattern for more complex routing.


Recently Documented (March 9, 2026)

A total of 502 dispatch labels were created during the dispatch table documentation sprint:

  • 105 dispatch site labels (jp_dri/call/jp instruction sites)
  • 397 dispatch handler target labels (case handlers within dispatch tables)

Phase 1: Dispatch Sites (105 labels)

The following dispatch sites were labeled with semantic names:

Batch 1: Core Dispatch Sites (7 sites)

| Label | File | Type | Description | |——-|——|——|————-| | SeqRingBuf_WriteDispatch_Table | kn5000_v10_program.s | call (xhl) | 8-entry sequencer ring buffer write, indexed by DRAM[1508] bits [7:5] | | MidiPkt_EventType_Table | naka_dispatch.s | call (xhl) | 192-entry MIDI packet event type dispatch | | UIStateMachine_PrimaryDispatch | style_data_init.s | jp (xhl) | 3-state UI state machine primary dispatch | | Timer_ModeDispatch | scoop_display.s | call (xhl) | 4-entry timer mode dispatch | | E1DMA_TransferSetup | style_data_init.s | call (xhl) | DMA transfer setup after SeqRingBuf dispatch | | VoiceSynth_CommandDispatch | kn5000_v10_program.s | cascaded | Voice synthesis command dispatcher (DRAM[4012]) | | VoiceParam_CommandDispatch | kn5000_v10_program.s | cascaded | Voice parameter command dispatcher (DRAM[4012]) |

Batch 2: File I/O & MIDI Stream (7 sites)

| Label | File | Type | Description | |——-|——|——|————-| | RegBitManip_Dispatch | file_io_engine.s | call (xhl) | 8-entry register bit manipulation dispatch | | MidiStream_ProcessorDispatch | file_io_engine.s | call (xhl) | 8-entry MIDI stream processor A | | MidiStream_ProcessorDispatchB | file_io_engine.s | call (xhl) | 8-entry MIDI stream processor B | | MidiStream_ProcessorDispatchC | file_io_engine.s | call (xhl) | 16-entry MIDI stream processor C | | VoiceMode_ParamDispatch | file_io_engine.s | call (xhl) | 8-entry voice mode parameter dispatch | | VoiceSynth_AlgoTableDispatch | kn5000_v10_program.s | call (xhl) | 16-entry algorithm table via VoiceSynth_Algorithm_Table | | VoiceParam_ReadUpdateDispatch | kn5000_v10_program.s | call (xhl) | 16-entry read-update table via VoiceParam_ReadUpdate_Table |

Batch 3: Mode Screens UI (22 sites)

| Label | File | Description | |——-|——|————-| | TEST2FUNC_DispatchReturn | mode_screens.s | 6-entry event dispatch (event 0x1C00013) | | TEST3FUNC_DispatchReturn | mode_screens.s | 6-entry event dispatch | | TEST4FUNC_DispatchReturn | mode_screens.s | 6-entry event dispatch | | TEST6FUNC_DispatchReturn | mode_screens.s | 6-entry event dispatch | | MasterSetup_EventDispatch | mode_screens.s | 7-entry UI event dispatch (table 0xED0D24) | | MstStyleAlp_EventDispatch | mode_screens.s | 7-entry (table 0xED0D58) | | MstStyle_EventDispatch | mode_screens.s | 7-entry (table 0xED0D66) | | MstStyle1Grid_EventDispatch | mode_screens.s | 7-entry (table 0xED0D8A) | | MstStyle1_EventDispatch | mode_screens.s | 7-entry (table 0xED0D9E) | | MstStyle1Sub_EventDispatch | mode_screens.s | 7-entry (table 0xED0DC2) | | MstStyle1Page_EventDispatch | mode_screens.s | 7-entry (table 0xED0E04) | | MstStyle2_EventDispatch | mode_screens.s | 7-entry (table 0xED0ED2) | | TchSensGrid_EventDispatch | mode_screens.s | 7-entry (table 0xED0F08) | | TchSens_EventDispatch | mode_screens.s | 7-entry (table 0xED0F16) | | FSWAssGrid_EventDispatch | mode_screens.s | 7-entry (table 0xED1226) | | FswAsIni_EventDispatch | mode_screens.s | 6-entry (table 0xED1234) | | PmemPageCtl_EventDispatch | mode_screens.s | 7-entry (table 0xED1420) | | PmExpFilter_EventDispatch | mode_screens.s | 7-entry (table 0xED149A) | | PmExpFilter2_EventDispatch | mode_screens.s | 7-entry (table 0xED14A8) | | DispTimeSet_EventDispatch | mode_screens.s | 7-entry (table 0xED1582) | | MssName_EventDispatch | mode_screens.s | 10-entry (table 0xED15AC) | | PmBkName_EventDispatch | mode_screens.s | 10-entry (table 0xED15EE) |

Batch 4: Sequencer UI (21 sites)

| Label | File | Description | |——-|——|————-| | MuteChSel_Dispatch | sequencer_ui.s | SmfMuteChSelFunc dispatch | | SqTrAsPsSong_Dispatch | sequencer_ui.s | Song track dispatch | | MuteChSet_Dispatch | sequencer_ui.s | Mute channel set dispatch | | DemoMedDsp_Dispatch | sequencer_ui.s | Demo medium display dispatch | | DPPlayDsp_Dispatch | sequencer_ui.s | Demo play display dispatch | | DPPauseDsp_Dispatch | sequencer_ui.s | Demo pause display dispatch | | NoteEditBox_EventDispatch1 | sequencer_ui.s | Note edit box event dispatch 1 | | NoteEditBox_EventDispatch2 | sequencer_ui.s | Note edit box event dispatch 2 | | NoteEditBox_GridDispatch | sequencer_ui.s | Note edit box grid dispatch | | AcEntertainer_EventDispatch | sequencer_ui.s | Accompaniment entertainer dispatch | | SndParam_Dispatch | sequencer_ui.s | Sound parameter dispatch | | AccIll_Dispatch | sequencer_ui.s | Accompaniment illustration dispatch | | EffectBox_Dispatch | sequencer_ui.s | Effect box dispatch | | SeqAccomp_Dispatch | sequencer_ui.s | Sequencer accompaniment dispatch | | Sqedt_ParamDispatch | sequencer_ui.s | Sequencer editor param dispatch | | Sqedt_ValueDispatch | sequencer_ui.s | Sequencer editor value dispatch | | SeqFormat_DispatchA | sequencer_ui.s | Sequencer format dispatch A | | SeqFormat_DispatchB | sequencer_ui.s | Sequencer format dispatch B | | DspItem0_TypeDispatch | sequencer_ui.s | DSP item 0 type dispatch | | Equalizer_DispatchA | sequencer_ui.s | Equalizer dispatch A | | Equalizer_DispatchB | sequencer_ui.s | Equalizer dispatch B |

Batch 5: Voice, MIDI & Sound (21 sites)

| Label | File | Description | |——-|——|————-| | VoiceEvent_Dispatch | note_voice_mapping.s | 14-entry voice event handler (table 0xEE8F06) | | SeqPerformance_EventDispatch | note_voice_mapping.s | 6-entry sequence performance dispatch | | UIParam_CallbackReturn | note_voice_mapping.s | UI parameter callback return | | MidiSysMsg_Dispatch | note_voice_mapping.s | 15-entry MIDI system message dispatch | | SndParam_TypeDispatch | note_voice_mapping.s | 6-entry sound parameter type dispatch | | SndParam_OffsetDispatch | note_voice_mapping.s | 6-entry sound parameter offset dispatch | | HdaeRom_DataDispatch | note_voice_mapping.s | 6-entry HDAE5000 data dispatch | | HdaeRom_AltDispatch | note_voice_mapping.s | 6-entry HDAE5000 alt dispatch | | ToneGen_ParamWriteDispatch | voice_midi_buf.s | ToneGen param write dispatch table | | WallHomeEdit_EventDispatch | voice_midi_buf.s | Wall home edit event dispatch | | WallMenuEdit_EventDispatch | voice_midi_buf.s | Wall menu edit event dispatch | | WallOthEdit_EventDispatch | voice_midi_buf.s | Wall other edit event dispatch | | MainSysCtrl_DispatchTable | voice_midi_buf.s | Main system control dispatch | | CntIniFunc_EventDispatch | voice_midi_buf.s | CntIniFunc event dispatch | | DspConfig_EventDispatch | dsp_config_sysex.s | DSP config event dispatch | | WndEvt_EventCodeDispatch | voice_synth.s | Window event code dispatch | | MidiChan_ParamDispatch | midi_voice_routing.s | MIDI channel parameter dispatch | | SeqData_FieldDispatch | midi_voice_routing.s | Sequence data field dispatch | | SysEx_SendDispatch | midi_voice_routing.s | SysEx send dispatch | | TitleProc_EventDispatch | ui_widget_defs.s | Title proc event dispatch | | SeqEvent_Dispatch … (3 more) | sequencer_engine.s | Sequencer engine dispatches |

Phase 2: Handler Targets (~397 labels)

Dispatch handler targets (individual case labels) were labeled across these files:

File Targets Labeled Key Handler Groups
kn5000_v10_program.s 152 System (EditSwParam, WindowField, DirmdEmu, DSPCfg), Title functions (SqTrAs, SqMdlyPly, DkMdlyPly, DpMdly, DpDoc, DpPd, DpSmf, SqTrSel), Voice (AcVocalGrid, VocalistGrid, ParaLoadOpt)
sound_editor_ui.s 68 PartGrid columns, NoteEvent buffers, CmpSetP1/EasyCmp/FdcFormat grids, SndArgGrid, PsSCTxtBox
drawbar_panel_ui.s 44 ComSetGrid, PmemOutL, CtlMsgGrid, MidiSetup, IvSdpart, PsMixer, DemoMenu, AcPresCtrl
accompaniment_engine.s 78 RhythmParam, CmpMenuTtl/SetTtl/RealTtl, CmpBkslTtl fill-ins, CmpEsyTtl/NcpTtl, MainCmpSet, MspMenu/Name/Rec
sequencer_ui.s 59 TrAsGrid, MuteChSel, DemoMedDsp, NoteEditBox, Entertainer, SqedtFunc, DspItem0/Equalizer
sequencer_engine.s 30 SeqData/Event, AppEvent chain, SeqState, NoteEditSy, MainExeCall

Previously Documented Dispatch Tables

These tables had meaningful semantic labels before the documentation sprint.

Main CPU — Sequencer & Timing

# Label File Line Table Base Index Source Entries Type
1 SeqStep_TimerDispatchA seq_step_routines.s 2516 0xE44F00 DRAM[8956] ~23 jp (xhl)
2 SeqStep_TimerDispatchB seq_step_routines.s 2524 0xE44F5C DRAM[8956] ~23 jp (xhl)
3 SeqStep_TimerDispatchC seq_step_routines.s 2532 0xE44FB8 DRAM[8956] ~23 jp (xhl)
4 AccPlayMode_Dispatch_Execute accompaniment_engine.s 8061 0xF5ADF9 flags in reg l ~32 call (xhl)
5 AccFlags_Dispatch accompaniment_engine.s 5356 0xF59517 reg w & 0xF ~16 jp (xhl)
6 DrumSlot_ClampAndLookup accompaniment_engine.s 22127 0xF64D75 reg hl var call (xhl)
7 NoteEditSy_HandleUpScroll sequencer_engine.s 22430 0xE44A6A xde (<=0xE) 15 jp_dri
8 NoteEditSy_HandleDownScroll sequencer_engine.s 22491 0xE44A52 xde (<=0xB) 12 jp_dri
9 DspItem0_TypeChangeHandler sequencer_ui.s 13583 0xE34D92 xde (<=0x8) 9 jp_dri

Main CPU — UI & Control Panel

# Label File Line Table Base Index Source Entries Type
10 UI_STATE_2_SUBSTATE style_data_init.s 561 0xEF0DA5 DRAM[1042] & 0xF ~16 jp (xhl)
11 CtrlPanel_DispatchByIndex tonegen_voice_ctrl.s 4113 0xEA9A04 wa (<=0x2A) 43 jp_dri
12 CPanel_EncoderDispatch midi_encoder_routines.s 33 0xEDA0BC 5-bit idx ~32 jp (xhl)
13 Scoop_EventLoop_12Entry scoop_display.s 9770 (stack) reg c ~12 call (xhl)

Main CPU — MIDI & Sound

# Label File Line Table Base Index Source Entries Type
14 MIDI_CHANNEL_MESSAGE_DISPATCHER midi_serial_routines.s 690 0xFCF761 DRAM[1059] & 0x70 8 jp (xhl)
15 PanelEvent_DispatchByIndex midi_voice_routing.s 847 (computed) DRAM[0x964D] var call (xhl)
16 SndParam_* (5 tables) sndparam_routines.s 50-464 0xEE10D0-0xEE1148 reg a/c 5-7 call (xhl)
17 SeMenu_ValueEditor_* sound_editor_ui.s 3098 0xE0E72D a (0x20-0x3F) ~32 call (xhl)
18 SeMenu_ListSelector_* sound_editor_ui.s 3248 0xE0E72D a (0x20-0x3F) ~32 call (xhl)

Main CPU — Interrupt Handlers

# Label File Line Table Base Index Source Entries Type
19 INTTX1_HANDLER cpanel_routines.s 724 0xFC4489 DRAM[36234] var jp (xhl)
20 INTRX1_HANDLER cpanel_routines.s 746 0xFC4489 DRAM[36234] var jp (xhl)

Sub CPU

# Label File Line Table Base Index Source Entries Type
21 SubCPU cmd dispatch subprogram_v142.s 11322 0x00F46C latch[7:5] 8 call (xwa)
22 CmdHandler_Table subcpu_boot.s 99847 0xFF8000 latch[7:5] 8 call (xwa)
23 Voice_SystemMsg_DispatchJump subprogram_v142.s 25730 0x00F74F bc (<=0x16) 23 jp_dri
24 CmdHandler2C_JumpDispatch subprogram_v142.s 40501 0x0121BD wa (<=0xE) 15 jp_dri

Entry 22 is the boot ROM’s own copy of entry 21’s dispatch: same 3-bit selector, same sharing of slots 6 and 7. All eight of its targets are lds hl,0 / ret stubs, so the boot loader acknowledges every command and implements none until the payload installs the real table. Since August 2026 it is emitted as symbolic .longs rather than hidden inside a binary include — see Sub-CPU Boot ROM (IC30).

HDAE5000

# Label File Line Table Base Index Source Entries Type
25 ATA command dispatch hd-ae5000_v2_06i.s 30631 0x295146 wa (cmd#) ~10 call (xhl)
26 TitleFunc_LifecycleDispatch hama/hama_code.s 159 0xE1FDFE xwa (<=0x7) 8 jp_dri
27 GetResouceInfo kn5000_v10_program.s 19638 0xE1FFD2 wa (<=0x9) 10 jp_dri

Table Data ROM

# Label File Line Table Base Index Source Entries Type
28 Boot transfer kn5000_table_data.s 537 0xFFFEDC – 1 jp (xwa)

Labeling Sprint Summary (March 9, 2026)

During this sprint, 569 dispatch labels were created or verified:

  • 105 dispatch site labels in Phase 1 (jp_dri/call/jp instruction sites)
  • 397 handler target labels in Phase 2 (case handlers within dispatch tables)
  • 67 additional function labels in Phase 3 (remaining unlabeled dispatch functions)

Phase 3: Final Labels (67 renames)

File Labels Added Key Functions
ui_widget_defs.s 23 ObjectProc, EventHandler/EventRoute, DrawTask/DrawFunc pipeline, ApTimer, RootContext, FunctionProc, MainSendEvent/PostEvent
drawbar_panel_ui.s 9 PsMixer (ControlHelper, EventCallback, GridLoop), AudioCtrl (MixerDispatch, ArrayRead)
note_voice_mapping.s 7 VoiceEvent_TypeDispatch, SeqEvtBuf_NoteDispatch, MidiSysMsg_Handler, HdaeRom handlers
file_io_engine.s 6 FileIO_CallbackHandler, BitmaskDispatch, MidiCtrl/VoiceNote/Part dispatches
dsp_config_sysex.s 5 VoiceInit, AudioModeChange, AudioSubsystem/Voice callbacks
sound_editor_ui.s 3 FloppyDisk_LoadNoteEvents, ComputeToneParams, CopyNoteBuffers
midi_voice_routing.s 3 FileData/MidiTable/SeqData dispatch handlers
voice_synth.s 2 Draw_DispatchByPartType, DrawPartGroup_DispatchByType
Other files 9 CtrlPanel_FuncDispatch, FileDemo callbacks, Display_ModeHandler, etc.

This inventory was generated by automated analysis of all .s files in the ROM disassembly. Coverage verified at 100% on March 9, 2026.