isl: rename built-ins 8/9/93 to stopwatch_start/_elapsed/_stop

They are start / read / stop of one of 32 per-phase stopwatches, not
flag operations.  123-127 keep timer_* -- that is the mission timer,
five scalars at [phase+304..320], a different clock.

Artefact check: 84 lines changed across 5 files and all 84 pair
exactly with their old-name partners once column padding is
normalised (0 removed lines without an old name, 0 added lines
without a new one).  data/isl-timers.txt reproduces the same
675/675, 11.2 % control, 82/1 and identical histograms, which is
what shows the rename is cosmetic.

Also withdraws a label from the previous commit: sub_8230C398 is NOT
the message pump.  It runs every frame but drains nothing -- a state
machine on [0x828E1F8C] that only allocates, builds strings, looks up
and PUSHES.  And bus+8216 is weak evidence: sub_82254A08 is a generic
map find with ~120 sites, and the key looked up is a pointer, not a
tag.  The open handle is now the ring buffer at bus+4, not bus+8216.
This commit is contained in:
Sylpheed RE agent
2026-08-27 09:21:04 +00:00
parent 11bcf283cb
commit 3fa898093f
10 changed files with 153 additions and 106 deletions

View File

@@ -86,7 +86,8 @@ KIND = {0: 'global', 1: 'imm', 2: 'special', 3: 'local'}
# guess. See docs/re/structures/isl-builtins.md.
BUILTIN = {
1: 'start_coroutine', 2: 'deploy_squadron', 3: 'move_order', 4: 'wait_s',
5: 'kill_coroutine', 6: 'END_PHASE', 8: 'set_flag', 9: 'read_freg',
5: 'kill_coroutine', 6: 'END_PHASE', 8: 'stopwatch_start',
9: 'stopwatch_elapsed',
10: 'random', 11: 'end_coroutine', 12: 'activate_unit',
13: 'play_se', 14: 'play_bgm',
15: 'set_group_speed',
@@ -108,7 +109,7 @@ BUILTIN = {
77: 'banner_mission_start', 78: 'banner_mission_complete',
81: 'banner_objective_update', 82: 'banner_mission_failed',
135: 'banner_mission_restart',
93: 'clear_flag', 94: 'is_engaged', 95: 'unit_hp_pct', 100: 'reset_phase_threads',
93: 'stopwatch_stop', 94: 'is_engaged', 95: 'unit_hp_pct', 100: 'reset_phase_threads',
102: 'prompt_yes_no', 108: 'deploy_squadron_ex',
109: 'set_unit_flags', 115: 'named_event',
120: 'wait_cmds_drained', 123: 'timer_resume', 124: 'timer_stop',
@@ -174,7 +175,7 @@ def symbols(b, which):
# makes the test discriminating -- plain range-checking cannot separate an index
# from a bool, because every small integer is "in range".
#
# It also refutes one tempting entry: `set_flag`'s slot 0 passes the range and
# It also refutes one tempting entry: `stopwatch_start`'s slot 0 passes the range and
# spread tests but its maximum EXCEEDS the table (flag indices run 0..31 against
# tables as small as 40), so it is excluded. Slots are only listed here when the
# ratio stayed below 1.0.
@@ -210,7 +211,7 @@ UNIT_SLOTS = {4: UNIT_ARG, 12: UNIT_ARG2, 20: UNIT_ARG3}
# one taking a third;
# * 24 built-ins have a slot 0 that is NOT the constant -- and every one of
# them takes no symbol at slot 4 (`start_coroutine` a code offset, `wait_s`
# a double, `set_flag` an index).
# a double, `stopwatch_start` an index).
#
# The tag does NOT generalise to "every even slot is a tag": slot 8 is a bare
# double for built-ins 4, 20, 24, 26, 28, 29, 90, 106 and 127, and built-in 75